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);
|
||||
|
||||
/// If it's empty, skip change window size.
|
||||
/// Format: {width}x{height}
|
||||
late final windowSize = property('windowSize', '');
|
||||
|
||||
// Never show these settings for users
|
||||
//
|
||||
// ------BEGIN------
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -231,6 +231,7 @@
|
||||
"rememberChoice": "選択を記憶する",
|
||||
"rememberPwdInMem": "メモリにパスワードを記憶する",
|
||||
"rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。",
|
||||
"rememberWindowSize": "ウィンドウサイズを記憶する",
|
||||
"remotePath": "リモートパス",
|
||||
"rename": "名前を変更",
|
||||
"reportBugsOnGithubIssue": "{url}で問題を報告してください",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -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}",
|
||||
|
||||
@@ -231,6 +231,7 @@
|
||||
"rememberChoice": "Запомнить выбор",
|
||||
"rememberPwdInMem": "Запомнить пароль в памяти",
|
||||
"rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.",
|
||||
"rememberWindowSize": "Запомнить размер окна",
|
||||
"remotePath": "удаленный путь",
|
||||
"rename": "переименовать",
|
||||
"reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}",
|
||||
|
||||
@@ -231,6 +231,7 @@
|
||||
"rememberChoice": "记住选择",
|
||||
"rememberPwdInMem": "在内存中记住密码",
|
||||
"rememberPwdInMemTip": "用于容器、挂起等",
|
||||
"rememberWindowSize": "记住窗口大小",
|
||||
"remotePath": "远端路径",
|
||||
"rename": "重命名",
|
||||
"reportBugsOnGithubIssue": "请到 {url} 提交问题",
|
||||
|
||||
@@ -231,6 +231,7 @@
|
||||
"rememberChoice": "記住選擇",
|
||||
"rememberPwdInMem": "在記憶體中記住密碼",
|
||||
"rememberPwdInMemTip": "用於容器、暫停等",
|
||||
"rememberWindowSize": "記住窗口大小",
|
||||
"remotePath": "遠端路徑",
|
||||
"rename": "重命名",
|
||||
"reportBugsOnGithubIssue": "請到 {url} 提交問題",
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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(),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user