default: mac window size & opt.: snippet result

This commit is contained in:
lollipopkit
2023-10-18 19:57:47 +08:00
parent cf4f74dcfc
commit 4984953287
10 changed files with 85 additions and 65 deletions

View File

@@ -209,7 +209,7 @@ class AppRoute {
return AppRoute(AndroidSettingsPage(key: key), 'android_setting'); return AppRoute(AndroidSettingsPage(key: key), 'android_setting');
} }
static AppRoute snippetResult({Key? key, required Map<String, String?> results}) { static AppRoute snippetResult({Key? key, required List<SnippetResult?> results}) {
return AppRoute( return AppRoute(
SnippetResultPage( SnippetResultPage(
key: key, key: key,

View File

@@ -7,15 +7,15 @@ enum ServerTabMenuType {
docker, docker,
process, process,
pkg, pkg,
snippet, //snippet,
; ;
IconData get icon { IconData get icon {
switch (this) { switch (this) {
case ServerTabMenuType.sftp: case ServerTabMenuType.sftp:
return Icons.insert_drive_file; return Icons.insert_drive_file;
case ServerTabMenuType.snippet: //case ServerTabMenuType.snippet:
return Icons.code; //return Icons.code;
case ServerTabMenuType.pkg: case ServerTabMenuType.pkg:
return Icons.system_security_update; return Icons.system_security_update;
case ServerTabMenuType.docker: case ServerTabMenuType.docker:
@@ -31,8 +31,8 @@ enum ServerTabMenuType {
switch (this) { switch (this) {
case ServerTabMenuType.sftp: case ServerTabMenuType.sftp:
return 'SFTP'; return 'SFTP';
case ServerTabMenuType.snippet: //case ServerTabMenuType.snippet:
return l10n.snippet; //return l10n.snippet;
case ServerTabMenuType.pkg: case ServerTabMenuType.pkg:
return l10n.pkg; return l10n.pkg;
case ServerTabMenuType.docker: case ServerTabMenuType.docker:

View File

@@ -3,6 +3,7 @@ import '../server/system.dart';
const seperator = 'SrvBoxSep'; const seperator = 'SrvBoxSep';
/// The suffix `\t` is for formatting
const _cmdDivider = '\necho $seperator\n\t'; const _cmdDivider = '\necho $seperator\n\t';
const _serverBoxDir = r'$HOME/.config/server_box'; const _serverBoxDir = r'$HOME/.config/server_box';

View File

@@ -45,3 +45,15 @@ class Snippet implements TagPickable {
@override @override
String get tagName => name; 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,
});
}

View File

@@ -362,18 +362,26 @@ class ServerProvider extends ChangeNotifier {
_limiter.reset(sid); _limiter.reset(sid);
} }
Future<String?> runSnippets(String id, List<Snippet> snippets) async { Future<SnippetResult?> runSnippets(String id, Snippet snippet) async {
final client = _servers[id]?.client; final client = _servers[id]?.client;
if (client == null) { if (client == null) {
return 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<List<String?>> runSnippetsMulti( Future<List<SnippetResult?>> runSnippetsMulti(
List<String> ids, List<String> ids,
List<Snippet> snippets, Snippet snippet,
) async { ) async {
return await Future.wait(ids.map((id) async => runSnippets(id, snippets))); return await Future.wait(ids.map((id) async => runSnippets(id, snippet)));
} }
} }

View File

@@ -38,5 +38,6 @@ class GithubIds {
'a1564471347', 'a1564471347',
'fanzhebufan1', 'fanzhebufan1',
'wcbing', 'wcbing',
'balh55y',
}; };
} }

View File

@@ -134,15 +134,9 @@ class _SnippetListPageState extends State<SnippetListPage> {
return; return;
} }
final ids = servers.map((e) => e.spi.id).toList(); 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) { if (results.isNotEmpty) {
// SERVER_NAME: RESULT AppRoute.snippetResult(results: results).go(context);
final result = Map.fromIterables(
names,
results,
);
AppRoute.snippetResult(results: result).go(context);
} }
} }
} }

View File

@@ -1,11 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/context/locale.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/cardx.dart';
import 'package:toolbox/view/widget/custom_appbar.dart'; import 'package:toolbox/view/widget/custom_appbar.dart';
import 'package:toolbox/view/widget/expand_tile.dart'; import 'package:toolbox/view/widget/expand_tile.dart';
class SnippetResultPage extends StatelessWidget { class SnippetResultPage extends StatelessWidget {
final Map<String, String?> results; final List<SnippetResult?> results;
const SnippetResultPage({super.key, required this.results}); const SnippetResultPage({super.key, required this.results});
@@ -20,28 +22,30 @@ class SnippetResultPage extends StatelessWidget {
} }
Widget _buildBody() { Widget _buildBody() {
return Align( return ListView.builder(
alignment: Alignment.centerLeft, padding: const EdgeInsets.symmetric(horizontal: 17),
child: ListView.builder( itemCount: results.length,
padding: const EdgeInsets.symmetric(horizontal: 17), itemBuilder: (_, index) {
itemCount: results.length, final item = results[index];
itemBuilder: (_, index) { if (item == null) return UIs.placeholder;
final key = results.keys.elementAt(index); return CardX(
final value = results[key]; ExpandTile(
return CardX( initiallyExpanded: results.length == 1,
ExpandTile( title: Text(item.dest ?? ''),
initiallyExpanded: results.length == 1, subtitle: Text(item.time.toString(), style: UIs.textGrey),
title: Text(key), children: [
children: [ SingleChildScrollView(
Text( padding: const EdgeInsets.symmetric(horizontal: 17),
value ?? '', scrollDirection: Axis.horizontal,
child: Text(
item.result,
textAlign: TextAlign.start, textAlign: TextAlign.start,
), ),
], ),
), ],
); ),
}, );
), },
); );
} }
} }

View File

@@ -14,12 +14,10 @@ import 'package:toolbox/data/model/server/dist.dart';
import 'package:toolbox/data/res/provider.dart'; import 'package:toolbox/data/res/provider.dart';
import '../../core/route.dart'; import '../../core/route.dart';
import '../../core/utils/misc.dart';
import '../../core/utils/server.dart'; import '../../core/utils/server.dart';
import '../../data/model/app/menu.dart'; import '../../data/model/app/menu.dart';
import '../../data/model/pkg/upgrade_info.dart'; import '../../data/model/pkg/upgrade_info.dart';
import '../../data/model/server/server_private_info.dart'; import '../../data/model/server/server_private_info.dart';
import '../../data/model/server/snippet.dart';
import 'popup_menu.dart'; import 'popup_menu.dart';
class ServerFuncBtnsTopRight extends StatelessWidget { class ServerFuncBtnsTopRight extends StatelessWidget {
@@ -94,28 +92,29 @@ void _onTapMoreBtns(
check: () => _checkClient(context, spi.id), check: () => _checkClient(context, spi.id),
); );
break; break;
case ServerTabMenuType.snippet: // case ServerTabMenuType.snippet:
final snippets = await context.showPickDialog<Snippet>( // final snippets = await context.showPickDialog<Snippet>(
items: Pros.snippet.snippets, // items: Pros.snippet.snippets,
name: (e) => e.name, // name: (e) => e.name,
); // multi: false
if (snippets == null) { // );
return; // if (snippets == null || snippets.isEmpty) {
} // return;
final result = await Pros.server.runSnippets(spi.id, snippets); // }
if (result != null && result.isNotEmpty) { // final result = await Pros.server.runSnippets(spi.id, snippets.first);
context.showRoundDialog( // if (result != null && result.isNotEmpty) {
title: Text(l10n.result), // context.showRoundDialog(
child: Text(result), // title: Text(l10n.result),
actions: [ // child: Text(result),
TextButton( // actions: [
onPressed: () => copy2Clipboard(result), // TextButton(
child: Text(l10n.copy), // onPressed: () => copy2Clipboard(result),
) // child: Text(l10n.copy),
], // )
); // ],
} // );
break; // }
// break;
case ServerTabMenuType.docker: case ServerTabMenuType.docker:
AppRoute.docker(spi: spi).checkGo( AppRoute.docker(spi: spi).checkGo(
context: context, context: context,

View File

@@ -6,7 +6,8 @@ class MainFlutterWindow: NSWindow {
let flutterViewController = FlutterViewController() let flutterViewController = FlutterViewController()
let windowFrame = self.frame let windowFrame = self.frame
self.contentViewController = flutterViewController 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) RegisterGeneratedPlugins(registry: flutterViewController)