new: prefer temperature device (#285)

This commit is contained in:
lollipopkit
2024-02-26 09:57:59 +08:00
parent 1f586a2c31
commit 2137bfbcd0
17 changed files with 145 additions and 22 deletions

View File

@@ -1168,6 +1168,18 @@ abstract class S {
/// **'Port'** /// **'Port'**
String get port; String get port;
/// No description provided for @preferTemperatureDeviceList.
///
/// In en, this message translates to:
/// **'List prioritizing the display of temperature'**
String get preferTemperatureDeviceList;
/// No description provided for @preferTemperatureDeviceListTip.
///
/// In en, this message translates to:
/// **'For example: Devices supporting temperature display include [\'a\', \'b\'], this configuration is [\'b\', \'c\'], so display the temperature of device b'**
String get preferTemperatureDeviceListTip;
/// No description provided for @preview. /// No description provided for @preview.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

View File

@@ -562,6 +562,12 @@ class SDe extends S {
@override @override
String get port => 'Port'; String get port => 'Port';
@override
String get preferTemperatureDeviceList => 'Liste mit Priorität für die Anzeige der Temperatur';
@override
String get preferTemperatureDeviceListTip => 'Zum Beispiel: Geräte, die die Anzeige der Temperatur unterstützen, sind [\'a\', \'b\'], diese Einstellung ist [\'b\', \'c\'], daher wird die Temperatur des Geräts b angezeigt';
@override @override
String get preview => 'Vorschau'; String get preview => 'Vorschau';

View File

@@ -562,6 +562,12 @@ class SEn extends S {
@override @override
String get port => 'Port'; String get port => 'Port';
@override
String get preferTemperatureDeviceList => 'List prioritizing the display of temperature';
@override
String get preferTemperatureDeviceListTip => 'For example: Devices supporting temperature display include [\'a\', \'b\'], this configuration is [\'b\', \'c\'], so display the temperature of device b';
@override @override
String get preview => 'Preview'; String get preview => 'Preview';

View File

@@ -562,6 +562,12 @@ class SFr extends S {
@override @override
String get port => 'Port'; String get port => 'Port';
@override
String get preferTemperatureDeviceList => 'Liste d\'affichage prioritaire de la température';
@override
String get preferTemperatureDeviceListTip => 'Par exemple : Les appareils prenant en charge l\'affichage de la température sont [\'a\', \'b\'], cette configuration est [\'b\', \'c\'], donc afficher la température de l\'appareil b';
@override @override
String get preview => 'Aperçu'; String get preview => 'Aperçu';

View File

@@ -562,6 +562,12 @@ class SId extends S {
@override @override
String get port => 'Port'; String get port => 'Port';
@override
String get preferTemperatureDeviceList => 'Daftar prioritas tampilan suhu';
@override
String get preferTemperatureDeviceListTip => 'Contohnya: Perangkat yang mendukung tampilan suhu adalah [\'a\', \'b\'], pengaturan ini adalah [\'b\', \'c\'], maka tampilkan suhu perangkat b';
@override @override
String get preview => 'Pratinjau'; String get preview => 'Pratinjau';

View File

@@ -562,6 +562,12 @@ class SZh extends S {
@override @override
String get port => '端口'; String get port => '端口';
@override
String get preferTemperatureDeviceList => '优先显示温度的列表';
@override
String get preferTemperatureDeviceListTip => '例如:设备支持显示温度的设备有[\'a\',\'b\'],此设置为[\'b\',\'c\']则显示设备b的温度';
@override @override
String get preview => '预览'; String get preview => '预览';
@@ -1443,6 +1449,12 @@ class SZhTw extends SZh {
@override @override
String get port => '端口'; String get port => '端口';
@override
String get preferTemperatureDeviceList => '優先顯示溫度的列表';
@override
String get preferTemperatureDeviceListTip => '例如:支持顯示溫度的設備有[\'a\', \'b\'],此設置為[\'b\', \'c\']則顯示設備b的溫度';
@override @override
String get preview => '預覽'; String get preview => '預覽';

View File

@@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:toolbox/core/extension/listx.dart'; import 'package:toolbox/core/extension/listx.dart';
import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/logger.dart';
import 'package:toolbox/data/res/store.dart';
final class SensorAdaptor { final class SensorAdaptor {
final String raw; final String raw;
@@ -101,6 +102,22 @@ final class SensorItem {
return items; return items;
} }
static double? findPreferTempVal(List<SensorItem> items) {
if (items.isEmpty) {
return null;
}
final preferTemperatureDevs = Stores.setting.preferTemperatureDevs.fetch();
if (preferTemperatureDevs.isNotEmpty) {
for (final key in preferTemperatureDevs) {
final item = items.firstWhereOrNull((e) => e.device == key);
if (item != null) {
return item.props.values.firstOrNull?.current;
}
}
}
return items.first.props.values.firstOrNull?.current;
}
static const sensorsRaw = ''' static const sensorsRaw = '''
{ {
"coretemp-isa-0000":{ "coretemp-isa-0000":{

View File

@@ -1,3 +1,5 @@
import 'package:toolbox/data/res/store.dart';
class Temperatures { class Temperatures {
final Map<String, double> _map = {}; final Map<String, double> _map = {};
@@ -35,8 +37,16 @@ class Temperatures {
if (_map.isEmpty) { if (_map.isEmpty) {
return null; return null;
} }
for (final key in _map.keys) { final preferTemperatureDevs = Stores.setting.preferTemperatureDevs.fetch();
if (cpuTempReg.hasMatch(key)) { if (preferTemperatureDevs.isNotEmpty) {
for (final key in preferTemperatureDevs) {
if (_map.containsKey(key)) {
return _map[key];
}
}
}
for (final key in _cpuTemp) {
if (_map.containsKey(key)) {
return _map[key]; return _map[key];
} }
} }
@@ -45,5 +55,5 @@ class Temperatures {
} }
/// soc: mobile phone /// soc: mobile phone
/// cpu_thermal / x86_pkg_temp: x86 /// cpu_thermal / x86_pkg_temp / coretemp / zenpower: x86
final cpuTempReg = RegExp(r'(x86_pkg_temp|cpu_thermal|soc)'); const _cpuTemp = ['x86_pkg_temp', 'coretemp', 'zenpower', 'cpu_thermal', 'soc'];

View File

@@ -239,6 +239,13 @@ class SettingStore extends PersistentStore {
/// Auto refresh container status /// Auto refresh container status
late final contaienrAutoRefresh = property('contaienrAutoRefresh', true); late final contaienrAutoRefresh = property('contaienrAutoRefresh', true);
/// eg:
/// Available devices: ['iwlwifi','x86pkg_temp']
/// Prefer list: ['x86pkg_temp','example']
/// Result: use x86pkg_temp's temperature as the temperature
late final preferTemperatureDevs =
listProperty('preferTemperatureDevs', <String>[]);
// Never show these settings for users // Never show these settings for users
// //
// ------BEGIN------ // ------BEGIN------

View File

@@ -178,6 +178,8 @@
"plzEnterHost": "Bitte Host eingeben.", "plzEnterHost": "Bitte Host eingeben.",
"plzSelectKey": "Wähle einen Key.", "plzSelectKey": "Wähle einen Key.",
"port": "Port", "port": "Port",
"preferTemperatureDeviceList": "Liste mit Priorität für die Anzeige der Temperatur",
"preferTemperatureDeviceListTip": "Zum Beispiel: Geräte, die die Anzeige der Temperatur unterstützen, sind ['a', 'b'], diese Einstellung ist ['b', 'c'], daher wird die Temperatur des Geräts b angezeigt",
"preview": "Vorschau", "preview": "Vorschau",
"primaryColorSeed": "Farbschema", "primaryColorSeed": "Farbschema",
"privateKey": "Private Key", "privateKey": "Private Key",

View File

@@ -178,6 +178,8 @@
"plzEnterHost": "Please enter host.", "plzEnterHost": "Please enter host.",
"plzSelectKey": "Please select a key.", "plzSelectKey": "Please select a key.",
"port": "Port", "port": "Port",
"preferTemperatureDeviceList": "List prioritizing the display of temperature",
"preferTemperatureDeviceListTip": "For example: Devices supporting temperature display include ['a', 'b'], this configuration is ['b', 'c'], so display the temperature of device b",
"preview": "Preview", "preview": "Preview",
"primaryColorSeed": "Primary color seed", "primaryColorSeed": "Primary color seed",
"privateKey": "Private Key", "privateKey": "Private Key",

View File

@@ -178,6 +178,8 @@
"plzEnterHost": "Veuillez saisir l'hôte.", "plzEnterHost": "Veuillez saisir l'hôte.",
"plzSelectKey": "Veuillez sélectionner une clé.", "plzSelectKey": "Veuillez sélectionner une clé.",
"port": "Port", "port": "Port",
"preferTemperatureDeviceList": "Liste d'affichage prioritaire de la température",
"preferTemperatureDeviceListTip": "Par exemple : Les appareils prenant en charge l'affichage de la température sont ['a', 'b'], cette configuration est ['b', 'c'], donc afficher la température de l'appareil b",
"preview": "Aperçu", "preview": "Aperçu",
"primaryColorSeed": "Graine de couleur primaire", "primaryColorSeed": "Graine de couleur primaire",
"privateKey": "Clé privée", "privateKey": "Clé privée",

View File

@@ -178,6 +178,8 @@
"plzEnterHost": "Harap masukkan host.", "plzEnterHost": "Harap masukkan host.",
"plzSelectKey": "Pilih kunci.", "plzSelectKey": "Pilih kunci.",
"port": "Port", "port": "Port",
"preferTemperatureDeviceList": "Daftar prioritas tampilan suhu",
"preferTemperatureDeviceListTip": "Contohnya: Perangkat yang mendukung tampilan suhu adalah ['a', 'b'], pengaturan ini adalah ['b', 'c'], maka tampilkan suhu perangkat b",
"preview": "Pratinjau", "preview": "Pratinjau",
"primaryColorSeed": "Warna utama", "primaryColorSeed": "Warna utama",
"privateKey": "Kunci Pribadi", "privateKey": "Kunci Pribadi",

View File

@@ -178,6 +178,8 @@
"plzEnterHost": "请输入主机", "plzEnterHost": "请输入主机",
"plzSelectKey": "请选择私钥", "plzSelectKey": "请选择私钥",
"port": "端口", "port": "端口",
"preferTemperatureDeviceList": "优先显示温度的列表",
"preferTemperatureDeviceListTip": "例如:设备支持显示温度的设备有['a','b'],此设置为['b','c']则显示设备b的温度",
"preview": "预览", "preview": "预览",
"primaryColorSeed": "主题色种子", "primaryColorSeed": "主题色种子",
"privateKey": "私钥", "privateKey": "私钥",

View File

@@ -178,6 +178,8 @@
"plzEnterHost": "請輸入主機", "plzEnterHost": "請輸入主機",
"plzSelectKey": "請選擇私鑰", "plzSelectKey": "請選擇私鑰",
"port": "端口", "port": "端口",
"preferTemperatureDeviceList": "優先顯示溫度的列表",
"preferTemperatureDeviceListTip": "例如:支持顯示溫度的設備有['a', 'b'],此設置為['b', 'c']則顯示設備b的溫度",
"preview": "預覽", "preview": "預覽",
"primaryColorSeed": "主要色調種子", "primaryColorSeed": "主要色調種子",
"privateKey": "私鑰", "privateKey": "私鑰",

View File

@@ -12,6 +12,7 @@ import 'package:toolbox/core/extension/ssh_client.dart';
import 'package:toolbox/core/utils/platform/base.dart'; import 'package:toolbox/core/utils/platform/base.dart';
import 'package:toolbox/core/utils/share.dart'; import 'package:toolbox/core/utils/share.dart';
import 'package:toolbox/data/model/app/shell_func.dart'; import 'package:toolbox/data/model/app/shell_func.dart';
import 'package:toolbox/data/model/server/sensors.dart';
import 'package:toolbox/data/model/server/try_limiter.dart'; import 'package:toolbox/data/model/server/try_limiter.dart';
import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/data/res/store.dart';
@@ -393,12 +394,6 @@ class _ServerPageState extends State<ServerPage>
} }
Widget _buildTopRightText(ServerStatus ss, ServerState cs) { Widget _buildTopRightText(ServerStatus ss, ServerState cs) {
final topRightStr = _getTopRightStr(
cs,
ss.temps.first,
ss.more[StatusCmdType.uptime] ?? '',
ss.err,
);
if (cs == ServerState.failed && ss.err != null) { if (cs == ServerState.failed && ss.err != null) {
return GestureDetector( return GestureDetector(
onTap: () => _showFailReason(ss), onTap: () => _showFailReason(ss),
@@ -408,6 +403,7 @@ class _ServerPageState extends State<ServerPage>
), ),
); );
} }
final topRightStr = _getTopRightStr(ss, cs);
return Text( return Text(
topRightStr, topRightStr,
style: UIs.text13Grey, style: UIs.text13Grey,
@@ -549,19 +545,21 @@ class _ServerPageState extends State<ServerPage>
_tag == null || (pro.pick(id: e)?.spi.tags?.contains(_tag) ?? false)) _tag == null || (pro.pick(id: e)?.spi.tags?.contains(_tag) ?? false))
.toList(); .toList();
String _getTopRightStr( String _getTopRightStr(ServerStatus ss, ServerState cs) {
ServerState cs,
double? temp,
String upTime,
String? failedInfo,
) {
switch (cs) { switch (cs) {
case ServerState.disconnected: case ServerState.disconnected:
return l10n.disconnected; return l10n.disconnected;
case ServerState.finished: case ServerState.finished:
final tempStr = temp == null ? '' : '${temp.toStringAsFixed(1)}°C'; final temp = ss.temps.first;
final sensorTemp = SensorItem.findPreferTempVal(ss.sensors);
final tempStr = switch ((temp, sensorTemp)) {
(_, final double val) => '${val.toStringAsFixed(1)}°C',
(final double val, _) => '${val.toStringAsFixed(1)}°C',
_ => null,
};
final upTime = ss.more[StatusCmdType.uptime];
final items = [tempStr, upTime]; final items = [tempStr, upTime];
final str = items.where((element) => element.isNotEmpty).join(' | '); final str = items.where((e) => e != null && e.isNotEmpty).join(' | ');
if (str.isEmpty) return l10n.noResult; if (str.isEmpty) return l10n.noResult;
return str; return str;
case ServerState.loading: case ServerState.loading:
@@ -571,10 +569,7 @@ class _ServerPageState extends State<ServerPage>
case ServerState.connecting: case ServerState.connecting:
return l10n.serverTabConnecting; return l10n.serverTabConnecting;
case ServerState.failed: case ServerState.failed:
if (failedInfo == null) { return ss.err ?? l10n.serverTabFailed;
return l10n.serverTabFailed;
}
return failedInfo;
} }
} }

View File

@@ -190,6 +190,7 @@ class _SettingPageState extends State<SettingPage> {
//_buildDiskIgnorePath(), //_buildDiskIgnorePath(),
_buildDeleteServers(), _buildDeleteServers(),
_buildTextScaler(), _buildTextScaler(),
_buildPreferTemperatureDeviceList(),
//if (isDesktop) _buildDoubleColumnServersPage(), //if (isDesktop) _buildDoubleColumnServersPage(),
].map((e) => CardX(child: e)).toList(), ].map((e) => CardX(child: e)).toList(),
); );
@@ -1153,4 +1154,37 @@ class _SettingPageState extends State<SettingPage> {
trailing: StoreSwitch(prop: _setting.containerParseStat), trailing: StoreSwitch(prop: _setting.containerParseStat),
); );
} }
Widget _buildPreferTemperatureDeviceList() {
void onSubmitted(String s) {
final list = s.split('\n');
_setting.preferTemperatureDevs.put(list);
context.pop();
}
return ListTile(
title: Text(l10n.preferTemperatureDeviceList),
subtitle: Text(l10n.preferTemperatureDeviceListTip, style: UIs.textGrey),
trailing: const Icon(Icons.keyboard_arrow_right),
onTap: () {
final list = _setting.preferTemperatureDevs.fetch();
final listStr = list.join('\n');
final ctrl = TextEditingController(text: listStr);
context.showRoundDialog(
title: Text(l10n.preferTemperatureDeviceList),
child: Input(
autoFocus: true,
controller: ctrl,
maxLines: 3,
onSubmitted: onSubmitted,
),
actions: [
TextButton(
onPressed: () => onSubmitted(ctrl.text),
child: Text(l10n.ok),
),
],
);
},
);
}
} }