From 4d52023982179294488c5bb1716f46886807a72a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Sat, 7 Jun 2025 17:07:13 +0800 Subject: [PATCH] opt.: ssh terminal ux (#778) --- lib/view/page/setting/entries/app.dart | 16 +-------------- lib/view/page/setting/entries/editor.dart | 12 +++++------- lib/view/page/setting/entries/ssh.dart | 12 ++++++++++++ lib/view/page/setting/entry.dart | 2 -- lib/view/page/ssh/page/init.dart | 1 + lib/view/page/ssh/page/page.dart | 24 ++++++++--------------- pubspec.lock | 12 +++++++----- pubspec.yaml | 4 ++-- 8 files changed, 36 insertions(+), 47 deletions(-) diff --git a/lib/view/page/setting/entries/app.dart b/lib/view/page/setting/entries/app.dart index 73c7221e..0e5bbf7b 100644 --- a/lib/view/page/setting/entries/app.dart +++ b/lib/view/page/setting/entries/app.dart @@ -9,8 +9,8 @@ extension _App on _AppSettingsPageState { _buildAppColor(), _buildCheckUpdate(), PlatformPublicSettings.buildBioAuth(), - _buildAppMore(), if (specific != null) specific, + _buildAppMore(), ]; return Column(children: children.map((e) => e.cardx).toList()); @@ -200,20 +200,6 @@ extension _App on _AppSettingsPageState { } } - Widget _buildTermFontSize() { - return ListTile( - leading: const Icon(MingCute.font_size_line), - // title: Text(l10n.fontSize), - // subtitle: Text(l10n.termFontSizeTip, style: UIs.textGrey), - title: TipText(l10n.fontSize, l10n.termFontSizeTip), - trailing: ValBuilder( - listenable: _setting.termFontSize.listenable(), - builder: (val) => Text(val.toString(), style: UIs.text15), - ), - onTap: () => _showFontSizeDialog(_setting.termFontSize), - ); - } - Widget _buildLocale() { return ListTile( leading: const Icon(IonIcons.language), diff --git a/lib/view/page/setting/entries/editor.dart b/lib/view/page/setting/entries/editor.dart index 6c64e380..11748a4b 100644 --- a/lib/view/page/setting/entries/editor.dart +++ b/lib/view/page/setting/entries/editor.dart @@ -90,23 +90,21 @@ extension _Editor on _AppSettingsPageState { title: Text(l10n.fontSize), trailing: ValBuilder( listenable: _setting.editorFontSize.listenable(), - builder: (val) => Text( - val.toString(), - style: UIs.text15, - ), + builder: (val) => Text(val.toString(), style: UIs.text15), ), onTap: () => _showFontSizeDialog(_setting.editorFontSize), ); } void _showFontSizeDialog(HiveProp property) { + final ctrl = TextEditingController(text: property.fetch().toString()); void onSave() { context.pop(); - final fontSize = double.tryParse(_editorTextSizeCtrl.text); + final fontSize = double.tryParse(ctrl.text); if (fontSize == null) { context.showRoundDialog( title: libL10n.fail, - child: Text('Parsed failed: ${_editorTextSizeCtrl.text}'), + child: Text('Parsed failed: ${ctrl.text}'), ); return; } @@ -116,7 +114,7 @@ extension _Editor on _AppSettingsPageState { context.showRoundDialog( title: l10n.fontSize, child: Input( - controller: _editorTextSizeCtrl, + controller: ctrl, autoFocus: true, type: TextInputType.number, icon: Icons.font_download, diff --git a/lib/view/page/setting/entries/ssh.dart b/lib/view/page/setting/entries/ssh.dart index edb4ed4f..53193342 100644 --- a/lib/view/page/setting/entries/ssh.dart +++ b/lib/view/page/setting/entries/ssh.dart @@ -79,6 +79,18 @@ extension _SSH on _AppSettingsPageState { RNodes.app.notify(); } + Widget _buildTermFontSize() { + return ListTile( + leading: const Icon(MingCute.font_size_line), + title: TipText(l10n.fontSize, l10n.termFontSizeTip), + trailing: ValBuilder( + listenable: _setting.termFontSize.listenable(), + builder: (val) => Text(val.toString(), style: UIs.text15), + ), + onTap: () => _showFontSizeDialog(_setting.termFontSize), + ); + } + Future _pickBgImage() async { final path = await Pfs.pickFilePath(); if (path == null) return; diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index d4bdca44..c3359af6 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -111,8 +111,6 @@ final class _AppSettingsPageState extends State { late final _sshOpacityCtrl = TextEditingController(text: _setting.sshBgOpacity.fetch().toString()); late final _sshBlurCtrl = TextEditingController(text: _setting.sshBlurRadius.fetch().toString()); late final _textScalerCtrl = TextEditingController(text: _setting.textFactor.toString()); - - late final _editorTextSizeCtrl = TextEditingController(text: _setting.editorFontSize.get().toString()); late final _serverLogoCtrl = TextEditingController(text: _setting.serverLogoUrl.fetch()); @override diff --git a/lib/view/page/ssh/page/init.dart b/lib/view/page/ssh/page/init.dart index 112f2e10..1b94af07 100644 --- a/lib/view/page/ssh/page/init.dart +++ b/lib/view/page/ssh/page/init.dart @@ -135,6 +135,7 @@ extension _Init on SSHPageState { actions: Btn.ok( onTap: () { contextSafe?.pop(); // Can't use tear-drop here + contextSafe?.pop(); // Pop the SSHPage }, ).toList, ); diff --git a/lib/view/page/ssh/page/page.dart b/lib/view/page/ssh/page/page.dart index 71e21657..0afab982 100644 --- a/lib/view/page/ssh/page/page.dart +++ b/lib/view/page/ssh/page/page.dart @@ -64,10 +64,11 @@ class SSHPage extends StatefulWidget { const _horizonPadding = 7.0; -class SSHPageState extends State with AutomaticKeepAliveClientMixin, AfterLayoutMixin { +class SSHPageState extends State + with AutomaticKeepAliveClientMixin, AfterLayoutMixin, TickerProviderStateMixin { final _keyboard = VirtKeyProvider(); late final _terminal = Terminal(inputHandler: _keyboard); - final TerminalController _terminalController = TerminalController(); + late final TerminalController _terminalController = TerminalController(vsync: this); final List> _virtKeysList = []; late final _termKey = widget.args.terminalKey ?? GlobalKey(); @@ -156,8 +157,9 @@ class SSHPageState extends State with AutomaticKeepAliveClientMixin, Af }, child: Scaffold( appBar: CustomAppBar( + leading: BackButton(onPressed: context.pop), title: Text(widget.args.spi.name), - actions: [_buildCopyBtn, _buildKillBtn], + actions: [_buildCopyBtn], centerTitle: false, ), backgroundColor: hasBg ? Colors.transparent : _terminalTheme.background, @@ -310,9 +312,10 @@ class SSHPageState extends State with AutomaticKeepAliveClientMixin, Af } Widget get _buildCopyBtn { - return Btn.icon( + return IconButton( icon: Icon(MingCute.copy_2_fill), - onTap: () { + tooltip: libL10n.copy, + onPressed: () { final selected = terminalSelected; if (selected == null || selected.isEmpty) { return; @@ -322,17 +325,6 @@ class SSHPageState extends State with AutomaticKeepAliveClientMixin, Af ); } - Widget get _buildKillBtn { - return Btn.icon( - icon: Icon(MingCute.close_circle_fill), - onTap: () { - if (_client == null) return; - _client!.close(); - context.pop(); - }, - ); - } - @override bool get wantKeepAlive => true; diff --git a/pubspec.lock b/pubspec.lock index 58146565..1c4b8f40 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -496,9 +496,11 @@ packages: fl_lib: dependency: "direct main" description: - path: "../fl_lib" - relative: true - source: path + path: "." + ref: "v1.0.319" + resolved-ref: d45c47a24303a2e937fee6753f1d0755805b8483 + url: "https://github.com/lppcg/fl_lib" + source: git version: "0.0.1" flutter: dependency: "direct main" @@ -1772,8 +1774,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.587" - resolved-ref: "0f5027286380e3829ad2696d69d5a1ecf68eb875" + ref: "v1.0.588" + resolved-ref: d28207b988b5bed38c799618b9c412486592c689 url: "https://github.com/lollipopkit/xterm.dart" source: git version: "4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1c3e7e71..b3eb4fb8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,7 +46,7 @@ dependencies: xterm: git: url: https://github.com/lollipopkit/xterm.dart - ref: v1.0.587 + ref: v1.0.588 computer: git: url: https://github.com/lollipopkit/dart_computer @@ -62,7 +62,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.318 + ref: v1.0.319 dependency_overrides: # webdav_client_plus: