diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 1271838a..e42d5d01 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -356,7 +356,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 210; + CURRENT_PROJECT_VERSION = 212; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -364,7 +364,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.210; + MARKETING_VERSION = 1.0.212; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -486,7 +486,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 210; + CURRENT_PROJECT_VERSION = 212; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -494,7 +494,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.210; + MARKETING_VERSION = 1.0.212; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -510,7 +510,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 210; + CURRENT_PROJECT_VERSION = 212; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -518,7 +518,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.210; + MARKETING_VERSION = 1.0.212; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/lib/data/model/ssh/terminal_color.dart b/lib/data/model/ssh/terminal_color.dart new file mode 100644 index 00000000..4904c52e --- /dev/null +++ b/lib/data/model/ssh/terminal_color.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:toolbox/data/res/terminal_color.dart'; +import 'package:xterm/ui.dart'; + +class TerminalUITheme { + final Color cursor; + final Color selection; + final Color foreground; + final Color background; + final Color searchHitBackground; + final Color searchHitBackgroundCurrent; + final Color searchHitForeground; + + const TerminalUITheme({ + required this.cursor, + required this.selection, + required this.foreground, + required this.background, + required this.searchHitBackground, + required this.searchHitBackgroundCurrent, + required this.searchHitForeground, + }); + + TerminalTheme toTerminalTheme(TerminalColors termColor) { + return TerminalTheme( + cursor: cursor, + selection: selection, + foreground: foreground, + background: background, + black: termColor.black, + red: termColor.red, + green: termColor.green, + yellow: termColor.yellow, + blue: termColor.blue, + magenta: termColor.magenta, + cyan: termColor.cyan, + white: termColor.white, + brightBlack: termColor.brightBlack, + brightRed: termColor.brightRed, + brightGreen: termColor.brightGreen, + brightYellow: termColor.brightYellow, + brightBlue: termColor.brightBlue, + brightMagenta: termColor.brightMagenta, + brightCyan: termColor.brightCyan, + brightWhite: termColor.brightWhite, + searchHitBackground: searchHitBackground, + searchHitBackgroundCurrent: searchHitBackgroundCurrent, + searchHitForeground: searchHitForeground, + ); + } +} + +abstract class TerminalColors { + final TerminalColorsPlatform platform; + final Color black = Colors.black; + final Color red; + final Color green; + final Color yellow; + final Color blue; + // 品红 + final Color magenta; + // 青 + final Color cyan; + final Color white; + + /// Also called grey + final Color brightBlack; + final Color brightRed; + final Color brightGreen; + final Color brightYellow; + final Color brightBlue; + final Color brightMagenta; + final Color brightCyan; + final Color brightWhite; + + TerminalColors( + this.platform, + this.red, + this.green, + this.yellow, + this.blue, + this.magenta, + this.cyan, + this.white, + this.brightBlack, + this.brightRed, + this.brightGreen, + this.brightYellow, + this.brightBlue, + this.brightMagenta, + this.brightCyan, { + this.brightWhite = Colors.white, + }); +} + +enum TerminalColorsPlatform { + macOS, + vga, + cmd, + putty, + xterm, + ubuntu, + ; + + String get name { + switch (this) { + case TerminalColorsPlatform.vga: + return 'VGA'; + case TerminalColorsPlatform.cmd: + return 'CMD'; + case TerminalColorsPlatform.macOS: + return 'macOS'; + case TerminalColorsPlatform.putty: + return 'PuTTY'; + case TerminalColorsPlatform.xterm: + return 'xterm'; + case TerminalColorsPlatform.ubuntu: + return 'Ubuntu'; + default: + return 'Unknown'; + } + } + + TerminalColors get colors { + switch (this) { + case TerminalColorsPlatform.vga: + return VGATerminalColor(); + case TerminalColorsPlatform.cmd: + return CMDTerminalColor(); + case TerminalColorsPlatform.macOS: + return MacOSTerminalColor(); + case TerminalColorsPlatform.putty: + return PuttyTerminalColor(); + case TerminalColorsPlatform.xterm: + return XTermTerminalColor(); + case TerminalColorsPlatform.ubuntu: + return UbuntuTerminalColor(); + default: + return MacOSTerminalColor(); + } + } +} diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 093449df..d2e1f1cc 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 = 211; + static const int build = 212; static const String engine = "Flutter 3.7.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision b06b8b2710 (9 days ago) • 2023-01-23 16:55:55 -0800\nEngine • revision b24591ed32\nTools • Dart 2.19.0 • DevTools 2.20.1\n"; - static const String buildAt = "2023-02-02 12:40:53.962160"; - static const int modifications = 5; + static const String buildAt = "2023-02-02 13:16:45.445785"; + static const int modifications = 3; } diff --git a/lib/data/res/terminal_color.dart b/lib/data/res/terminal_color.dart new file mode 100644 index 00000000..e24af98c --- /dev/null +++ b/lib/data/res/terminal_color.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +import 'package:toolbox/data/model/ssh/terminal_color.dart'; + +class VGATerminalColor extends TerminalColors { + VGATerminalColor() + : super( + TerminalColorsPlatform.vga, + const Color.fromARGB(255, 170, 0, 0), + const Color.fromARGB(255, 0, 170, 0), + const Color.fromARGB(255, 170, 85, 0), + const Color.fromARGB(255, 0, 0, 170), + const Color.fromARGB(255, 170, 0, 170), + const Color.fromARGB(255, 0, 170, 170), + const Color.fromARGB(255, 170, 170, 170), + const Color.fromARGB(255, 85, 85, 85), + const Color.fromARGB(255, 255, 85, 85), + const Color.fromARGB(255, 85, 255, 85), + const Color.fromARGB(255, 255, 255, 85), + const Color.fromARGB(255, 85, 85, 255), + const Color.fromARGB(255, 255, 85, 255), + const Color.fromARGB(255, 85, 255, 255), + ); +} + +class CMDTerminalColor extends TerminalColors { + CMDTerminalColor() + : super( + TerminalColorsPlatform.cmd, + const Color.fromARGB(255, 128, 0, 0), + const Color.fromARGB(255, 0, 128, 0), + const Color.fromARGB(255, 128, 128, 0), + const Color.fromARGB(255, 0, 0, 128), + const Color.fromARGB(255, 128, 0, 128), + const Color.fromARGB(255, 0, 128, 128), + const Color.fromARGB(255, 192, 192, 192), + const Color.fromARGB(255, 128, 128, 128), + const Color.fromARGB(255, 255, 0, 0), + const Color.fromARGB(255, 0, 255, 0), + const Color.fromARGB(255, 255, 255, 0), + const Color.fromARGB(255, 0, 0, 255), + const Color.fromARGB(255, 255, 0, 255), + const Color.fromARGB(255, 0, 255, 255), + ); +} + +class MacOSTerminalColor extends TerminalColors { + MacOSTerminalColor() + : super( + TerminalColorsPlatform.macOS, + const Color.fromARGB(255, 194, 54, 33), + const Color.fromARGB(255, 37, 188, 36), + const Color.fromARGB(255, 173, 173, 39), + const Color.fromARGB(255, 73, 46, 225), + const Color.fromARGB(255, 211, 56, 211), + const Color.fromARGB(255, 51, 187, 200), + const Color.fromARGB(255, 203, 204, 205), + const Color.fromARGB(255, 129, 131, 131), + const Color.fromARGB(255, 252, 57, 31), + const Color.fromARGB(255, 49, 231, 34), + const Color.fromARGB(255, 234, 236, 35), + const Color.fromARGB(255, 88, 51, 255), + const Color.fromARGB(255, 249, 53, 248), + const Color.fromARGB(255, 20, 240, 240), + brightWhite: const Color.fromARGB(255, 233, 235, 235)); +} + +class PuttyTerminalColor extends TerminalColors { + PuttyTerminalColor() + : super( + TerminalColorsPlatform.putty, + const Color.fromARGB(255, 187, 0, 0), + const Color.fromARGB(255, 0, 187, 0), + const Color.fromARGB(255, 187, 187, 0), + const Color.fromARGB(255, 0, 0, 187), + const Color.fromARGB(255, 187, 0, 187), + const Color.fromARGB(255, 0, 187, 187), + const Color.fromARGB(255, 187, 187, 187), + const Color.fromARGB(255, 85, 85, 85), + const Color.fromARGB(255, 255, 85, 85), + const Color.fromARGB(255, 85, 255, 85), + const Color.fromARGB(255, 255, 255, 85), + const Color.fromARGB(255, 85, 85, 255), + const Color.fromARGB(255, 255, 85, 255), + const Color.fromARGB(255, 85, 255, 255), + ); +} + +class XTermTerminalColor extends TerminalColors { + XTermTerminalColor() + : super( + TerminalColorsPlatform.xterm, + const Color.fromARGB(255, 205, 0, 0), + const Color.fromARGB(255, 0, 205, 0), + const Color.fromARGB(255, 205, 205, 0), + const Color.fromARGB(255, 0, 0, 238), + const Color.fromARGB(255, 205, 0, 205), + const Color.fromARGB(255, 0, 205, 205), + const Color.fromARGB(255, 229, 229, 229), + const Color.fromARGB(255, 127, 127, 127), + const Color.fromARGB(255, 255, 0, 0), + const Color.fromARGB(255, 0, 255, 0), + const Color.fromARGB(255, 255, 255, 0), + const Color.fromARGB(255, 92, 92, 255), + const Color.fromARGB(255, 255, 0, 255), + const Color.fromARGB(255, 0, 255, 255), + ); +} + +class UbuntuTerminalColor extends TerminalColors { + UbuntuTerminalColor() + : super( + TerminalColorsPlatform.ubuntu, + const Color.fromARGB(255, 222, 56, 43), + const Color.fromARGB(255, 57, 181, 74), + const Color.fromARGB(255, 255, 199, 6), + const Color.fromARGB(255, 0, 111, 184), + const Color.fromARGB(255, 118, 38, 113), + const Color.fromARGB(255, 44, 181, 233), + const Color.fromARGB(255, 204, 204, 204), + const Color.fromARGB(255, 128, 128, 128), + const Color.fromARGB(255, 255, 0, 0), + const Color.fromARGB(255, 0, 255, 0), + const Color.fromARGB(255, 255, 255, 0), + const Color.fromARGB(255, 0, 0, 255), + const Color.fromARGB(255, 255, 0, 255), + const Color.fromARGB(255, 0, 255, 255), + ); +} diff --git a/lib/data/res/terminal_theme.dart b/lib/data/res/terminal_theme.dart index 0f731f50..4cea661c 100644 --- a/lib/data/res/terminal_theme.dart +++ b/lib/data/res/terminal_theme.dart @@ -1,53 +1,22 @@ import 'package:flutter/material.dart'; -import 'package:xterm/ui.dart'; -const termDarkTheme = TerminalTheme( +import '../model/ssh/terminal_color.dart'; + +const termDarkTheme = TerminalUITheme( cursor: Color(0XAAAEAFAD), selection: Color(0XAAAEAFAD), foreground: Color(0XFFCCCCCC), background: Colors.black, - black: Color(0XFF000000), - red: Color(0XFFCD3131), - green: Color(0XFF0DBC79), - yellow: Color(0XFFE5E510), - blue: Color(0XFF2472C8), - magenta: Color(0XFFBC3FBC), - cyan: Color(0XFF11A8CD), - white: Color(0XFFE5E5E5), - brightBlack: Color(0XFF666666), - brightRed: Color(0XFFF14C4C), - brightGreen: Color(0XFF23D18B), - brightYellow: Color(0XFFF5F543), - brightBlue: Color(0XFF3B8EEA), - brightMagenta: Color(0XFFD670D6), - brightCyan: Color(0XFF29B8DB), - brightWhite: Color(0XFFFFFFFF), searchHitBackground: Color(0XFFFFFF2B), searchHitBackgroundCurrent: Color(0XFF31FF26), searchHitForeground: Color(0XFF000000), ); -const termLightTheme = TerminalTheme( +const termLightTheme = TerminalUITheme( cursor: Color(0XFFAEAFAD), - selection: Color(0XFFAEAFAD), + selection: Color.fromARGB(102, 174, 175, 173), foreground: Color(0XFF000000), background: Color(0XFFFFFFFF), - black: Color(0XFF000000), - red: Color(0XFFCD3131), - green: Color(0XFF0DBC79), - yellow: Color(0XFFE5E510), - blue: Color(0XFF2472C8), - magenta: Color(0XFFBC3FBC), - cyan: Color(0XFF11A8CD), - white: Color(0XFFE5E5E5), - brightBlack: Color(0XFF666666), - brightRed: Color(0XFFF14C4C), - brightGreen: Color(0XFF23D18B), - brightYellow: Color(0XFFF5F543), - brightBlue: Color(0XFF3B8EEA), - brightMagenta: Color(0XFFD670D6), - brightCyan: Color(0XFF29B8DB), - brightWhite: Color(0XFFFFFFFF), searchHitBackground: Color(0XFFFFFF2B), searchHitBackgroundCurrent: Color(0XFF31FF26), searchHitForeground: Color(0XFF000000), diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index f127203e..ff521938 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -22,4 +22,6 @@ class SettingStore extends PersistentStore { /// First time to use SSH term StoreProperty get firstTimeUseSshTerm => property('firstTimeUseSshTerm', defaultValue: true); + + StoreProperty get termColorIdx => property('termColorIdx', defaultValue: 0); } diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index 6b551ad1..b101c86c 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -67,7 +67,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aboutThanks": MessageLookupByLibrary.simpleMessage( - "\nAll rights reserved.\n\nThanks to the following people who participated in the test."), + "\n\nThanks to the following people who participated in the test."), "addAServer": MessageLookupByLibrary.simpleMessage("add a server"), "addOne": MessageLookupByLibrary.simpleMessage("Add one"), "addPrivateKey": @@ -242,6 +242,7 @@ class MessageLookup extends MessageLookupByLibrary { "sureNoPwd": MessageLookupByLibrary.simpleMessage( "Are you sure to use no password?"), "sureToDeleteServer": m14, + "termTheme": MessageLookupByLibrary.simpleMessage("Terminal theme"), "ttl": MessageLookupByLibrary.simpleMessage("ttl"), "unknown": MessageLookupByLibrary.simpleMessage("unknown"), "unknownError": MessageLookupByLibrary.simpleMessage("Unknown error"), diff --git a/lib/generated/intl/messages_zh.dart b/lib/generated/intl/messages_zh.dart index 4c573cae..427b6dbd 100644 --- a/lib/generated/intl/messages_zh.dart +++ b/lib/generated/intl/messages_zh.dart @@ -66,7 +66,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aboutThanks": - MessageLookupByLibrary.simpleMessage("\n保留所有权利。\n\n感谢以下参与软件测试的各位。"), + MessageLookupByLibrary.simpleMessage("\n\n感谢以下参与软件测试的各位。"), "addAServer": MessageLookupByLibrary.simpleMessage("添加服务器"), "addOne": MessageLookupByLibrary.simpleMessage("前去新增"), "addPrivateKey": MessageLookupByLibrary.simpleMessage("添加一个私钥"), @@ -210,6 +210,7 @@ class MessageLookup extends MessageLookupByLibrary { "sureDelete": m13, "sureNoPwd": MessageLookupByLibrary.simpleMessage("确认使用无密码?"), "sureToDeleteServer": m14, + "termTheme": MessageLookupByLibrary.simpleMessage("终端主题"), "ttl": MessageLookupByLibrary.simpleMessage("缓存时间"), "unknown": MessageLookupByLibrary.simpleMessage("未知"), "unknownError": MessageLookupByLibrary.simpleMessage("未知错误"), diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index cc8e55ca..bb2a08b4 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -50,10 +50,10 @@ class S { return Localizations.of(context, S); } - /// `\nAll rights reserved.\n\nThanks to the following people who participated in the test.` + /// `\n\nThanks to the following people who participated in the test.` String get aboutThanks { return Intl.message( - '\nAll rights reserved.\n\nThanks to the following people who participated in the test.', + '\n\nThanks to the following people who participated in the test.', name: 'aboutThanks', desc: '', args: [], @@ -1381,6 +1381,16 @@ class S { ); } + /// `Terminal theme` + String get termTheme { + return Intl.message( + 'Terminal theme', + name: 'termTheme', + desc: '', + args: [], + ); + } + /// `ttl` String get ttl { return Intl.message( diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index e0ee7035..a2b66f5c 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,5 +1,5 @@ { - "aboutThanks": "\nAll rights reserved.\n\nThanks to the following people who participated in the test.", + "aboutThanks": "\n\nThanks to the following people who participated in the test.", "addAServer": "add a server", "addOne": "Add one", "addPrivateKey": "Add private key", @@ -132,6 +132,7 @@ "sureDelete": "Are you sure to delete [{name}]?", "sureNoPwd": "Are you sure to use no password?", "sureToDeleteServer": "Are you sure to delete server [{server}]?", + "termTheme": "Terminal theme", "ttl": "ttl", "unknown": "unknown", "unknownError": "Unknown error", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index cc032b3c..fe2bb881 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -1,5 +1,5 @@ { - "aboutThanks": "\n保留所有权利。\n\n感谢以下参与软件测试的各位。", + "aboutThanks": "\n\n感谢以下参与软件测试的各位。", "addAServer": "添加服务器", "addOne": "前去新增", "addPrivateKey": "添加一个私钥", @@ -132,6 +132,7 @@ "sureDelete": "确定删除[{name}]?", "sureNoPwd": "确认使用无密码?", "sureToDeleteServer": "你确定要删除服务器 [{server}] 吗?", + "termTheme": "终端主题", "ttl": "缓存时间", "unknown": "未知", "unknownError": "未知错误", diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 29620019..cc2deab6 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -342,7 +342,7 @@ class _ServerDetailPageState extends State SizedBox( width: width, child: Text( - '${ns.speedIn(device: device)}\n${ns.totalIn(device: device)}', + '${ns.speedIn(device: device)} | ${ns.totalIn(device: device)}', style: textSize11, textAlign: TextAlign.center, textScaleFactor: 0.87, @@ -351,7 +351,7 @@ class _ServerDetailPageState extends State SizedBox( width: width, child: Text( - '${ns.speedOut(device: device)}\n${ns.totalOut(device: device)}', + '${ns.speedOut(device: device)} | ${ns.totalOut(device: device)}', style: textSize11, textAlign: TextAlign.right, textScaleFactor: 0.87, diff --git a/lib/view/page/setting.dart b/lib/view/page/setting.dart index d1d3bf75..e1fd3940 100644 --- a/lib/view/page/setting.dart +++ b/lib/view/page/setting.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_material_color_picker/flutter_material_color_picker.dart'; import 'package:provider/provider.dart'; +import 'package:toolbox/data/model/ssh/terminal_color.dart'; import '../../core/update.dart'; import '../../core/utils/ui.dart'; @@ -24,20 +25,19 @@ class SettingPage extends StatefulWidget { class _SettingPageState extends State { late final SettingStore _setting; - late int _selectedColorValue; - late int _launchPageIdx; late final ServerProvider _serverProvider; late MediaQueryData _media; - late ThemeData _theme; late S _s; - var _updateInterval = 5.0; + late int _selectedColorValue; + late int _launchPageIdx; + late int _termThemeIdx; + late double _updateInterval; @override void didChangeDependencies() { super.didChangeDependencies(); _media = MediaQuery.of(context); - _theme = Theme.of(context); _s = S.of(context); } @@ -47,6 +47,7 @@ class _SettingPageState extends State { _serverProvider = locator(); _setting = locator(); _launchPageIdx = _setting.launchPage.fetch()!; + _termThemeIdx = _setting.termColorIdx.fetch()!; _updateInterval = _setting.serverStatusUpdateInterval.fetch()!.toDouble(); } @@ -64,6 +65,7 @@ class _SettingPageState extends State { _buildCheckUpdate(), _buildLaunchPage(), _buildDistLogoSwitch(), + _buildTermTheme(), ].map((e) => RoundRectCard(e)).toList(), ), ); @@ -218,10 +220,7 @@ class _SettingPageState extends State { contentPadding: EdgeInsets.zero, title: Text( tabTitleName(context, tabs.indexOf(e)), - style: TextStyle( - fontSize: 14, - color: _theme.textTheme.bodyMedium!.color!.withAlpha(177), - ), + style: textSize13, ), trailing: _buildRadio(tabs.indexOf(e)), ), @@ -242,4 +241,49 @@ class _SettingPageState extends State { }, ); } + + Widget _buildTermTheme() { + return ExpansionTile( + textColor: primaryColor, + childrenPadding: const EdgeInsets.only(left: 17), + title: Text( + _s.termTheme, + style: textSize13, + ), + trailing: Text( + TerminalColorsPlatform.values[_termThemeIdx].name, + style: textSize13, + ), + children: _buildTermThemeRadioList(), + ); + } + + List _buildTermThemeRadioList() { + return TerminalColorsPlatform.values + .map( + (e) => ListTile( + contentPadding: EdgeInsets.zero, + title: Text( + e.name, + style: textSize13, + ), + trailing: _buildTermThemeRadio(e), + ), + ) + .toList(); + } + + Radio _buildTermThemeRadio(TerminalColorsPlatform platform) { + return Radio( + value: platform.index, + groupValue: _termThemeIdx, + onChanged: (int? value) { + setState(() { + value ??= 0; + _termThemeIdx = value!; + _setting.termColorIdx.put(value!); + }); + }, + ); + } } diff --git a/lib/view/page/ssh.dart b/lib/view/page/ssh.dart index 7126f6e0..8d43c31f 100644 --- a/lib/view/page/ssh.dart +++ b/lib/view/page/ssh.dart @@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; +import 'package:toolbox/data/model/ssh/terminal_color.dart'; import 'package:toolbox/generated/l10n.dart'; import 'package:xterm/xterm.dart'; @@ -17,6 +18,7 @@ import '../../data/provider/virtual_keyboard.dart'; import '../../data/res/color.dart'; import '../../data/res/terminal_theme.dart'; import '../../data/res/virtual_key.dart'; +import '../../data/store/setting.dart'; import '../../locator.dart'; class SSHPage extends StatefulWidget { @@ -36,6 +38,7 @@ class _SSHPageState extends State { final TerminalController _terminalController = TerminalController(); final ContextMenuController _menuController = ContextMenuController(); late TextStyle _menuTextStyle; + late TerminalColors _termColors; late S _s; var _isDark = false; @@ -43,6 +46,7 @@ class _SSHPageState extends State { @override void initState() { super.initState(); + _termColors = TerminalColorsPlatform.values[locator().termColorIdx.fetch()!].colors; initTerminal(); } @@ -102,7 +106,7 @@ class _SSHPageState extends State { final termTheme = _isDark ? termDarkTheme : termLightTheme; return Scaffold( backgroundColor: termTheme.background, - body: _buildBody(termTheme), + body: _buildBody(termTheme.toTerminalTheme(_termColors)), bottomNavigationBar: _buildBottom(), ); } diff --git a/screenshots/detail.jpg b/screenshots/detail.jpg index 91aba26b..0eb37305 100644 Binary files a/screenshots/detail.jpg and b/screenshots/detail.jpg differ