From 21eb7bd1651e586d2573b667d3fe7ba3f54091cf Mon Sep 17 00:00:00 2001 From: Kingtous Date: Mon, 19 Sep 2022 16:06:03 +0800 Subject: [PATCH] opt: more configurable scroll logic & edge size --- flutter/lib/common.dart | 1 + .../lib/desktop/pages/desktop_tab_page.dart | 2 +- .../desktop/pages/file_manager_tab_page.dart | 1 + .../desktop/pages/port_forward_tab_page.dart | 1 + .../lib/desktop/pages/remote_tab_page.dart | 2 +- flutter/lib/desktop/widgets/peer_widget.dart | 97 ++++++++++--------- .../lib/desktop/widgets/scroll_wrapper.dart | 21 ++++ flutter/pubspec.yaml | 1 + 8 files changed, 79 insertions(+), 47 deletions(-) create mode 100644 flutter/lib/desktop/widgets/scroll_wrapper.dart diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 3e08d1e0c..dfe96c903 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -248,6 +248,7 @@ List supportedLocales = const [ // specify CN/TW to fix CJK issue in flutter Locale('zh', 'CN'), Locale('zh', 'TW'), + Locale('zh', 'SG'), Locale('fr'), Locale('de'), Locale('it'), diff --git a/flutter/lib/desktop/pages/desktop_tab_page.dart b/flutter/lib/desktop/pages/desktop_tab_page.dart index a117bab12..8a49f4cde 100644 --- a/flutter/lib/desktop/pages/desktop_tab_page.dart +++ b/flutter/lib/desktop/pages/desktop_tab_page.dart @@ -60,7 +60,7 @@ class _DesktopTabPageState extends State { return Platform.isMacOS ? tabWidget : Obx(() => DragToResizeArea( - resizeEdgeSize: fullscreen.value ? 1.0 : 8.0, child: tabWidget)); + resizeEdgeSize: fullscreen.value ? 1.0 : 4.0, child: tabWidget)); } void onAddSetting() { diff --git a/flutter/lib/desktop/pages/file_manager_tab_page.dart b/flutter/lib/desktop/pages/file_manager_tab_page.dart index bfaf33327..086f3b184 100644 --- a/flutter/lib/desktop/pages/file_manager_tab_page.dart +++ b/flutter/lib/desktop/pages/file_manager_tab_page.dart @@ -81,6 +81,7 @@ class _FileManagerTabPageState extends State { return Platform.isMacOS ? tabWidget : SubWindowDragToResizeArea( + resizeEdgeSize: 4.0, windowId: windowId(), child: tabWidget, ); diff --git a/flutter/lib/desktop/pages/port_forward_tab_page.dart b/flutter/lib/desktop/pages/port_forward_tab_page.dart index f142508de..b92943f13 100644 --- a/flutter/lib/desktop/pages/port_forward_tab_page.dart +++ b/flutter/lib/desktop/pages/port_forward_tab_page.dart @@ -92,6 +92,7 @@ class _PortForwardTabPageState extends State { return Platform.isMacOS ? tabWidget : SubWindowDragToResizeArea( + resizeEdgeSize: 4.0, windowId: windowId(), child: tabWidget, ); diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 5ea94f4a9..70003483a 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -143,7 +143,7 @@ class _ConnectionTabPageState extends State { return Platform.isMacOS ? tabWidget : Obx(() => SubWindowDragToResizeArea( - resizeEdgeSize: fullscreen.value ? 1.0 : 8.0, + resizeEdgeSize: fullscreen.value ? 1.0 : 4.0, windowId: windowId(), child: tabWidget)); } diff --git a/flutter/lib/desktop/widgets/peer_widget.dart b/flutter/lib/desktop/widgets/peer_widget.dart index f137241a9..07a621add 100644 --- a/flutter/lib/desktop/widgets/peer_widget.dart +++ b/flutter/lib/desktop/widgets/peer_widget.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; import 'package:visibility_detector/visibility_detector.dart'; @@ -41,6 +42,7 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener { static const int _maxQueryCount = 3; final _curPeers = {}; + final _scrollController = ScrollController(); var _lastChangeTime = DateTime.now(); var _lastQueryPeers = {}; var _lastQueryTime = DateTime.now().subtract(const Duration(hours: 1)); @@ -84,53 +86,58 @@ class _PeerWidgetState extends State<_PeerWidget> with WindowListener { ? Center( child: Text(translate("Empty")), ) - : SingleChildScrollView( - 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), + : DesktopScrollWrapper( + scrollController: _scrollController, + child: SingleChildScrollView( + 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(), + ); } - return Wrap( - spacing: space, runSpacing: space, children: cards); - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - future: matchPeers(searchText.value, peers.peers), - ); - }, peerSearchText), + }, + future: matchPeers(searchText.value, peers.peers), + ); + }, peerSearchText), + ), ), ), ); diff --git a/flutter/lib/desktop/widgets/scroll_wrapper.dart b/flutter/lib/desktop/widgets/scroll_wrapper.dart new file mode 100644 index 000000000..dc333205f --- /dev/null +++ b/flutter/lib/desktop/widgets/scroll_wrapper.dart @@ -0,0 +1,21 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_improved_scrolling/flutter_improved_scrolling.dart'; + +class DesktopScrollWrapper extends StatelessWidget { + final ScrollController scrollController; + final Widget child; + const DesktopScrollWrapper( + {Key? key, required this.scrollController, required this.child}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return ImprovedScrolling( + scrollController: scrollController, + enableCustomMouseWheelScrolling: false, + customMouseWheelScrollConfig: + const CustomMouseWheelScrollConfig(scrollAmountMultiplier: 3.0), + child: child, + ); + } +} diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 9248fe80e..9bc8816ef 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -80,6 +80,7 @@ dependencies: desktop_drop: ^0.3.3 scroll_pos: ^0.3.0 rxdart: ^0.27.5 + flutter_improved_scrolling: ^0.0.3 dev_dependencies: icons_launcher: ^2.0.4