This commit is contained in:
lollipopkit
2023-08-24 21:24:27 +08:00
parent 536fbedda2
commit 7d4c30732a
9 changed files with 40 additions and 24 deletions

View File

@@ -0,0 +1,5 @@
abstract class TagPickable {
bool containsTag(String tag);
String get tagName;
}

View File

@@ -2,13 +2,23 @@ import 'package:dartssh2/dartssh2.dart';
import 'package:toolbox/data/model/server/server_private_info.dart'; import 'package:toolbox/data/model/server/server_private_info.dart';
import 'package:toolbox/data/model/server/server_status.dart'; import 'package:toolbox/data/model/server/server_status.dart';
class Server { import '../app/tag_pickable.dart';
class Server implements TagPickable {
ServerPrivateInfo spi; ServerPrivateInfo spi;
ServerStatus status; ServerStatus status;
SSHClient? client; SSHClient? client;
ServerState state; ServerState state;
Server(this.spi, this.status, this.client, this.state); Server(this.spi, this.status, this.client, this.state);
@override
bool containsTag(String tag) {
return spi.tags?.contains(tag) ?? false;
}
@override
String get tagName => spi.id;
} }
enum ServerState { enum ServerState {

View File

@@ -1,9 +1,11 @@
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import '../app/tag_pickable.dart';
part 'snippet.g.dart'; part 'snippet.g.dart';
@HiveType(typeId: 2) @HiveType(typeId: 2)
class Snippet { class Snippet implements TagPickable {
@HiveField(0) @HiveField(0)
late String name; late String name;
@HiveField(1) @HiveField(1)
@@ -24,4 +26,12 @@ class Snippet {
data['tags'] = tags; data['tags'] = tags;
return data; return data;
} }
@override
bool containsTag(String tag) {
return tags?.contains(tag) ?? false;
}
@override
String get tagName => name;
} }

View File

@@ -2,8 +2,8 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; static const String name = "ServerBox";
static const int build = 493; static const int build = 498;
static const String engine = "3.13.0"; static const String engine = "3.13.0";
static const String buildAt = "2023-08-22 16:14:41.022063"; static const String buildAt = "2023-08-23 21:54:10.937955";
static const int modifications = 8; static const int modifications = 2;
} }

View File

@@ -137,9 +137,7 @@ class _SnippetListPageState extends State<SnippetListPage> {
context: context, context: context,
builder: (_) => TagPicker<Server>( builder: (_) => TagPicker<Server>(
items: provider.servers.values.toList(), items: provider.servers.values.toList(),
containsTag: (t, tag) => t.spi.tags?.contains(tag) ?? false,
tags: provider.tags.toSet(), tags: provider.tags.toSet(),
name: (t) => t.spi.id,
), ),
); );
if (servers == null) { if (servers == null) {

View File

@@ -52,9 +52,7 @@ class ServerFuncBtns extends StatelessWidget {
context: context, context: context,
builder: (_) => TagPicker<Snippet>( builder: (_) => TagPicker<Snippet>(
items: provider.snippets, items: provider.snippets,
containsTag: (t, tag) => t.tags?.contains(tag) ?? false,
tags: provider.tags.toSet(), tags: provider.tags.toSet(),
name: (t) => t.name,
), ),
); );
if (snippets == null) { if (snippets == null) {

View File

@@ -6,6 +6,7 @@ import 'package:toolbox/view/widget/round_rect_card.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../../core/utils/ui.dart'; import '../../core/utils/ui.dart';
import '../../data/model/app/tag_pickable.dart';
import '../../data/res/color.dart'; import '../../data/res/color.dart';
const _kTagBtnHeight = 31.0; const _kTagBtnHeight = 31.0;
@@ -178,17 +179,13 @@ class TagEditor extends StatelessWidget {
} }
} }
class TagPicker<T> extends StatefulWidget { class TagPicker<T extends TagPickable> extends StatefulWidget {
final List<T> items; final List<T> items;
final bool Function(T, String?) containsTag;
final String Function(T) name;
final Set<String> tags; final Set<String> tags;
const TagPicker({ const TagPicker({
Key? key, Key? key,
required this.items, required this.items,
required this.containsTag,
required this.name,
required this.tags, required this.tags,
}) : super(key: key); }) : super(key: key);
@@ -196,7 +193,7 @@ class TagPicker<T> extends StatefulWidget {
_TagPickerState<T> createState() => _TagPickerState<T>(); _TagPickerState<T> createState() => _TagPickerState<T>();
} }
class _TagPickerState<T> extends State<TagPicker<T>> { class _TagPickerState<T extends TagPickable> extends State<TagPicker<T>> {
late S _s; late S _s;
late MediaQueryData _media; late MediaQueryData _media;
final List<T> _selected = []; final List<T> _selected = [];
@@ -251,19 +248,19 @@ class _TagPickerState<T> extends State<TagPicker<T>> {
itemBuilder: (_, idx) { itemBuilder: (_, idx) {
final item = widget.tags.elementAt(idx); final item = widget.tags.elementAt(idx);
final isEnable = final isEnable =
widget.items.where((ele) => widget.containsTag(ele, item)).every( widget.items.where((ele) => ele.containsTag(item)).every(
(element) => _selected.contains(element), (ele) => _selected.contains(ele),
); );
return TagBtn( return TagBtn(
isEnable: isEnable, isEnable: isEnable,
onTap: () { onTap: () {
if (isEnable) { if (isEnable) {
_selected.removeWhere( _selected.removeWhere(
(element) => widget.containsTag(element, item), (ele) => ele.containsTag(item),
); );
} else { } else {
_selected.addAll(widget.items.where( _selected.addAll(widget.items.where(
(ele) => widget.containsTag(ele, item), (ele) => ele.containsTag(item),
)); ));
} }
setState(() {}); setState(() {});
@@ -290,7 +287,7 @@ class _TagPickerState<T> extends State<TagPicker<T>> {
} }
setState(() {}); setState(() {});
}, },
content: widget.name(e), content: e.tagName,
); );
}, },
); );

View File

@@ -70,9 +70,7 @@ class UrlText extends StatelessWidget {
widgets.add( widgets.add(
TextSpan( TextSpan(
text: result.text, text: result.text,
style: style.copyWith( style: style.copyWith(color: c),
color: c,
),
), ),
); );
} }

View File

@@ -259,7 +259,7 @@ void main(List<String> args) async {
for (final func in funcs) { for (final func in funcs) {
stopwatch.start(); stopwatch.start();
await func(); await func();
print('Build finished in ${stopwatch.elapsed}\n'); print('Build finished in ${stopwatch.elapsed}');
stopwatch.reset(); stopwatch.reset();
} }
break; break;