From da8b6a90102be6df40a3c1e4b4077d8a827f494f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Sat, 22 Jun 2024 21:52:48 +0800 Subject: [PATCH] feat: remember window size (#404) Fixes #398 --- lib/core/utils/window_size_listener.dart | 88 +++++++++++++++++++ lib/data/store/setting.dart | 4 + lib/l10n/app_de.arb | 1 + lib/l10n/app_en.arb | 1 + lib/l10n/app_es.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_id.arb | 1 + lib/l10n/app_ja.arb | 1 + lib/l10n/app_nl.arb | 1 + lib/l10n/app_pt.arb | 1 + lib/l10n/app_ru.arb | 1 + lib/l10n/app_zh.arb | 1 + lib/l10n/app_zh_tw.arb | 1 + lib/main.dart | 8 +- lib/view/page/setting/entry.dart | 2 + .../page/setting/platform/platform_pub.dart | 45 ++++++++++ pubspec.lock | 4 +- pubspec.yaml | 2 +- 18 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 lib/core/utils/window_size_listener.dart diff --git a/lib/core/utils/window_size_listener.dart b/lib/core/utils/window_size_listener.dart new file mode 100644 index 00000000..1fc75271 --- /dev/null +++ b/lib/core/utils/window_size_listener.dart @@ -0,0 +1,88 @@ +import 'package:fl_lib/fl_lib.dart'; +import 'package:server_box/data/res/store.dart'; +import 'package:window_manager/window_manager.dart'; + +abstract final class WindowSizeListener { + static final _WindowSizeListener instance = _WindowSizeListener(); +} + +final class _WindowSizeListener implements WindowListener { + @override + void onWindowBlur() { + } + + @override + void onWindowClose() { + } + + @override + void onWindowDocked() { + } + + @override + void onWindowEnterFullScreen() { + } + + @override + void onWindowEvent(String eventName) { + } + + @override + void onWindowFocus() { + } + + @override + void onWindowLeaveFullScreen() { + } + + @override + void onWindowMaximize() { + } + + @override + void onWindowMinimize() { + } + + @override + void onWindowMove() { + } + + @override + void onWindowMoved() { + } + + @override + void onWindowResize() { + if (!isLinux) return; + final current = Stores.setting.windowSize.fetch(); + if (current.isEmpty) return; + + windowManager.getSize().then((size) { + Stores.setting.windowSize.put(size.toIntStr()); + }); + } + + @override + void onWindowResized() { + if (!isMacOS || !isWindows) return; + final current = Stores.setting.windowSize.fetch(); + if (current.isEmpty) return; + + windowManager.getSize().then((size) { + Stores.setting.windowSize.put(size.toIntStr()); + }); + } + + @override + void onWindowRestore() { + } + + @override + void onWindowUndocked() { + } + + @override + void onWindowUnmaximize() { + } + +} \ No newline at end of file diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 18fb94b7..48fb1607 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -276,6 +276,10 @@ class SettingStore extends PersistentStore { late final betaTest = property('betaTest', false); + /// If it's empty, skip change window size. + /// Format: {width}x{height} + late final windowSize = property('windowSize', ''); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 23ae0301..7cd69b46 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -231,6 +231,7 @@ "rememberChoice": "Auswahl merken", "rememberPwdInMem": "Passwort im Speicher behalten", "rememberPwdInMemTip": "Für Container, Aufhängen usw.", + "rememberWindowSize": "Fenstergröße merken", "remotePath": "Entfernte Pfade", "rename": "Umbenennen", "reportBugsOnGithubIssue": "Bitte Bugs auf {url} melden", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7dcf917d..2d9136cc 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -231,6 +231,7 @@ "rememberChoice": "Remember the selection", "rememberPwdInMem": "Remember password in memory", "rememberPwdInMemTip": "Used for containers, suspending, etc.", + "rememberWindowSize": "Remember window size", "remotePath": "Remote path", "rename": "Rename", "reportBugsOnGithubIssue": "Please report bugs on {url}", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 23b88dfa..120803b3 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -231,6 +231,7 @@ "rememberChoice": "Recordar la selección", "rememberPwdInMem": "Recordar contraseña en la memoria", "rememberPwdInMemTip": "Utilizado para contenedores, suspensión, etc.", + "rememberWindowSize": "Recordar el tamaño de la ventana", "remotePath": "Ruta remota", "rename": "Renombrar", "reportBugsOnGithubIssue": "Por favor, informa los problemas en {url}", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index c6b773e2..ec3cc4a9 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -231,6 +231,7 @@ "rememberChoice": "Se souvenir du choix", "rememberPwdInMem": "Mémoriser le mot de passe en mémoire", "rememberPwdInMemTip": "Utilisé pour les conteneurs, la suspension, etc.", + "rememberWindowSize": "Se souvenir de la taille de la fenêtre", "remotePath": "Chemin distant", "rename": "Renommer", "reportBugsOnGithubIssue": "Veuillez signaler les bugs sur {url}", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index b7252aed..7f81f66d 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -231,6 +231,7 @@ "rememberChoice": "Ingat pilihan", "rememberPwdInMem": "Ingat kata sandi di dalam memori", "rememberPwdInMemTip": "Digunakan untuk kontainer, menangguhkan, dll.", + "rememberWindowSize": "Ingat ukuran jendela", "remotePath": "Jalur jarak jauh", "rename": "Ganti nama", "reportBugsOnGithubIssue": "Harap laporkan bug di {url}", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 13643674..bff98c37 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -231,6 +231,7 @@ "rememberChoice": "選択を記憶する", "rememberPwdInMem": "メモリにパスワードを記憶する", "rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。", + "rememberWindowSize": "ウィンドウサイズを記憶する", "remotePath": "リモートパス", "rename": "名前を変更", "reportBugsOnGithubIssue": "{url}で問題を報告してください", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 250479f5..7898b6ba 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -230,6 +230,7 @@ "rememberChoice": "Selectie onthouden", "rememberPwdInMem": "Wachtwoord onthouden in geheugen", "rememberPwdInMemTip": "Gebruikt voor containers, opschorting, enz.", + "rememberWindowSize": "Venstergrootte onthouden", "remotePath": "Extern pad", "rename": "Hernoemen", "reportBugsOnGithubIssue": "Meld alstublieft bugs op {url}", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 96696910..1f6f241e 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -231,6 +231,7 @@ "rememberChoice": "Lembrar da seleção", "rememberPwdInMem": "Lembrar senha na memória", "rememberPwdInMemTip": "Usado para contêineres, suspensão, etc.", + "rememberWindowSize": "Lembrar o tamanho da janela", "remotePath": "Caminho remoto", "rename": "Renomear", "reportBugsOnGithubIssue": "Por favor, reporte problemas em {url}", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index d753f2de..0f9fe383 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -231,6 +231,7 @@ "rememberChoice": "Запомнить выбор", "rememberPwdInMem": "Запомнить пароль в памяти", "rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.", + "rememberWindowSize": "Запомнить размер окна", "remotePath": "удаленный путь", "rename": "переименовать", "reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index d71b1569..c5628f59 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -231,6 +231,7 @@ "rememberChoice": "记住选择", "rememberPwdInMem": "在内存中记住密码", "rememberPwdInMemTip": "用于容器、挂起等", + "rememberWindowSize": "记住窗口大小", "remotePath": "远端路径", "rename": "重命名", "reportBugsOnGithubIssue": "请到 {url} 提交问题", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 836046ab..a0dfff2c 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -231,6 +231,7 @@ "rememberChoice": "記住選擇", "rememberPwdInMem": "在記憶體中記住密碼", "rememberPwdInMemTip": "用於容器、暫停等", + "rememberWindowSize": "記住窗口大小", "remotePath": "遠端路徑", "rename": "重命名", "reportBugsOnGithubIssue": "請到 {url} 提交問題", diff --git a/lib/main.dart b/lib/main.dart index c830e927..fe568791 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; +import 'package:server_box/core/utils/window_size_listener.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:server_box/app.dart'; import 'package:server_box/core/utils/sync/icloud.dart'; @@ -68,7 +69,12 @@ Future _initApp() async { await _initData(); _setupDebug(); - SystemUIs.initDesktopWindow(Stores.setting.hideTitleBar.fetch()); + final windowSize = Stores.setting.windowSize.fetch().toSize(); + SystemUIs.initDesktopWindow( + hideTitleBar: Stores.setting.hideTitleBar.fetch(), + size: windowSize, + listener: WindowSizeListener.instance, + ); FontUtils.loadFrom(Stores.setting.fontPath.fetch()); _doPlatformRelated(); diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index b56e25ef..262cec86 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -11,6 +11,7 @@ import 'package:server_box/data/res/provider.dart'; import 'package:server_box/data/res/rebuild.dart'; import 'package:server_box/data/res/store.dart'; import 'package:server_box/data/res/url.dart'; +import 'package:server_box/view/page/setting/platform/platform_pub.dart'; import '../../../core/route.dart'; import '../../../data/model/app/net_view.dart'; @@ -1071,6 +1072,7 @@ class _SettingPageState extends State { _buildCollapseUI(), _buildCupertinoRoute(), if (isDesktop) _buildHideTitleBar(), + if (isDesktop) PlatformPublicSettings.buildSaveWindowSize(), ], ); } diff --git a/lib/view/page/setting/platform/platform_pub.dart b/lib/view/page/setting/platform/platform_pub.dart index 5aff7f9a..6635e601 100644 --- a/lib/view/page/setting/platform/platform_pub.dart +++ b/lib/view/page/setting/platform/platform_pub.dart @@ -2,6 +2,7 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:flutter/material.dart'; import 'package:server_box/core/extension/context/locale.dart'; import 'package:server_box/data/res/store.dart'; +import 'package:window_manager/window_manager.dart'; abstract final class PlatformPublicSettings { static Widget buildBioAuth() { @@ -45,4 +46,48 @@ abstract final class PlatformPublicSettings { }, ); } + + static Widget buildSaveWindowSize() { + final isBusy = false.vn; + // Only show [FadeIn] when previous state is busy. + var lastIsBusy = false; + final prop = Stores.setting.windowSize; + + return ListTile( + title: Text(l10n.rememberWindowSize), + /// Copied from `fl_build/view/store_switch` + trailing: ValBuilder( + listenable: isBusy, + builder: (busy) { + return ValBuilder( + listenable: prop.listenable(), + builder: (value) { + if (busy) { + lastIsBusy = true; + return UIs.centerSizedLoadingSmall.paddingOnly(right: 17); + } + + final switcher = Switch( + value: value.isNotEmpty, + onChanged: (value) async { + isBusy.value = true; + final size = await windowManager.getSize(); + isBusy.value = false; + prop.put(size.toIntStr()); + }, + ); + + if (lastIsBusy) { + final ret = FadeIn(child: switcher); + lastIsBusy = false; + return ret; + } + + return switcher; + }, + ); + }, + ), + ); + } } diff --git a/pubspec.lock b/pubspec.lock index b97717cd..40610154 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -385,8 +385,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.44" - resolved-ref: "34a8ec3c66594feaa417043cf2173fa7a1cf9b81" + ref: "v1.0.45" + resolved-ref: ec8b29583a872130a536745eb2ff34f3f71ec042 url: "https://github.com/lppcg/fl_lib" source: git version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index 2cfe0a28..68dbc701 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,7 +58,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.44 + ref: v1.0.45 dependency_overrides: # dartssh2: