diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n.dart b/.dart_tool/flutter_gen/gen_l10n/l10n.dart index 469296d0..88017151 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n.dart @@ -785,7 +785,7 @@ abstract class S { /// No description provided for @moveOutServerFuncBtnsHelp. /// /// In en, this message translates to: - /// **'On: can be displayed below each card on the Server Tab page.\nOff: can be displayed at the top of the Server Details page.'** + /// **'On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.'** String get moveOutServerFuncBtnsHelp; /// No description provided for @ms. @@ -1088,6 +1088,18 @@ abstract class S { /// **'Server'** String get server; + /// No description provided for @serverDetailOrder. + /// + /// In en, this message translates to: + /// **'Detail page widget order'** + String get serverDetailOrder; + + /// No description provided for @serverOrder. + /// + /// In en, this message translates to: + /// **'Server order'** + String get serverOrder; + /// No description provided for @serverTabConnecting. /// /// In en, this message translates to: diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart index 1f08e442..2de8bb38 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_de.dart @@ -369,7 +369,7 @@ class SDe extends S { String get moveOutServerFuncBtns => 'Position der Server-Funktionsschaltfläche'; @override - String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden.\nAus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.'; + String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.'; @override String get ms => 'ms'; @@ -525,6 +525,12 @@ class SDe extends S { @override String get server => 'Server'; + @override + String get serverDetailOrder => 'Reihenfolge der Widgets auf der Detailseite'; + + @override + String get serverOrder => 'Server-Bestellung'; + @override String get serverTabConnecting => 'Verbinden...'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart index 4ba149b2..ae799ecd 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_en.dart @@ -369,7 +369,7 @@ class SEn extends S { String get moveOutServerFuncBtns => 'Server function button location'; @override - String get moveOutServerFuncBtnsHelp => 'On: can be displayed below each card on the Server Tab page.\nOff: can be displayed at the top of the Server Details page.'; + String get moveOutServerFuncBtnsHelp => 'On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.'; @override String get ms => 'ms'; @@ -525,6 +525,12 @@ class SEn extends S { @override String get server => 'Server'; + @override + String get serverDetailOrder => 'Detail page widget order'; + + @override + String get serverOrder => 'Server order'; + @override String get serverTabConnecting => 'Connecting...'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart index 44f73673..f390594f 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_id.dart @@ -369,7 +369,7 @@ class SId extends S { String get moveOutServerFuncBtns => 'Lokasi tombol fungsi server'; @override - String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server.\nNonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.'; + String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.'; @override String get ms => 'MS'; @@ -525,6 +525,12 @@ class SId extends S { @override String get server => 'Server'; + @override + String get serverDetailOrder => 'Detail pesanan widget halaman'; + + @override + String get serverOrder => 'Pesanan server'; + @override String get serverTabConnecting => 'Menghubungkan ...'; diff --git a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart index 344ae857..d65be8f9 100644 --- a/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart +++ b/.dart_tool/flutter_gen/gen_l10n/l10n_zh.dart @@ -369,7 +369,7 @@ class SZh extends S { String get moveOutServerFuncBtns => '服务器功能按钮位置'; @override - String get moveOutServerFuncBtnsHelp => '开启:可以在服务器 Tab 页的每个卡片下方显示。\n关闭:在服务器详情页顶部显示。'; + String get moveOutServerFuncBtnsHelp => '开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。'; @override String get ms => '毫秒'; @@ -525,6 +525,12 @@ class SZh extends S { @override String get server => '服务器'; + @override + String get serverDetailOrder => '详情页部件顺序'; + + @override + String get serverOrder => '服务器顺序'; + @override String get serverTabConnecting => '连接中...'; @@ -1077,7 +1083,7 @@ class SZhTw extends SZh { String get moveOutServerFuncBtns => '服務器功能按鈕位置'; @override - String get moveOutServerFuncBtnsHelp => '開啟:可以在服務器 Tab 頁的每個卡片下方顯示。\n關閉:在服務器詳情頁頂部顯示。'; + String get moveOutServerFuncBtnsHelp => '開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。'; @override String get ms => '毫秒'; @@ -1233,6 +1239,12 @@ class SZhTw extends SZh { @override String get server => '服務器'; + @override + String get serverDetailOrder => '詳情頁部件順序'; + + @override + String get serverOrder => '服務器順序'; + @override String get serverTabConnecting => '連接中...'; diff --git a/lib/core/route.dart b/lib/core/route.dart index 9c5f2904..bb0e9997 100644 --- a/lib/core/route.dart +++ b/lib/core/route.dart @@ -12,8 +12,8 @@ import 'package:toolbox/view/page/ping.dart'; import 'package:toolbox/view/page/private_key/edit.dart'; import 'package:toolbox/view/page/private_key/list.dart'; import 'package:toolbox/view/page/server/detail.dart'; -import 'package:toolbox/view/page/ssh/term.dart'; -import 'package:toolbox/view/page/ssh/virt_key_setting.dart'; +import 'package:toolbox/view/page/ssh_term.dart'; +import 'package:toolbox/view/page/setting/virt_key.dart'; import 'package:toolbox/view/page/storage/local.dart'; import '../data/model/server/snippet.dart'; @@ -25,7 +25,9 @@ import '../view/page/pkg.dart'; import '../view/page/process.dart'; import '../view/page/server/edit.dart'; import '../view/page/server/tab.dart'; -import '../view/page/setting.dart'; +import '../view/page/setting/entry.dart'; +import '../view/page/setting/srv_detail_seq.dart'; +import '../view/page/setting/srv_seq.dart'; import '../view/page/snippet/edit.dart'; import '../view/page/snippet/list.dart'; import '../view/page/storage/sftp.dart'; @@ -181,4 +183,12 @@ class AppRoute { static AppRoute setting({Key? key}) { return AppRoute(SettingPage(key: key), 'setting'); } + + static AppRoute serverOrder({Key? key}) { + return AppRoute(ServerOrderPage(key: key), 'server_order'); + } + + static AppRoute serverDetailOrder({Key? key}) { + return AppRoute(ServerDetailOrderPage(key: key), 'server_detail_order'); + } } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 097edcbe..5c6fd4e5 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -114,7 +114,7 @@ "min": "min", "mission": "Mission", "moveOutServerFuncBtns": "Position der Server-Funktionsschaltfläche", - "moveOutServerFuncBtnsHelp": "Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden.\nAus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.", + "moveOutServerFuncBtnsHelp": "Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.", "ms": "ms", "name": "Name", "needRestart": "App muss neugestartet werden", @@ -165,6 +165,8 @@ "saved": "Gerettet", "second": "s", "server": "Server", + "serverDetailOrder": "Reihenfolge der Widgets auf der Detailseite", + "serverOrder": "Server-Bestellung", "serverTabConnecting": "Verbinden...", "serverTabEmpty": "Keine Server vorhanden.", "serverTabFailed": "Fehlgeschlagen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index e3d697da..59213ed6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -114,7 +114,7 @@ "min": "min", "mission": "Mission", "moveOutServerFuncBtns": "Server function button location", - "moveOutServerFuncBtnsHelp": "On: can be displayed below each card on the Server Tab page.\nOff: can be displayed at the top of the Server Details page.", + "moveOutServerFuncBtnsHelp": "On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.", "ms": "ms", "name": "Name", "needRestart": "Need to restart app", @@ -165,6 +165,8 @@ "saved": "Saved", "second": "s", "server": "Server", + "serverDetailOrder": "Detail page widget order", + "serverOrder": "Server order", "serverTabConnecting": "Connecting...", "serverTabEmpty": "There is no server.\nClick the fab to add one.", "serverTabFailed": "Failed", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index df1a80fe..9559a286 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -114,7 +114,7 @@ "min": "Min", "mission": "Misi", "moveOutServerFuncBtns": "Lokasi tombol fungsi server", - "moveOutServerFuncBtnsHelp": "Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server.\nNonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.", + "moveOutServerFuncBtnsHelp": "Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.", "ms": "MS", "name": "Nama", "needRestart": "Perlu memulai ulang aplikasi", @@ -165,6 +165,8 @@ "saved": "Diselamatkan", "second": "S", "server": "Server", + "serverDetailOrder": "Detail pesanan widget halaman", + "serverOrder": "Pesanan server", "serverTabConnecting": "Menghubungkan ...", "serverTabEmpty": "Tidak ada server.\nKlik fab untuk menambahkan satu.", "serverTabFailed": "Gagal", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 65dbf281..a668e7b9 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -114,7 +114,7 @@ "min": "最小", "mission": "任务", "moveOutServerFuncBtns": "服务器功能按钮位置", - "moveOutServerFuncBtnsHelp": "开启:可以在服务器 Tab 页的每个卡片下方显示。\n关闭:在服务器详情页顶部显示。", + "moveOutServerFuncBtnsHelp": "开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。", "ms": "毫秒", "name": "名称", "needRestart": "需要重启 App", @@ -165,6 +165,8 @@ "saved": "已保存", "second": "秒", "server": "服务器", + "serverDetailOrder": "详情页部件顺序", + "serverOrder": "服务器顺序", "serverTabConnecting": "连接中...", "serverTabEmpty": "现在没有服务器。\n点击右下方按钮来添加。", "serverTabFailed": "失败", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 8a964210..d5c22398 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -114,7 +114,7 @@ "min": "最小", "mission": "任務", "moveOutServerFuncBtns": "服務器功能按鈕位置", - "moveOutServerFuncBtnsHelp": "開啟:可以在服務器 Tab 頁的每個卡片下方顯示。\n關閉:在服務器詳情頁頂部顯示。", + "moveOutServerFuncBtnsHelp": "開啟:可以在服務器 Tab 頁的每個卡片下方顯示。關閉:在服務器詳情頁頂部顯示。", "ms": "毫秒", "name": "名稱", "needRestart": "需要重啓 App", @@ -165,6 +165,8 @@ "saved": "已保存", "second": "秒", "server": "服務器", + "serverDetailOrder": "詳情頁部件順序", + "serverOrder": "服務器順序", "serverTabConnecting": "連接中...", "serverTabEmpty": "現在沒有服務器。\n點擊右下方按鈕來新增。", "serverTabFailed": "失敗", diff --git a/lib/view/page/docker.dart b/lib/view/page/docker.dart index d6c7ffaf..d8f4bdba 100644 --- a/lib/view/page/docker.dart +++ b/lib/view/page/docker.dart @@ -4,7 +4,7 @@ import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/navigator.dart'; import 'package:toolbox/core/route.dart'; import 'package:toolbox/data/model/docker/image.dart'; -import 'package:toolbox/view/page/ssh/term.dart'; +import 'package:toolbox/view/page/ssh_term.dart'; import 'package:toolbox/view/widget/input_field.dart'; import '../../core/utils/ui.dart'; diff --git a/lib/view/page/full_screen.dart b/lib/view/page/full_screen.dart index 1d434816..c5113966 100644 --- a/lib/view/page/full_screen.dart +++ b/lib/view/page/full_screen.dart @@ -23,7 +23,7 @@ import '../../data/model/server/server_private_info.dart'; import '../../data/model/server/server_status.dart'; import '../../data/res/color.dart'; import 'server/edit.dart'; -import 'setting.dart'; +import 'setting/entry.dart'; class FullScreenPage extends StatefulWidget { const FullScreenPage({Key? key}) : super(key: key); diff --git a/lib/view/page/home.dart b/lib/view/page/home.dart index 0909b520..e3b0b12a 100644 --- a/lib/view/page/home.dart +++ b/lib/view/page/home.dart @@ -26,7 +26,7 @@ import 'backup.dart'; import 'convert.dart'; import 'debug.dart'; import 'private_key/list.dart'; -import 'setting.dart'; +import 'setting/entry.dart'; import 'storage/local.dart'; class HomePage extends StatefulWidget { diff --git a/lib/view/page/server/detail.dart b/lib/view/page/server/detail.dart index 00bbfd12..2774e294 100644 --- a/lib/view/page/server/detail.dart +++ b/lib/view/page/server/detail.dart @@ -94,35 +94,19 @@ class _ServerDetailPageState extends State ) ], ), - body: ReorderableListView.builder( + bottomNavigationBar: _setting.moveOutServerTabFuncBtns.fetch()! + ? null + : ServerFuncBtns(spi: widget.spi, s: _s, iconSize: 19), + body: ListView.builder( padding: EdgeInsets.only( left: 13, right: 13, top: 13, - bottom: _media.padding.bottom, + bottom: _media.padding.bottom + 77, ), - onReorder: (int oldIndex, int newIndex) { - setState(() { - _cardsOrder.move( - oldIndex, - newIndex, - property: _setting.detailCardOrder, - ); - }); - }, - footer: height13, - header: _setting.moveOutServerTabFuncBtns.fetch()! - ? null - : RoundRectCard(ServerFuncBtns(spi: widget.spi, s: _s)), itemCount: _cardsOrder.length, - buildDefaultDragHandles: false, - itemBuilder: (context, index) => ReorderableDelayedDragStartListener( - key: ValueKey(index), - index: index, - child: SizedBox( - child: _cardBuildMap[_cardsOrder[index]]?.call(si.status), - ), - ), + itemBuilder: (context, index) => + _cardBuildMap[_cardsOrder[index]]?.call(si.status), ), ); } diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 6bffd12e..c76ce36e 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -5,7 +5,6 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:get_it/get_it.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/media_queryx.dart'; -import 'package:toolbox/core/extension/order.dart'; import 'package:toolbox/data/model/app/net_view.dart'; import 'package:toolbox/view/widget/server_func_btns.dart'; import 'package:toolbox/view/widget/tag/switcher.dart'; @@ -72,6 +71,20 @@ class _ServerPageState extends State heroTag: 'server', child: const Icon(Icons.add), ), + bottomNavigationBar: Padding( + padding: const EdgeInsets.fromLTRB(7, 17, 7, 3), + child: Consumer(builder: (_, pro, __) { + return TagSwitcher( + tags: pro.tags, + width: _media.size.width, + onTagChanged: (p0) => setState(() { + _tag = p0; + }), + initTag: _tag, + all: _s.all, + ); + }), + ), ); } @@ -113,36 +126,15 @@ class _ServerPageState extends State _tag == null || (pro.servers[e]?.spi.tags?.contains(_tag) ?? false)) .toList(); - Widget _buildBodySmall( - {required ServerProvider provider, - required List filtered, - EdgeInsets? padding = const EdgeInsets.fromLTRB(7, 10, 7, 7)}) { - return ReorderableListView.builder( - header: TagSwitcher( - tags: provider.tags, - width: _media.size.width, - onTagChanged: (p0) => setState(() { - _tag = p0; - }), - initTag: _tag, - all: _s.all, - ), - footer: const SizedBox(height: 77), + Widget _buildBodySmall({ + required ServerProvider provider, + required List filtered, + EdgeInsets? padding = const EdgeInsets.fromLTRB(7, 10, 7, 7), + }) { + return ListView.builder( padding: padding, - onReorder: (oldIndex, newIndex) => setState(() { - provider.serverOrder.moveByItem( - filtered, - oldIndex, - newIndex, - property: _settingStore.serverOrder, - ); - }), - buildDefaultDragHandles: false, - itemBuilder: (_, index) => ReorderableDelayedDragStartListener( - key: ValueKey('$_tag${filtered[index]}'), - index: index, - child: _buildEachServerCard(provider.servers[filtered[index]]), - ), + itemBuilder: (_, index) => + _buildEachServerCard(provider.servers[filtered[index]]), itemCount: filtered.length, ); } @@ -176,17 +168,18 @@ class _ServerPageState extends State return placeholder; } - return GestureDetector( + return RoundRectCard( key: Key(si.spi.id + (_tag ?? '')), - onTap: () { - if (si.state.canViewDetails) { - AppRoute.serverDetail(spi: si.spi).go(context); - } else if (si.status.failedInfo != null) { - _showFailReason(si.status); - } - }, - child: RoundRectCard( - Padding( + InkWell( + onTap: () { + if (si.state.canViewDetails) { + AppRoute.serverDetail(spi: si.spi).go(context); + } else if (si.status.failedInfo != null) { + _showFailReason(si.status); + } + }, + onLongPress: () => AppRoute.serverEdit(spi: si.spi).go(context), + child: Padding( padding: const EdgeInsets.all(13), child: _buildRealServerCard(si.status, si.state, si.spi), ), diff --git a/lib/view/page/setting.dart b/lib/view/page/setting/entry.dart similarity index 95% rename from lib/view/page/setting.dart rename to lib/view/page/setting/entry.dart index 5010d678..68cc241b 100644 --- a/lib/view/page/setting.dart +++ b/lib/view/page/setting/entry.dart @@ -12,26 +12,26 @@ import 'package:toolbox/core/extension/navigator.dart'; import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/route.dart'; import 'package:toolbox/data/model/app/net_view.dart'; -import 'package:toolbox/view/page/ssh/virt_key_setting.dart'; +import 'package:toolbox/view/page/setting/virt_key.dart'; import 'package:toolbox/view/widget/input_field.dart'; import 'package:toolbox/view/widget/value_notifier.dart'; -import '../../core/utils/misc.dart'; -import '../../core/utils/platform.dart'; -import '../../core/update.dart'; -import '../../core/utils/ui.dart'; -import '../../data/provider/app.dart'; -import '../../data/provider/server.dart'; -import '../../data/res/build_data.dart'; -import '../../data/res/color.dart'; -import '../../data/res/path.dart'; -import '../../data/res/ui.dart'; -import '../../data/store/server.dart'; -import '../../data/store/setting.dart'; -import '../../locator.dart'; -import '../widget/custom_appbar.dart'; -import '../widget/future_widget.dart'; -import '../widget/round_rect_card.dart'; +import '../../../core/utils/misc.dart'; +import '../../../core/utils/platform.dart'; +import '../../../core/update.dart'; +import '../../../core/utils/ui.dart'; +import '../../../data/provider/app.dart'; +import '../../../data/provider/server.dart'; +import '../../../data/res/build_data.dart'; +import '../../../data/res/color.dart'; +import '../../../data/res/path.dart'; +import '../../../data/res/ui.dart'; +import '../../../data/store/server.dart'; +import '../../../data/store/setting.dart'; +import '../../../locator.dart'; +import '../../widget/custom_appbar.dart'; +import '../../widget/future_widget.dart'; +import '../../widget/round_rect_card.dart'; class SettingPage extends StatefulWidget { const SettingPage({Key? key}) : super(key: key); @@ -170,6 +170,8 @@ class _SettingPageState extends State { return Column( children: [ _buildMoveOutServerFuncBtns(), + _buildServerOrder(), + _buildServerDetailOrder(), _buildNetViewType(), _buildUpdateInterval(), _buildMaxRetry(), @@ -978,4 +980,20 @@ class _SettingPageState extends State { trailing: buildSwitch(context, _setting.moveOutServerTabFuncBtns), ); } + + Widget _buildServerOrder() { + return ListTile( + title: Text(_s.serverOrder), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: () => AppRoute.serverOrder().go(context), + ); + } + + Widget _buildServerDetailOrder() { + return ListTile( + title: Text(_s.serverDetailOrder), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: () => AppRoute.serverDetailOrder().go(context), + ); + } } diff --git a/lib/view/page/setting/srv_detail_seq.dart b/lib/view/page/setting/srv_detail_seq.dart new file mode 100644 index 00000000..3b1a567c --- /dev/null +++ b/lib/view/page/setting/srv_detail_seq.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +import '../../../core/extension/order.dart'; +import '../../../data/store/setting.dart'; +import '../../../locator.dart'; +import '../../widget/custom_appbar.dart'; +import '../../widget/round_rect_card.dart'; + +class ServerDetailOrderPage extends StatefulWidget { + const ServerDetailOrderPage({super.key}); + + @override + State createState() => _ServerDetailOrderPageState(); +} + +class _ServerDetailOrderPageState extends State { + final _store = locator(); + + final Order _cardsOrder = []; + + late S _s; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _s = S.of(context)!; + } + + @override + void initState() { + super.initState(); + _cardsOrder.addAll(_store.detailCardOrder.fetch()!); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: Text(_s.serverOrder), + ), + body: _buildBody(), + ); + } + + Widget _buildBody() { + return ReorderableListView.builder( + footer: const SizedBox(height: 77), + onReorder: (oldIndex, newIndex) => setState(() { + _cardsOrder.move( + oldIndex, + newIndex, + property: _store.serverOrder, + ); + }), + padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3), + buildDefaultDragHandles: false, + itemBuilder: (_, index) => _buildItem(index, _cardsOrder[index]), + itemCount: _cardsOrder.length, + ); + } + + Widget _buildItem(int index, String id) { + return ReorderableDelayedDragStartListener( + key: ValueKey('$index'), + index: index, + child: RoundRectCard(ListTile( + title: Text(id), + trailing: const Icon(Icons.drag_handle), + )), + ); + } +} diff --git a/lib/view/page/setting/srv_seq.dart b/lib/view/page/setting/srv_seq.dart new file mode 100644 index 00000000..b73b109e --- /dev/null +++ b/lib/view/page/setting/srv_seq.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:toolbox/core/extension/order.dart'; +import 'package:toolbox/view/widget/round_rect_card.dart'; + +import '../../../data/provider/server.dart'; +import '../../../data/store/setting.dart'; +import '../../../locator.dart'; +import '../../widget/custom_appbar.dart'; + +class ServerOrderPage extends StatefulWidget { + const ServerOrderPage({Key? key}) : super(key: key); + + @override + _ServerOrderPageState createState() => _ServerOrderPageState(); +} + +class _ServerOrderPageState extends State { + final _store = locator(); + final _provider = locator(); + + late S _s; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _s = S.of(context)!; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: Text(_s.serverOrder), + ), + body: _buildBody(), + ); + } + + Widget _buildBody() { + return ReorderableListView.builder( + footer: const SizedBox(height: 77), + onReorder: (oldIndex, newIndex) => setState(() { + _provider.serverOrder.move( + oldIndex, + newIndex, + property: _store.serverOrder, + ); + }), + padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3), + buildDefaultDragHandles: false, + itemBuilder: (_, index) => + _buildItem(index, _provider.serverOrder[index]), + itemCount: _provider.serverOrder.length, + ); + } + + Widget _buildItem(int index, String id) { + final spi = _provider.servers[id]?.spi; + if (spi == null) { + return const SizedBox(); + } + return ReorderableDelayedDragStartListener( + key: ValueKey('$index'), + index: index, + child: RoundRectCard(ListTile( + title: Text(spi.name), + subtitle: Text(spi.id), + leading: CircleAvatar( + child: Text(spi.name[0]), + ), + trailing: const Icon(Icons.drag_handle), + )), + ); + } +} diff --git a/lib/view/page/ssh/virt_key_setting.dart b/lib/view/page/setting/virt_key.dart similarity index 100% rename from lib/view/page/ssh/virt_key_setting.dart rename to lib/view/page/setting/virt_key.dart diff --git a/lib/view/page/ssh/term.dart b/lib/view/page/ssh_term.dart similarity index 95% rename from lib/view/page/ssh/term.dart rename to lib/view/page/ssh_term.dart index 12a7f2aa..ca8e6e23 100644 --- a/lib/view/page/ssh/term.dart +++ b/lib/view/page/ssh_term.dart @@ -10,18 +10,18 @@ import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/navigator.dart'; import 'package:xterm/xterm.dart'; -import '../../../core/route.dart'; -import '../../../core/utils/platform.dart'; -import '../../../core/utils/misc.dart'; -import '../../../core/utils/ui.dart'; -import '../../../core/utils/server.dart'; -import '../../../data/model/server/server_private_info.dart'; -import '../../../data/model/ssh/virtual_key.dart'; -import '../../../data/provider/virtual_keyboard.dart'; -import '../../../data/res/color.dart'; -import '../../../data/res/terminal.dart'; -import '../../../data/store/setting.dart'; -import '../../../locator.dart'; +import '../../core/route.dart'; +import '../../core/utils/platform.dart'; +import '../../core/utils/misc.dart'; +import '../../core/utils/ui.dart'; +import '../../core/utils/server.dart'; +import '../../data/model/server/server_private_info.dart'; +import '../../data/model/ssh/virtual_key.dart'; +import '../../data/provider/virtual_keyboard.dart'; +import '../../data/res/color.dart'; +import '../../data/res/terminal.dart'; +import '../../data/store/setting.dart'; +import '../../locator.dart'; const echoPWD = 'echo \$PWD'; diff --git a/lib/view/widget/server_func_btns.dart b/lib/view/widget/server_func_btns.dart index 037f5632..640f1982 100644 --- a/lib/view/widget/server_func_btns.dart +++ b/lib/view/widget/server_func_btns.dart @@ -18,10 +18,16 @@ import '../page/process.dart'; import 'tag/picker.dart'; class ServerFuncBtns extends StatelessWidget { - const ServerFuncBtns({super.key, required this.spi, required this.s}); + const ServerFuncBtns({ + super.key, + required this.spi, + required this.s, + this.iconSize, + }); final ServerPrivateInfo spi; final S s; + final double? iconSize; void _onTapMoreBtns( ServerTabMenuType value, @@ -101,7 +107,7 @@ class ServerFuncBtns extends StatelessWidget { .map((e) => IconButton( onPressed: () => _onTapMoreBtns(e, spi, context), padding: EdgeInsets.zero, - icon: Icon(e.icon, size: 15), + icon: Icon(e.icon, size: iconSize ?? 15), )) .toList(), ); diff --git a/lib/view/widget/tag/btn.dart b/lib/view/widget/tag/btn.dart index 1b39329f..2ac9ed3d 100644 --- a/lib/view/widget/tag/btn.dart +++ b/lib/view/widget/tag/btn.dart @@ -31,8 +31,7 @@ class TagBtn extends StatelessWidget { content, style: TextStyle( color: isEnable ? null : Colors.grey, - fontSize: 15, - fontWeight: FontWeight.w500, + fontSize: 13, ), ), )),