diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index e8d29ee2..c38b4344 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -1334,6 +1334,18 @@ abstract class S { /// **'See error'** String get viewErr; + /// No description provided for @virtKeyHelpClipboard. + /// + /// In en, this message translates to: + /// **'Copy to the clipboard if terminal selected is not empty, otherwise paste the contents of the clipboard to the terminal.'** + String get virtKeyHelpClipboard; + + /// No description provided for @virtKeyHelpSFTP. + /// + /// In en, this message translates to: + /// **'Open current directory in SFTP.'** + String get virtKeyHelpSFTP; + /// No description provided for @waitConnection. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart index 10cbc63b..9b989239 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart @@ -666,6 +666,12 @@ class SDe extends S { @override String get viewErr => 'Fehler anzeigen'; + @override + String get virtKeyHelpClipboard => 'In die Zwischenablage kopieren, wenn das ausgewählte Terminal nicht leer ist, andernfalls den Inhalt der Zwischenablage in das Terminal einfügen.'; + + @override + String get virtKeyHelpSFTP => 'Aktuelles Verzeichnis in SFTP öffnen.'; + @override String get waitConnection => 'Bitte warte, bis die Verbindung hergestellt wurde.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index db400d6f..5bc07dc7 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -666,6 +666,12 @@ class SEn extends S { @override String get viewErr => 'See error'; + @override + String get virtKeyHelpClipboard => 'Copy to the clipboard if terminal selected is not empty, otherwise paste the contents of the clipboard to the terminal.'; + + @override + String get virtKeyHelpSFTP => 'Open current directory in SFTP.'; + @override String get waitConnection => 'Please wait for the connection to be established.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart index 580694ab..e2bf1074 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart @@ -666,6 +666,12 @@ class SId extends S { @override String get viewErr => 'Lihat kesalahan'; + @override + String get virtKeyHelpClipboard => 'Salin ke clipboard jika terminal yang dipilih tidak kosong, jika tidak, tempel isi clipboard ke terminal.'; + + @override + String get virtKeyHelpSFTP => 'Buka direktori saat ini di SFTP.'; + @override String get waitConnection => 'Harap tunggu koneksi akan dibuat.'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index 3bff4e9a..47376942 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -666,6 +666,12 @@ class SZh extends S { @override String get viewErr => '查看错误'; + @override + String get virtKeyHelpClipboard => '如果终端有选中字符,则复制选中字符至剪切板,否则粘贴剪切板内容至终端。'; + + @override + String get virtKeyHelpSFTP => '在 SFTP 中打开当前路径。'; + @override String get waitConnection => '请等待连接建立'; @@ -1342,6 +1348,12 @@ class SZhTw extends SZh { @override String get viewErr => '查看錯誤'; + @override + String get virtKeyHelpClipboard => '如果終端有選中字符,則復製選中字符至剪切板,否則粘貼剪切板內容至終端。'; + + @override + String get virtKeyHelpSFTP => '在 SFTP 中打開當前路徑。'; + @override String get waitConnection => '請等待連接建立'; diff --git a/README.md b/README.md index 5a51d94d..789766dd 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Especially thanks to dartss - [x] `Status` charts - [x] `Code editor` - [x] `Ping` and etc. -- [x] Localization ( English, 简体中文, Deutsch, 繁體中文, Indonesian. [How to contribute?](#l10n-guide)) +- [x] Localization ( English, 简体中文, Deutsch, 繁體中文, Indonesian. [l10n guide](#l10n-guide) ) - [x] Desktop support @@ -86,7 +86,10 @@ Full Support| Android / iOS / macOS Support, but not tested| Windows / Linux -## l10n guide +## 🧱 Contribution +**Any positive contribution is welcome**. +10 iOS app redemption codes will be given away for the first time you participate in the contribution. This is the only thing I can do to thank you. :) +### l10n guide 1. Fork this repo and clone forked repo to your local machine. 2. Create `arb` file in `lib/l10n/` directory - File name should be `intl_XX.arb`, where `XX` is the language code. Such as `intl_en.arb` for English and `intl_zh.arb` for Chinese. diff --git a/README_zh.md b/README_zh.md index b1406c75..ad4b9449 100644 --- a/README_zh.md +++ b/README_zh.md @@ -31,7 +31,7 @@ - [x] 状态图表 - [x] 代码编辑器 - [x] `Ping` 和 更多 -- [x] 本地化 ( English, 简体中文, Deutsch, 繁體中文, Indonesian。 [如何贡献?](#l10n-guide)) +- [x] 本地化 ( English, 简体中文, Deutsch, 繁體中文, Indonesian。 [如何贡献?](#l10n)) - [x] 桌面端支持 @@ -85,8 +85,11 @@ 完整支持 | Android / iOS / macOS 可能支持,未测试 | Windows / Linux +## 🧱 贡献 +**任何正面的贡献都欢迎**. +第一次参与贡献,会赠送 10 份 iOS App 兑换码。这是我唯一能送的。你可以同来送给其他人。:) -## l10n +### l10n 1. Fork 本项目,并 Clone 你 Fork 的项目至你的电脑 2. 在 `lib/l10n/` 文件夹内创建 `.arb` 本地化文件 - 文件名应该类似 `intl_XX.arb`, `XX` 是语言标识码。 例如 `intl_en.arb` 是给英语的, `intl_zh.arb` 是给中文的 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 80c42830..0e1526bf 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 = 396; + CURRENT_PROJECT_VERSION = 397; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -478,7 +478,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -610,7 +610,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -636,7 +636,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; 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.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; 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.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; 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.396; + MARKETING_VERSION = 1.0.397; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/lib/data/model/server/try_limiter.dart b/lib/data/model/server/try_limiter.dart index d6931dcd..32b39c18 100644 --- a/lib/data/model/server/try_limiter.dart +++ b/lib/data/model/server/try_limiter.dart @@ -17,7 +17,7 @@ class TryLimiter { return true; } - void resetTryTimes(String id) { + void reset(String id) { _triedTimes[id] = 0; } diff --git a/lib/data/model/ssh/virtual_key.dart b/lib/data/model/ssh/virtual_key.dart index 00b560c5..8ec41ae3 100644 --- a/lib/data/model/ssh/virtual_key.dart +++ b/lib/data/model/ssh/virtual_key.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:xterm/core.dart'; @@ -17,7 +18,7 @@ enum VirtKey { @HiveField(4) end, @HiveField(5) - file, + sftp, @HiveField(6) snippet, @HiveField(7) @@ -31,7 +32,7 @@ enum VirtKey { @HiveField(11) right, @HiveField(12) - paste, + clipboard, @HiveField(13) ime, @HiveField(14) @@ -94,11 +95,11 @@ enum VirtKey { return Icons.arrow_downward; case VirtKey.right: return Icons.arrow_forward; - case VirtKey.file: + case VirtKey.sftp: return Icons.file_open; case VirtKey.snippet: return Icons.code; - case VirtKey.paste: + case VirtKey.clipboard: return Icons.paste; case VirtKey.ime: return Icons.keyboard_hide; @@ -112,12 +113,12 @@ enum VirtKey { // and make sure all [VirtualKeyFunc] are handled VirtualKeyFunc? get func { switch (this) { - case VirtKey.file: + case VirtKey.sftp: return VirtualKeyFunc.file; case VirtKey.snippet: return VirtualKeyFunc.snippet; - case VirtKey.paste: - return VirtualKeyFunc.paste; + case VirtKey.clipboard: + return VirtualKeyFunc.clipboard; case VirtKey.ime: return VirtualKeyFunc.toggleIME; default: @@ -146,6 +147,17 @@ enum VirtKey { return false; } } + + String? help(S s) { + switch (this) { + case VirtKey.sftp: + return s.virtKeyHelpSFTP; + case VirtKey.clipboard: + return s.virtKeyHelpClipboard; + default: + return null; + } + } } -enum VirtualKeyFunc { toggleIME, backspace, copy, paste, snippet, file } +enum VirtualKeyFunc { toggleIME, backspace, clipboard, snippet, file } diff --git a/lib/data/model/ssh/virtual_key.g.dart b/lib/data/model/ssh/virtual_key.g.dart index 3bac7a60..a43ee654 100644 --- a/lib/data/model/ssh/virtual_key.g.dart +++ b/lib/data/model/ssh/virtual_key.g.dart @@ -24,7 +24,7 @@ class VirtKeyAdapter extends TypeAdapter { case 4: return VirtKey.end; case 5: - return VirtKey.file; + return VirtKey.sftp; case 6: return VirtKey.snippet; case 7: @@ -38,7 +38,7 @@ class VirtKeyAdapter extends TypeAdapter { case 11: return VirtKey.right; case 12: - return VirtKey.paste; + return VirtKey.clipboard; case 13: return VirtKey.ime; case 14: @@ -68,7 +68,7 @@ class VirtKeyAdapter extends TypeAdapter { case VirtKey.end: writer.writeByte(4); break; - case VirtKey.file: + case VirtKey.sftp: writer.writeByte(5); break; case VirtKey.snippet: @@ -89,7 +89,7 @@ class VirtKeyAdapter extends TypeAdapter { case VirtKey.right: writer.writeByte(11); break; - case VirtKey.paste: + case VirtKey.clipboard: writer.writeByte(12); break; case VirtKey.ime: diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index b6f3db6e..589e41d8 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -101,7 +101,7 @@ class ServerProvider extends BusyProvider { await Future.wait(_servers.values.map((s) async { if (onlyFailed) { if (s.state != ServerState.failed) return; - _limiter.resetTryTimes(s.spi.id); + _limiter.reset(s.spi.id); } return await _getData(s.spi); })); @@ -109,8 +109,8 @@ class ServerProvider extends BusyProvider { Future startAutoRefresh() async { final duration = _settingStore.serverStatusUpdateInterval.fetch()!; - if (duration == 0) return; stopAutoRefresh(); + if (duration == 0) return; _timer = Timer.periodic(Duration(seconds: duration), (_) async { await refreshData(); }); @@ -240,7 +240,7 @@ class ServerProvider extends BusyProvider { throw Exception(writeResult); } // reset try times if connected successfully - _limiter.resetTryTimes(sid); + _limiter.reset(sid); } if (s.client == null) return; diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index 1f5a320c..4ae107ee 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 = 396; + static const int build = 397; static const String engine = "3.10.6"; - static const String buildAt = "2023-07-28 19:15:52.944462"; - static const int modifications = 5; + static const String buildAt = "2023-07-28 20:51:35.807892"; + static const int modifications = 6; } diff --git a/lib/data/res/default.dart b/lib/data/res/default.dart index 13134b51..dcd9fe18 100644 --- a/lib/data/res/default.dart +++ b/lib/data/res/default.dart @@ -28,14 +28,14 @@ const defaultSSHVirtKeys = [ VirtKey.home, VirtKey.up, VirtKey.end, - VirtKey.file, + VirtKey.sftp, VirtKey.snippet, VirtKey.tab, VirtKey.ctrl, VirtKey.left, VirtKey.down, VirtKey.right, - VirtKey.paste, + VirtKey.clipboard, VirtKey.ime, ]; diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 97f6dec3..8d4cc81a 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -206,6 +206,8 @@ "versionUnknownUpdate": "Aktuell: v1.0.{build}", "versionUpdated": "v1.0.{build} ist bereits die neueste Version", "viewErr": "Fehler anzeigen", + "virtKeyHelpClipboard": "In die Zwischenablage kopieren, wenn das ausgewählte Terminal nicht leer ist, andernfalls den Inhalt der Zwischenablage in das Terminal einfügen.", + "virtKeyHelpSFTP": "Aktuelles Verzeichnis in SFTP öffnen.", "waitConnection": "Bitte warte, bis die Verbindung hergestellt wurde.", "whenOpenApp": "Beim Öffnen der App", "willTakEeffectImmediately": "Wird sofort angewendet" diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index aaa37858..5871d66c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -206,6 +206,8 @@ "versionUnknownUpdate": "Current: v1.0.{build}", "versionUpdated": "Current: v1.0.{build}, is up to date", "viewErr": "See error", + "virtKeyHelpClipboard": "Copy to the clipboard if terminal selected is not empty, otherwise paste the contents of the clipboard to the terminal.", + "virtKeyHelpSFTP": "Open current directory in SFTP.", "waitConnection": "Please wait for the connection to be established.", "whenOpenApp": "When opening the app", "willTakEeffectImmediately": "Will take effect immediately" diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 89c13607..f9f33acb 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -45,7 +45,7 @@ "dockerEditHost": "Edit Docker_host", "dockerEmptyRunningItems": "Tidak ada wadah yang berjalan.\nMungkin saja env DOCKER_HOST tidak dibaca dengan benar. Anda dapat menemukannya dengan menjalankan `echo $DOCKER_HOST` di terminal.", "dockerImagesFmt": "{count} gambar", - "dockerNotInstalled": "Docker tidak terpasang", + "dockerNotInstalled": "Docker tidak terpasang", "dockerStatusRunningAndStoppedFmt": "{runningCount} running, {stoppedCount} container stopped.", "dockerStatusRunningFmt": "{count} wadah berjalan.", "download": "Unduh", @@ -206,6 +206,8 @@ "versionUnknownUpdate": "Saat ini: v1.0.{build}", "versionUpdated": "Saat ini: v1.0.{build}, mutakhir", "viewErr": "Lihat kesalahan", + "virtKeyHelpClipboard": "Salin ke clipboard jika terminal yang dipilih tidak kosong, jika tidak, tempel isi clipboard ke terminal.", + "virtKeyHelpSFTP": "Buka direktori saat ini di SFTP.", "waitConnection": "Harap tunggu koneksi akan dibuat.", "whenOpenApp": "Saat membuka aplikasi", "willTakEeffectImmediately": "Akan segera berlaku" diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 4dbf165b..6c61f509 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -206,6 +206,8 @@ "versionUnknownUpdate": "当前:v1.0.{build}", "versionUpdated": "当前:v1.0.{build}, 已是最新版本", "viewErr": "查看错误", + "virtKeyHelpClipboard": "如果终端有选中字符,则复制选中字符至剪切板,否则粘贴剪切板内容至终端。", + "virtKeyHelpSFTP": "在 SFTP 中打开当前路径。", "waitConnection": "请等待连接建立", "whenOpenApp": "当打开 App 时", "willTakEeffectImmediately": "更改将会立即生效" diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 5194bda3..2abb12d0 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -206,6 +206,8 @@ "versionUnknownUpdate": "當前:v1.0.{build}", "versionUpdated": "當前:v1.0.{build}, 已是最新版本", "viewErr": "查看錯誤", + "virtKeyHelpClipboard": "如果終端有選中字符,則復製選中字符至剪切板,否則粘貼剪切板內容至終端。", + "virtKeyHelpSFTP": "在 SFTP 中打開當前路徑。", "waitConnection": "請等待連接建立", "whenOpenApp": "當打開 App 時", "willTakEeffectImmediately": "更改將會立即生效" diff --git a/lib/view/page/sftp/local.dart b/lib/view/page/sftp/local.dart index 2d5de3c6..8e474091 100644 --- a/lib/view/page/sftp/local.dart +++ b/lib/view/page/sftp/local.dart @@ -76,18 +76,6 @@ class _SFTPDownloadedPageState extends State { bottomNavigationBar: SafeArea( child: _buildPath(), ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, - floatingActionButton: FloatingActionButton( - onPressed: (() { - if (_path!.path == _prefixPath) { - showSnackBar(context, Text(_s.alreadyLastDir)); - return; - } - _path!.update('..'); - setState(() {}); - }), - child: const Icon(Icons.keyboard_arrow_left), - ), ); } @@ -112,10 +100,22 @@ class _SFTPDownloadedPageState extends State { } final dir = Directory(_path!.path); final files = dir.listSync(); + final canGoBack = _path!.path != _prefixPath; return ListView.builder( - itemCount: files.length, + itemCount: canGoBack ? files.length + 1 : files.length, padding: const EdgeInsets.symmetric(vertical: 3, horizontal: 7), itemBuilder: (context, index) { + if (index == 0 && canGoBack) { + return RoundRectCard(ListTile( + leading: const Icon(Icons.keyboard_arrow_left), + title: const Text('..'), + onTap: () { + _path!.update('..'); + setState(() {}); + }, + )); + } + index = canGoBack ? index - 1 : index; var file = files[index]; var fileName = file.path.split('/').last; var stat = file.statSync(); diff --git a/lib/view/page/ssh/term.dart b/lib/view/page/ssh/term.dart index 632dcfb2..069a01d6 100644 --- a/lib/view/page/ssh/term.dart +++ b/lib/view/page/ssh/term.dart @@ -39,11 +39,9 @@ class _SSHPageState extends State { final _setting = locator(); late final _terminal = Terminal(inputHandler: _keyboard); final TerminalController _terminalController = TerminalController(); - final ContextMenuController _menuController = ContextMenuController(); final List> _virtKeysList = []; late MediaQueryData _media; - late TextStyle _menuTextStyle; late S _s; late TerminalStyle _terminalStyle; late TerminalTheme _terminalTheme; @@ -75,7 +73,6 @@ class _SSHPageState extends State { super.didChangeDependencies(); _isDark = isDarkMode(context); _media = MediaQuery.of(context); - _menuTextStyle = TextStyle(color: contentColor.resolve(context)); _s = S.of(context)!; _terminalTheme = _isDark ? termDarkTheme : termLightTheme; // Calculate virtkey width / height @@ -118,8 +115,7 @@ class _SSHPageState extends State { textStyle: _terminalStyle, theme: _terminalTheme, deleteDetection: isIOS, - onTapUp: _onTapUp, - autoFocus: true, + autofocus: true, keyboardAppearance: _isDark ? Brightness.dark : Brightness.light, ), ); @@ -231,13 +227,12 @@ class _SSHPageState extends State { case VirtualKeyFunc.backspace: _terminal.keyInput(TerminalKey.backspace); break; - case VirtualKeyFunc.paste: - _paste(); - break; - case VirtualKeyFunc.copy: + case VirtualKeyFunc.clipboard: final selected = terminalSelected; if (selected != null) { copy2Clipboard(selected); + } else { + _paste(); } break; case VirtualKeyFunc.snippet: @@ -290,58 +285,12 @@ class _SSHPageState extends State { return _terminal.buffer.getText(range); } - void _onTapUp(TapUpDetails details, CellOffset offset) { - if (_menuController.isShown) { - _menuController.remove(); - return; - } - final selected = terminalSelected; - final children = [ - // TextButton( - // onPressed: () { - // _paste(); - // }, - // child: Text(_s.paste), - // ), - ]; - if (selected?.trim().isNotEmpty ?? false) { - children.add( - TextButton( - child: Text( - _s.copy, - style: _menuTextStyle, - ), - onPressed: () { - _terminalController.setSelection(null); - if (selected != null) { - copy2Clipboard(selected); - } - _menuController.remove(); - }, - ), - ); - } - if (children.isEmpty) { - return; - } - _menuController.show( - context: context, - contextMenuBuilder: (context) { - return TextSelectionToolbar( - anchorAbove: details.globalPosition, - anchorBelow: details.globalPosition, - children: children, - ); - }, - ); - } - void _write(String p0) { _terminal.write('$p0\r\n'); } void _initVirtKeys() { - final virtKeys = _setting.sshVirtKeys.fetch()!; + final virtKeys = List.from(_setting.sshVirtKeys.fetchRaw()); for (int len = 0; len < virtKeys.length; len += 7) { if (len + 7 > virtKeys.length) { diff --git a/lib/view/page/ssh/virt_key_setting.dart b/lib/view/page/ssh/virt_key_setting.dart index 0167472a..9eecde8c 100644 --- a/lib/view/page/ssh/virt_key_setting.dart +++ b/lib/view/page/ssh/virt_key_setting.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:nil/nil.dart'; import 'package:toolbox/core/extension/order.dart'; import 'package:toolbox/core/utils/platform.dart'; import 'package:toolbox/core/utils/ui.dart'; import 'package:toolbox/data/model/ssh/virtual_key.dart'; +import 'package:toolbox/data/res/ui.dart'; import 'package:toolbox/data/store/setting.dart'; import 'package:toolbox/locator.dart'; +import 'package:toolbox/view/widget/round_rect_card.dart'; class SSHVirtKeySettingPage extends StatefulWidget { const SSHVirtKeySettingPage({Key? key}) : super(key: key); @@ -44,17 +45,18 @@ class _SSHVirtKeySettingPageState extends State { final disabled = VirtKey.values.where((e) => !keys.contains(e)).toList(); final allKeys = [...keys, ...disabled]; return ReorderableListView.builder( - padding: const EdgeInsets.fromLTRB(11, 3, 0, 3), + padding: const EdgeInsets.all(7), itemBuilder: (_, idx) { final key = allKeys[idx]; - return ListTile( - key: ValueKey(idx), - title: _buildTitle(key), - leading: _buildCheckBox(keys, key, idx, idx < keys.length), - trailing: isDesktop - ? nil - : const Icon(Icons.drag_handle, color: Colors.grey), - ); + final help = key.help(_s); + return RoundRectCard( + key: ValueKey(idx), + ListTile( + title: _buildTitle(key), + subtitle: help == null ? null : Text(help, style: grey), + leading: _buildCheckBox(keys, key, idx, idx < keys.length), + trailing: isDesktop ? null : const Icon(Icons.drag_handle), + )); }, itemCount: allKeys.length, onReorder: (o, n) { @@ -70,12 +72,8 @@ class _SSHVirtKeySettingPageState extends State { Widget _buildTitle(VirtKey key) { return key.icon == null - ? Text( - key.text, - textAlign: TextAlign.center, - ) + ? Text(key.text) : Row( - mainAxisAlignment: MainAxisAlignment.center, children: [ Text(key.text), const SizedBox(width: 10), diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 84b1feab..f6f23bfe 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,13 +6,9 @@ #include "generated_plugin_registrant.h" -#include #include void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) flutter_volume_controller_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterVolumeControllerPlugin"); - flutter_volume_controller_plugin_register_with_registrar(flutter_volume_controller_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 3e922b18..f16b4c34 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,7 +3,6 @@ # list(APPEND FLUTTER_PLUGIN_LIST - flutter_volume_controller url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 04309f6e..5f077980 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,14 +5,12 @@ import FlutterMacOS import Foundation -import flutter_volume_controller import path_provider_foundation import share_plus import shared_preferences_foundation import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - FlutterVolumeControllerPlugin.register(with: registry.registrar(forPlugin: "FlutterVolumeControllerPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 4024d762..d9d5ae90 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 = 396; + CURRENT_PROJECT_VERSION = 397; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.396; + MARKETING_VERSION = 1.0.397; 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 = 396; + CURRENT_PROJECT_VERSION = 397; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0.396; + MARKETING_VERSION = 1.0.397; PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/make.dart b/make.dart index 37a0ff1c..2c5e8886 100755 --- a/make.dart +++ b/make.dart @@ -146,10 +146,9 @@ Future flutterBuildAndroid() async { } Future scp2CDN() async { - final result = await Process.run('scp', [ - apkPath, - 'custcdn:/usr/share/caddy/uploads/${appName}_${build}_Arm64.apk' - ]); + print('scp2CDN...'); + final result = await Process.run( + 'scp', [apkPath, 'hk:/var/www/res/serverbox/apks/$build.apk']); print(result.stdout); if (result.exitCode != 0) { print(result.stderr); diff --git a/pubspec.lock b/pubspec.lock index cde191c5..46ec4f3e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -361,14 +361,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_volume_controller: - dependency: "direct main" - description: - name: flutter_volume_controller - sha256: "5e7d1b63d051c881450a98155024219079a1cde0cf66ef895eb96dc9d8a7f670" - url: "https://pub.dev" - source: hosted - version: "1.2.6" flutter_web_plugins: dependency: transitive description: flutter @@ -1070,12 +1062,11 @@ packages: xterm: dependency: "direct main" description: - path: "." - ref: master - resolved-ref: e945750b97a2f875befa37e0c483bc3f51e215b2 - url: "https://github.com/lollipopkit/xterm.dart" - source: git - version: "3.6.1-pre" + name: xterm + sha256: "6a02b15d03152b8186e12790902ff28c8a932fc441e89fa7255a7491661a8e69" + url: "https://pub.dev" + source: hosted + version: "3.5.0" yaml: dependency: transitive description: @@ -1084,14 +1075,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" - zmodem: - dependency: transitive - description: - name: zmodem - sha256: "3b7e5b29f3a7d8aee472029b05165a68438eff2f3f7766edf13daba1e297adbf" - url: "https://pub.dev" - source: hosted - version: "0.0.6" sdks: dart: ">=3.0.2 <4.0.0" flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index eaae2714..818f9664 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,18 +53,17 @@ dependencies: easy_isolate: ^1.3.0 share_plus: ^7.0.2 intl: ^0.18.0 - # xterm: ^3.4.1 - xterm: - #path: ../xterm.dart - git: - ref: master - url: https://github.com/lollipopkit/xterm.dart + xterm: ^3.5.0 + # xterm: + # #path: ../xterm.dart + # git: + # ref: master + # url: https://github.com/lollipopkit/xterm.dart file_picker: ^5.3.2 plain_notification_token: ^0.0.4 highlight: ^0.7.0 flutter_highlight: ^0.7.0 code_text_field: ^1.1.0 - flutter_volume_controller: ^1.2.6 nil: ^1.1.1 shared_preferences: ^2.1.1 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index aed25025..c3384ec5 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,13 +6,10 @@ #include "generated_plugin_registrant.h" -#include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { - FlutterVolumeControllerPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FlutterVolumeControllerPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 987dc278..01d38362 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,7 +3,6 @@ # list(APPEND FLUTTER_PLUGIN_LIST - flutter_volume_controller share_plus url_launcher_windows )