feat: remember window size (#404)

Fixes #398
This commit is contained in:
lollipopkit🏳️‍⚧️
2024-06-22 21:52:48 +08:00
committed by GitHub
parent 1fd68722da
commit da8b6a9010
18 changed files with 160 additions and 4 deletions

View File

@@ -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() {
}
}

View File

@@ -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------

View File

@@ -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",

View File

@@ -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}",

View File

@@ -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}",

View File

@@ -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}",

View File

@@ -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}",

View File

@@ -231,6 +231,7 @@
"rememberChoice": "選択を記憶する",
"rememberPwdInMem": "メモリにパスワードを記憶する",
"rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。",
"rememberWindowSize": "ウィンドウサイズを記憶する",
"remotePath": "リモートパス",
"rename": "名前を変更",
"reportBugsOnGithubIssue": "{url}で問題を報告してください",

View File

@@ -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}",

View File

@@ -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}",

View File

@@ -231,6 +231,7 @@
"rememberChoice": "Запомнить выбор",
"rememberPwdInMem": "Запомнить пароль в памяти",
"rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.",
"rememberWindowSize": "Запомнить размер окна",
"remotePath": "удаленный путь",
"rename": "переименовать",
"reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}",

View File

@@ -231,6 +231,7 @@
"rememberChoice": "记住选择",
"rememberPwdInMem": "在内存中记住密码",
"rememberPwdInMemTip": "用于容器、挂起等",
"rememberWindowSize": "记住窗口大小",
"remotePath": "远端路径",
"rename": "重命名",
"reportBugsOnGithubIssue": "请到 {url} 提交问题",

View File

@@ -231,6 +231,7 @@
"rememberChoice": "記住選擇",
"rememberPwdInMem": "在記憶體中記住密碼",
"rememberPwdInMemTip": "用於容器、暫停等",
"rememberWindowSize": "記住窗口大小",
"remotePath": "遠端路徑",
"rename": "重命名",
"reportBugsOnGithubIssue": "請到 {url} 提交問題",

View File

@@ -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<void> _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();

View File

@@ -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<SettingPage> {
_buildCollapseUI(),
_buildCupertinoRoute(),
if (isDesktop) _buildHideTitleBar(),
if (isDesktop) PlatformPublicSettings.buildSaveWindowSize(),
],
);
}

View File

@@ -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;
},
);
},
),
);
}
}

View File

@@ -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"

View File

@@ -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: