mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
opt.
This commit is contained in:
5
lib/data/model/app/tag_pickable.dart
Normal file
5
lib/data/model/app/tag_pickable.dart
Normal file
@@ -0,0 +1,5 @@
|
||||
abstract class TagPickable {
|
||||
bool containsTag(String tag);
|
||||
|
||||
String get tagName;
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -70,9 +70,7 @@ class UrlText extends StatelessWidget {
|
||||
widgets.add(
|
||||
TextSpan(
|
||||
text: result.text,
|
||||
style: style.copyWith(
|
||||
color: c,
|
||||
),
|
||||
style: style.copyWith(color: c),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user