diff --git a/lib/core/route.dart b/lib/core/route.dart index cc73f760..28d66bad 100644 --- a/lib/core/route.dart +++ b/lib/core/route.dart @@ -209,7 +209,7 @@ class AppRoute { return AppRoute(AndroidSettingsPage(key: key), 'android_setting'); } - static AppRoute snippetResult({Key? key, required Map results}) { + static AppRoute snippetResult({Key? key, required List results}) { return AppRoute( SnippetResultPage( key: key, diff --git a/lib/data/model/app/menu.dart b/lib/data/model/app/menu.dart index 976155fc..13080e44 100644 --- a/lib/data/model/app/menu.dart +++ b/lib/data/model/app/menu.dart @@ -7,15 +7,15 @@ enum ServerTabMenuType { docker, process, pkg, - snippet, + //snippet, ; IconData get icon { switch (this) { case ServerTabMenuType.sftp: return Icons.insert_drive_file; - case ServerTabMenuType.snippet: - return Icons.code; + //case ServerTabMenuType.snippet: + //return Icons.code; case ServerTabMenuType.pkg: return Icons.system_security_update; case ServerTabMenuType.docker: @@ -31,8 +31,8 @@ enum ServerTabMenuType { switch (this) { case ServerTabMenuType.sftp: return 'SFTP'; - case ServerTabMenuType.snippet: - return l10n.snippet; + //case ServerTabMenuType.snippet: + //return l10n.snippet; case ServerTabMenuType.pkg: return l10n.pkg; case ServerTabMenuType.docker: diff --git a/lib/data/model/app/shell_func.dart b/lib/data/model/app/shell_func.dart index 120a2e1b..6b654668 100644 --- a/lib/data/model/app/shell_func.dart +++ b/lib/data/model/app/shell_func.dart @@ -3,6 +3,7 @@ import '../server/system.dart'; const seperator = 'SrvBoxSep'; +/// The suffix `\t` is for formatting const _cmdDivider = '\necho $seperator\n\t'; const _serverBoxDir = r'$HOME/.config/server_box'; diff --git a/lib/data/model/server/snippet.dart b/lib/data/model/server/snippet.dart index a3d2e67f..f56a44a8 100644 --- a/lib/data/model/server/snippet.dart +++ b/lib/data/model/server/snippet.dart @@ -45,3 +45,15 @@ class Snippet implements TagPickable { @override String get tagName => name; } + +class SnippetResult { + final String? dest; + final String result; + final Duration time; + + SnippetResult({ + required this.dest, + required this.result, + required this.time, + }); +} diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 79839470..18e4b346 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -362,18 +362,26 @@ class ServerProvider extends ChangeNotifier { _limiter.reset(sid); } - Future runSnippets(String id, List snippets) async { + Future runSnippets(String id, Snippet snippet) async { final client = _servers[id]?.client; if (client == null) { return null; } - return await client.run(snippets.map((e) => e.script).join('&&')).string; + final watch = Stopwatch()..start(); + final result = await client.run(snippet.script).string; + final time = watch.elapsed; + watch.stop(); + return SnippetResult( + dest: _servers[id]?.spi.name, + result: result, + time: time, + ); } - Future> runSnippetsMulti( + Future> runSnippetsMulti( List ids, - List snippets, + Snippet snippet, ) async { - return await Future.wait(ids.map((id) async => runSnippets(id, snippets))); + return await Future.wait(ids.map((id) async => runSnippets(id, snippet))); } } diff --git a/lib/data/res/github_id.dart b/lib/data/res/github_id.dart index f6e8d30b..0b24c5b5 100644 --- a/lib/data/res/github_id.dart +++ b/lib/data/res/github_id.dart @@ -38,5 +38,6 @@ class GithubIds { 'a1564471347', 'fanzhebufan1', 'wcbing', + 'balh55y', }; } diff --git a/lib/view/page/snippet/list.dart b/lib/view/page/snippet/list.dart index 7e414374..fbf34ac8 100644 --- a/lib/view/page/snippet/list.dart +++ b/lib/view/page/snippet/list.dart @@ -134,15 +134,9 @@ class _SnippetListPageState extends State { return; } final ids = servers.map((e) => e.spi.id).toList(); - final names = servers.map((e) => e.spi.name).toList(); - final results = await Pros.server.runSnippetsMulti(ids, [snippet]); + final results = await Pros.server.runSnippetsMulti(ids, snippet); if (results.isNotEmpty) { - // SERVER_NAME: RESULT - final result = Map.fromIterables( - names, - results, - ); - AppRoute.snippetResult(results: result).go(context); + AppRoute.snippetResult(results: results).go(context); } } } diff --git a/lib/view/page/snippet/result.dart b/lib/view/page/snippet/result.dart index ca2f6592..74d7102b 100644 --- a/lib/view/page/snippet/result.dart +++ b/lib/view/page/snippet/result.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:toolbox/core/extension/context/locale.dart'; +import 'package:toolbox/data/model/server/snippet.dart'; +import 'package:toolbox/data/res/ui.dart'; import 'package:toolbox/view/widget/cardx.dart'; import 'package:toolbox/view/widget/custom_appbar.dart'; import 'package:toolbox/view/widget/expand_tile.dart'; class SnippetResultPage extends StatelessWidget { - final Map results; + final List results; const SnippetResultPage({super.key, required this.results}); @@ -20,28 +22,30 @@ class SnippetResultPage extends StatelessWidget { } Widget _buildBody() { - return Align( - alignment: Alignment.centerLeft, - child: ListView.builder( - padding: const EdgeInsets.symmetric(horizontal: 17), - itemCount: results.length, - itemBuilder: (_, index) { - final key = results.keys.elementAt(index); - final value = results[key]; - return CardX( - ExpandTile( - initiallyExpanded: results.length == 1, - title: Text(key), - children: [ - Text( - value ?? '', + return ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 17), + itemCount: results.length, + itemBuilder: (_, index) { + final item = results[index]; + if (item == null) return UIs.placeholder; + return CardX( + ExpandTile( + initiallyExpanded: results.length == 1, + title: Text(item.dest ?? ''), + subtitle: Text(item.time.toString(), style: UIs.textGrey), + children: [ + SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 17), + scrollDirection: Axis.horizontal, + child: Text( + item.result, textAlign: TextAlign.start, ), - ], - ), - ); - }, - ), + ), + ], + ), + ); + }, ); } } diff --git a/lib/view/widget/server_func_btns.dart b/lib/view/widget/server_func_btns.dart index 9a37c023..2775e58e 100644 --- a/lib/view/widget/server_func_btns.dart +++ b/lib/view/widget/server_func_btns.dart @@ -14,12 +14,10 @@ import 'package:toolbox/data/model/server/dist.dart'; import 'package:toolbox/data/res/provider.dart'; import '../../core/route.dart'; -import '../../core/utils/misc.dart'; import '../../core/utils/server.dart'; import '../../data/model/app/menu.dart'; import '../../data/model/pkg/upgrade_info.dart'; import '../../data/model/server/server_private_info.dart'; -import '../../data/model/server/snippet.dart'; import 'popup_menu.dart'; class ServerFuncBtnsTopRight extends StatelessWidget { @@ -94,28 +92,29 @@ void _onTapMoreBtns( check: () => _checkClient(context, spi.id), ); break; - case ServerTabMenuType.snippet: - final snippets = await context.showPickDialog( - items: Pros.snippet.snippets, - name: (e) => e.name, - ); - if (snippets == null) { - return; - } - final result = await Pros.server.runSnippets(spi.id, snippets); - if (result != null && result.isNotEmpty) { - context.showRoundDialog( - title: Text(l10n.result), - child: Text(result), - actions: [ - TextButton( - onPressed: () => copy2Clipboard(result), - child: Text(l10n.copy), - ) - ], - ); - } - break; + // case ServerTabMenuType.snippet: + // final snippets = await context.showPickDialog( + // items: Pros.snippet.snippets, + // name: (e) => e.name, + // multi: false + // ); + // if (snippets == null || snippets.isEmpty) { + // return; + // } + // final result = await Pros.server.runSnippets(spi.id, snippets.first); + // if (result != null && result.isNotEmpty) { + // context.showRoundDialog( + // title: Text(l10n.result), + // child: Text(result), + // actions: [ + // TextButton( + // onPressed: () => copy2Clipboard(result), + // child: Text(l10n.copy), + // ) + // ], + // ); + // } + // break; case ServerTabMenuType.docker: AppRoute.docker(spi: spi).checkGo( context: context, diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 3cc05eb2..2a301d4c 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -6,7 +6,8 @@ class MainFlutterWindow: NSWindow { let flutterViewController = FlutterViewController() let windowFrame = self.frame self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) + let newWindowRect = NSRect(x: windowFrame.origin.x, y: windowFrame.origin.y, width: 300, height: 600) + self.setFrame(newWindowRect, display: true) RegisterGeneratedPlugins(registry: flutterViewController)