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
This commit is contained in:
parent
f9cc8de93e
commit
f853b29fd9
@ -385,10 +385,10 @@ class _AddressBookState extends State<AddressBook> {
|
|||||||
if (canWrite) getEntry(translate("Add Tag"), abAddTag),
|
if (canWrite) getEntry(translate("Add Tag"), abAddTag),
|
||||||
getEntry(translate("Unselect all tags"), gFFI.abModel.unsetSelectedTags),
|
getEntry(translate("Unselect all tags"), gFFI.abModel.unsetSelectedTags),
|
||||||
sortMenuItem(),
|
sortMenuItem(),
|
||||||
syncMenuItem(),
|
if (canWrite) syncMenuItem(),
|
||||||
filterMenuItem(),
|
filterMenuItem(),
|
||||||
if (!gFFI.abModel.legacyMode.value) MenuEntryDivider<String>(),
|
if (!gFFI.abModel.legacyMode.value) MenuEntryDivider<String>(),
|
||||||
if (!gFFI.abModel.legacyMode.value)
|
if (!gFFI.abModel.legacyMode.value && canWrite)
|
||||||
getEntry(translate("ab_web_console_tip"), () async {
|
getEntry(translate("ab_web_console_tip"), () async {
|
||||||
final url = await bind.mainGetApiServer();
|
final url = await bind.mainGetApiServer();
|
||||||
if (await canLaunchUrlString(url)) {
|
if (await canLaunchUrlString(url)) {
|
||||||
|
@ -86,17 +86,6 @@ class _PeersViewState extends State<_PeersView> with WindowListener {
|
|||||||
var _queryCount = 0;
|
var _queryCount = 0;
|
||||||
var _exit = false;
|
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();
|
final _scrollController = ScrollController();
|
||||||
|
|
||||||
_PeersViewState() {
|
_PeersViewState() {
|
||||||
@ -189,61 +178,60 @@ class _PeersViewState extends State<_PeersView> with WindowListener {
|
|||||||
onVisibilityChanged: onVisibilityChanged,
|
onVisibilityChanged: onVisibilityChanged,
|
||||||
child: widget.peerCardBuilder(peer),
|
child: widget.peerCardBuilder(peer),
|
||||||
);
|
);
|
||||||
final windowWidth = MediaQuery.of(context).size.width;
|
|
||||||
// `Provider.of<PeerTabModel>(context)` will causes infinete loop.
|
// `Provider.of<PeerTabModel>(context)` will causes infinete loop.
|
||||||
// Because `gFFI.peerTabModel.setCurrentTabCachedPeers(peers)` will trigger `notifyListeners()`.
|
// Because `gFFI.peerTabModel.setCurrentTabCachedPeers(peers)` will trigger `notifyListeners()`.
|
||||||
//
|
//
|
||||||
// No need to listen the currentTab change event.
|
// No need to listen the currentTab change event.
|
||||||
// Because the currentTab change event will trigger the peers change event,
|
// Because the currentTab change event will trigger the peers change event,
|
||||||
// and the peers change event will trigger _buildPeersView().
|
// and the peers change event will trigger _buildPeersView().
|
||||||
final currentTab =
|
|
||||||
Provider.of<PeerTabModel>(context, listen: false).currentTab;
|
|
||||||
final hideAbTagsPanel =
|
|
||||||
bind.mainGetLocalOption(key: "hideAbTagsPanel").isNotEmpty;
|
|
||||||
return (isDesktop || isWebDesktop)
|
return (isDesktop || isWebDesktop)
|
||||||
? Obx(
|
? Obx(() => peerCardUiType.value == PeerUiType.list
|
||||||
() => SizedBox(
|
? Container(height: 45, child: visibilityChild)
|
||||||
width: peerCardUiType.value != PeerUiType.list
|
: peerCardUiType.value == PeerUiType.grid
|
||||||
? 220
|
? SizedBox(
|
||||||
: currentTab == PeerTabIndex.group.index ||
|
width: 220, height: 140, child: visibilityChild)
|
||||||
(currentTab == PeerTabIndex.ab.index &&
|
: SizedBox(
|
||||||
!hideAbTagsPanel)
|
width: 220, height: 42, child: visibilityChild))
|
||||||
? windowWidth - 390
|
: Container(child: visibilityChild);
|
||||||
: windowWidth - 227,
|
|
||||||
height: peerCardUiType.value == PeerUiType.grid
|
|
||||||
? 140
|
|
||||||
: peerCardUiType.value != PeerUiType.list
|
|
||||||
? 42
|
|
||||||
: 45,
|
|
||||||
child: visibilityChild,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: SizedBox(width: mobileWidth, child: visibilityChild);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final Widget child;
|
final Widget child;
|
||||||
if (isMobile) {
|
if (isMobile) {
|
||||||
child = DynamicGridView.builder(
|
child = ListView.builder(
|
||||||
gridDelegate: SliverGridDelegateWithWrapping(
|
|
||||||
mainAxisSpacing: space / 2, crossAxisSpacing: space),
|
|
||||||
itemCount: peers.length,
|
itemCount: peers.length,
|
||||||
itemBuilder: (BuildContext context, int index) {
|
itemBuilder: (BuildContext context, int index) {
|
||||||
return buildOnePeer(peers[index]);
|
return buildOnePeer(peers[index]).marginOnly(
|
||||||
|
top: index == 0 ? 0 : space / 2, bottom: space / 2);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
child = DesktopScrollWrapper(
|
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,
|
scrollController: _scrollController,
|
||||||
child: DynamicGridView.builder(
|
child: DynamicGridView.builder(
|
||||||
controller: _scrollController,
|
controller: _scrollController,
|
||||||
physics: DraggableNeverScrollableScrollPhysics(),
|
physics: DraggableNeverScrollableScrollPhysics(),
|
||||||
gridDelegate: SliverGridDelegateWithWrapping(
|
gridDelegate: SliverGridDelegateWithWrapping(
|
||||||
mainAxisSpacing: space / 2, crossAxisSpacing: space),
|
mainAxisSpacing: space / 2,
|
||||||
|
crossAxisSpacing: space),
|
||||||
itemCount: peers.length,
|
itemCount: peers.length,
|
||||||
itemBuilder: (BuildContext context, int index) {
|
itemBuilder: (BuildContext context, int index) {
|
||||||
return buildOnePeer(peers[index]);
|
return buildOnePeer(peers[index]);
|
||||||
}),
|
}),
|
||||||
);
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateEvent == UpdateEvent.load) {
|
if (updateEvent == UpdateEvent.load) {
|
||||||
|
@ -84,7 +84,7 @@ class AbModel {
|
|||||||
reset() async {
|
reset() async {
|
||||||
print("reset ab model");
|
print("reset ab model");
|
||||||
addressbooks.clear();
|
addressbooks.clear();
|
||||||
setCurrentName('');
|
_currentName.value = '';
|
||||||
await bind.mainClearAb();
|
await bind.mainClearAb();
|
||||||
listInitialized = false;
|
listInitialized = false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user