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_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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user