From ff5e9a8ea5672cd07f1a3c83b00a66227eb6ee67 Mon Sep 17 00:00:00 2001 From: Kingtous Date: Sat, 27 Aug 2022 00:45:09 +0800 Subject: [PATCH] opt: support match user/hostname/id(flutter), case insensitive Signed-off-by: Kingtous --- flutter/lib/common.dart | 35 +++++++++ flutter/lib/desktop/widgets/peer_widget.dart | 81 ++++++++++++-------- 2 files changed, 82 insertions(+), 34 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 643705d69..349b5abcc 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -8,6 +8,7 @@ import 'package:desktop_multi_window/desktop_multi_window.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.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:shared_preferences/shared_preferences.dart'; import 'package:window_manager/window_manager.dart'; @@ -704,3 +705,37 @@ String bool2option(String option, bool b) { } return res; } + +Future 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>? matchPeers(String searchText, List peers) async { + if (searchText.isEmpty) { + return peers; + } + searchText = searchText.toLowerCase(); + final matches = + await Future.wait(peers.map((peer) => matchPeer(searchText, peer))); + final filteredList = List.empty(growable: true); + for (var i = 0; i < peers.length; i++) { + if (matches[i]) { + filteredList.add(peers[i]); + } + } + return filteredList; +} \ No newline at end of file diff --git a/flutter/lib/desktop/widgets/peer_widget.dart b/flutter/lib/desktop/widgets/peer_widget.dart index fa79db624..3bfff60bf 100644 --- a/flutter/lib/desktop/widgets/peer_widget.dart +++ b/flutter/lib/desktop/widgets/peer_widget.dart @@ -88,40 +88,53 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener { ) : SingleChildScrollView( child: ObxValue((searchText) { - final cards = []; - peers.peers.where((peer) { - if (searchText.isEmpty) { - return true; - } else { - return peer.id.contains(peerSearchText.value); - } - }).forEach((peer) { - cards.add(Offstage( - offstage: super.widget._offstageFunc(peer), - child: Obx( - () => Container( - width: 220, - height: peerCardUiType.value == PeerUiType.grid - ? 140 - : 42, - child: VisibilityDetector( - key: Key('${peer.id}'), - onVisibilityChanged: (info) { - final peerId = (info.key as ValueKey).value; - if (info.visibleFraction > 0.00001) { - _curPeers.add(peerId); - } else { - _curPeers.remove(peerId); - } - _lastChangeTime = DateTime.now(); - }, - child: super.widget._peerCardWidgetFunc(peer), - ), - ), - ))); - }); - return Wrap( - children: cards, spacing: space, runSpacing: space); + return FutureBuilder>( + builder: (context, snapshot) { + if (snapshot.hasData) { + final peers = snapshot.data!; + final cards = []; + for (final peer in peers) { + cards.add(Offstage( + key: ValueKey("off${peer.id}"), + offstage: super.widget._offstageFunc(peer), + child: Obx( + () => SizedBox( + width: 220, + height: + peerCardUiType.value == PeerUiType.grid + ? 140 + : 42, + child: VisibilityDetector( + key: ValueKey(peer.id), + onVisibilityChanged: (info) { + final peerId = + (info.key as ValueKey).value; + if (info.visibleFraction > 0.00001) { + _curPeers.add(peerId); + } else { + _curPeers.remove(peerId); + } + _lastChangeTime = DateTime.now(); + }, + child: super + .widget + ._peerCardWidgetFunc(peer), + ), + ), + ))); + } + return Wrap( + spacing: space, + runSpacing: space, + children: cards); + } else { + return const Center( + child: CircularProgressIndicator(), + ); + } + }, + future: matchPeers(searchText.value, peers.peers), + ); }, peerSearchText), )), );