This commit is contained in:
Junyuan Feng
2022-02-09 11:29:56 +08:00
parent 1184841c24
commit feb3b10f1f
9 changed files with 138 additions and 127 deletions

View File

@@ -354,7 +354,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 88; CURRENT_PROJECT_VERSION = 96;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -362,7 +362,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.88; MARKETING_VERSION = 1.0.96;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -484,7 +484,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 88; CURRENT_PROJECT_VERSION = 96;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -492,7 +492,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.88; MARKETING_VERSION = 1.0.96;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -508,7 +508,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 88; CURRENT_PROJECT_VERSION = 96;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -516,7 +516,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.88; MARKETING_VERSION = 1.0.96;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

View File

@@ -11,13 +11,14 @@ class MenuItem {
} }
class MenuItems { class MenuItems {
static const List<MenuItem> firstItems = [sftp, snippet, apt]; static const List<MenuItem> firstItems = [ssh, sftp, snippet, apt];
static const List<MenuItem> secondItems = [edit]; static const List<MenuItem> secondItems = [edit];
static const ssh = MenuItem(text: 'SSH', icon: Icons.link);
static const sftp = MenuItem(text: 'SFTP', icon: Icons.file_present); static const sftp = MenuItem(text: 'SFTP', icon: Icons.file_present);
static const snippet = MenuItem(text: 'Snippet', icon: Icons.label); static const snippet = MenuItem(text: 'Snippet', icon: Icons.label);
static const apt = MenuItem(text: 'Apt', icon: Icons.system_security_update); static const apt = MenuItem(text: 'Apt', icon: Icons.system_security_update);
static const edit = MenuItem(text: 'Edit', icon: Icons.settings); static const edit = MenuItem(text: 'Edit', icon: Icons.edit);
static Widget buildItem(MenuItem item) { static Widget buildItem(MenuItem item) {
return Row( return Row(

View File

@@ -2,9 +2,9 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; static const String name = "ServerBox";
static const int build = 95; static const int build = 97;
static const String engine = static const String engine =
"Flutter 2.10.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 5f105a6ca7 (7 days ago) • 2022-02-01 14:15:42 -0800\nEngine • revision 776efd2034\nTools • Dart 2.16.0 • DevTools 2.9.2\n"; "Flutter 2.10.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 5f105a6ca7 (7 days ago) • 2022-02-01 14:15:42 -0800\nEngine • revision 776efd2034\nTools • Dart 2.16.0 • DevTools 2.9.2\n";
static const String buildAt = "2022-02-08 21:30:51.218738"; static const String buildAt = "2022-02-09 10:58:45.586008";
static const int modifications = 3; static const int modifications = 8;
} }

View File

@@ -3,7 +3,7 @@ import 'package:toolbox/data/model/app/navigation_item.dart';
final List<String> tabs = ['Servers', 'En/Decode', 'Ping']; final List<String> tabs = ['Servers', 'En/Decode', 'Ping'];
final List<NavigationItem> tabItems = [ final List<NavigationItem> tabItems = [
NavigationItem(Icons.computer, 'Server'), NavigationItem(Icons.cloud, 'Server'),
NavigationItem(Icons.code, 'Convert'), NavigationItem(Icons.code, 'Convert'),
NavigationItem(Icons.network_check, 'Ping'), NavigationItem(Icons.leak_add, 'Ping'),
]; ];

View File

@@ -213,23 +213,28 @@ class _MyHomePageState extends State<MyHomePage>
SizedBox( SizedBox(
height: MediaQuery.of(context).size.height * 0.07, height: MediaQuery.of(context).size.height * 0.07,
), ),
Padding(
padding: const EdgeInsets.only(left: 29),
child: Column(
children: [
ListTile( ListTile(
leading: const Icon(Icons.settings), leading: const Icon(Icons.settings),
title: const Text('Setting'), title: const Text('Setting'),
onTap: () => AppRoute(const SettingPage(), 'Setting').go(context), onTap: () =>
AppRoute(const SettingPage(), 'Setting').go(context),
), ),
ListTile( ListTile(
leading: const Icon(Icons.vpn_key), leading: const Icon(Icons.vpn_key),
title: const Text('Private Key'), title: const Text('Private Key'),
onTap: () => onTap: () => AppRoute(
AppRoute(const StoredPrivateKeysPage(), 'private key list') const StoredPrivateKeysPage(), 'private key list')
.go(context), .go(context),
), ),
ListTile( ListTile(
leading: const Icon(Icons.snippet_folder), leading: const Icon(Icons.snippet_folder),
title: const Text('Snippet'), title: const Text('Snippet'),
onTap: () => onTap: () => AppRoute(const SnippetListPage(), 'snippet list')
AppRoute(const SnippetListPage(), 'snippet list').go(context), .go(context),
), ),
AboutListTile( AboutListTile(
icon: const Icon(Icons.text_snippet), icon: const Icon(Icons.text_snippet),
@@ -239,13 +244,17 @@ class _MyHomePageState extends State<MyHomePage>
applicationIcon: _buildIcon(), applicationIcon: _buildIcon(),
aboutBoxChildren: const [ aboutBoxChildren: const [
UrlText( UrlText(
text: '\nMade with ❤️ by $myGithub', replace: 'LollipopKit'), text: '\nMade with ❤️ by $myGithub',
replace: 'LollipopKit'),
UrlText( UrlText(
text: text:
'\nThanks $rainSunMeGithub for participating in the test.\n\nAll rights reserved.', '\nThanks $rainSunMeGithub for participating in the test.\n\nAll rights reserved.',
replace: 'RainSunMe', replace: 'RainSunMe',
), ),
], ],
)
],
),
), ),
], ],
), ),

