new: picker & opt. rm -r

This commit is contained in:
lollipopkit
2023-10-05 19:51:24 +08:00
parent ef144e27cb
commit a23a284d1a
28 changed files with 192 additions and 316 deletions

View File

@@ -1,13 +1,11 @@
import 'package:choice/choice.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/data/res/provider.dart';
import 'package:toolbox/view/widget/choice_chip.dart';
import '../../../data/model/server/snippet.dart';
import '../../../data/res/ui.dart';
import '../../../view/widget/input_field.dart';
import '../../../view/widget/picker.dart';
import '../../route.dart';
extension DialogX on BuildContext {
Future<T?> showRoundDialog<T>({
@@ -53,45 +51,60 @@ extension DialogX on BuildContext {
);
}
void showSnippetDialog(
void Function(Snippet s) onSelected,
) {
if (Pros.snippet.snippets.isEmpty) {
showRoundDialog(
child: Text(l10n.noSavedSnippet),
actions: [
TextButton(
onPressed: () => pop(),
child: Text(l10n.ok),
),
TextButton(
onPressed: () {
pop();
AppRoute.snippetEdit().go(this);
},
child: Text(l10n.add),
)
],
);
return;
}
var snippet = Pros.snippet.snippets.first;
showRoundDialog(
Future<List<T>?> showPickDialog<T>({
required List<T?> items,
required String Function(T) name,
bool multi = true,
}) async {
var vals = <T>[];
final sure = await showRoundDialog<bool>(
title: Text(l10n.choose),
child: Picker(
items: Pros.snippet.snippets.map((e) => Text(e.name)).toList(),
onSelected: (idx) => snippet = Pros.snippet.snippets[idx],
child: Choice<T>(
onChanged: (value) => vals = value,
multiple: multi,
clearable: true,
builder: (state, _) {
return Wrap(
children: List<Widget>.generate(
items.length,
(index) {
final item = items[index];
if (item == null) return UIs.placeholder;
return ChoiceChipX<T>(
label: name(item),
state: state,
value: item,
);
},
),
);
},
),
actions: [
TextButton(
onPressed: () async {
pop();
onSelected(snippet);
},
onPressed: () => pop(true),
child: Text(l10n.ok),
)
),
],
);
if (sure == true && vals.isNotEmpty) {
return vals;
}
return null;
}
Future<T?> showPickSingleDialog<T>({
required List<T?> items,
required String Function(T) name,
}) async {
final vals = await showPickDialog<T>(
items: items,
name: name,
multi: false,
);
if (vals != null && vals.isNotEmpty) {
return vals.first;
}
return null;
}
}