From 57e271cc40473cc252ac503826d946f50de3c870 Mon Sep 17 00:00:00 2001 From: open-trade Date: Wed, 25 Nov 2020 18:33:09 +0800 Subject: [PATCH] peers --- flutter_hbb/assets/linux.png | Bin 0 -> 4119 bytes flutter_hbb/assets/mac.png | Bin 0 -> 3931 bytes flutter_hbb/assets/win.png | Bin 0 -> 1797 bytes flutter_hbb/lib/common.dart | 8 ++++ flutter_hbb/lib/home_page.dart | 65 ++++++++++++++++++++++++++++++--- flutter_hbb/lib/model.dart | 5 ++- 6 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 flutter_hbb/assets/linux.png create mode 100644 flutter_hbb/assets/mac.png create mode 100644 flutter_hbb/assets/win.png diff --git a/flutter_hbb/assets/linux.png b/flutter_hbb/assets/linux.png new file mode 100644 index 0000000000000000000000000000000000000000..19813114233fd8af32501caa0f224637353158d9 GIT binary patch literal 4119 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 literal 0 HcmV?d00001 diff --git a/flutter_hbb/assets/mac.png b/flutter_hbb/assets/mac.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d71d8d3896bc6d1b4c9b095703f35238ebaf97 GIT binary patch literal 3931 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 literal 0 HcmV?d00001 diff --git a/flutter_hbb/assets/win.png b/flutter_hbb/assets/win.png new file mode 100644 index 0000000000000000000000000000000000000000..155f4e75d81098bf8925bfa3fa073e3dcf8e343f GIT binary patch literal 1797 zcmeAS@N?(olHy`uVBq!ia0y~yU_8LUz{J483=~oN?UMnd&IkB}xB}__!w9VCnCA}k zl1oXDUoZm;D;qlpm!OoioRX%tuCa}si*G<^SWH}eVrp7`ad~w^Q%lFhnTwV#U$tiQ z?jt8oojHH??z7i#-+%b{>GPMb-+ur3`)|stV~2s}F(!GtySV(^GUFfv1M3t|7srr_ zTW{|i^pkNHX}idj_9{%&_JOO}L?wM?*UJCyC%G$xRVV6JHYPXArXFN@XfR2&=i{AM zpLK6mtVn*wUiy8ClIJ894792A5yvF4wS66I26y}KbX?5pd8cj=nXc=$x^UxHv00za z8tM7vCiv|Xuj@P+CjCAAT>iq7>3j*FW-`yHdB&hN-?9P7eGs@M_w7Vuc7va17=7%D z877~XIgmbY=iQse|7J7v*FR&ZbKbdci&SmR{&0p5KY;3k&&A}PE(WSnpR@CHvb90O zarh!0-ijJU~`ows9)`83O>YrWX+_ARs-t!qdr!t;1FJ8^q zBVXn6J~cE~?N{6_eeFNpFSeZUe_$LQE&Kj|%5?q@_l#}UGo&%ysaHCzx;~}hxBcPs z(koILW&=HZKbJ$5x#rK}RSf+O>v~x|jU0@pixvnQMrC);Jk6HzY!j2)>czbV#Wxwg z8*guU?8mmFQ)2Jg`oL1V15;x|=5iQB#a3-8W}nS-;Y=#)og-H7WM}b%n0xlRUOTgt zdCotvo0*K)i@M*`G^FWiKiJ~mbcWC3FmwNFmN_pPk6&f{cO&~qYqJOUkJZK=b5B2F zU=3hk~!~s+ZF#)6!LlDDQn%i|Z z|FhNe*Zb@~Z1rDX>4lO6zlhHLGv{;Z{=bhOUO(oq&2neYnV-AjWf|`5i&0!)y&2>* zLY_c)7sF>%4=~E?vf5|1|EpBtLxoFB|KhwfZ{M2MabvFKgp!7(Q-bpH*2PT^Iv3Rw zmK;9U+vq^;{B`T@O$qYavhT`^!yi?c|E%Yizjx2-nxNox^*&9>2Xm8m%AT-z&t|0f zVBhT7tId~Axtym^%=GT}^E`#umln^p-ks9${a(a>qY0gi_VOoukGweR@QnG+_m7YN zHpU$4RAV-oP|P58!jpmbiA)1q5#ND!X3JY0M^~yd|G6*yx=ukq#`_%Gj{=40?9*&c zMhBXiEAK_9FxwbRxY*WshAl%uoe{|1`kp7n%z@dG{lUV`4!Eh7K` literal 0 HcmV?d00001 diff --git a/flutter_hbb/lib/common.dart b/flutter_hbb/lib/common.dart index 469564182..9c93e513c 100644 --- a/flutter_hbb/lib/common.dart +++ b/flutter_hbb/lib/common.dart @@ -127,3 +127,11 @@ class _PasswordWidgetState extends State { ); } } + +Color str2color(String str, [alpha = 0xFF]) { + var hash = 160 << 16 + 114 << 8 + 91; + for (var i = 0; i < str.length; i += 1) { + hash = str.codeUnitAt(i) + ((hash << 5) - hash); + } + return Color((hash & 0xFFFFFF) | (alpha << 24)); +} diff --git a/flutter_hbb/lib/home_page.dart b/flutter_hbb/lib/home_page.dart index 66ca89384..f9446067e 100644 --- a/flutter_hbb/lib/home_page.dart +++ b/flutter_hbb/lib/home_page.dart @@ -33,6 +33,7 @@ class _HomePageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ getSearchBarUI(), + getPeers(), Expanded(child: Container()) ]), padding: const EdgeInsets.fromLTRB(16.0, 0.0, 16.0, 0.0), @@ -41,13 +42,20 @@ class _HomePageState extends State { void onConnect() { var id = _idController.text.trim(); + connect(id); + } + + void connect(String id) { if (id == '') return; - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => RemotePage(id: id), - ), - ); + () async { + await Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => RemotePage(id: id), + ), + ); + setState(() {}); + }(); FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); @@ -133,4 +141,49 @@ class _HomePageState extends State { _idController.dispose(); super.dispose(); } + + Widget getPlatformImage(String platform) { + platform = platform.toLowerCase(); + if (platform == 'osx') + platform = 'mac'; + else if (platform != 'linux') platform = 'win'; + return Image.asset('assets/$platform.png', width: 36, height: 36); + } + + Widget getPeers() { + final cards = []; + var peers = FFI.peers(); + peers.forEach((p) { + cards.add(Card( + child: GestureDetector( + onTap: () => connect('${p.id}'), + onLongPressStart: (details) { + var x = details.globalPosition.dx; + var y = details.globalPosition.dy; + () async { + var value = await showMenu( + context: context, + position: RelativeRect.fromLTRB(x, y, x, y), + items: [ + PopupMenuItem( + child: Text('Remove'), value: 'remove'), + ], + elevation: 8, + ); + if (value == 'remove') { + setState(() => FFI.setByName('remove', '${p.id}')); + } + }(); + }, + child: ListTile( + subtitle: Text('${p.username}@${p.hostname}'), + title: Text('${p.id}'), + leading: Container( + padding: const EdgeInsets.all(6), + child: getPlatformImage('${p.platform}'), + color: str2color('${p.id}${p.platform}', 0x77)), + )))); + }); + return Wrap(children: cards); + } } diff --git a/flutter_hbb/lib/model.dart b/flutter_hbb/lib/model.dart index e61f1f283..58a37de3b 100644 --- a/flutter_hbb/lib/model.dart +++ b/flutter_hbb/lib/model.dart @@ -389,6 +389,7 @@ class CursorModel with ChangeNotifier { } class FFI { + static String _dir = ''; static F1 _freeCString; static F2 _getByName; static F3 _setByName; @@ -535,8 +536,8 @@ class FFI { _freeRgba = dylib .lookupFunction), F4>('free_rgba'); _getRgba = dylib.lookupFunction('get_rgba'); - final dir = (await getApplicationDocumentsDirectory()).path; - setByName('init', dir); + _dir = (await getApplicationDocumentsDirectory()).path; + setByName('init', _dir); } }