View File

@@ -18,15 +18,13 @@ class PingPage extends StatefulWidget {
class _PingPageState extends State<PingPage> class _PingPageState extends State<PingPage>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
late TextEditingController _textEditingController; late TextEditingController _textEditingController;
late TextEditingController _textEditingControllerResult; String _result = '';
late String _result;
Ping? _ping; Ping? _ping;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_textEditingController = TextEditingController(text: ''); _textEditingController = TextEditingController(text: '');
_textEditingControllerResult = TextEditingController(text: '');
if (Platform.isIOS) { if (Platform.isIOS) {
DartPingIOS.register(); DartPingIOS.register();
} }
@@ -48,7 +46,12 @@ class _PingPageState extends State<PingPage>
const SizedBox(height: 13), const SizedBox(height: 13),
buildInput(context, _textEditingController, maxLines: 1), buildInput(context, _textEditingController, maxLines: 1),
_buildControl(), _buildControl(),
buildInput(context, _textEditingControllerResult), RoundRectCard(
SizedBox(
width: double.infinity,
child: Padding(padding: const EdgeInsets.all(7), child: Text(_result)),
),
),
])), ])),
onTap: () => FocusScope.of(context).requestFocus(FocusNode()), onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
), ),
@@ -62,7 +65,7 @@ class _PingPageState extends State<PingPage>
final resp = event.response.toString(); final resp = event.response.toString();
if (resp == 'null') return; if (resp == 'null') return;
_result += '$resp\n'; _result += '$resp\n';
_textEditingControllerResult.text = _result; setState(() {});
}); });
} }

View File

@@ -175,70 +175,7 @@ class _ServerPageState extends State<ServerPage>
style: style), style: style),
) )
: Text(topRightStr, style: style, textScaleFactor: 1.0), : Text(topRightStr, style: style, textScaleFactor: 1.0),
DropdownButtonHideUnderline( _buildMoreBtn(spi),
child: DropdownButton2(
customButton: const Padding(
padding: EdgeInsets.only(left: 7),
child: Icon(
Icons.more_vert,
size: 17,
),
),
customItemsIndexes: const [3],
customItemsHeight: 8,
items: [
...MenuItems.firstItems.map(
(item) => DropdownMenuItem<MenuItem>(
value: item,
child: MenuItems.buildItem(item),
),
),
const DropdownMenuItem<Divider>(
enabled: false, child: Divider()),
...MenuItems.secondItems.map(
(item) => DropdownMenuItem<MenuItem>(
value: item,
child: MenuItems.buildItem(item),
),
),
],
onChanged: (value) {
final item = value as MenuItem;
switch (item) {
case MenuItems.apt:
case MenuItems.sftp:
showSnackBar(
context, const Text('Now is not supported'));
break;
case MenuItems.snippet:
AppRoute(
SnippetListPage(
spi: spi,
),
'snippet list')
.go(context);
break;
case MenuItems.edit:
AppRoute(
ServerEditPage(
spi: spi,
),
'Edit server info page')
.go(context);
break;
}
},
itemHeight: 37,
itemPadding: const EdgeInsets.only(left: 17, right: 17),
dropdownWidth: 160,
dropdownPadding: const EdgeInsets.symmetric(vertical: 7),
dropdownDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
),
dropdownElevation: 8,
offset: const Offset(0, 8),
),
),
], ],
) )
], ],
@@ -272,6 +209,72 @@ class _ServerPageState extends State<ServerPage>
); );
} }
Widget _buildMoreBtn(ServerPrivateInfo spi) {
return DropdownButtonHideUnderline(
child: DropdownButton2(
customButton: const Padding(
padding: EdgeInsets.only(left: 7),
child: Icon(
Icons.more_vert,
size: 17,
),
),
customItemsIndexes: [MenuItems.firstItems.length],
customItemsHeight: 8,
items: [
...MenuItems.firstItems.map(
(item) => DropdownMenuItem<MenuItem>(
value: item,
child: MenuItems.buildItem(item),
),
),
const DropdownMenuItem<Divider>(enabled: false, child: Divider()),
...MenuItems.secondItems.map(
(item) => DropdownMenuItem<MenuItem>(
value: item,
child: MenuItems.buildItem(item),
),
),
],
onChanged: (value) {
final item = value as MenuItem;
switch (item) {
case MenuItems.ssh:
case MenuItems.apt:
case MenuItems.sftp:
showSnackBar(context, const Text('Now is not supported'));
break;
case MenuItems.snippet:
AppRoute(
SnippetListPage(
spi: spi,
),
'snippet list')
.go(context);
break;
case MenuItems.edit:
AppRoute(
ServerEditPage(
spi: spi,
),
'Edit server info page')
.go(context);
break;
}
},
itemHeight: 37,
itemPadding: const EdgeInsets.only(left: 17, right: 17),
dropdownWidth: 160,
dropdownPadding: const EdgeInsets.symmetric(vertical: 7),
dropdownDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
),
dropdownElevation: 8,
offset: const Offset(0, 8),
),
);
}
Widget _buildExplainText(String text) { Widget _buildExplainText(String text) {
return SizedBox( return SizedBox(
width: _media.size.width * 0.2, width: _media.size.width * 0.2,

View File

@@ -44,12 +44,13 @@ Future<String> getFlutterVersion() async {
} }
Future<Map<String, dynamic>> getBuildData() async { Future<Map<String, dynamic>> getBuildData() async {
final modifiedCount = await getGitModificationCount();
final data = { final data = {
'name': appName, 'name': appName,
'build': await getGitCommitCount(), 'build': await getGitCommitCount() + (modifiedCount == 0 ? 0 : 1),
'engine': await getFlutterVersion(), 'engine': await getFlutterVersion(),
'buildAt': DateTime.now().toString(), 'buildAt': DateTime.now().toString(),
'modifications': await getGitModificationCount(), 'modifications': modifiedCount,
}; };
return data; return data;
} }
@@ -69,7 +70,7 @@ Future<void> updateBuildData() async {
void dartFormat() { void dartFormat() {
final result = Process.runSync('dart', ['format', '.']); final result = Process.runSync('dart', ['format', '.']);
print(result.stdout); print('\n' + result.stdout);
if (result.exitCode != 0) { if (result.exitCode != 0) {
print(result.stderr); print(result.stderr);
exit(1); exit(1);
@@ -83,7 +84,8 @@ void flutterRun(String? mode) {
Future<void> flutterBuild(String source, String target, bool isAndroid) async { Future<void> flutterBuild(String source, String target, bool isAndroid) async {
final startTime = DateTime.now(); final startTime = DateTime.now();
final build = await getGitCommitCount(); final build = await getGitCommitCount() +
(await getGitModificationCount() == 0 ? 0 : 1);
final args = [ final args = [
'build', 'build',

View File

@@ -335,13 +335,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.11" version: "0.12.11"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.3"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -528,7 +521,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.8" version: "0.4.3"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description: