From f853b29fd9747c7f6e6a82f3c1e5b6ec85e1bd5b Mon Sep 17 00:00:00 2001 From: 21pages Date: Wed, 1 May 2024 23:38:39 +0800 Subject: [PATCH] fix list type peer view (#7887) * Layout list type peer view with layout rather than calculated width * Hide menu sync from recent and web console if no write permission * Pull ab twice because it's force updated when refreshCurrentUser is called on startup and connection status changing --- flutter/lib/common/widgets/address_book.dart | 4 +- flutter/lib/common/widgets/peers_view.dart | 88 +++++++++----------- flutter/lib/models/ab_model.dart | 2 +- 3 files changed, 41 insertions(+), 53 deletions(-) diff --git a/flutter/lib/common/widgets/address_book.dart b/flutter/lib/common/widgets/address_book.dart index 702b4eb79..87a6190d1 100644 --- a/flutter/lib/common/widgets/address_book.dart +++ b/flutter/lib/common/widgets/address_book.dart @@ -385,10 +385,10 @@ class _AddressBookState extends State { if (canWrite) getEntry(translate("Add Tag"), abAddTag), getEntry(translate("Unselect all tags"), gFFI.abModel.unsetSelectedTags), sortMenuItem(), - syncMenuItem(), + if (canWrite) syncMenuItem(), filterMenuItem(), if (!gFFI.abModel.legacyMode.value) MenuEntryDivider(), - if (!gFFI.abModel.legacyMode.value) + if (!gFFI.abModel.legacyMode.value && canWrite) getEntry(translate("ab_web_console_tip"), () async { final url = await bind.mainGetApiServer(); if (await canLaunchUrlString(url)) { diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart index dd2902e54..fae9fc901 100644 --- a/flutter/lib/common/widgets/peers_view.dart +++ b/flutter/lib/common/widgets/peers_view.dart @@ -86,17 +86,6 @@ class _PeersViewState extends State<_PeersView> with WindowListener { var _queryCount = 0; var _exit = false; - late final mobileWidth = () { - const minWidth = 320.0; - final windowWidth = MediaQuery.of(context).size.width; - var width = windowWidth - 2 * space; - if (windowWidth > minWidth + 2 * space) { - final n = (windowWidth / (minWidth + 2 * space)).floor(); - width = windowWidth / n - 2 * space; - } - return width; - }(); - final _scrollController = ScrollController(); _PeersViewState() { @@ -189,61 +178,60 @@ class _PeersViewState extends State<_PeersView> with WindowListener { onVisibilityChanged: onVisibilityChanged, child: widget.peerCardBuilder(peer), ); - final windowWidth = MediaQuery.of(context).size.width; // `Provider.of(context)` will causes infinete loop. // Because `gFFI.peerTabModel.setCurrentTabCachedPeers(peers)` will trigger `notifyListeners()`. // // No need to listen the currentTab change event. // Because the currentTab change event will trigger the peers change event, // and the peers change event will trigger _buildPeersView(). - final currentTab = - Provider.of(context, listen: false).currentTab; - final hideAbTagsPanel = - bind.mainGetLocalOption(key: "hideAbTagsPanel").isNotEmpty; return (isDesktop || isWebDesktop) - ? Obx( - () => SizedBox( - width: peerCardUiType.value != PeerUiType.list - ? 220 - : currentTab == PeerTabIndex.group.index || - (currentTab == PeerTabIndex.ab.index && - !hideAbTagsPanel) - ? windowWidth - 390 - : windowWidth - 227, - height: peerCardUiType.value == PeerUiType.grid - ? 140 - : peerCardUiType.value != PeerUiType.list - ? 42 - : 45, - child: visibilityChild, - ), - ) - : SizedBox(width: mobileWidth, child: visibilityChild); + ? Obx(() => peerCardUiType.value == PeerUiType.list + ? Container(height: 45, child: visibilityChild) + : peerCardUiType.value == PeerUiType.grid + ? SizedBox( + width: 220, height: 140, child: visibilityChild) + : SizedBox( + width: 220, height: 42, child: visibilityChild)) + : Container(child: visibilityChild); } final Widget child; if (isMobile) { - child = DynamicGridView.builder( - gridDelegate: SliverGridDelegateWithWrapping( - mainAxisSpacing: space / 2, crossAxisSpacing: space), + child = ListView.builder( itemCount: peers.length, itemBuilder: (BuildContext context, int index) { - return buildOnePeer(peers[index]); + return buildOnePeer(peers[index]).marginOnly( + top: index == 0 ? 0 : space / 2, bottom: space / 2); }, ); } else { - child = DesktopScrollWrapper( - scrollController: _scrollController, - child: DynamicGridView.builder( - controller: _scrollController, - physics: DraggableNeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithWrapping( - mainAxisSpacing: space / 2, crossAxisSpacing: space), - itemCount: peers.length, - itemBuilder: (BuildContext context, int index) { - return buildOnePeer(peers[index]); - }), - ); + child = Obx(() => peerCardUiType.value == PeerUiType.list + ? DesktopScrollWrapper( + scrollController: _scrollController, + child: ListView.builder( + controller: _scrollController, + physics: DraggableNeverScrollableScrollPhysics(), + itemCount: peers.length, + itemBuilder: (BuildContext context, int index) { + return buildOnePeer(peers[index]).marginOnly( + right: space, + top: index == 0 ? 0 : space / 2, + bottom: space / 2); + }), + ) + : DesktopScrollWrapper( + scrollController: _scrollController, + child: DynamicGridView.builder( + controller: _scrollController, + physics: DraggableNeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithWrapping( + mainAxisSpacing: space / 2, + crossAxisSpacing: space), + itemCount: peers.length, + itemBuilder: (BuildContext context, int index) { + return buildOnePeer(peers[index]); + }), + )); } if (updateEvent == UpdateEvent.load) { diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index 9849e39bf..4dfec2690 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -84,7 +84,7 @@ class AbModel { reset() async { print("reset ab model"); addressbooks.clear(); - setCurrentName(''); + _currentName.value = ''; await bind.mainClearAb(); listInitialized = false; }