new: only calc non-virt net iface (#295)

This commit is contained in:
lollipopkit
2024-03-06 14:59:37 +08:00
parent 5baf683278
commit 4e6ea086e3
23 changed files with 208 additions and 71 deletions

View File

@@ -946,6 +946,12 @@ abstract class S {
/// **'Mission'** /// **'Mission'**
String get mission; String get mission;
/// No description provided for @more.
///
/// In en, this message translates to:
/// **'More'**
String get more;
/// No description provided for @moveOutServerFuncBtnsHelp. /// No description provided for @moveOutServerFuncBtnsHelp.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

View File

@@ -449,6 +449,9 @@ class SDe extends S {
@override @override
String get mission => 'Mission'; String get mission => 'Mission';
@override
String get more => 'Mehr';
@override @override
String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.'; String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.';

View File

@@ -449,6 +449,9 @@ class SEn extends S {
@override @override
String get mission => 'Mission'; String get mission => 'Mission';
@override
String get more => 'More';
@override @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.'; 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.';

View File

@@ -449,6 +449,9 @@ class SFr extends S {
@override @override
String get mission => 'Mission'; String get mission => 'Mission';
@override
String get more => 'Plus';
@override @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.'; 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.';

View File

@@ -449,6 +449,9 @@ class SId extends S {
@override @override
String get mission => 'Misi'; String get mission => 'Misi';
@override
String get more => 'Lebih Banyak';
@override @override
String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.'; String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.';

View File

@@ -449,6 +449,9 @@ class SZh extends S {
@override @override
String get mission => '任务'; String get mission => '任务';
@override
String get more => '更多';
@override @override
String get moveOutServerFuncBtnsHelp => '开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。'; String get moveOutServerFuncBtnsHelp => '开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。';
@@ -1339,6 +1342,9 @@ class SZhTw extends SZh {
@override @override
String get mission => '任務'; String get mission => '任務';
@override
String get more => '更多';
@override @override
String get moveOutServerFuncBtnsHelp => '開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。'; String get moveOutServerFuncBtnsHelp => '開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。';

View File

@@ -586,7 +586,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -596,7 +596,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -720,7 +720,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -730,7 +730,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -748,7 +748,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -758,7 +758,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -779,7 +779,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -792,7 +792,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
@@ -818,7 +818,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -831,7 +831,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -854,7 +854,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11; GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -867,7 +867,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -890,7 +890,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -902,7 +902,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
@@ -931,7 +931,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -943,7 +943,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox; PRODUCT_NAME = ServerBox;
@@ -969,7 +969,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -981,7 +981,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox; PRODUCT_NAME = ServerBox;

View File

@@ -1,6 +1,7 @@
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:toolbox/core/extension/context/locale.dart'; import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/data/model/server/server.dart'; import 'package:toolbox/data/model/server/server.dart';
import 'package:toolbox/data/res/store.dart';
part 'net_view.g.dart'; part 'net_view.g.dart';
@@ -36,6 +37,7 @@ enum NetViewType {
} }
(String, String) build(ServerStatus ss) { (String, String) build(ServerStatus ss) {
final ignoreLocal = Stores.setting.ignoreLocalNet.fetch();
switch (this) { switch (this) {
case NetViewType.conn: case NetViewType.conn:
return ( return (
@@ -43,14 +45,26 @@ enum NetViewType {
'${l10n.failed}:\n${ss.tcp.fail}', '${l10n.failed}:\n${ss.tcp.fail}',
); );
case NetViewType.speed: case NetViewType.speed:
if (ignoreLocal) {
return ( return (
'↓:\n${ss.netSpeed.speedIn(all: true)}', '↓:\n${ss.netSpeed.cachedRealVals.speedIn}',
'↑:\n${ss.netSpeed.speedOut(all: true)}', '↑:\n${ss.netSpeed.cachedRealVals.speedOut}',
);
}
return (
'↓:\n${ss.netSpeed.speedIn()}',
'↑:\n${ss.netSpeed.speedOut()}',
); );
case NetViewType.traffic: case NetViewType.traffic:
if (ignoreLocal) {
return ( return (
'↓:\n${ss.netSpeed.sizeIn(all: true)}', '↓:\n${ss.netSpeed.cachedRealVals.sizeIn}',
'↑:\n${ss.netSpeed.sizeOut(all: true)}', '↑:\n${ss.netSpeed.cachedRealVals.sizeOut}',
);
}
return (
'↓:\n${ss.netSpeed.sizeIn()}',
'↑:\n${ss.netSpeed.sizeOut()}',
); );
} }
} }

View File

@@ -5,6 +5,16 @@ import 'time_seq.dart';
class Cpus extends TimeSeq<OneTimeCpuStatus> { class Cpus extends TimeSeq<OneTimeCpuStatus> {
Cpus(super.pre, super.now); 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}) { double usedPercent({int coreIdx = 0}) {
if (now.length != pre.length) return 0; if (now.length != pre.length) return 0;
final idleDelta = now[coreIdx].idle - pre[coreIdx].idle; final idleDelta = now[coreIdx].idle - pre[coreIdx].idle;
@@ -13,39 +23,42 @@ class Cpus extends TimeSeq<OneTimeCpuStatus> {
return used.isNaN ? 0 : 100 - used * 100; 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; if (now.length != pre.length) return 0;
final delta = now[0].user - pre[0].user; final delta = now[0].user - pre[0].user;
final used = delta / totalDelta; final used = delta / totalDelta;
return used.isNaN ? 0 : used * 100; 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; if (now.length != pre.length) return 0;
final delta = now[0].sys - pre[0].sys; final delta = now[0].sys - pre[0].sys;
final used = delta / totalDelta; final used = delta / totalDelta;
return used.isNaN ? 0 : used * 100; return used.isNaN ? 0 : used * 100;
} }
double get nice { double _iowait = 0;
if (now.length != pre.length) return 0; double get iowait => _iowait;
final delta = now[0].nice - pre[0].nice; double _getIowait() {
final used = delta / totalDelta;
return used.isNaN ? 0 : used * 100;
}
double get iowait {
if (now.length != pre.length) return 0; if (now.length != pre.length) return 0;
final delta = now[0].iowait - pre[0].iowait; final delta = now[0].iowait - pre[0].iowait;
final used = delta / totalDelta; final used = delta / totalDelta;
return used.isNaN ? 0 : used * 100; 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<OneTimeCpuStatus> { class OneTimeCpuStatus extends TimeSeqIface<OneTimeCpuStatus> {

View File

@@ -64,6 +64,11 @@ class Disk {
class DiskIO extends TimeSeq<DiskIOPiece> { class DiskIO extends TimeSeq<DiskIOPiece> {
DiskIO(super.pre, super.now); DiskIO(super.pre, super.now);
@override
void onUpdate() {
}
(double?, double?) _getSpeed(String dev) { (double?, double?) _getSpeed(String dev) {
final pres = this.pre.where( final pres = this.pre.where(
(element) => element.dev == dev.replaceFirst('/dev/', ''), (element) => element.dev == dev.replaceFirst('/dev/', ''),

View File

@@ -17,8 +17,51 @@ class NetSpeedPart extends TimeSeqIface<NetSpeedPart> {
class NetSpeed extends TimeSeq<NetSpeedPart> { class NetSpeed extends TimeSeq<NetSpeedPart> {
NetSpeed(super.pre, super.now); NetSpeed(super.pre, super.now);
List<String> 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 = <String>[];
/// Issue #295
/// Non-virtual network device prefix
static const List<String> realIfacePrefixs = ['eth', 'wlan', 'en', 'ww', 'wl'];
/// Cached non-virtual network device prefix
final realIfaces = <String>[];
({
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); BigInt get _timeDiff => BigInt.from(now[0].time - pre[0].time);
double speedInBytes(int i) => (now[i].bytesIn - pre[i].bytesIn) / _timeDiff; double speedInBytes(int i) => (now[i].bytesIn - pre[i].bytesIn) / _timeDiff;
@@ -27,12 +70,16 @@ class NetSpeed extends TimeSeq<NetSpeedPart> {
BigInt sizeInBytes(int i) => now[i].bytesIn; BigInt sizeInBytes(int i) => now[i].bytesIn;
BigInt sizeOutBytes(int i) => now[i].bytesOut; 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 (pre[0].device == '' || now[0].device == '') return '0kb/s';
if (all) { if (device == null) {
var speed = 0.0; var speed = 0.0;
for (var i = 0; i < now.length; i++) { for (final device in devices) {
speed += speedInBytes(i); for (final prefix in realIfacePrefixs) {
if (device.startsWith(prefix)) {
speed += speedInBytes(devices.indexOf(device));
}
}
} }
return buildStandardOutput(speed); return buildStandardOutput(speed);
} }
@@ -40,12 +87,16 @@ class NetSpeed extends TimeSeq<NetSpeedPart> {
return buildStandardOutput(speedInBytes(idx)); 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 (pre[0].device == '' || now[0].device == '') return '0kb';
if (all) { if (device == null) {
var size = BigInt.from(0); var size = BigInt.from(0);
for (var i = 0; i < now.length; i++) { for (final device in devices) {
size += sizeInBytes(i); for (final prefix in realIfacePrefixs) {
if (device.startsWith(prefix)) {
size += sizeInBytes(devices.indexOf(device));
}
}
} }
return size.bytes2Str; return size.bytes2Str;
} }
@@ -53,12 +104,16 @@ class NetSpeed extends TimeSeq<NetSpeedPart> {
return sizeInBytes(idx).bytes2Str; 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 (pre[0].device == '' || now[0].device == '') return '0kb/s';
if (all) { if (device == null) {
var speed = 0.0; var speed = 0.0;
for (var i = 0; i < now.length; i++) { for (final device in devices) {
speed += speedOutBytes(i); for (final prefix in realIfacePrefixs) {
if (device.startsWith(prefix)) {
speed += speedOutBytes(devices.indexOf(device));
}
}
} }
return buildStandardOutput(speed); return buildStandardOutput(speed);
} }
@@ -66,12 +121,16 @@ class NetSpeed extends TimeSeq<NetSpeedPart> {
return buildStandardOutput(speedOutBytes(idx)); 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 (pre[0].device == '' || now[0].device == '') return '0kb';
if (all) { if (device == null) {
var size = BigInt.from(0); var size = BigInt.from(0);
for (var i = 0; i < now.length; i++) { for (final device in devices) {
size += sizeOutBytes(i); for (final prefix in realIfacePrefixs) {
if (device.startsWith(prefix)) {
size += sizeOutBytes(devices.indexOf(device));
}
}
} }
return size.bytes2Str; return size.bytes2Str;
} }

View File

@@ -1,6 +1,7 @@
abstract class TimeSeq<T extends TimeSeqIface> { abstract class TimeSeq<T extends TimeSeqIface> {
List<T> pre; List<T> pre;
List<T> now; List<T> now;
void onUpdate();
void update(List<T> new_) { void update(List<T> new_) {
pre = now; pre = now;
@@ -10,6 +11,8 @@ abstract class TimeSeq<T extends TimeSeqIface> {
pre.removeWhere((e) => now.any((el) => e.same(el))); pre.removeWhere((e) => now.any((el) => e.same(el)));
pre.addAll(now.where((e) => pre.every((el) => !e.same(el)))); pre.addAll(now.where((e) => pre.every((el) => !e.same(el))));
} }
onUpdate();
} }
TimeSeq(this.pre, this.now); TimeSeq(this.pre, this.now);

View File

@@ -2,9 +2,9 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; static const String name = "ServerBox";
static const int build = 778; static const int build = 780;
static const String engine = "3.19.1"; static const String engine = "3.19.2";
static const String buildAt = "2024-02-26 16:30:57"; static const String buildAt = "2024-03-06 11:26:38";
static const int modifications = 6; static const int modifications = 7;
static const int script = 40; static const int script = 40;
} }

View File

@@ -246,6 +246,10 @@ class SettingStore extends PersistentStore {
true, 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 // Never show these settings for users
// //
// ------BEGIN------ // ------BEGIN------

View File

@@ -141,6 +141,7 @@
"maxRetryCountEqual0": "Unbegrenzte Verbindungsversuche zum Server", "maxRetryCountEqual0": "Unbegrenzte Verbindungsversuche zum Server",
"min": "min", "min": "min",
"mission": "Mission", "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.", "moveOutServerFuncBtnsHelp": "Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.",
"ms": "ms", "ms": "ms",
"name": "Name", "name": "Name",

View File

@@ -141,6 +141,7 @@
"maxRetryCountEqual0": "Will retry again and again.", "maxRetryCountEqual0": "Will retry again and again.",
"min": "min", "min": "min",
"mission": "Mission", "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.", "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", "ms": "ms",
"name": "Name", "name": "Name",

View File

@@ -141,6 +141,7 @@
"maxRetryCountEqual0": "Réessayera encore et encore.", "maxRetryCountEqual0": "Réessayera encore et encore.",
"min": "min", "min": "min",
"mission": "Mission", "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.", "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", "ms": "ms",
"name": "Nom", "name": "Nom",

View File

@@ -141,6 +141,7 @@
"maxRetryCountEqual0": "Akan mencoba lagi lagi dan lagi.", "maxRetryCountEqual0": "Akan mencoba lagi lagi dan lagi.",
"min": "Min", "min": "Min",
"mission": "Misi", "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.", "moveOutServerFuncBtnsHelp": "Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.",
"ms": "MS", "ms": "MS",
"name": "Nama", "name": "Nama",

View File

@@ -141,6 +141,7 @@
"maxRetryCountEqual0": "会无限重试", "maxRetryCountEqual0": "会无限重试",
"min": "最小", "min": "最小",
"mission": "任务", "mission": "任务",
"more": "更多",
"moveOutServerFuncBtnsHelp": "开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。", "moveOutServerFuncBtnsHelp": "开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。",
"ms": "毫秒", "ms": "毫秒",
"name": "名称", "name": "名称",

View File

@@ -141,6 +141,7 @@
"maxRetryCountEqual0": "會無限重試", "maxRetryCountEqual0": "會無限重試",
"min": "最小", "min": "最小",
"mission": "任務", "mission": "任務",
"more": "更多",
"moveOutServerFuncBtnsHelp": "開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。", "moveOutServerFuncBtnsHelp": "開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。",
"ms": "毫秒", "ms": "毫秒",
"name": "名稱", "name": "名稱",

View File

@@ -180,18 +180,13 @@ class _SettingPageState extends State<SettingPage> {
Widget _buildServer() { Widget _buildServer() {
return Column( return Column(
children: [ children: [
_buildKeepStatusWhenErr(),
_buildServerFuncBtns(), _buildServerFuncBtns(),
_buildNetViewType(),
_buildServerSeq(), _buildServerSeq(),
_buildServerDetailCardSeq(), _buildServerDetailCardSeq(),
_buildNetViewType(),
_buildUpdateInterval(),
_buildMaxRetry(),
//_buildDiskIgnorePath(), //_buildDiskIgnorePath(),
_buildDeleteServers(), _buildDeleteServers(),
_buildTextScaler(), _buildServerMore(),
_buildPreferTemperatureDeviceList(),
_buildDoubleColumnServersPage(),
].map((e) => CardX(child: e)).toList(), ].map((e) => CardX(child: e)).toList(),
); );
} }
@@ -1189,4 +1184,18 @@ class _SettingPageState extends State<SettingPage> {
}, },
); );
} }
Widget _buildServerMore() {
return ExpandTile(
title: Text(l10n.more),
children: [
_buildTextScaler(),
_buildPreferTemperatureDeviceList(),
_buildKeepStatusWhenErr(),
_buildDoubleColumnServersPage(),
_buildUpdateInterval(),
_buildMaxRetry(),
],
);
}
} }

View File

@@ -439,7 +439,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; INFOPLIST_KEY_CFBundleDisplayName = "Server Box";
@@ -449,7 +449,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.15; MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "Server Box"; PRODUCT_NAME = "Server Box";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -574,7 +574,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; INFOPLIST_KEY_CFBundleDisplayName = "Server Box";
@@ -584,7 +584,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.15; MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "Server Box"; PRODUCT_NAME = "Server Box";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -604,7 +604,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 778; CURRENT_PROJECT_VERSION = 780;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -615,7 +615,7 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 10.15; MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 1.0.778; MARKETING_VERSION = 1.0.780;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "Server Box"; PRODUCT_NAME = "Server Box";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";