fix & opt.

fix: net iface parse
opt: `ssh` page auto unpress `ctrl or alt` after call
opt: enable translation for menu
opt: add confirm to `docker` page
This commit is contained in:
LollipopKit
2023-01-29 17:39:27 +08:00
parent f3c670d82c
commit 7c0e01d0d5
10 changed files with 122 additions and 51 deletions

View File

@@ -1,27 +1,7 @@
import 'package:flutter/material.dart';
import 'package:toolbox/data/res/color.dart';
class DropdownBtnItem {
final String text;
final IconData icon;
const DropdownBtnItem({
required this.text,
required this.icon,
});
Widget get build => Row(
children: [
Icon(icon, color: primaryColor),
const SizedBox(
width: 10,
),
Text(
text,
),
],
);
}
import '../../generated/l10n.dart';
import '../../view/widget/dropdown_menu.dart';
class ServerTabMenuItems {
static const List<DropdownBtnItem> firstItems = [sftp, snippet, pkg, docker];
@@ -42,3 +22,22 @@ class DockerMenuItems {
static const start = DropdownBtnItem(text: 'Start', icon: Icons.play_arrow);
static const stop = DropdownBtnItem(text: 'Stop', icon: Icons.stop);
}
String getDropdownBtnText(S s, String text) {
switch (text) {
case 'Snippet':
return s.snippet;
case 'Pkg':
return s.pkgManage;
case 'Remove':
return s.delete;
case 'Start':
return s.start;
case 'Stop':
return s.stop;
case 'Edit':
return s.edit;
default:
return text;
}
}

View File

@@ -11,7 +11,7 @@ get _initMemory => Memory(
free: 1,
cache: 0,
avail: 1,
);
);
get _initOneTimeCpuStatus => OneTimeCpuStatus(
'cpu',
0,

View File

@@ -192,6 +192,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Please input a target IP/domain."),
"pingNoServer": MessageLookupByLibrary.simpleMessage(
"No server to ping.\nPlease add a server in server tab."),
"pkgManager": MessageLookupByLibrary.simpleMessage("Pkg mgr"),
"platformNotSupportUpdate": MessageLookupByLibrary.simpleMessage(
"Current platform does not support in app update.\nPlease build from source and install it."),
"plzEnterHost":

View File

@@ -168,6 +168,7 @@ class MessageLookup extends MessageLookupByLibrary {
"pingInputIP": MessageLookupByLibrary.simpleMessage("请输入目标IP或域名"),
"pingNoServer": MessageLookupByLibrary.simpleMessage(
"没有服务器可用于Ping\n请在服务器tab添加服务器后再试"),
"pkgManager": MessageLookupByLibrary.simpleMessage("包管理"),
"platformNotSupportUpdate":
MessageLookupByLibrary.simpleMessage("当前平台不支持更新,请编译最新源码后手动安装"),
"plzEnterHost": MessageLookupByLibrary.simpleMessage("请输入主机"),

View File

@@ -1550,6 +1550,16 @@ class S {
args: [newest],
);
}
/// `Pkg mgr`
String get pkgManager {
return Intl.message(
'Pkg mgr',
name: 'pkgManager',
desc: '',
args: [],
);
}
}
class AppLocalizationDelegate extends LocalizationsDelegate<S> {

View File

@@ -148,5 +148,6 @@
"addOne": "Add one",
"sshTip": "This function is now in the experimental stage. \nPlease report bugs on {url} or join our development.",
"updateTip": "Update: v1.0.{newest}",
"updateTipTooLow": "Current version is too low, please update to v1.0.{newest}"
"updateTipTooLow": "Current version is too low, please update to v1.0.{newest}",
"pkgManager": "Pkg mgr"
}

View File

@@ -148,5 +148,6 @@
"addOne": "前去新增",
"sshTip": "该功能目前处于测试阶段,请在 {url} 反馈问题,或者加入我们开发。",
"updateTip": "新版本: v1.0.{newest}",
"updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}"
"updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}",
"pkgManager": "包管理"
}

View File

