From 3f15caeaf263617531a7fc1bd00800ba1da44be9 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: Sun, 7 Dec 2025 17:51:07 +0800 Subject: [PATCH] new: add copy btn for ask ai (#975) --- lib/data/provider/server/single.dart | 4 ++-- lib/view/page/ssh/page/ask_ai.dart | 25 ++++++++++++++++++++++++- lib/view/page/ssh/page/page.dart | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/data/provider/server/single.dart b/lib/data/provider/server/single.dart index 77a255fd..2c6119ca 100644 --- a/lib/data/provider/server/single.dart +++ b/lib/data/provider/server/single.dart @@ -292,7 +292,7 @@ class ServerNotifier extends _$ServerNotifier { try { final statusCmd = ShellFunc.status.exec(spi.id, systemType: state.status.system, customDir: spi.custom?.scriptDir); - Loggers.app.info('Running status command for ${spi.name} (${state.status.system.name}): $statusCmd'); + // Loggers.app.info('Running status command for ${spi.name} (${state.status.system.name}): $statusCmd'); final execResult = await state.client?.run(statusCmd); if (execResult != null) { raw = SSHDecoder.decode( @@ -300,7 +300,7 @@ class ServerNotifier extends _$ServerNotifier { isWindows: state.status.system == SystemType.windows, context: 'GetStatus<${spi.name}>', ); - Loggers.app.info('Status response length for ${spi.name}: ${raw.length} bytes'); + // Loggers.app.info('Status response length for ${spi.name}: ${raw.length} bytes'); } else { raw = ''; Loggers.app.warning('No status result from ${spi.name}'); diff --git a/lib/view/page/ssh/page/ask_ai.dart b/lib/view/page/ssh/page/ask_ai.dart index fb92dcd9..12dbe13f 100644 --- a/lib/view/page/ssh/page/ask_ai.dart +++ b/lib/view/page/ssh/page/ask_ai.dart @@ -250,6 +250,13 @@ class _AskAiSheetState extends ConsumerState<_AskAiSheet> { context.showSnackBar(libL10n.success); } + Future _copyText(BuildContext context, String text) async { + if (text.trim().isEmpty) return; + await Clipboard.setData(ClipboardData(text: text)); + if (!mounted) return; + context.showSnackBar(libL10n.success); + } + void _sendMessage() { if (_isStreaming) return; final text = _inputController.text.trim(); @@ -310,7 +317,23 @@ class _AskAiSheetState extends ConsumerState<_AskAiSheet> { streaming ? l10n.askAiAwaitingResponse : l10n.askAiNoResponse, style: theme.textTheme.bodySmall, ) - : SimpleMarkdown(data: content); + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SimpleMarkdown(data: content), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton.icon( + onPressed: () => _copyText(context, content), + icon: const Icon(Icons.copy, size: 18), + label: Text(libL10n.copy), + ), + ], + ), + ], + ); return Align( alignment: Alignment.centerLeft, child: CardX( diff --git a/lib/view/page/ssh/page/page.dart b/lib/view/page/ssh/page/page.dart index 5529b347..521e1607 100644 --- a/lib/view/page/ssh/page/page.dart +++ b/lib/view/page/ssh/page/page.dart @@ -252,7 +252,7 @@ class SSHPageState extends ConsumerState deleteDetection: isMobile, autofocus: false, keyboardAppearance: _isDark ? Brightness.dark : Brightness.light, - showToolbar: isMobile, + showToolbar: true, viewOffset: Offset(2 * _horizonPadding, CustomAppBar.sysStatusBarHeight), hideScrollBar: false, focusNode: widget.args.focusNode,