diff --git a/flutter/lib/common/widgets/peer_tab_page.dart b/flutter/lib/common/widgets/peer_tab_page.dart index fbda91649..c1151088d 100644 --- a/flutter/lib/common/widgets/peer_tab_page.dart +++ b/flutter/lib/common/widgets/peer_tab_page.dart @@ -23,15 +23,31 @@ class _PeerTabPageState extends State @override void initState() { + () async { + await bind.mainGetLocalOption(key: 'peer-tab-index').then((value) { + if (value == '') return; + final tab = int.parse(value); + _tabIndex.value = tab; + _pageController.jumpToPage(tab); + }); + await bind.mainGetLocalOption(key: 'peer-card-ui-type').then((value) { + if (value == '') return; + final tab = int.parse(value); + peerCardUiType.value = + tab == PeerUiType.list.index ? PeerUiType.list : PeerUiType.grid; + }); + }(); super.initState(); } // hard code for now - void _handleTabSelection(int index) { + Future _handleTabSelection(int index) async { // reset search text peerSearchText.value = ""; peerSearchTextController.clear(); _tabIndex.value = index; + await bind.mainSetLocalOption( + key: 'peer-tab-index', value: index.toString()); _pageController.jumpToPage(index); switch (index) { case 0: @@ -89,7 +105,7 @@ class _PeerTabPageState extends State shrinkWrap: true, controller: ScrollController(), children: super.widget.tabs.asMap().entries.map((t) { - return Obx(() => GestureDetector( + return Obx(() => InkWell( child: Container( padding: const EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration( @@ -111,7 +127,7 @@ class _PeerTabPageState extends State : MyTheme.color(context).lightText), ), )), - onTap: () => _handleTabSelection(t.key), + onTap: () async => await _handleTabSelection(t.key), )); }).toList()); } @@ -120,7 +136,9 @@ class _PeerTabPageState extends State final verticalMargin = isDesktop ? 12.0 : 6.0; return Expanded( child: PageView( - physics: const BouncingScrollPhysics(), + physics: isDesktop + ? NeverScrollableScrollPhysics() + : BouncingScrollPhysics(), controller: _pageController, children: super.widget.children, onPageChanged: (to) => _tabIndex.value = to) @@ -130,44 +148,30 @@ class _PeerTabPageState extends State Widget _createPeerViewTypeSwitch(BuildContext context) { final activeDeco = BoxDecoration(color: MyTheme.color(context).bg); return Row( - children: [ - Obx( - () => Container( - padding: const EdgeInsets.all(4.0), - decoration: - peerCardUiType.value == PeerUiType.grid ? activeDeco : null, - child: InkWell( - onTap: () { - peerCardUiType.value = PeerUiType.grid; - }, - child: Icon( - Icons.grid_view_rounded, - size: 18, - color: peerCardUiType.value == PeerUiType.grid - ? MyTheme.color(context).text - : MyTheme.color(context).lightText, - )), - ), - ), - Obx( - () => Container( - padding: const EdgeInsets.all(4.0), - decoration: - peerCardUiType.value == PeerUiType.list ? activeDeco : null, - child: InkWell( - onTap: () { - peerCardUiType.value = PeerUiType.list; - }, - child: Icon( - Icons.list, - size: 18, - color: peerCardUiType.value == PeerUiType.list - ? MyTheme.color(context).text - : MyTheme.color(context).lightText, - )), - ), - ), - ], + children: [PeerUiType.grid, PeerUiType.list] + .map((type) => Obx( + () => Container( + padding: EdgeInsets.all(4.0), + decoration: peerCardUiType.value == type ? activeDeco : null, + child: InkWell( + onTap: () async { + await bind.mainSetLocalOption( + key: 'peer-card-ui-type', + value: type.index.toString()); + peerCardUiType.value = type; + }, + child: Icon( + type == PeerUiType.grid + ? Icons.grid_view_rounded + : Icons.list, + size: 18, + color: peerCardUiType.value == type + ? MyTheme.color(context).text + : MyTheme.color(context).lightText, + )), + ), + )) + .toList(), ); } } diff --git a/flutter/lib/common/widgets/peer_widget.dart b/flutter/lib/common/widgets/peer_widget.dart index f32b8a2f1..bdfbe53e5 100644 --- a/flutter/lib/common/widgets/peer_widget.dart +++ b/flutter/lib/common/widgets/peer_widget.dart @@ -92,68 +92,78 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener { return ChangeNotifierProvider( create: (context) => widget.peers, child: Consumer( - builder: (context, peers, child) => peers.peers.isEmpty - ? Center( - child: Text(translate("Empty")), - ) - : DesktopScrollWrapper( - scrollController: _scrollController, - child: SingleChildScrollView( - physics: NeverScrollableScrollPhysics(), - controller: _scrollController, - child: ObxValue((searchText) { - 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: 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: widget.peerCardWidgetFunc(peer), - ), - ), - ))); - } - return Wrap( - spacing: space, - runSpacing: space, - children: cards); - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - future: matchPeers(searchText.value, peers.peers), - ); - }, peerSearchText), - ), - ), - ), + builder: (context, peers, child) => peers.peers.isEmpty + ? Center( + child: Text(translate("Empty")), + ) + : _buildPeersView(peers)), ); } + Widget _buildPeersView(Peers peers) { + final body = ObxValue((searchText) { + return FutureBuilder>( + builder: (context, snapshot) { + if (snapshot.hasData) { + final peers = snapshot.data!; + final cards = []; + for (final peer in peers) { + final visibilityChild = 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: widget.peerCardWidgetFunc(peer), + ); + cards.add(Offstage( + key: ValueKey("off${peer.id}"), + offstage: widget.offstageFunc(peer), + child: isDesktop + ? Obx( + () => SizedBox( + width: 220, + height: peerCardUiType.value == PeerUiType.grid + ? 140 + : 42, + child: visibilityChild, + ), + ) + : SizedBox(width: mobileWidth, child: visibilityChild))); + } + return Wrap(spacing: space, runSpacing: space, children: cards); + } else { + return const Center( + child: CircularProgressIndicator(), + ); + } + }, + future: matchPeers(searchText.value, peers.peers), + ); + }, peerSearchText); + + if (isDesktop) { + return DesktopScrollWrapper( + scrollController: _scrollController, + child: SingleChildScrollView( + physics: NeverScrollableScrollPhysics(), + controller: _scrollController, + child: body), + ); + } else { + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + controller: _scrollController, + child: body, + ); + } + } + // ignore: todo // TODO: variables walk through async tasks? void _startCheckOnlines() {