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_status.dart';
class Server {
import '../app/tag_pickable.dart';
class Server implements TagPickable {
ServerPrivateInfo spi;
ServerStatus status;
SSHClient? client;
ServerState 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 {

View File

@@ -1,9 +1,11 @@
import 'package:hive_flutter/hive_flutter.dart';
import '../app/tag_pickable.dart';
part 'snippet.g.dart';
@HiveType(typeId: 2)
class Snippet {
class Snippet implements TagPickable {
@HiveField(0)
late String name;
@HiveField(1)
@@ -24,4 +26,12 @@ class Snippet {
data['tags'] = tags;
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 {
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 buildAt = "2023-08-22 16:14:41.022063";
static const int modifications = 8;
static const String buildAt = "2023-08-23 21:54:10.937955";
static const int modifications = 2;
}

View File

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

View File

@@ -52,9 +52,7 @@ class ServerFuncBtns extends StatelessWidget {
context: context,
builder: (_) => TagPicker<Snippet>(
items: provider.snippets,
containsTag: (t, tag) => t.tags?.contains(tag) ?? false,
tags: provider.tags.toSet(),
name: (t) => t.name,
),
);
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 '../../core/utils/ui.dart';
import '../../data/model/app/tag_pickable.dart';
import '../../data/res/color.dart';
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 bool Function(T, String?) containsTag;
final String Function(T) name;
final Set<String> tags;
const TagPicker({
Key? key,
required this.items,
required this.containsTag,
required this.name,
required this.tags,
}) : super(key: key);
@@ -196,7 +193,7 @@ class TagPicker<T> extends StatefulWidget {
_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 MediaQueryData _media;
final List<T> _selected = [];
@@ -251,19 +248,19 @@ class _TagPickerState<T> extends State<TagPicker<T>> {
itemBuilder: (_, idx) {
final item = widget.tags.elementAt(idx);
final isEnable =
widget.items.where((ele) => widget.containsTag(ele, item)).every(
(element) => _selected.contains(element),
widget.items.where((ele) => ele.containsTag(item)).every(
(ele) => _selected.contains(ele),
);
return TagBtn(
isEnable: isEnable,
onTap: () {
if (isEnable) {
_selected.removeWhere(
(element) => widget.containsTag(element, item),
(ele) => ele.containsTag(item),
);
} else {
_selected.addAll(widget.items.where(
(ele) => widget.containsTag(ele, item),
(ele) => ele.containsTag(item),
));
}
setState(() {});
@@ -290,7 +287,7 @@ class _TagPickerState<T> extends State<TagPicker<T>> {
}
setState(() {});
},
content: widget.name(e),
content: e.tagName,
);
},
);

View File

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

View File

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