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

@@ -84,12 +84,15 @@ List<SettingsModel> get extraSettings => [
],
),
),
getPopupMenuModel(
PopupModel<SkipType>(
title: '番剧片头/片尾跳过类型',
leading: const Icon(MdiIcons.debugStepOver),
key: SettingBoxKey.pgcSkipType,
values: SkipType.values,
defaultIndex: SkipType.skipOnce.index,
value: () => Pref.pgcSkipType,
items: SkipType.values,
onSelected: (value, setState) async {
await GStorage.setting.put(SettingBoxKey.pgcSkipType, value.index);
setState();
},
),
SwitchModel(
title: '检查未读动态',
@@ -295,7 +298,7 @@ List<SettingsModel> get extraSettings => [
title: '超分辨率',
leading: const Icon(Icons.stay_current_landscape_outlined),
getSubtitle: () =>
'当前:「${Pref.superResolutionType.title}\n默认设置对番剧生效, 其他视频默认关闭\n超分辨率需要启用硬件解码, 若启用硬件解码后仍然不生效, 尝试切换硬件解码器为 auto-copy',
'当前:「${Pref.superResolutionType.label}\n默认设置对番剧生效, 其他视频默认关闭\n超分辨率需要启用硬件解码, 若启用硬件解码后仍然不生效, 尝试切换硬件解码器为 auto-copy',
onTap: _showSuperResolutionDialog,
),
const SwitchModel(
@@ -964,7 +967,6 @@ Future<void> _showRefreshDragDialog(
kDragContainerExtentPercentage = res;
await GStorage.setting.put(SettingBoxKey.refreshDragPercentage, res);
Get.forceAppUpdate();
setState();
}
}
@@ -986,7 +988,6 @@ Future<void> _showRefreshDialog(
displacement = res;
await GStorage.setting.put(SettingBoxKey.refreshDisplacement, res);
Get.forceAppUpdate();
setState();
}
}
@@ -999,7 +1000,7 @@ Future<void> _showSuperResolutionDialog(
builder: (context) => SelectDialog<SuperResolutionType>(
title: '超分辨率',
value: Pref.superResolutionType,
values: SuperResolutionType.values.map((e) => (e, e.title)).toList(),
values: SuperResolutionType.values.map((e) => (e, e.label)).toList(),
),
);
if (res != null) {

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),
),
),
),
);
},
),
);
}