@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:toolbox/core/utils.dart';
import 'package:toolbox/data/model/app/menu_item.dart';
import 'package:toolbox/data/model/docker/ps.dart';
import 'package:toolbox/data/model/server/server_private_info.dart';
import 'package:toolbox/data/provider/docker.dart';
@@ -17,6 +16,9 @@ import 'package:toolbox/view/widget/two_line_text.dart';
import 'package:toolbox/view/widget/round_rect_card.dart';
import 'package:toolbox/view/widget/url_text.dart';
import '../../data/res/menu.dart';
import '../widget/dropdown_menu.dart';
class DockerManagePage extends StatefulWidget {
final ServerPrivateInfo spi;
const DockerManagePage(this.spi, {Key? key}) : super(key: key);
@@ -288,12 +290,36 @@ class _DockerManagePageState extends State<DockerManagePage> {
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () async {
final result = await _docker.run('docker rmi ${e.id} -f');
showRoundDialog(
context,
_s.attention,
Text(_s.sureDelete(e.repo)),
[
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(_s.cancel),
),
TextButton(
onPressed: () async {
Navigator.of(context).pop();
final result = await _docker.run(
'docker rmi ${e.id} -f',
);
if (result != null) {
showSnackBar(
context, Text(getErrMsg(result) ?? _s.unknownError));
context,
Text(getErrMsg(result) ?? _s.unknownError),
);
}
},
child: Text(
_s.ok,
style: const TextStyle(color: Colors.red),
),
),
],
);
},
),
),
)
@@ -414,27 +440,26 @@ class _DockerManagePageState extends State<DockerManagePage> {
children: running.map(
(item) {
return ListTile(
title: Text(item.image),
subtitle: Text(item.status),
trailing:
_buildMoreBtn(item.running, item.containerId, docker.isBusy),
title: Text(item.name),
subtitle: Text('${item.image} ${item.status}'),
trailing: _buildMoreBtn(item, docker.isBusy),
);
},
).toList(),
);
}
Widget _buildMoreBtn(bool running, String containerId, bool busy) {
final item = running ? DockerMenuItems.stop : DockerMenuItems.start;
Widget _buildMoreBtn(DockerPsItem dItem, bool busy) {
final item = dItem.running ? DockerMenuItems.stop : DockerMenuItems.start;
return buildPopuopMenu(
items: [
PopupMenuItem<DropdownBtnItem>(
value: item,
child: item.build,
child: item.build(_s),
),
PopupMenuItem<DropdownBtnItem>(
value: DockerMenuItems.rm,
child: DockerMenuItems.rm.build,
child: DockerMenuItems.rm.build(_s),
),
],
onSelected: (value) {
@@ -445,13 +470,19 @@ class _DockerManagePageState extends State<DockerManagePage> {
final item = value as DropdownBtnItem;
switch (item) {
case DockerMenuItems.rm:
_docker.delete(containerId);
showRoundDialog(
context,
_s.attention,
Text(_s.sureDelete(dItem.name)),
[],
);
_docker.delete(dItem.containerId);
break;
case DockerMenuItems.start:
_docker.start(containerId);
_docker.start(dItem.containerId);
break;
case DockerMenuItems.stop:
_docker.stop(containerId);
_docker.stop(dItem.containerId);
break;
}
},

View File

@@ -5,7 +5,6 @@ import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';
import 'package:toolbox/core/route.dart';
import 'package:toolbox/core/utils.dart';
import 'package:toolbox/data/model/app/menu_item.dart';
import 'package:toolbox/data/model/server/server.dart';
import 'package:toolbox/data/model/server/server_private_info.dart';
import 'package:toolbox/data/model/server/server_status.dart';
@@ -27,6 +26,8 @@ import 'package:toolbox/view/page/ssh.dart';
import 'package:toolbox/view/widget/picker.dart';
import 'package:toolbox/view/widget/round_rect_card.dart';
import '../../../data/res/menu.dart';
import '../../widget/dropdown_menu.dart';
import '../../widget/url_text.dart';
class ServerPage extends StatefulWidget {
@@ -239,14 +240,14 @@ class _ServerPageState extends State<ServerPage>
...ServerTabMenuItems.firstItems.map(
(item) => PopupMenuItem<DropdownBtnItem>(
value: item,
child: item.build,
child: item.build(_s),
),
),
const PopupMenuDivider(height: 1),
...ServerTabMenuItems.secondItems.map(
(item) => PopupMenuItem<DropdownBtnItem>(
value: item,
child: item.build,
child: item.build(_s),
),
),
],

View File

@@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:toolbox/data/res/color.dart';
import 'package:toolbox/data/res/menu.dart';
import 'package:toolbox/generated/l10n.dart';
class DropdownBtnItem {
final String text;
final IconData icon;
const DropdownBtnItem({
required this.text,
required this.icon,
});
Widget build(S s) => Row(
children: [
Icon(icon, color: primaryColor),
const SizedBox(
width: 10,
),
Text(
getDropdownBtnText(s, text),
),
],
);
}