opt settings

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-02-05 18:11:02 +08:00
parent cfa925549e
commit 1ad710c1cf
8 changed files with 242 additions and 226 deletions

View File

@@ -1,14 +1,14 @@
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/models/common/enum_with_label.dart';
import 'package:PiliPlus/pages/setting/widgets/normal_item.dart';
import 'package:PiliPlus/pages/setting/widgets/popup_item.dart';
import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';
import 'package:PiliPlus/pages/setting/widgets/switch_item.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' hide PopupMenuItemSelected;
import 'package:flutter/services.dart' show FilteringTextInputFormatter;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
@immutable
sealed class SettingsModel {
@@ -30,6 +30,45 @@ sealed class SettingsModel {
});
}
class PopupModel<T extends EnumWithLabel> extends SettingsModel {
const PopupModel({
required this.title,
super.subtitle,
super.leading,
super.contentPadding,
super.titleStyle,
required this.value,
required this.items,
required this.onSelected,
});
@override
String? get effectiveSubtitle => null;
@override
String get effectiveTitle => title;
@override
final String title;
final ValueGetter<T> value;
final List<T> items;
final PopupMenuItemSelected<T> onSelected;
@override
Widget get widget => PopupListTile<T>(
safeArea: false,
leading: leading,
title: Text(title),
value: () {
final v = value();
return (v, v.label);
},
itemBuilder: (_) => enumItemBuilder(items),
onSelected: onSelected,
);
}
class NormalModel extends SettingsModel {
@override
final String? title;
@@ -254,61 +293,3 @@ SettingsModel getVideoFilterSelectModel({
},
);
}
SettingsModel getPopupMenuModel({
required String title,
Widget? leading,
String? subtitle,
required String key,
required List<EnumWithLabel> values,
int defaultIndex = 0,
}) {
// final globalKey = GlobalKey<PopupMenuButtonState<EnumWithLabel>>();
return NormalModel(
title: title,
subtitle: subtitle,
leading: leading,
// onTap: (context, setState) => globalKey.currentState?.showButtonMenu(),
getTrailing: (theme) => Builder(
builder: (context) {
final color = theme.colorScheme.secondary;
final v = values[GStorage.setting.get(key, defaultValue: defaultIndex)];
return PopupMenuButton(
// key: globalKey,
padding: .zero,
initialValue: v,
onSelected: (value) async {
await GStorage.setting.put(key, value.index);
if (context.mounted) {
(context as Element).markNeedsBuild();
}
},
itemBuilder: (context) => values
.map((i) => PopupMenuItem(value: i, child: Text(i.label)))
.toList(),
child: Padding(
padding: const .symmetric(vertical: 8),
child: Text.rich(
style: TextStyle(fontSize: 14, height: 1, color: color),
strutStyle: const StrutStyle(leading: 0, height: 1, fontSize: 14),
TextSpan(
children: [
TextSpan(text: v.label),
WidgetSpan(
alignment: .middle,
child: Icon(
size: 14,
MdiIcons.unfoldMoreHorizontal,
color: color,
),
),
],
style: TextStyle(color: color),
),
),
),
);
},
),
);
}