mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-04-27 13:55:54 +08:00
@@ -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) {
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user