opt: ssh tab & del script

This commit is contained in:
lollipopkit
2023-11-19 15:49:47 +08:00
parent 1a49c7870c
commit 4153713ce7
4 changed files with 61 additions and 71 deletions

View File

@@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/data/model/server/server.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/data/provider/server.dart';
import 'package:toolbox/data/res/ui.dart';
import 'package:toolbox/view/page/ssh/page.dart';
import 'package:toolbox/view/widget/cardx.dart';
class SSHTabPage extends StatefulWidget {
const SSHTabPage({super.key});
@@ -17,7 +18,7 @@ class SSHTabPage extends StatefulWidget {
class _SSHTabPageState extends State<SSHTabPage>
with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {
late final _tabIds = <String, Widget>{
l10n.add: _addPage,
l10n.add: _buildAddPage(),
};
final _tabKeys = <String, GlobalKey>{};
late var _tabController = TabController(
@@ -81,52 +82,41 @@ class _SSHTabPageState extends State<SSHTabPage>
);
}
late final Widget _addPage = Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(77),
color: Colors.white10,
),
child: IconButton(
padding: const EdgeInsets.all(17),
onPressed: () async {
final spi = (await context.showPickDialog<Server>(
items: Pros.server.servers.toList(),
name: (e) => e.spi.name,
multi: false,
))
?.first
.spi;
if (spi == null) {
return;
}
final name = () {
if (_tabIds.containsKey(spi.name)) {
return '${spi.name}(${_tabIds.length + 1})';
}
return spi.name;
}();
final key = GlobalKey(debugLabel: 'sshTabPage_$name');
_tabIds[name] = SSHPage(
key: key,
spi: spi,
pop: false,
);
_tabKeys[name] = key;
_refreshTabs();
_tabController.animateTo(_tabIds.length - 1);
},
icon: const Icon(Icons.add),
),
),
UIs.height13,
Text(l10n.add),
],
),
);
Widget _buildAddPage() {
return Center(
child: Consumer<ServerProvider>(builder: (_, pro, __) {
return ListView.builder(
padding: const EdgeInsets.all(7),
itemBuilder: (_, idx) {
final spi = pro.servers.toList()[idx].spi;
return CardX(ListTile(
title: Text(spi.name),
subtitle: Text(spi.id, style: UIs.textGrey),
trailing: const Icon(Icons.chevron_right),
onTap: () {
final name = () {
if (_tabIds.containsKey(spi.name)) {
return '${spi.name}(${_tabIds.length + 1})';
}
return spi.name;
}();
final key = GlobalKey(debugLabel: 'sshTabPage_$name');
_tabIds[name] = SSHPage(
key: key,
spi: spi,
pop: false,
);
_tabKeys[name] = key;
_refreshTabs();
_tabController.animateTo(_tabIds.length - 1);
},
));
},
itemCount: pro.servers.length,
);
}),
);
}
Widget _buildBody() {
return TabBarView(