From 1163f2e4182c74c920d990c8237231b4810a2373 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Fri, 28 Jul 2023 20:21:15 +0800 Subject: [PATCH] opt.: `TimeSeq` --- ios/Runner.xcodeproj/project.pbxproj | 24 ++++----- lib/data/model/server/cpu.dart | 53 ++++++++------------ lib/data/model/server/net_speed.dart | 68 +++++++++----------------- lib/data/model/server/time_seq.dart | 22 +++++++++ lib/data/res/build_data.dart | 6 +-- lib/view/page/setting.dart | 35 ++++++------- lib/view/page/sftp/mission.dart | 2 +- macos/Runner.xcodeproj/project.pbxproj | 12 ++--- 8 files changed, 107 insertions(+), 115 deletions(-) create mode 100644 lib/data/model/server/time_seq.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4d8285ca..80c42830 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -470,7 +470,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -478,7 +478,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -602,7 +602,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -610,7 +610,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -628,7 +628,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -636,7 +636,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -657,7 +657,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -670,7 +670,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -696,7 +696,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -709,7 +709,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -732,7 +732,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -745,7 +745,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/lib/data/model/server/cpu.dart b/lib/data/model/server/cpu.dart index b064fea7..88b1497c 100644 --- a/lib/data/model/server/cpu.dart +++ b/lib/data/model/server/cpu.dart @@ -1,58 +1,44 @@ -class Cpus { - List _pre; - List _now; - Cpus(this._pre, this._now); +import 'time_seq.dart'; + +class Cpus extends TimeSeq { + Cpus(super.pre, super.now); double usedPercent({int coreIdx = 0}) { - if (_now.length != _pre.length) return 0; - final idleDelta = _now[coreIdx].idle - _pre[coreIdx].idle; - final totalDelta = _now[coreIdx].total - _pre[coreIdx].total; + if (now.length != pre.length) return 0; + final idleDelta = now[coreIdx].idle - pre[coreIdx].idle; + final totalDelta = now[coreIdx].total - pre[coreIdx].total; final used = idleDelta / totalDelta; return used.isNaN ? 0 : 100 - used * 100; } - void update(List newStatus) { - _pre = _now; - _now = newStatus; - // 类似 [NetSpeed.update] 的处理 - // 虽然CPU热插拔情况较少... - if (_pre.length != _now.length) { - if (_pre.length > _now.length) { - _pre = _pre.sublist(0, _now.length); - } else { - _pre.addAll(_now.sublist(_pre.length, _now.length)); - } - } - } + int get coresCount => now.length; - int get coresCount => _now.length; - - int get totalDelta => _now[0].total - _pre[0].total; + int get totalDelta => now[0].total - pre[0].total; double get user { - if (_now.length != _pre.length) return 0; - final delta = _now[0].user - _pre[0].user; + 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 { - if (_now.length != _pre.length) return 0; - final delta = _now[0].sys - _pre[0].sys; + 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; + 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 { - if (_now.length != _pre.length) return 0; - final delta = _now[0].iowait - _pre[0].iowait; + 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; } @@ -60,7 +46,7 @@ class Cpus { double get idle => 100 - usedPercent(); } -class OneTimeCpuStatus { +class OneTimeCpuStatus extends TimeSeqIface { late String id; late int user; late int sys; @@ -82,6 +68,9 @@ class OneTimeCpuStatus { ); int get total => user + sys + nice + idle + iowait + irq + softirq; + + @override + bool same(OneTimeCpuStatus other) => id == other.id; } List parseCPU(String raw) { diff --git a/lib/data/model/server/net_speed.dart b/lib/data/model/server/net_speed.dart index 76b9f8ae..a5d89af0 100644 --- a/lib/data/model/server/net_speed.dart +++ b/lib/data/model/server/net_speed.dart @@ -1,55 +1,35 @@ import 'package:toolbox/core/extension/numx.dart'; -class NetSpeedPart { +import 'time_seq.dart'; + +class NetSpeedPart extends TimeSeqIface { String device; BigInt bytesIn; BigInt bytesOut; BigInt time; NetSpeedPart(this.device, this.bytesIn, this.bytesOut, this.time); + + @override + bool same(NetSpeedPart other) => device == other.device; } -class NetSpeed { - List _old; - List _now; - NetSpeed(this._old, this._now); +class NetSpeed extends TimeSeq { + NetSpeed(super.pre, super.now); - List get devices { - final devices = []; - for (var item in _now) { - devices.add(item.device); - } - return devices; - } + List get devices => now.map((e) => e.device).toList(); - void update(List newOne) { - _old = _now; - _now = newOne; - // 当长度不同,说明有网络接口改变 - // - // 应当跟随改变: - // 旧长度 > 新长度:将旧的数据截断 - // 旧长度 < 新长度:将旧的数据补齐 - if (_old.length != _now.length) { - if (_old.length > _now.length) { - _old = _old.sublist(0, _now.length); - } else { - _old.addAll(_now.sublist(_old.length, _now.length)); - } - } - } + BigInt get _timeDiff => now[0].time - pre[0].time; - BigInt get timeDiff => _now[0].time - _old[0].time; - - double _speedIn(int i) => (_now[i].bytesIn - _old[i].bytesIn) / timeDiff; - double _speedOut(int i) => (_now[i].bytesOut - _old[i].bytesOut) / timeDiff; - BigInt _sizeIn(int i) => _now[i].bytesIn; - BigInt _sizeOut(int i) => _now[i].bytesOut; + double _speedIn(int i) => (now[i].bytesIn - pre[i].bytesIn) / _timeDiff; + double _speedOut(int i) => (now[i].bytesOut - pre[i].bytesOut) / _timeDiff; + BigInt _sizeIn(int i) => now[i].bytesIn; + BigInt _sizeOut(int i) => now[i].bytesOut; String speedIn({String? device, bool all = false}) { - if (_old[0].device == '' || _now[0].device == '') return '0kb/s'; + if (pre[0].device == '' || now[0].device == '') return '0kb/s'; if (all) { var speed = 0.0; - for (var i = 0; i < _now.length; i++) { + for (var i = 0; i < now.length; i++) { speed += _speedIn(i); } return buildStandardOutput(speed); @@ -59,10 +39,10 @@ class NetSpeed { } String sizeIn({String? device, bool all = false}) { - if (_old[0].device == '' || _now[0].device == '') return '0kb'; + if (pre[0].device == '' || now[0].device == '') return '0kb'; if (all) { var size = BigInt.from(0); - for (var i = 0; i < _now.length; i++) { + for (var i = 0; i < now.length; i++) { size += _sizeIn(i); } return size.convertBytes; @@ -72,10 +52,10 @@ class NetSpeed { } String speedOut({String? device, bool all = false}) { - if (_old[0].device == '' || _now[0].device == '') return '0kb/s'; + if (pre[0].device == '' || now[0].device == '') return '0kb/s'; if (all) { var speed = 0.0; - for (var i = 0; i < _now.length; i++) { + for (var i = 0; i < now.length; i++) { speed += _speedOut(i); } return buildStandardOutput(speed); @@ -85,10 +65,10 @@ class NetSpeed { } String sizeOut({String? device, bool all = false}) { - if (_old[0].device == '' || _now[0].device == '') return '0kb'; + if (pre[0].device == '' || now[0].device == '') return '0kb'; if (all) { var size = BigInt.from(0); - for (var i = 0; i < _now.length; i++) { + for (var i = 0; i < now.length; i++) { size += _sizeOut(i); } return size.convertBytes; @@ -99,9 +79,9 @@ class NetSpeed { int deviceIdx(String? device) { if (device != null) { - for (var item in _now) { + for (var item in now) { if (item.device == device) { - return _now.indexOf(item); + return now.indexOf(item); } } } diff --git a/lib/data/model/server/time_seq.dart b/lib/data/model/server/time_seq.dart new file mode 100644 index 00000000..d693706e --- /dev/null +++ b/lib/data/model/server/time_seq.dart @@ -0,0 +1,22 @@ +// ignore_for_file: prefer_final_fields + +abstract class TimeSeq { + List pre; + List now; + + void update(List new_) { + pre = now; + now = new_; + + if (pre.length != now.length) { + pre.removeWhere((e) => now.any((el) => e.same(el))); + pre.addAll(now.where((e) => pre.every((el) => !e.same(el)))); + } + } + + TimeSeq(this.pre, this.now); +} + +abstract class TimeSeqIface { + bool same(T other); +} diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index b910068c..1f5a320c 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,8 +2,8 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 395; + static const int build = 396; static const String engine = "3.10.6"; - static const String buildAt = "2023-07-28 17:28:52.039761"; - static const int modifications = 10; + static const String buildAt = "2023-07-28 19:15:52.944462"; + static const int modifications = 5; } diff --git a/lib/view/page/setting.dart b/lib/view/page/setting.dart index 145f0cea..03df6db0 100644 --- a/lib/view/page/setting.dart +++ b/lib/view/page/setting.dart @@ -841,7 +841,7 @@ class _SettingPageState extends State { Widget _buildSSHVirtKeys() { return ListTile( title: Text(_s.editVirtKeys), - trailing: const Icon(Icons.arrow_forward_ios, size: 13), + trailing: const Icon(Icons.keyboard_arrow_right), onTap: () => AppRoute( const SSHVirtKeySettingPage(), 'ssh virt key edit', @@ -880,23 +880,24 @@ class _SettingPageState extends State { }); final ctrl = TextEditingController(text: json.encode(data)); showRoundDialog( - context: context, - title: Text(_s.homeWidgetUrlConfig), - child: Input( - controller: ctrl, - label: 'JSON', - type: TextInputType.visiblePassword, - maxLines: 7, - onSubmitted: (p0) => _saveWidgetSP(p0, data), + context: context, + title: Text(_s.homeWidgetUrlConfig), + child: Input( + controller: ctrl, + label: 'JSON', + type: TextInputType.visiblePassword, + maxLines: 7, + onSubmitted: (p0) => _saveWidgetSP(p0, data), + ), + actions: [ + TextButton( + onPressed: () { + _saveWidgetSP(ctrl.text, data); + }, + child: Text(_s.ok), ), - actions: [ - TextButton( - onPressed: () { - _saveWidgetSP(ctrl.text, data); - }, - child: Text(_s.ok), - ), - ]); + ], + ); }, ); } diff --git a/lib/view/page/sftp/mission.dart b/lib/view/page/sftp/mission.dart index 940bae1c..43e8d509 100644 --- a/lib/view/page/sftp/mission.dart +++ b/lib/view/page/sftp/mission.dart @@ -113,7 +113,7 @@ class _SFTPDownloadingPageState extends State { child: CircularProgressIndicator( value: percent, ), - ) + ), ); case SftpWorkerStatus.preparing: return _wrapInCard( diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 41d69518..4024d762 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -475,9 +475,9 @@ baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -490,9 +490,9 @@ baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -505,9 +505,9 @@ baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 395; + CURRENT_PROJECT_VERSION = 396; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.395; + MARKETING_VERSION = 1.0.396; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0;