mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
88
lib/core/utils/window_size_listener.dart
Normal file
88
lib/core/utils/window_size_listener.dart
Normal 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() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -276,6 +276,10 @@ class SettingStore extends PersistentStore {
|
|||||||
|
|
||||||
late final betaTest = property('betaTest', false);
|
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
|
// Never show these settings for users
|
||||||
//
|
//
|
||||||
// ------BEGIN------
|
// ------BEGIN------
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Auswahl merken",
|
"rememberChoice": "Auswahl merken",
|
||||||
"rememberPwdInMem": "Passwort im Speicher behalten",
|
"rememberPwdInMem": "Passwort im Speicher behalten",
|
||||||
"rememberPwdInMemTip": "Für Container, Aufhängen usw.",
|
"rememberPwdInMemTip": "Für Container, Aufhängen usw.",
|
||||||
|
"rememberWindowSize": "Fenstergröße merken",
|
||||||
"remotePath": "Entfernte Pfade",
|
"remotePath": "Entfernte Pfade",
|
||||||
"rename": "Umbenennen",
|
"rename": "Umbenennen",
|
||||||
"reportBugsOnGithubIssue": "Bitte Bugs auf {url} melden",
|
"reportBugsOnGithubIssue": "Bitte Bugs auf {url} melden",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Remember the selection",
|
"rememberChoice": "Remember the selection",
|
||||||
"rememberPwdInMem": "Remember password in memory",
|
"rememberPwdInMem": "Remember password in memory",
|
||||||
"rememberPwdInMemTip": "Used for containers, suspending, etc.",
|
"rememberPwdInMemTip": "Used for containers, suspending, etc.",
|
||||||
|
"rememberWindowSize": "Remember window size",
|
||||||
"remotePath": "Remote path",
|
"remotePath": "Remote path",
|
||||||
"rename": "Rename",
|
"rename": "Rename",
|
||||||
"reportBugsOnGithubIssue": "Please report bugs on {url}",
|
"reportBugsOnGithubIssue": "Please report bugs on {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Recordar la selección",
|
"rememberChoice": "Recordar la selección",
|
||||||
"rememberPwdInMem": "Recordar contraseña en la memoria",
|
"rememberPwdInMem": "Recordar contraseña en la memoria",
|
||||||
"rememberPwdInMemTip": "Utilizado para contenedores, suspensión, etc.",
|
"rememberPwdInMemTip": "Utilizado para contenedores, suspensión, etc.",
|
||||||
|
"rememberWindowSize": "Recordar el tamaño de la ventana",
|
||||||
"remotePath": "Ruta remota",
|
"remotePath": "Ruta remota",
|
||||||
"rename": "Renombrar",
|
"rename": "Renombrar",
|
||||||
"reportBugsOnGithubIssue": "Por favor, informa los problemas en {url}",
|
"reportBugsOnGithubIssue": "Por favor, informa los problemas en {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Se souvenir du choix",
|
"rememberChoice": "Se souvenir du choix",
|
||||||
"rememberPwdInMem": "Mémoriser le mot de passe en mémoire",
|
"rememberPwdInMem": "Mémoriser le mot de passe en mémoire",
|
||||||
"rememberPwdInMemTip": "Utilisé pour les conteneurs, la suspension, etc.",
|
"rememberPwdInMemTip": "Utilisé pour les conteneurs, la suspension, etc.",
|
||||||
|
"rememberWindowSize": "Se souvenir de la taille de la fenêtre",
|
||||||
"remotePath": "Chemin distant",
|
"remotePath": "Chemin distant",
|
||||||
"rename": "Renommer",
|
"rename": "Renommer",
|
||||||
"reportBugsOnGithubIssue": "Veuillez signaler les bugs sur {url}",
|
"reportBugsOnGithubIssue": "Veuillez signaler les bugs sur {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Ingat pilihan",
|
"rememberChoice": "Ingat pilihan",
|
||||||
"rememberPwdInMem": "Ingat kata sandi di dalam memori",
|
"rememberPwdInMem": "Ingat kata sandi di dalam memori",
|
||||||
"rememberPwdInMemTip": "Digunakan untuk kontainer, menangguhkan, dll.",
|
"rememberPwdInMemTip": "Digunakan untuk kontainer, menangguhkan, dll.",
|
||||||
|
"rememberWindowSize": "Ingat ukuran jendela",
|
||||||
"remotePath": "Jalur jarak jauh",
|
"remotePath": "Jalur jarak jauh",
|
||||||
"rename": "Ganti nama",
|
"rename": "Ganti nama",
|
||||||
"reportBugsOnGithubIssue": "Harap laporkan bug di {url}",
|
"reportBugsOnGithubIssue": "Harap laporkan bug di {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "選択を記憶する",
|
"rememberChoice": "選択を記憶する",
|
||||||
"rememberPwdInMem": "メモリにパスワードを記憶する",
|
"rememberPwdInMem": "メモリにパスワードを記憶する",
|
||||||
"rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。",
|
"rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。",
|
||||||
|
"rememberWindowSize": "ウィンドウサイズを記憶する",
|
||||||
"remotePath": "リモートパス",
|
"remotePath": "リモートパス",
|
||||||
"rename": "名前を変更",
|
"rename": "名前を変更",
|
||||||
"reportBugsOnGithubIssue": "{url}で問題を報告してください",
|
"reportBugsOnGithubIssue": "{url}で問題を報告してください",
|
||||||
|
|||||||
@@ -230,6 +230,7 @@
|
|||||||
"rememberChoice": "Selectie onthouden",
|
"rememberChoice": "Selectie onthouden",
|
||||||
"rememberPwdInMem": "Wachtwoord onthouden in geheugen",
|
"rememberPwdInMem": "Wachtwoord onthouden in geheugen",
|
||||||
"rememberPwdInMemTip": "Gebruikt voor containers, opschorting, enz.",
|
"rememberPwdInMemTip": "Gebruikt voor containers, opschorting, enz.",
|
||||||
|
"rememberWindowSize": "Venstergrootte onthouden",
|
||||||
"remotePath": "Extern pad",
|
"remotePath": "Extern pad",
|
||||||
"rename": "Hernoemen",
|
"rename": "Hernoemen",
|
||||||
"reportBugsOnGithubIssue": "Meld alstublieft bugs op {url}",
|
"reportBugsOnGithubIssue": "Meld alstublieft bugs op {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Lembrar da seleção",
|
"rememberChoice": "Lembrar da seleção",
|
||||||
"rememberPwdInMem": "Lembrar senha na memória",
|
"rememberPwdInMem": "Lembrar senha na memória",
|
||||||
"rememberPwdInMemTip": "Usado para contêineres, suspensão, etc.",
|
"rememberPwdInMemTip": "Usado para contêineres, suspensão, etc.",
|
||||||
|
"rememberWindowSize": "Lembrar o tamanho da janela",
|
||||||
"remotePath": "Caminho remoto",
|
"remotePath": "Caminho remoto",
|
||||||
"rename": "Renomear",
|
"rename": "Renomear",
|
||||||
"reportBugsOnGithubIssue": "Por favor, reporte problemas em {url}",
|
"reportBugsOnGithubIssue": "Por favor, reporte problemas em {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "Запомнить выбор",
|
"rememberChoice": "Запомнить выбор",
|
||||||
"rememberPwdInMem": "Запомнить пароль в памяти",
|
"rememberPwdInMem": "Запомнить пароль в памяти",
|
||||||
"rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.",
|
"rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.",
|
||||||
|
"rememberWindowSize": "Запомнить размер окна",
|
||||||
"remotePath": "удаленный путь",
|
"remotePath": "удаленный путь",
|
||||||
"rename": "переименовать",
|
"rename": "переименовать",
|
||||||
"reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}",
|
"reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "记住选择",
|
"rememberChoice": "记住选择",
|
||||||
"rememberPwdInMem": "在内存中记住密码",
|
"rememberPwdInMem": "在内存中记住密码",
|
||||||
"rememberPwdInMemTip": "用于容器、挂起等",
|
"rememberPwdInMemTip": "用于容器、挂起等",
|
||||||
|
"rememberWindowSize": "记住窗口大小",
|
||||||
"remotePath": "远端路径",
|
"remotePath": "远端路径",
|
||||||
"rename": "重命名",
|
"rename": "重命名",
|
||||||
"reportBugsOnGithubIssue": "请到 {url} 提交问题",
|
"reportBugsOnGithubIssue": "请到 {url} 提交问题",
|
||||||
|
|||||||
@@ -231,6 +231,7 @@
|
|||||||
"rememberChoice": "記住選擇",
|
"rememberChoice": "記住選擇",
|
||||||
"rememberPwdInMem": "在記憶體中記住密碼",
|
"rememberPwdInMem": "在記憶體中記住密碼",
|
||||||
"rememberPwdInMemTip": "用於容器、暫停等",
|
"rememberPwdInMemTip": "用於容器、暫停等",
|
||||||
|
"rememberWindowSize": "記住窗口大小",
|
||||||
"remotePath": "遠端路徑",
|
"remotePath": "遠端路徑",
|
||||||
"rename": "重命名",
|
"rename": "重命名",
|
||||||
"reportBugsOnGithubIssue": "請到 {url} 提交問題",
|
"reportBugsOnGithubIssue": "請到 {url} 提交問題",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import 'package:flutter_displaymode/flutter_displaymode.dart';
|
|||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:provider/provider.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:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:server_box/app.dart';
|
import 'package:server_box/app.dart';
|
||||||
import 'package:server_box/core/utils/sync/icloud.dart';
|
import 'package:server_box/core/utils/sync/icloud.dart';
|
||||||
@@ -68,7 +69,12 @@ Future<void> _initApp() async {
|
|||||||
await _initData();
|
await _initData();
|
||||||
_setupDebug();
|
_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());
|
FontUtils.loadFrom(Stores.setting.fontPath.fetch());
|
||||||
|
|
||||||
_doPlatformRelated();
|
_doPlatformRelated();
|
||||||
|
|||||||
@@ -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/rebuild.dart';
|
||||||
import 'package:server_box/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
import 'package:server_box/data/res/url.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 '../../../core/route.dart';
|
||||||
import '../../../data/model/app/net_view.dart';
|
import '../../../data/model/app/net_view.dart';
|
||||||
@@ -1071,6 +1072,7 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
_buildCollapseUI(),
|
_buildCollapseUI(),
|
||||||
_buildCupertinoRoute(),
|
_buildCupertinoRoute(),
|
||||||
if (isDesktop) _buildHideTitleBar(),
|
if (isDesktop) _buildHideTitleBar(),
|
||||||
|
if (isDesktop) PlatformPublicSettings.buildSaveWindowSize(),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:fl_lib/fl_lib.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:server_box/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:server_box/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
abstract final class PlatformPublicSettings {
|
abstract final class PlatformPublicSettings {
|
||||||
static Widget buildBioAuth() {
|
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;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -385,8 +385,8 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: "v1.0.44"
|
ref: "v1.0.45"
|
||||||
resolved-ref: "34a8ec3c66594feaa417043cf2173fa7a1cf9b81"
|
resolved-ref: ec8b29583a872130a536745eb2ff34f3f71ec042
|
||||||
url: "https://github.com/lppcg/fl_lib"
|
url: "https://github.com/lppcg/fl_lib"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ dependencies:
|
|||||||
fl_lib:
|
fl_lib:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/lppcg/fl_lib
|
url: https://github.com/lppcg/fl_lib
|
||||||
ref: v1.0.44
|
ref: v1.0.45
|
||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
# dartssh2:
|
# dartssh2:
|
||||||
|
|||||||
Reference in New Issue
Block a user