Merge pull request #1376 from Kingtous/master

opt: support match user/hostname/id(flutter&sciter), case insensitive
This commit is contained in:
RustDesk 2022-08-27 08:35:14 +08:00 committed by GitHub
commit ba8addbe2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 91 additions and 37 deletions

View File

@ -8,6 +8,7 @@ import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart'; import 'package:flutter_hbb/desktop/widgets/tabbar_widget.dart';
import 'package:flutter_hbb/models/peer_model.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
@ -704,3 +705,38 @@ String bool2option(String option, bool b) {
} }
return res; return res;
} }
Future<bool> matchPeer(String searchText, Peer peer) async {
if (searchText.isEmpty) {
return true;
}
if (peer.id.toLowerCase().contains(searchText)) {
return true;
}
if (peer.hostname.toLowerCase().contains(searchText) ||
peer.username.toLowerCase().contains(searchText)) {
return true;
}
final alias = await bind.mainGetPeerOption(id: peer.id, key: 'alias');
if (alias.isEmpty) {
return false;
}
return alias.toLowerCase().contains(searchText);
}
Future<List<Peer>>? matchPeers(String searchText, List<Peer> peers) async {
searchText = searchText.trim();
if (searchText.isEmpty) {
return peers;
}
searchText = searchText.toLowerCase();
final matches =
await Future.wait(peers.map((peer) => matchPeer(searchText, peer)));
final filteredList = List<Peer>.empty(growable: true);
for (var i = 0; i < peers.length; i++) {
if (matches[i]) {
filteredList.add(peers[i]);
}
}
return filteredList;
}

View File

@ -88,40 +88,53 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener {
) )
: SingleChildScrollView( : SingleChildScrollView(
child: ObxValue<RxString>((searchText) { child: ObxValue<RxString>((searchText) {
final cards = <Widget>[]; return FutureBuilder<List<Peer>>(
peers.peers.where((peer) { builder: (context, snapshot) {
if (searchText.isEmpty) { if (snapshot.hasData) {
return true; final peers = snapshot.data!;
} else { final cards = <Widget>[];
return peer.id.contains(peerSearchText.value); for (final peer in peers) {
} cards.add(Offstage(
}).forEach((peer) { key: ValueKey("off${peer.id}"),
cards.add(Offstage( offstage: super.widget._offstageFunc(peer),
offstage: super.widget._offstageFunc(peer), child: Obx(
child: Obx( () => SizedBox(
() => Container( width: 220,
width: 220, height:
height: peerCardUiType.value == PeerUiType.grid peerCardUiType.value == PeerUiType.grid
? 140 ? 140
: 42, : 42,
child: VisibilityDetector( child: VisibilityDetector(
key: Key('${peer.id}'), key: ValueKey(peer.id),
onVisibilityChanged: (info) { onVisibilityChanged: (info) {
final peerId = (info.key as ValueKey).value; final peerId =
if (info.visibleFraction > 0.00001) { (info.key as ValueKey).value;
_curPeers.add(peerId); if (info.visibleFraction > 0.00001) {
} else { _curPeers.add(peerId);
_curPeers.remove(peerId); } else {
} _curPeers.remove(peerId);
_lastChangeTime = DateTime.now(); }
}, _lastChangeTime = DateTime.now();
child: super.widget._peerCardWidgetFunc(peer), },
), child: super
), .widget
))); ._peerCardWidgetFunc(peer),
}); ),
return Wrap( ),
children: cards, spacing: space, runSpacing: space); )));
}
return Wrap(
spacing: space,
runSpacing: space,
children: cards);
} else {
return const Center(
child: CircularProgressIndicator(),
);
}
},
future: matchPeers(searchText.value, peers.peers),
);
}, peerSearchText), }, peerSearchText),
)), )),
); );

View File

@ -245,7 +245,7 @@ class SearchBar: Reactor.Component {
} }
event change $(input) (_, el) { event change $(input) (_, el) {
this.onChange(el.value.trim()); this.onChange(el.value.trim().toLowerCase());
} }
function onChange(v) { function onChange(v) {
@ -297,8 +297,13 @@ class SessionList: Reactor.Component {
if (!p) return this.sessions; if (!p) return this.sessions;
var tmp = []; var tmp = [];
this.sessions.map(function(s) { this.sessions.map(function(s) {
var name = s[4] || s.alias || s[0] || s.id || ""; var name = (s[4] || s.alias || "").toLowerCase();
if (name.indexOf(p) >= 0) tmp.push(s); var id = (s[0] || s.id || "").toLowerCase();
var user = (s[1] || "").toLowerCase();
var hostname = (s[2] || "").toLowerCase();
if (name.indexOf(p) >= 0 || id.indexOf(p) >= 0 || user.indexOf(p) >= 0 || hostname.indexOf(p) >= 0) {
tmp.push(s);
}
}); });
return tmp; return tmp;
} }