diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index b385e478..51da00db 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -946,6 +946,12 @@ abstract class S { /// **'Mission'** String get mission; + /// No description provided for @more. + /// + /// In en, this message translates to: + /// **'More'** + String get more; + /// No description provided for @moveOutServerFuncBtnsHelp. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart index 939015bc..13167ce1 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart @@ -449,6 +449,9 @@ class SDe extends S { @override String get mission => 'Mission'; + @override + String get more => 'Mehr'; + @override String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index 38341c20..415c57db 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -449,6 +449,9 @@ class SEn extends S { @override String get mission => 'Mission'; + @override + String get more => 'More'; + @override String get moveOutServerFuncBtnsHelp => 'On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart index ca3d7da2..af64861e 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_fr.dart @@ -449,6 +449,9 @@ class SFr extends S { @override String get mission => 'Mission'; + @override + String get more => 'Plus'; + @override String get moveOutServerFuncBtnsHelp => 'Activé : peut être affiché sous chaque carte sur la page de l\'onglet Serveur. Désactivé : peut être affiché en haut de la page Détails du serveur.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart index 1034239f..c3603003 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart @@ -449,6 +449,9 @@ class SId extends S { @override String get mission => 'Misi'; + @override + String get more => 'Lebih Banyak'; + @override String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index 870d4ef6..2c035447 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -449,6 +449,9 @@ class SZh extends S { @override String get mission => '任务'; + @override + String get more => '更多'; + @override String get moveOutServerFuncBtnsHelp => '开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。'; @@ -1339,6 +1342,9 @@ class SZhTw extends SZh { @override String get mission => '任務'; + @override + String get more => '更多'; + @override String get moveOutServerFuncBtnsHelp => '開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。'; diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 44b80d6d..f81d69e9 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -586,7 +586,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -596,7 +596,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -720,7 +720,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -730,7 +730,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -748,7 +748,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -758,7 +758,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -779,7 +779,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -792,7 +792,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -818,7 +818,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -831,7 +831,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -854,7 +854,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -867,7 +867,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -890,7 +890,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -902,7 +902,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -931,7 +931,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -943,7 +943,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -969,7 +969,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -981,7 +981,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/data/model/app/net_view.dart b/lib/data/model/app/net_view.dart index 86077848..a8e9ca40 100644 --- a/lib/data/model/app/net_view.dart +++ b/lib/data/model/app/net_view.dart @@ -1,6 +1,7 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:toolbox/core/extension/context/locale.dart'; import 'package:toolbox/data/model/server/server.dart'; +import 'package:toolbox/data/res/store.dart'; part 'net_view.g.dart'; @@ -36,6 +37,7 @@ enum NetViewType { } (String, String) build(ServerStatus ss) { + final ignoreLocal = Stores.setting.ignoreLocalNet.fetch(); switch (this) { case NetViewType.conn: return ( @@ -43,14 +45,26 @@ enum NetViewType { '${l10n.failed}:\n${ss.tcp.fail}', ); case NetViewType.speed: + if (ignoreLocal) { + return ( + '↓:\n${ss.netSpeed.cachedRealVals.speedIn}', + '↑:\n${ss.netSpeed.cachedRealVals.speedOut}', + ); + } return ( - '↓:\n${ss.netSpeed.speedIn(all: true)}', - '↑:\n${ss.netSpeed.speedOut(all: true)}', + '↓:\n${ss.netSpeed.speedIn()}', + '↑:\n${ss.netSpeed.speedOut()}', ); case NetViewType.traffic: + if (ignoreLocal) { + return ( + '↓:\n${ss.netSpeed.cachedRealVals.sizeIn}', + '↑:\n${ss.netSpeed.cachedRealVals.sizeOut}', + ); + } return ( - '↓:\n${ss.netSpeed.sizeIn(all: true)}', - '↑:\n${ss.netSpeed.sizeOut(all: true)}', + '↓:\n${ss.netSpeed.sizeIn()}', + '↑:\n${ss.netSpeed.sizeOut()}', ); } } diff --git a/lib/data/model/server/cpu.dart b/lib/data/model/server/cpu.dart index 0fbec3d1..9905c0d6 100644 --- a/lib/data/model/server/cpu.dart +++ b/lib/data/model/server/cpu.dart @@ -5,6 +5,16 @@ import 'time_seq.dart'; class Cpus extends TimeSeq { Cpus(super.pre, super.now); + @override + void onUpdate() { + _coresCount = now.length; + _totalDelta = now[0].total - pre[0].total; + _user = _getUser(); + _sys = _getSys(); + _iowait = _getIowait(); + _idle = _getIdle(); + } + double usedPercent({int coreIdx = 0}) { if (now.length != pre.length) return 0; final idleDelta = now[coreIdx].idle - pre[coreIdx].idle; @@ -13,39 +23,42 @@ class Cpus extends TimeSeq { return used.isNaN ? 0 : 100 - used * 100; } - int get coresCount => now.length; + int _coresCount = 0; + int get coresCount => _coresCount; - int get totalDelta => now[0].total - pre[0].total; + int _totalDelta = 0; + int get totalDelta => _totalDelta; - double get user { + double _user = 0; + double get user => _user; + double _getUser() { if (now.length != pre.length) return 0; final delta = now[0].user - pre[0].user; final used = delta / totalDelta; return used.isNaN ? 0 : used * 100; } - double get sys { + double _sys = 0; + double get sys => _sys; + double _getSys() { if (now.length != pre.length) return 0; final delta = now[0].sys - pre[0].sys; final used = delta / totalDelta; return used.isNaN ? 0 : used * 100; } - double get nice { - if (now.length != pre.length) return 0; - final delta = now[0].nice - pre[0].nice; - final used = delta / totalDelta; - return used.isNaN ? 0 : used * 100; - } - - double get iowait { + double _iowait = 0; + double get iowait => _iowait; + double _getIowait() { if (now.length != pre.length) return 0; final delta = now[0].iowait - pre[0].iowait; final used = delta / totalDelta; return used.isNaN ? 0 : used * 100; } - double get idle => 100 - usedPercent(); + double _idle = 0; + double get idle => _idle; + double _getIdle() => 100 - usedPercent(); } class OneTimeCpuStatus extends TimeSeqIface { diff --git a/lib/data/model/server/disk.dart b/lib/data/model/server/disk.dart index df6485d1..b28ac873 100644 --- a/lib/data/model/server/disk.dart +++ b/lib/data/model/server/disk.dart @@ -64,6 +64,11 @@ class Disk { class DiskIO extends TimeSeq { DiskIO(super.pre, super.now); + @override + void onUpdate() { + + } + (double?, double?) _getSpeed(String dev) { final pres = this.pre.where( (element) => element.dev == dev.replaceFirst('/dev/', ''), diff --git a/lib/data/model/server/net_speed.dart b/lib/data/model/server/net_speed.dart index 5f7290b5..669781ba 100644 --- a/lib/data/model/server/net_speed.dart +++ b/lib/data/model/server/net_speed.dart @@ -17,8 +17,51 @@ class NetSpeedPart extends TimeSeqIface { class NetSpeed extends TimeSeq { NetSpeed(super.pre, super.now); - List get devices => now.map((e) => e.device).toList(); + @override + void onUpdate() { + devices.clear(); + devices.addAll(now.map((e) => e.device).toList()); + realIfaces.clear(); + realIfaces.addAll(devices + .where((e) => realIfacePrefixs.any((prefix) => e.startsWith(prefix))) + .toList()); + + final sizeIn = this.sizeIn(); + final sizeOut = this.sizeOut(); + final speedIn = this.speedIn(); + final speedOut = this.speedOut(); + cachedRealVals = ( + sizeIn: sizeIn, + sizeOut: sizeOut, + speedIn: speedIn, + speedOut: speedOut, + ); + } + + /// Cached network device list + final devices = []; + + /// Issue #295 + /// Non-virtual network device prefix + static const List realIfacePrefixs = ['eth', 'wlan', 'en', 'ww', 'wl']; + + /// Cached non-virtual network device prefix + final realIfaces = []; + + ({ + String sizeIn, + String sizeOut, + String speedIn, + String speedOut, + }) cachedRealVals = ( + sizeIn: '0kb', + sizeOut: '0kb', + speedIn: '0kb/s', + speedOut: '0kb/s', + ); + + /// Time diff between [pre] and [now] BigInt get _timeDiff => BigInt.from(now[0].time - pre[0].time); double speedInBytes(int i) => (now[i].bytesIn - pre[i].bytesIn) / _timeDiff; @@ -27,12 +70,16 @@ class NetSpeed extends TimeSeq { BigInt sizeInBytes(int i) => now[i].bytesIn; BigInt sizeOutBytes(int i) => now[i].bytesOut; - String speedIn({String? device, bool all = false}) { + String speedIn({String? device}) { if (pre[0].device == '' || now[0].device == '') return '0kb/s'; - if (all) { + if (device == null) { var speed = 0.0; - for (var i = 0; i < now.length; i++) { - speed += speedInBytes(i); + for (final device in devices) { + for (final prefix in realIfacePrefixs) { + if (device.startsWith(prefix)) { + speed += speedInBytes(devices.indexOf(device)); + } + } } return buildStandardOutput(speed); } @@ -40,12 +87,16 @@ class NetSpeed extends TimeSeq { return buildStandardOutput(speedInBytes(idx)); } - String sizeIn({String? device, bool all = false}) { + String sizeIn({String? device}) { if (pre[0].device == '' || now[0].device == '') return '0kb'; - if (all) { + if (device == null) { var size = BigInt.from(0); - for (var i = 0; i < now.length; i++) { - size += sizeInBytes(i); + for (final device in devices) { + for (final prefix in realIfacePrefixs) { + if (device.startsWith(prefix)) { + size += sizeInBytes(devices.indexOf(device)); + } + } } return size.bytes2Str; } @@ -53,12 +104,16 @@ class NetSpeed extends TimeSeq { return sizeInBytes(idx).bytes2Str; } - String speedOut({String? device, bool all = false}) { + String speedOut({String? device}) { if (pre[0].device == '' || now[0].device == '') return '0kb/s'; - if (all) { + if (device == null) { var speed = 0.0; - for (var i = 0; i < now.length; i++) { - speed += speedOutBytes(i); + for (final device in devices) { + for (final prefix in realIfacePrefixs) { + if (device.startsWith(prefix)) { + speed += speedOutBytes(devices.indexOf(device)); + } + } } return buildStandardOutput(speed); } @@ -66,12 +121,16 @@ class NetSpeed extends TimeSeq { return buildStandardOutput(speedOutBytes(idx)); } - String sizeOut({String? device, bool all = false}) { + String sizeOut({String? device}) { if (pre[0].device == '' || now[0].device == '') return '0kb'; - if (all) { + if (device == null) { var size = BigInt.from(0); - for (var i = 0; i < now.length; i++) { - size += sizeOutBytes(i); + for (final device in devices) { + for (final prefix in realIfacePrefixs) { + if (device.startsWith(prefix)) { + size += sizeOutBytes(devices.indexOf(device)); + } + } } return size.bytes2Str; } diff --git a/lib/data/model/server/time_seq.dart b/lib/data/model/server/time_seq.dart index 4fcfb4fd..2b25b103 100644 --- a/lib/data/model/server/time_seq.dart +++ b/lib/data/model/server/time_seq.dart @@ -1,6 +1,7 @@ abstract class TimeSeq { List pre; List now; + void onUpdate(); void update(List new_) { pre = now; @@ -10,6 +11,8 @@ abstract class TimeSeq { pre.removeWhere((e) => now.any((el) => e.same(el))); pre.addAll(now.where((e) => pre.every((el) => !e.same(el)))); } + + onUpdate(); } TimeSeq(this.pre, this.now); diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index acbb14b4..a1d4765f 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 778; - static const String engine = "3.19.1"; - static const String buildAt = "2024-02-26 16:30:57"; - static const int modifications = 6; + static const int build = 780; + static const String engine = "3.19.2"; + static const String buildAt = "2024-03-06 11:26:38"; + static const int modifications = 7; static const int script = 40; } diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index ca4122f7..b7ede753 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -239,13 +239,17 @@ class SettingStore extends PersistentStore { /// Result: use x86pkg_temp's temperature as the temperature late final preferTemperatureDevs = listProperty('preferTemperatureDevs', []); - + /// Use double column servers page on Desktop late final doubleColumnServersPage = property( 'doubleColumnServersPage', true, ); + /// Ignore local network device (eg: br-xxx, ovs-system...) + /// when building traffic view on server tab + late final ignoreLocalNet = property('ignoreLocalNetIface', true); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 9bbc8cc2..a94a0cda 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -141,6 +141,7 @@ "maxRetryCountEqual0": "Unbegrenzte Verbindungsversuche zum Server", "min": "min", "mission": "Mission", + "more": "Mehr", "moveOutServerFuncBtnsHelp": "Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.", "ms": "ms", "name": "Name", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 4b767e98..359b5288 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -141,6 +141,7 @@ "maxRetryCountEqual0": "Will retry again and again.", "min": "min", "mission": "Mission", + "more": "More", "moveOutServerFuncBtnsHelp": "On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.", "ms": "ms", "name": "Name", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 3742e632..66f2c13e 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -141,6 +141,7 @@ "maxRetryCountEqual0": "Réessayera encore et encore.", "min": "min", "mission": "Mission", + "more": "Plus", "moveOutServerFuncBtnsHelp": "Activé : peut être affiché sous chaque carte sur la page de l'onglet Serveur. Désactivé : peut être affiché en haut de la page Détails du serveur.", "ms": "ms", "name": "Nom", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index e9371be0..44020b1c 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -141,6 +141,7 @@ "maxRetryCountEqual0": "Akan mencoba lagi lagi dan lagi.", "min": "Min", "mission": "Misi", + "more": "Lebih Banyak", "moveOutServerFuncBtnsHelp": "Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.", "ms": "MS", "name": "Nama", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 1bfd11e4..08a664d4 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -141,6 +141,7 @@ "maxRetryCountEqual0": "会无限重试", "min": "最小", "mission": "任务", + "more": "更多", "moveOutServerFuncBtnsHelp": "开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。", "ms": "毫秒", "name": "名称", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 725eadfb..5359a751 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -141,6 +141,7 @@ "maxRetryCountEqual0": "會無限重試", "min": "最小", "mission": "任務", + "more": "更多", "moveOutServerFuncBtnsHelp": "開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。", "ms": "毫秒", "name": "名稱", diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index 12ddd710..5e894571 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -389,7 +389,7 @@ class BackupPage extends StatelessWidget { final backup = await context.showLoadingDialog( fn: () => Computer.shared.start(Backup.fromJsonString, text.trim()), ); - + if (backupFormatVersion != backup.version) { context.showSnackBar(l10n.backupVersionNotMatch); return; diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 30709f26..4256f227 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -180,18 +180,13 @@ class _SettingPageState extends State { Widget _buildServer() { return Column( children: [ - _buildKeepStatusWhenErr(), _buildServerFuncBtns(), + _buildNetViewType(), _buildServerSeq(), _buildServerDetailCardSeq(), - _buildNetViewType(), - _buildUpdateInterval(), - _buildMaxRetry(), //_buildDiskIgnorePath(), _buildDeleteServers(), - _buildTextScaler(), - _buildPreferTemperatureDeviceList(), - _buildDoubleColumnServersPage(), + _buildServerMore(), ].map((e) => CardX(child: e)).toList(), ); } @@ -1189,4 +1184,18 @@ class _SettingPageState extends State { }, ); } + + Widget _buildServerMore() { + return ExpandTile( + title: Text(l10n.more), + children: [ + _buildTextScaler(), + _buildPreferTemperatureDeviceList(), + _buildKeepStatusWhenErr(), + _buildDoubleColumnServersPage(), + _buildUpdateInterval(), + _buildMaxRetry(), + ], + ); + } } diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index b8d14766..5b4f724b 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -439,7 +439,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -449,7 +449,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -574,7 +574,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -584,7 +584,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -604,7 +604,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 778; + CURRENT_PROJECT_VERSION = 780; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -615,7 +615,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.778; + MARKETING_VERSION = 1.0.780; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = "";