mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix & opt.
This commit is contained in:
16
lib/data/model/sftp/download_item.dart
Normal file
16
lib/data/model/sftp/download_item.dart
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import '../server/server_private_info.dart';
|
||||||
|
|
||||||
|
class DownloadItem {
|
||||||
|
DownloadItem(this.spi, this.remotePath, this.localPath);
|
||||||
|
|
||||||
|
final ServerPrivateInfo spi;
|
||||||
|
final String remotePath;
|
||||||
|
final String localPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DownloadItemEvent {
|
||||||
|
DownloadItemEvent(this.item, this.privateKey);
|
||||||
|
|
||||||
|
final DownloadItem item;
|
||||||
|
final String? privateKey;
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
import 'package:toolbox/data/model/sftp/download_worker.dart';
|
import 'package:toolbox/data/model/sftp/download_worker.dart';
|
||||||
|
|
||||||
|
import 'download_item.dart';
|
||||||
|
|
||||||
class SftpDownloadStatus {
|
class SftpDownloadStatus {
|
||||||
final int id;
|
final int id;
|
||||||
final DownloadItem item;
|
final DownloadItem item;
|
||||||
|
|||||||
@@ -4,16 +4,9 @@ import 'dart:isolate';
|
|||||||
|
|
||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:easy_isolate/easy_isolate.dart';
|
import 'package:easy_isolate/easy_isolate.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
|
||||||
import 'package:toolbox/data/model/sftp/download_status.dart';
|
|
||||||
|
|
||||||
class DownloadItem {
|
import 'download_item.dart';
|
||||||
DownloadItem(this.spi, this.remotePath, this.localPath);
|
import 'download_status.dart';
|
||||||
|
|
||||||
final ServerPrivateInfo spi;
|
|
||||||
final String remotePath;
|
|
||||||
final String localPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
class SftpDownloadWorker {
|
class SftpDownloadWorker {
|
||||||
SftpDownloadWorker(
|
SftpDownloadWorker(
|
||||||
@@ -101,10 +94,3 @@ class SftpDownloadWorker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DownloadItemEvent {
|
|
||||||
DownloadItemEvent(this.item, this.privateKey);
|
|
||||||
|
|
||||||
final DownloadItem item;
|
|
||||||
final String? privateKey;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:toolbox/core/provider_base.dart';
|
import 'package:toolbox/core/provider_base.dart';
|
||||||
import 'package:toolbox/data/model/sftp/download_status.dart';
|
|
||||||
import 'package:toolbox/data/model/sftp/download_worker.dart';
|
import '../model/sftp/download_item.dart';
|
||||||
|
import '../model/sftp/download_status.dart';
|
||||||
|
|
||||||
class SftpDownloadProvider extends ProviderBase {
|
class SftpDownloadProvider extends ProviderBase {
|
||||||
final List<SftpDownloadStatus> _status = [];
|
final List<SftpDownloadStatus> _status = [];
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
class BuildData {
|
class BuildData {
|
||||||
static const String name = "ServerBox";
|
static const String name = "ServerBox";
|
||||||
static const int build = 187;
|
static const int build = 189;
|
||||||
static const String engine =
|
static const String engine =
|
||||||
"Flutter 3.7.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision b06b8b2710 (4 days ago) • 2023-01-23 16:55:55 -0800\nEngine • revision b24591ed32\nTools • Dart 2.19.0 • DevTools 2.20.1\n";
|
"Flutter 3.7.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision b06b8b2710 (4 days ago) • 2023-01-23 16:55:55 -0800\nEngine • revision b24591ed32\nTools • Dart 2.19.0 • DevTools 2.20.1\n";
|
||||||
static const String buildAt = "2023-01-28 13:54:17.985459";
|
static const String buildAt = "2023-01-28 14:28:14.979200";
|
||||||
static const int modifications = 13;
|
static const int modifications = 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
const roundRectCardPadding = EdgeInsets.symmetric(horizontal: 17);
|
const roundRectCardPadding = EdgeInsets.symmetric(horizontal: 17, vertical: 13);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ class SettingStore extends PersistentStore {
|
|||||||
property('primaryColor', defaultValue: Colors.deepPurpleAccent.value);
|
property('primaryColor', defaultValue: Colors.deepPurpleAccent.value);
|
||||||
|
|
||||||
StoreProperty<int> get serverStatusUpdateInterval =>
|
StoreProperty<int> get serverStatusUpdateInterval =>
|
||||||
property('serverStatusUpdateInterval', defaultValue: 5);
|
property('serverStatusUpdateInterval', defaultValue: 3);
|
||||||
|
|
||||||
/// Lanch page idx
|
/// Lanch page idx
|
||||||
StoreProperty<int> get launchPage => property('launchPage', defaultValue: 0);
|
StoreProperty<int> get launchPage => property('launchPage', defaultValue: 0);
|
||||||
|
|||||||
@@ -133,8 +133,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"files": MessageLookupByLibrary.simpleMessage("Files"),
|
"files": MessageLookupByLibrary.simpleMessage("Files"),
|
||||||
"foundNUpdate": m5,
|
"foundNUpdate": m5,
|
||||||
"go": MessageLookupByLibrary.simpleMessage("Go"),
|
"go": MessageLookupByLibrary.simpleMessage("Go"),
|
||||||
"goSftpDlPage":
|
|
||||||
MessageLookupByLibrary.simpleMessage("Go to SFTP download page?"),
|
|
||||||
"goto": MessageLookupByLibrary.simpleMessage("Go to"),
|
"goto": MessageLookupByLibrary.simpleMessage("Go to"),
|
||||||
"host": MessageLookupByLibrary.simpleMessage("Host"),
|
"host": MessageLookupByLibrary.simpleMessage("Host"),
|
||||||
"httpFailedWithCode": m6,
|
"httpFailedWithCode": m6,
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"files": MessageLookupByLibrary.simpleMessage("文件"),
|
"files": MessageLookupByLibrary.simpleMessage("文件"),
|
||||||
"foundNUpdate": m5,
|
"foundNUpdate": m5,
|
||||||
"go": MessageLookupByLibrary.simpleMessage("开始"),
|
"go": MessageLookupByLibrary.simpleMessage("开始"),
|
||||||
"goSftpDlPage": MessageLookupByLibrary.simpleMessage("前往下载页?"),
|
|
||||||
"goto": MessageLookupByLibrary.simpleMessage("前往"),
|
"goto": MessageLookupByLibrary.simpleMessage("前往"),
|
||||||
"host": MessageLookupByLibrary.simpleMessage("主机"),
|
"host": MessageLookupByLibrary.simpleMessage("主机"),
|
||||||
"httpFailedWithCode": m6,
|
"httpFailedWithCode": m6,
|
||||||
|
|||||||
@@ -1051,16 +1051,6 @@ class S {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Go to SFTP download page?`
|
|
||||||
String get goSftpDlPage {
|
|
||||||
return Intl.message(
|
|
||||||
'Go to SFTP download page?',
|
|
||||||
name: 'goSftpDlPage',
|
|
||||||
desc: '',
|
|
||||||
args: [],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// `Create folder`
|
/// `Create folder`
|
||||||
String get createFolder {
|
String get createFolder {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
|
|||||||
@@ -99,7 +99,6 @@
|
|||||||
"install": "install",
|
"install": "install",
|
||||||
"loadingFiles": "Loading files...",
|
"loadingFiles": "Loading files...",
|
||||||
"sftpNoDownloadTask": "No download task.",
|
"sftpNoDownloadTask": "No download task.",
|
||||||
"goSftpDlPage": "Go to SFTP download page?",
|
|
||||||
"createFolder": "Create folder",
|
"createFolder": "Create folder",
|
||||||
"createFile": "Create file",
|
"createFile": "Create file",
|
||||||
"rename": "Rename",
|
"rename": "Rename",
|
||||||
|
|||||||
@@ -99,7 +99,6 @@
|
|||||||
"install": "安装",
|
"install": "安装",
|
||||||
"loadingFiles": "正在加载目录。。。",
|
"loadingFiles": "正在加载目录。。。",
|
||||||
"sftpNoDownloadTask": "没有下载任务",
|
"sftpNoDownloadTask": "没有下载任务",
|
||||||
"goSftpDlPage": "前往下载页?",
|
|
||||||
"createFolder": "创建文件夹",
|
"createFolder": "创建文件夹",
|
||||||
"createFile": "创建文件",
|
"createFile": "创建文件",
|
||||||
"rename": "重命名",
|
"rename": "重命名",
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import 'package:provider/provider.dart';
|
|||||||
import 'package:toolbox/core/route.dart';
|
import 'package:toolbox/core/route.dart';
|
||||||
import 'package:toolbox/data/provider/private_key.dart';
|
import 'package:toolbox/data/provider/private_key.dart';
|
||||||
import 'package:toolbox/data/res/font_style.dart';
|
import 'package:toolbox/data/res/font_style.dart';
|
||||||
import 'package:toolbox/data/res/padding.dart';
|
|
||||||
import 'package:toolbox/generated/l10n.dart';
|
import 'package:toolbox/generated/l10n.dart';
|
||||||
import 'package:toolbox/view/page/private_key/edit.dart';
|
import 'package:toolbox/view/page/private_key/edit.dart';
|
||||||
import 'package:toolbox/view/widget/round_rect_card.dart';
|
import 'package:toolbox/view/widget/round_rect_card.dart';
|
||||||
@@ -32,35 +31,30 @@ class _PrivateKeyListState extends State<StoredPrivateKeysPage> {
|
|||||||
),
|
),
|
||||||
body: Consumer<PrivateKeyProvider>(
|
body: Consumer<PrivateKeyProvider>(
|
||||||
builder: (_, key, __) {
|
builder: (_, key, __) {
|
||||||
return key.infos.isNotEmpty
|
if (key.infos.isEmpty) {
|
||||||
? ListView.builder(
|
return Center(
|
||||||
|
child: Text(_s.noSavedPrivateKey),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return ListView.builder(
|
||||||
padding: const EdgeInsets.all(13),
|
padding: const EdgeInsets.all(13),
|
||||||
itemCount: key.infos.length,
|
itemCount: key.infos.length,
|
||||||
itemExtent: 57,
|
|
||||||
itemBuilder: (context, idx) {
|
itemBuilder: (context, idx) {
|
||||||
return RoundRectCard(Padding(
|
return RoundRectCard(
|
||||||
padding: roundRectCardPadding,
|
ListTile(
|
||||||
child: Row(
|
title: Text(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
key.infos[idx].id,
|
key.infos[idx].id,
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
),
|
||||||
TextButton(
|
trailing: TextButton(
|
||||||
onPressed: () => AppRoute(
|
onPressed: () => AppRoute(
|
||||||
PrivateKeyEditPage(info: key.infos[idx]),
|
PrivateKeyEditPage(info: key.infos[idx]),
|
||||||
'private key edit page')
|
'private key edit page')
|
||||||
.go(context),
|
.go(context),
|
||||||
child: Text(_s.edit),
|
child: Text(_s.edit),
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
));
|
),
|
||||||
})
|
);
|
||||||
: Center(
|
},
|
||||||
child: Text(_s.noSavedPrivateKey),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ class ServerDetailPage extends StatefulWidget {
|
|||||||
_ServerDetailPageState createState() => _ServerDetailPageState();
|
_ServerDetailPageState createState() => _ServerDetailPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const width13 = SizedBox(
|
||||||
|
width: 13,
|
||||||
|
);
|
||||||
|
|
||||||
class _ServerDetailPageState extends State<ServerDetailPage>
|
class _ServerDetailPageState extends State<ServerDetailPage>
|
||||||
with SingleTickerProviderStateMixin {
|
with SingleTickerProviderStateMixin {
|
||||||
late MediaQueryData _media;
|
late MediaQueryData _media;
|
||||||
@@ -92,37 +96,37 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildCPUView(ServerStatus ss) {
|
Widget _buildCPUView(ServerStatus ss) {
|
||||||
|
final tempWidget = ss.cpu2Status.temp.isEmpty
|
||||||
|
? const SizedBox()
|
||||||
|
: Text(
|
||||||
|
ss.cpu2Status.temp,
|
||||||
|
style: textSize13Grey,
|
||||||
|
);
|
||||||
return RoundRectCard(
|
return RoundRectCard(
|
||||||
Padding(
|
Padding(
|
||||||
padding: roundRectCardPadding,
|
padding: roundRectCardPadding,
|
||||||
child: SizedBox(
|
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
|
||||||
height: 12 * ss.cpu2Status.coresCount + 63,
|
|
||||||
child: Column(children: [
|
|
||||||
SizedBox(
|
|
||||||
height: _media.size.height * 0.02,
|
|
||||||
),
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'${ss.cpu2Status.usedPercent(coreIdx: 0).toInt()}%',
|
'${ss.cpu2Status.usedPercent(coreIdx: 0).toInt()}%',
|
||||||
style: textSize27,
|
style: textSize27,
|
||||||
textScaleFactor: 1.0,
|
textScaleFactor: 1.0,
|
||||||
),
|
),
|
||||||
|
tempWidget
|
||||||
|
],
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
_buildDetailPercent(ss.cpu2Status.user, 'user'),
|
_buildDetailPercent(ss.cpu2Status.user, 'user'),
|
||||||
SizedBox(
|
width13,
|
||||||
width: _media.size.width * 0.03,
|
|
||||||
),
|
|
||||||
_buildDetailPercent(ss.cpu2Status.sys, 'sys'),
|
_buildDetailPercent(ss.cpu2Status.sys, 'sys'),
|
||||||
SizedBox(
|
width13,
|
||||||
width: _media.size.width * 0.03,
|
|
||||||
),
|
|
||||||
_buildDetailPercent(ss.cpu2Status.iowait, 'io'),
|
_buildDetailPercent(ss.cpu2Status.iowait, 'io'),
|
||||||
SizedBox(
|
width13,
|
||||||
width: _media.size.width * 0.03,
|
|
||||||
),
|
|
||||||
_buildDetailPercent(ss.cpu2Status.idle, 'idle')
|
_buildDetailPercent(ss.cpu2Status.idle, 'idle')
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@@ -131,7 +135,6 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
_buildCPUProgress(ss)
|
_buildCPUProgress(ss)
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,13 +183,13 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
value: percentWithinOne,
|
value: percentWithinOne,
|
||||||
minHeight: 7,
|
minHeight: 7,
|
||||||
backgroundColor: progressColor.resolve(context),
|
backgroundColor: progressColor.resolve(context),
|
||||||
color: pColor.withOpacity(0.5 + percentWithinOne / 2),
|
color: pColor,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildUpTimeAndSys(ServerStatus ss) {
|
Widget _buildUpTimeAndSys(ServerStatus ss) {
|
||||||
return RoundRectCard(Padding(
|
return RoundRectCard(Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 13, horizontal: 17),
|
padding: roundRectCardPadding,
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@@ -208,8 +211,6 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
|
|
||||||
return RoundRectCard(Padding(
|
return RoundRectCard(Padding(
|
||||||
padding: roundRectCardPadding,
|
padding: roundRectCardPadding,
|
||||||
child: SizedBox(
|
|
||||||
height: 70,
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
@@ -228,9 +229,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
_buildDetailPercent(free, 'free'),
|
_buildDetailPercent(free, 'free'),
|
||||||
SizedBox(
|
width13,
|
||||||
width: _media.size.width * 0.03,
|
|
||||||
),
|
|
||||||
_buildDetailPercent(avail, 'avail'),
|
_buildDetailPercent(avail, 'avail'),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -242,7 +241,6 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
_buildProgress(used)
|
_buildProgress(used)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,17 +251,11 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
clone.remove(item);
|
clone.remove(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return RoundRectCard(SizedBox(
|
final children = clone
|
||||||
height: 27 * clone.length + 25,
|
.map((disk) => Padding(
|
||||||
child: ListView.builder(
|
|
||||||
padding: const EdgeInsets.symmetric(vertical: 13, horizontal: 17),
|
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
|
||||||
itemCount: clone.length,
|
|
||||||
itemBuilder: (_, idx) {
|
|
||||||
final disk = clone[idx];
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.all(3),
|
padding: const EdgeInsets.all(3),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
@@ -280,8 +272,14 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
_buildProgress(disk.usedPercent.toDouble())
|
_buildProgress(disk.usedPercent.toDouble())
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
))
|
||||||
}),
|
.toList();
|
||||||
|
return RoundRectCard(Padding(
|
||||||
|
padding: roundRectCardPadding,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: children,
|
||||||
|
),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,7 +302,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
|||||||
}
|
}
|
||||||
|
|
||||||
return RoundRectCard(Padding(
|
return RoundRectCard(Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 7, horizontal: 17),
|
padding: roundRectCardPadding,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: children,
|
children: children,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import 'package:toolbox/data/provider/server.dart';
|
|||||||
import 'package:toolbox/data/res/build_data.dart';
|
import 'package:toolbox/data/res/build_data.dart';
|
||||||
import 'package:toolbox/data/res/color.dart';
|
import 'package:toolbox/data/res/color.dart';
|
||||||
import 'package:toolbox/data/res/font_style.dart';
|
import 'package:toolbox/data/res/font_style.dart';
|
||||||
import 'package:toolbox/data/res/padding.dart';
|
|
||||||
import 'package:toolbox/data/res/tab.dart';
|
import 'package:toolbox/data/res/tab.dart';
|
||||||
import 'package:toolbox/data/store/setting.dart';
|
import 'package:toolbox/data/store/setting.dart';
|
||||||
import 'package:toolbox/generated/l10n.dart';
|
import 'package:toolbox/generated/l10n.dart';
|
||||||
@@ -99,7 +98,6 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
display = _s.versionUnknownUpdate(BuildData.build);
|
display = _s.versionUnknownUpdate(BuildData.build);
|
||||||
}
|
}
|
||||||
return ListTile(
|
return ListTile(
|
||||||
contentPadding: roundRectCardPadding,
|
|
||||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||||
title: Text(
|
title: Text(
|
||||||
display,
|
display,
|
||||||
@@ -114,8 +112,6 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
|
|
||||||
Widget _buildUpdateInterval() {
|
Widget _buildUpdateInterval() {
|
||||||
return ExpansionTile(
|
return ExpansionTile(
|
||||||
tilePadding: roundRectCardPadding,
|
|
||||||
childrenPadding: roundRectCardPadding,
|
|
||||||
textColor: priColor,
|
textColor: priColor,
|
||||||
title: Text(
|
title: Text(
|
||||||
_s.updateServerStatusInterval,
|
_s.updateServerStatusInterval,
|
||||||
@@ -166,8 +162,6 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
Widget _buildAppColorPreview() {
|
Widget _buildAppColorPreview() {
|
||||||
return ExpansionTile(
|
return ExpansionTile(
|
||||||
textColor: priColor,
|
textColor: priColor,
|
||||||
tilePadding: roundRectCardPadding,
|
|
||||||
childrenPadding: roundRectCardPadding,
|
|
||||||
trailing: ClipOval(
|
trailing: ClipOval(
|
||||||
child: Container(
|
child: Container(
|
||||||
color: priColor,
|
color: priColor,
|
||||||
@@ -205,8 +199,6 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
Widget _buildLaunchPage() {
|
Widget _buildLaunchPage() {
|
||||||
return ExpansionTile(
|
return ExpansionTile(
|
||||||
textColor: priColor,
|
textColor: priColor,
|
||||||
tilePadding: roundRectCardPadding,
|
|
||||||
childrenPadding: roundRectCardPadding,
|
|
||||||
title: Text(
|
title: Text(
|
||||||
_s.launchPage,
|
_s.launchPage,
|
||||||
style: textSize13,
|
style: textSize13,
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ class _SFTPDownloadingPageState extends State<SFTPDownloadingPage> {
|
|||||||
Widget _buildItem(SftpDownloadStatus status) {
|
Widget _buildItem(SftpDownloadStatus status) {
|
||||||
if (status.error != null) {
|
if (status.error != null) {
|
||||||
showSnackBar(context, Text(status.error.toString()));
|
showSnackBar(context, Text(status.error.toString()));
|
||||||
|
status.error = null;
|
||||||
}
|
}
|
||||||
switch (status.status) {
|
switch (status.status) {
|
||||||
case SftpWorkerStatus.finished:
|
case SftpWorkerStatus.finished:
|
||||||
|
|||||||
@@ -2,24 +2,25 @@ import 'dart:typed_data';
|
|||||||
|
|
||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/numx.dart';
|
|
||||||
import 'package:toolbox/core/extension/stringx.dart';
|
import '../../../core/extension/numx.dart';
|
||||||
import 'package:toolbox/core/route.dart';
|
import '../../../core/extension/stringx.dart';
|
||||||
import 'package:toolbox/core/utils.dart';
|
import '../../../core/route.dart';
|
||||||
import 'package:toolbox/data/model/server/server.dart';
|
import '../../../core/utils.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import '../../../data/model/server/server.dart';
|
||||||
import 'package:toolbox/data/model/sftp/absolute_path.dart';
|
import '../../../data/model/server/server_private_info.dart';
|
||||||
import 'package:toolbox/data/model/sftp/download_worker.dart';
|
import '../../../data/model/sftp/absolute_path.dart';
|
||||||
import 'package:toolbox/data/model/sftp/browser_status.dart';
|
import '../../../data/model/sftp/browser_status.dart';
|
||||||
import 'package:toolbox/data/provider/server.dart';
|
import '../../../data/model/sftp/download_item.dart';
|
||||||
import 'package:toolbox/data/provider/sftp_download.dart';
|
import '../../../data/provider/server.dart';
|
||||||
import 'package:toolbox/data/res/path.dart';
|
import '../../../data/provider/sftp_download.dart';
|
||||||
import 'package:toolbox/data/store/private_key.dart';
|
import '../../../data/res/path.dart';
|
||||||
import 'package:toolbox/generated/l10n.dart';
|
import '../../../data/store/private_key.dart';
|
||||||
import 'package:toolbox/locator.dart';
|
import '../../../generated/l10n.dart';
|
||||||
import 'package:toolbox/view/page/sftp/downloading.dart';
|
import '../../../locator.dart';
|
||||||
import 'package:toolbox/view/widget/fade_in.dart';
|
import '../../widget/fade_in.dart';
|
||||||
import 'package:toolbox/view/widget/two_line_text.dart';
|
import '../../widget/two_line_text.dart';
|
||||||
|
import 'downloading.dart';
|
||||||
|
|
||||||
class SFTPPage extends StatefulWidget {
|
class SFTPPage extends StatefulWidget {
|
||||||
final ServerPrivateInfo spi;
|
final ServerPrivateInfo spi;
|
||||||
@@ -61,6 +62,38 @@ class _SFTPPageState extends State<SFTPPage> {
|
|||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
title: TwoLineText(up: 'SFTP', down: widget.spi.name),
|
title: TwoLineText(up: 'SFTP', down: widget.spi.name),
|
||||||
actions: [
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(Icons.downloading),
|
||||||
|
onPressed: () =>
|
||||||
|
AppRoute(const SFTPDownloadingPage(), 'sftp downloading')
|
||||||
|
.go(context),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: _buildFileView(),
|
||||||
|
bottomNavigationBar: _buildBottom(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildBottom() {
|
||||||
|
return SafeArea(
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.fromLTRB(11, 7, 11, 11),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
const Divider(),
|
||||||
|
(_status.path?.path ?? _s.loadingFiles).omitStartStr(),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
|
children: [
|
||||||
|
IconButton(
|
||||||
|
padding: const EdgeInsets.all(0),
|
||||||
|
onPressed: () async {
|
||||||
|
await backward();
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.arrow_back),
|
||||||
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: (() => showRoundDialog(
|
onPressed: (() => showRoundDialog(
|
||||||
context,
|
context,
|
||||||
@@ -85,32 +118,6 @@ class _SFTPPageState extends State<SFTPPage> {
|
|||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
icon: const Icon(Icons.add),
|
icon: const Icon(Icons.add),
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
body: _buildFileView(),
|
|
||||||
bottomNavigationBar: _buildPath(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildPath() {
|
|
||||||
return SafeArea(
|
|
||||||
child: Container(
|
|
||||||
padding: const EdgeInsets.fromLTRB(11, 7, 11, 11),
|
|
||||||
child: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
const Divider(),
|
|
||||||
(_status.path?.path ?? _s.loadingFiles).omitStartStr(),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
||||||
children: [
|
|
||||||
IconButton(
|
|
||||||
padding: const EdgeInsets.all(0),
|
|
||||||
onPressed: () async {
|
|
||||||
await backward();
|
|
||||||
},
|
|
||||||
icon: const Icon(Icons.arrow_back),
|
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
padding: const EdgeInsets.all(0),
|
padding: const EdgeInsets.all(0),
|
||||||
@@ -307,25 +314,6 @@ class _SFTPPageState extends State<SFTPPage> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
showRoundDialog(
|
|
||||||
context,
|
|
||||||
_s.goSftpDlPage,
|
|
||||||
const SizedBox(),
|
|
||||||
[
|
|
||||||
TextButton(
|
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
|
||||||
child: Text(_s.cancel),
|
|
||||||
),
|
|
||||||
TextButton(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
AppRoute(const SFTPDownloadingPage(), 'sftp downloading')
|
|
||||||
.go(context);
|
|
||||||
},
|
|
||||||
child: Text(_s.ok),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
child: Text(_s.download),
|
child: Text(_s.download),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:toolbox/core/route.dart';
|
import 'package:toolbox/core/route.dart';
|
||||||
import 'package:toolbox/data/provider/snippet.dart';
|
import 'package:toolbox/data/provider/snippet.dart';
|
||||||
import 'package:toolbox/data/res/color.dart';
|
|
||||||
import 'package:toolbox/data/res/font_style.dart';
|
import 'package:toolbox/data/res/font_style.dart';
|
||||||
import 'package:toolbox/data/res/padding.dart';
|
|
||||||
import 'package:toolbox/generated/l10n.dart';
|
import 'package:toolbox/generated/l10n.dart';
|
||||||
import 'package:toolbox/view/page/snippet/edit.dart';
|
import 'package:toolbox/view/page/snippet/edit.dart';
|
||||||
import 'package:toolbox/view/widget/round_rect_card.dart';
|
import 'package:toolbox/view/widget/round_rect_card.dart';
|
||||||
@@ -17,8 +15,6 @@ class SnippetListPage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _SnippetListPageState extends State<SnippetListPage> {
|
class _SnippetListPageState extends State<SnippetListPage> {
|
||||||
final _textStyle = TextStyle(color: primaryColor);
|
|
||||||
|
|
||||||
late S _s;
|
late S _s;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -54,30 +50,18 @@ class _SnippetListPageState extends State<SnippetListPage> {
|
|||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
padding: const EdgeInsets.all(13),
|
padding: const EdgeInsets.all(13),
|
||||||
itemCount: key.snippets.length,
|
itemCount: key.snippets.length,
|
||||||
itemExtent: 57,
|
|
||||||
itemBuilder: (context, idx) {
|
itemBuilder: (context, idx) {
|
||||||
return RoundRectCard(
|
return RoundRectCard(
|
||||||
Padding(
|
ListTile(
|
||||||
padding: roundRectCardPadding,
|
title: Text(
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
key.snippets[idx].name,
|
key.snippets[idx].name,
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
),
|
||||||
TextButton(
|
trailing: TextButton(
|
||||||
onPressed: () => AppRoute(
|
onPressed: () => AppRoute(
|
||||||
SnippetEditPage(snippet: key.snippets[idx]),
|
SnippetEditPage(snippet: key.snippets[idx]),
|
||||||
'snippet edit page')
|
'snippet edit page')
|
||||||
.go(context),
|
.go(context),
|
||||||
child: Text(
|
child: Text(_s.edit),
|
||||||
_s.edit,
|
|
||||||
style: _textStyle,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user