From 4fd82afadeeb90da8094e4d692225551514c1862 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Mon, 8 Apr 2024 23:43:24 +0800 Subject: [PATCH] new: `hideTitlebar` & `cupertinoRoute` --- lib/core/route.dart | 6 ++++- lib/data/model/server/cpu.dart | 37 ++++++++++++++++----------- lib/data/store/setting.dart | 6 +++++ lib/l10n/app_de.arb | 2 ++ lib/l10n/app_en.arb | 2 ++ lib/l10n/app_es.arb | 2 ++ lib/l10n/app_fr.arb | 2 ++ lib/l10n/app_id.arb | 2 ++ lib/l10n/app_ja.arb | 2 ++ lib/l10n/app_pt.arb | 2 ++ lib/l10n/app_ru.arb | 2 ++ lib/l10n/app_zh.arb | 2 ++ lib/l10n/app_zh_tw.arb | 2 ++ lib/main.dart | 4 +-- lib/view/page/home/home.dart | 2 +- lib/view/page/server/detail/misc.dart | 14 +++++----- lib/view/page/server/detail/view.dart | 3 +-- lib/view/page/setting/entry.dart | 27 ++++++++++++++++++- lib/view/widget/appbar.dart | 3 ++- 19 files changed, 93 insertions(+), 29 deletions(-) diff --git a/lib/core/route.dart b/lib/core/route.dart index 6ec97f68..f6ac80bb 100644 --- a/lib/core/route.dart +++ b/lib/core/route.dart @@ -1,7 +1,9 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:toolbox/core/analysis.dart'; import 'package:toolbox/data/model/server/private_key_info.dart'; import 'package:toolbox/data/model/server/server_private_info.dart'; +import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/page/backup.dart'; import 'package:toolbox/view/page/container.dart'; import 'package:toolbox/view/page/home/home.dart'; @@ -43,7 +45,9 @@ class AppRoute { Analysis.recordView(title); return Navigator.push( context, - MaterialPageRoute(builder: (context) => page), + Stores.setting.cupertinoRoute.fetch() + ? CupertinoPageRoute(builder: (context) => page) + : MaterialPageRoute(builder: (context) => page), ); } diff --git a/lib/data/model/server/cpu.dart b/lib/data/model/server/cpu.dart index 530b0619..33b9f3b1 100644 --- a/lib/data/model/server/cpu.dart +++ b/lib/data/model/server/cpu.dart @@ -67,15 +67,21 @@ class Cpus extends TimeSeq> { double get idle => _idle; double _getIdle() => 100 - usedPercent(); + void _coresLoop(void Function(int i) callback) { + /// Only update the entire core when [coresCount] > 4, or the chart will be too crowded + final onlyCalcSingle = coresCount > 4; + final maxIdx = onlyCalcSingle ? 1 : coresCount; + for (var i = onlyCalcSingle ? 0 : 1; i < maxIdx; i++) { + callback(i); + } + } + /// [core1, core2] /// core1: [FlSpot(0, 10), FlSpot(1, 20), FlSpot(2, 30)] final _spots = >[]; List> get spots => _spots; void _updateSpots() { - /// Only update the entire core when [coresCount] > 4, or the chart will be too crowded - final onlyCalcSingle = coresCount > 4; - final maxIdx = onlyCalcSingle ? 1 : coresCount; - for (var i = onlyCalcSingle ? 0 : 1; i < maxIdx; i++) { + _coresLoop((i) { if (i >= _spots.length) { _spots.add(Fifo(capacity: _kCap)); } else { @@ -83,7 +89,7 @@ class Cpus extends TimeSeq> { final spot = FlSpot(item.count.toDouble(), usedPercent(coreIdx: i)); item.add(spot); } - } + }); } var _rangeX = Range(0.0, _kCap.toDouble()); @@ -91,16 +97,17 @@ class Cpus extends TimeSeq> { // var _rangeY = Range(0.0, 100.0); // Range get rangeY => _rangeY; void _updateRange() { - double? minX, maxX; - for (var i = 1; i < now.length; i++) { - final item = _spots[i]; - if (item.isEmpty) continue; - final first = item.first.x; - final last = item.last.x; - if (minX == null || first < minX) minX = first; - if (maxX == null || last > maxX) maxX = last; - } - if (minX != null && maxX != null) _rangeX = Range(minX, maxX); + double minX = 0; + double maxX = 0; + _coresLoop((i) { + final fifo = _spots[i]; + if (fifo.isEmpty) return; + final first = fifo.first.x; + final last = fifo.last.x; + if (first > minX) minX = first; + if (last > maxX) maxX = last; + }); + _rangeX = Range(minX, maxX); // double? minY, maxY; // for (var i = 1; i < now.length; i++) { diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index d3ab802b..711a89e4 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -256,6 +256,12 @@ class SettingStore extends PersistentStore { late final lastVer = property('lastVer', 0); + /// Use CupertinoPageRoute for all routes + late final cupertinoRoute = property('cupertinoRoute', isIOS); + + /// Hide title bar on desktop + late final hideTitleBar = property('hideTitleBar', isDesktop); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 76dcd7c8..7810a3ae 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -113,6 +113,7 @@ "gettingToken": "Getting token...", "goBackQ": "Zurückkommen?", "goto": "Pfad öffnen", + "hideTitleBar": "Titelleiste ausblenden", "highlight": "Code highlight", "homeWidgetUrlConfig": "Home-Widget-Link konfigurieren", "host": "Host", @@ -221,6 +222,7 @@ "restoreSuccess": "Wiederherstellung erfolgreich. App neustarten um Änderungen anzuwenden.", "result": "Result", "rotateAngel": "Rotationswinkel", + "route": "Routen", "run": "Ausführen", "running": "läuft", "save": "Speichern", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a02cc559..51fad05e 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -113,6 +113,7 @@ "gettingToken": "Getting token...", "goBackQ": "Go back?", "goto": "Go to", + "hideTitleBar": "Hide title bar", "highlight": "Code highlight", "homeWidgetUrlConfig": "Config home widget url", "host": "Host", @@ -221,6 +222,7 @@ "restoreSuccess": "Restore success. Restart app to apply.", "result": "Result", "rotateAngel": "Rotation angle", + "route": "Routing", "run": "Run", "running": "Running", "save": "Save", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 1e58fca0..55886692 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -113,6 +113,7 @@ "gettingToken": "Obteniendo Token...", "goBackQ": "¿Regresar?", "goto": "Ir a", + "hideTitleBar": "Ocultar barra de título", "highlight": "Resaltar código", "homeWidgetUrlConfig": "Configuración de URL del widget de inicio", "host": "Anfitrión", @@ -221,6 +222,7 @@ "restoreSuccess": "Restauración exitosa, necesitas reiniciar la App para aplicar cambios", "result": "Resultado", "rotateAngel": "Ángulo de rotación", + "route": "Enrutamiento", "run": "Ejecutar", "running": "En ejecución", "save": "Guardar", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 284983a4..a477a9cd 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -113,6 +113,7 @@ "gettingToken": "Récupération du jeton...", "goBackQ": "Revenir en arrière ?", "goto": "Aller à", + "hideTitleBar": "Masquer la barre de titre", "highlight": "Coloration syntaxique", "homeWidgetUrlConfig": "Configurer l'URL du widget d'accueil", "host": "Hôte", @@ -221,6 +222,7 @@ "restoreSuccess": "Restauration réussie. Redémarrez l'application pour l'appliquer.", "result": "Résultat", "rotateAngel": "Angle de rotation", + "route": "Routage", "run": "Exécuter", "running": "en cours d'exécution", "save": "Enregistrer", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 02de00ac..68f2bb2c 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -113,6 +113,7 @@ "gettingToken": "Mendapatkan token ...", "goBackQ": "Datang kembali?", "goto": "Pergi ke", + "hideTitleBar": "Sembunyikan bilah judul", "highlight": "Sorotan kode", "homeWidgetUrlConfig": "Konfigurasi URL Widget Rumah", "host": "Host", @@ -221,6 +222,7 @@ "restoreSuccess": "Kembalikan kesuksesan. Mulai ulang aplikasi untuk diterapkan.", "result": "Hasil", "rotateAngel": "Sudut rotasi", + "route": "Routing", "run": "Berlari", "running": "berlari", "save": "Menyimpan", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index cb77278d..9e75e87e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -113,6 +113,7 @@ "gettingToken": "トークンを取得しています...", "goBackQ": "戻りますか?", "goto": "移動", + "hideTitleBar": "タイトルバーを非表示にする", "highlight": "コードハイライト", "homeWidgetUrlConfig": "ホームウィジェットURL設定", "host": "ホスト", @@ -221,6 +222,7 @@ "restoreSuccess": "復元に成功しました。変更を適用するためにアプリを再起動する必要があります", "result": "結果", "rotateAngel": "回転角度", + "route": "ルーティング", "run": "実行", "running": "実行中", "save": "保存", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 49cd246f..87c0efdb 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -113,6 +113,7 @@ "gettingToken": "Obtendo Token...", "goBackQ": "Voltar?", "goto": "Ir para", + "hideTitleBar": "Ocultar barra de título", "highlight": "Destaque de código", "homeWidgetUrlConfig": "Configuração de URL do widget da tela inicial", "host": "Host", @@ -221,6 +222,7 @@ "restoreSuccess": "Restauração bem-sucedida, é necessário reiniciar o app para aplicar as mudanças", "result": "Resultado", "rotateAngel": "Ângulo de rotação", + "route": "Roteamento", "run": "Executar", "running": "Executando", "save": "Salvar", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index b66f64c6..04ff9630 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -113,6 +113,7 @@ "gettingToken": "Получение токена...", "goBackQ": "Вернуться?", "goto": "перейти к", + "hideTitleBar": "Скрыть заголовок", "highlight": "подсветка кода", "homeWidgetUrlConfig": "конфигурация URL виджета домашнего экрана", "host": "хост", @@ -221,6 +222,7 @@ "restoreSuccess": "Восстановление успешно, требуется перезапуск приложения для применения изменений", "result": "результат", "rotateAngel": "угол поворота", + "route": "Маршрутизация", "run": "запустить", "running": "работает", "save": "сохранить", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index f0167d15..08928169 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -113,6 +113,7 @@ "gettingToken": "正在获取Token...", "goBackQ": "返回?", "goto": "前往", + "hideTitleBar": "隐藏标题栏", "highlight": "代码高亮", "homeWidgetUrlConfig": "桌面部件链接配置", "host": "主机", @@ -221,6 +222,7 @@ "restoreSuccess": "恢复成功,需要重启App来应用更改", "result": "结果", "rotateAngel": "旋转角度", + "route": "路由", "run": "运行", "running": "运行中", "save": "保存", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index dfcd2262..4dc5d937 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -113,6 +113,7 @@ "gettingToken": "正在獲取Token...", "goBackQ": "返回?", "goto": "前往", + "hideTitleBar": "隱藏標題欄", "highlight": "代碼高亮", "homeWidgetUrlConfig": "桌面部件鏈接配置", "host": "主機", @@ -221,6 +222,7 @@ "restoreSuccess": "恢復成功,需要重啓App來應用更改", "result": "結果", "rotateAngel": "旋轉角度", + "route": "路由", "run": "運行", "running": "運作中", "save": "保存", diff --git a/lib/main.dart b/lib/main.dart index 47fbe832..6d1c076d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -142,11 +142,11 @@ Future _initDesktopWindow() async { await windowManager.ensureInitialized(); await CustomAppBar.updateTitlebarHeight(); - const windowOptions = WindowOptions( + final windowOptions = WindowOptions( center: true, backgroundColor: Colors.transparent, skipTaskbar: false, - titleBarStyle: TitleBarStyle.hidden, + titleBarStyle: CustomAppBar.barHeight != 0 ? TitleBarStyle.hidden : null, ); windowManager.waitUntilReadyToShow(windowOptions, () async { await windowManager.show(); diff --git a/lib/view/page/home/home.dart b/lib/view/page/home/home.dart index ed47bdc1..c79a8577 100644 --- a/lib/view/page/home/home.dart +++ b/lib/view/page/home/home.dart @@ -31,7 +31,6 @@ import 'package:toolbox/view/widget/appbar.dart'; import 'package:toolbox/view/widget/cardx.dart'; import 'package:toolbox/view/widget/markdown.dart'; - part 'appbar.dart'; class HomePage extends StatefulWidget { @@ -332,6 +331,7 @@ ${GithubIds.participants.map((e) => '[$e](${e.url})').join(' ')} } Future _reqNotiPerm() async { + if (!isAndroid) return; final suc = await PermUtils.request(Permission.notification); if (!suc) { final noNotiPerm = Stores.setting.noNotiPerm; diff --git a/lib/view/page/server/detail/misc.dart b/lib/view/page/server/detail/misc.dart index b95dbaa7..f00487a1 100644 --- a/lib/view/page/server/detail/misc.dart +++ b/lib/view/page/server/detail/misc.dart @@ -42,13 +42,13 @@ Widget _buildLineChart( Range x, { String? tooltipPrefix, bool curve = false, + int verticalInterval = 20, }) { return LineChart(LineChartData( lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( tooltipPadding: const EdgeInsets.all(5), tooltipRoundedRadius: 8, - tooltipMargin: 3, getTooltipItems: (List touchedSpots) { return touchedSpots.map((e) { return LineTooltipItem( @@ -66,11 +66,12 @@ Widget _buildLineChart( gridData: FlGridData( show: true, drawVerticalLine: false, - horizontalInterval: 20, + horizontalInterval: verticalInterval.toDouble(), getDrawingHorizontalLine: (value) { return const FlLine( color: Color(0xff37434d), strokeWidth: 1, + dashArray: [5, 17], ); }, ), @@ -90,21 +91,22 @@ Widget _buildLineChart( showTitles: true, interval: 1, getTitlesWidget: (val, meta) { - if (val % 20 != 0) return UIs.placeholder; + if (val % verticalInterval != 0) return UIs.placeholder; + if (val == 0) return const Text('0 %', style: UIs.text12Grey); return Text( val.toInt().toString(), style: UIs.text12Grey, ); }, - reservedSize: 42, + reservedSize: 27, ), ), ), borderData: FlBorderData(show: false), minX: x.start, maxX: x.end, - minY: 0, - maxY: 100, + minY: -1, + maxY: 101, lineBarsData: spots .map((e) => LineChartBarData( spots: e, diff --git a/lib/view/page/server/detail/view.dart b/lib/view/page/server/detail/view.dart index 2bf5e4f2..d48f740b 100644 --- a/lib/view/page/server/detail/view.dart +++ b/lib/view/page/server/detail/view.dart @@ -186,7 +186,7 @@ class _ServerDetailPageState extends State ), ), childrenPadding: const EdgeInsets.symmetric(vertical: 13), - initiallyExpanded: true, + initiallyExpanded: _getInitExpand(1), trailing: Row( mainAxisSize: MainAxisSize.min, children: details, @@ -201,7 +201,6 @@ class _ServerDetailPageState extends State ss.cpu.spots, ss.cpu.rangeX, tooltipPrefix: 'CPU', - curve: true, ), ), ), diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index e7a2435e..07dcdc39 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -119,7 +119,7 @@ class _SettingPageState extends State { _buildAppColor(), //_buildLaunchPage(), _buildCheckUpdate(), - _buildCollapseUI(), + _buildAppMore(), ]; /// Platform specific settings @@ -1065,4 +1065,29 @@ class _SettingPageState extends State { }, ); } + + Widget _buildAppMore() { + return ExpandTile( + title: Text(l10n.more), + children: [ + _buildCollapseUI(), + _buildCupertinoRoute(), + if (isDesktop) _buildHideTitleBar(), + ], + ); + } + + Widget _buildCupertinoRoute() { + return ListTile( + title: Text('Cupertino ${l10n.route}'), + trailing: StoreSwitch(prop: _setting.cupertinoRoute), + ); + } + + Widget _buildHideTitleBar() { + return ListTile( + title: Text(l10n.hideTitleBar), + trailing: StoreSwitch(prop: _setting.hideTitleBar), + ); + } } diff --git a/lib/view/widget/appbar.dart b/lib/view/widget/appbar.dart index 71e6f374..d55b88f0 100644 --- a/lib/view/widget/appbar.dart +++ b/lib/view/widget/appbar.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:toolbox/data/res/store.dart'; import 'package:window_manager/window_manager.dart'; class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { @@ -84,8 +85,8 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { case 'macos': barHeight = 27; break; - // Draw a titlebar on Linux case 'linux' || 'windows': + if (!Stores.setting.hideTitleBar.fetch()) break; barHeight = 37; _drawTitlebar = true; break;