Merge pull request #1376 from Kingtous/master
opt: support match user/hostname/id(flutter&sciter), case insensitive
This commit is contained in:
		
						commit
						ba8addbe2f
					
				| @ -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,38 @@ String bool2option(String option, bool b) { | ||||
|   } | ||||
|   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; | ||||
| } | ||||
|  | ||||
| @ -88,26 +88,27 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener { | ||||
|                 ) | ||||
|               : SingleChildScrollView( | ||||
|                   child: ObxValue<RxString>((searchText) { | ||||
|                     return FutureBuilder<List<Peer>>( | ||||
|                       builder: (context, snapshot) { | ||||
|                         if (snapshot.hasData) { | ||||
|                           final peers = snapshot.data!; | ||||
|                           final cards = <Widget>[]; | ||||
|                     peers.peers.where((peer) { | ||||
|                       if (searchText.isEmpty) { | ||||
|                         return true; | ||||
|                       } else { | ||||
|                         return peer.id.contains(peerSearchText.value); | ||||
|                       } | ||||
|                     }).forEach((peer) { | ||||
|                           for (final peer in peers) { | ||||
|                             cards.add(Offstage( | ||||
|                                 key: ValueKey("off${peer.id}"), | ||||
|                                 offstage: super.widget._offstageFunc(peer), | ||||
|                                 child: Obx( | ||||
|                             () => Container( | ||||
|                                   () => SizedBox( | ||||
|                                     width: 220, | ||||
|                               height: peerCardUiType.value == PeerUiType.grid | ||||
|                                     height: | ||||
|                                         peerCardUiType.value == PeerUiType.grid | ||||
|                                             ? 140 | ||||
|                                             : 42, | ||||
|                                     child: VisibilityDetector( | ||||
|                                 key: Key('${peer.id}'), | ||||
|                                       key: ValueKey(peer.id), | ||||
|                                       onVisibilityChanged: (info) { | ||||
|                                   final peerId = (info.key as ValueKey).value; | ||||
|                                         final peerId = | ||||
|                                             (info.key as ValueKey).value; | ||||
|                                         if (info.visibleFraction > 0.00001) { | ||||
|                                           _curPeers.add(peerId); | ||||
|                                         } else { | ||||
| @ -115,13 +116,25 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener { | ||||
|                                         } | ||||
|                                         _lastChangeTime = DateTime.now(); | ||||
|                                       }, | ||||
|                                 child: super.widget._peerCardWidgetFunc(peer), | ||||
|                                       child: super | ||||
|                                           .widget | ||||
|                                           ._peerCardWidgetFunc(peer), | ||||
|                                     ), | ||||
|                                   ), | ||||
|                                 ))); | ||||
|                     }); | ||||
|                           } | ||||
|                           return Wrap( | ||||
|                         children: cards, spacing: space, runSpacing: space); | ||||
|                               spacing: space, | ||||
|                               runSpacing: space, | ||||
|                               children: cards); | ||||
|                         } else { | ||||
|                           return const Center( | ||||
|                             child: CircularProgressIndicator(), | ||||
|                           ); | ||||
|                         } | ||||
|                       }, | ||||
|                       future: matchPeers(searchText.value, peers.peers), | ||||
|                     ); | ||||
|                   }, peerSearchText), | ||||
|                 )), | ||||
|     ); | ||||
|  | ||||
| @ -245,7 +245,7 @@ class SearchBar: Reactor.Component { | ||||
|     } | ||||
| 
 | ||||
|     event change $(input) (_, el) { | ||||
|         this.onChange(el.value.trim()); | ||||
|         this.onChange(el.value.trim().toLowerCase()); | ||||
|     } | ||||
|      | ||||
|     function onChange(v) { | ||||
| @ -297,8 +297,13 @@ class SessionList: Reactor.Component { | ||||
|         if (!p) return this.sessions; | ||||
|         var tmp = []; | ||||
|         this.sessions.map(function(s) { | ||||
|             var name = s[4] || s.alias || s[0] || s.id || ""; | ||||
|             if (name.indexOf(p) >= 0) tmp.push(s); | ||||
|             var name = (s[4] || s.alias || "").toLowerCase(); | ||||
|             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; | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user