From 7d2fbde2fec7e20b3ad10550868c8cb2e025195a Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Mon, 8 Apr 2024 21:31:00 +0800 Subject: [PATCH] opt.: cpu line chart --- lib/data/model/server/cpu.dart | 21 +++++++++++-------- .../server/server_status_update_req.dart | 2 +- lib/data/res/status.dart | 2 +- lib/view/page/server/detail/misc.dart | 15 +++++++++---- lib/view/page/server/detail/view.dart | 9 ++++++-- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/data/model/server/cpu.dart b/lib/data/model/server/cpu.dart index fca0766b..530b0619 100644 --- a/lib/data/model/server/cpu.dart +++ b/lib/data/model/server/cpu.dart @@ -7,7 +7,7 @@ import 'package:toolbox/data/res/status.dart'; const _kCap = 30; -class Cpus extends TimeSeq> { +class Cpus extends TimeSeq> { Cpus(super.init1, super.init2); @override @@ -72,7 +72,10 @@ class Cpus extends TimeSeq> { final _spots = >[]; List> get spots => _spots; void _updateSpots() { - for (var i = 1; i < now.length; i++) { + /// 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++) { if (i >= _spots.length) { _spots.add(Fifo(capacity: _kCap)); } else { @@ -112,7 +115,7 @@ class Cpus extends TimeSeq> { } } -class SingleCoreCpu extends TimeSeqIface { +class SingleCpuCore extends TimeSeqIface { final String id; final int user; final int sys; @@ -122,7 +125,7 @@ class SingleCoreCpu extends TimeSeqIface { final int irq; final int softirq; - SingleCoreCpu( + SingleCpuCore( this.id, this.user, this.sys, @@ -136,10 +139,10 @@ class SingleCoreCpu extends TimeSeqIface { int get total => user + sys + nice + idle + iowait + irq + softirq; @override - bool same(SingleCoreCpu other) => id == other.id; + bool same(SingleCpuCore other) => id == other.id; - static List parse(String raw) { - final List cpus = []; + static List parse(String raw) { + final List cpus = []; for (var item in raw.split('\n')) { if (item == '') break; @@ -147,7 +150,7 @@ class SingleCoreCpu extends TimeSeqIface { if (id == null) continue; final matches = item.replaceFirst(id, '').trim().split(' '); cpus.add( - SingleCoreCpu( + SingleCpuCore( id, int.parse(matches[0]), int.parse(matches[1]), @@ -178,7 +181,7 @@ Cpus parseBsdCpu(String raw) { final init = InitStatus.cpus; init.add([ - SingleCoreCpu('cpu', percents[0].toInt(), 0, 0, + SingleCpuCore('cpu', percents[0].toInt(), 0, 0, percents[2].toInt() + percents[1].toInt(), 0, 0, 0), ]); return init; diff --git a/lib/data/model/server/server_status_update_req.dart b/lib/data/model/server/server_status_update_req.dart index 9bb3a1e4..6fb924ab 100644 --- a/lib/data/model/server/server_status_update_req.dart +++ b/lib/data/model/server/server_status_update_req.dart @@ -69,7 +69,7 @@ Future _getLinuxStatus(ServerStatusUpdateReq req) async { } try { - final cpus = SingleCoreCpu.parse(StatusCmdType.cpu.find(segments)); + final cpus = SingleCpuCore.parse(StatusCmdType.cpu.find(segments)); req.ss.cpu.update(cpus); } catch (e, s) { Loggers.parse.warning(e, s); diff --git a/lib/data/res/status.dart b/lib/data/res/status.dart index 596207db..3580c7df 100644 --- a/lib/data/res/status.dart +++ b/lib/data/res/status.dart @@ -9,7 +9,7 @@ import '../model/server/conn.dart'; import '../model/server/system.dart'; abstract final class InitStatus { - static SingleCoreCpu get _initOneTimeCpuStatus => SingleCoreCpu( + static SingleCpuCore get _initOneTimeCpuStatus => SingleCpuCore( 'cpu', 0, 0, diff --git a/lib/view/page/server/detail/misc.dart b/lib/view/page/server/detail/misc.dart index aee09a38..b95dbaa7 100644 --- a/lib/view/page/server/detail/misc.dart +++ b/lib/view/page/server/detail/misc.dart @@ -37,17 +37,24 @@ enum _NetSortType { } } -Widget _buildLineChart(List> spots, Range x) { +Widget _buildLineChart( + List> spots, + Range x, { + String? tooltipPrefix, + bool curve = false, +}) { return LineChart(LineChartData( lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( - tooltipPadding: const EdgeInsets.all(8), + tooltipPadding: const EdgeInsets.all(5), tooltipRoundedRadius: 8, + tooltipMargin: 3, getTooltipItems: (List touchedSpots) { return touchedSpots.map((e) { return LineTooltipItem( - 'CPU${e.barIndex}: ${e.y.toStringAsFixed(2)}', + '$tooltipPrefix${e.barIndex}: ${e.y.toStringAsFixed(2)}', const TextStyle( + fontSize: 12, fontWeight: FontWeight.bold, ), ); @@ -101,7 +108,7 @@ Widget _buildLineChart(List> spots, Range x) { lineBarsData: spots .map((e) => LineChartBarData( spots: e, - isCurved: false, + isCurved: curve, barWidth: 2, isStrokeCapRound: true, color: primaryColor, diff --git a/lib/view/page/server/detail/view.dart b/lib/view/page/server/detail/view.dart index c2b21b2d..2bf5e4f2 100644 --- a/lib/view/page/server/detail/view.dart +++ b/lib/view/page/server/detail/view.dart @@ -193,11 +193,16 @@ class _ServerDetailPageState extends State ), children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 17, vertical: 7), + padding: const EdgeInsets.symmetric(horizontal: 17, vertical: 13), child: SizedBox( height: 137, width: _media.size.width - 26 - 34, - child: _buildLineChart(ss.cpu.spots, ss.cpu.rangeX), + child: _buildLineChart( + ss.cpu.spots, + ss.cpu.rangeX, + tooltipPrefix: 'CPU', + curve: true, + ), ), ), ],