Files
PiliPlus/lib/pages/setting/pages/play_speed_set.dart
bggRGjQaUbCoE 76f1d0129b opt ui
Closes #1050

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-08-20 23:28:57 +08:00

283 lines
8.3 KiB
Dart

import 'dart:math';
import 'package:PiliPlus/common/widgets/view_safe_area.dart';
import 'package:PiliPlus/pages/setting/widgets/switch_item.dart';
import 'package:PiliPlus/utils/context_ext.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show FilteringTextInputFormatter;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart' hide ContextExtensionss;
import 'package:hive/hive.dart';
class PlaySpeedPage extends StatefulWidget {
const PlaySpeedPage({super.key});
@override
State<PlaySpeedPage> createState() => _PlaySpeedPageState();
}
class _PlaySpeedPageState extends State<PlaySpeedPage> {
late double playSpeedDefault = Pref.playSpeedDefault;
late double longPressSpeedDefault = Pref.longPressSpeedDefault;
late List<double> speedList = Pref.speedList;
late bool enableAutoLongPressSpeed = Pref.enableAutoLongPressSpeed;
List<({int id, String title, Icon icon})> sheetMenu = [
(
id: 1,
title: '设置为默认倍速',
icon: const Icon(
Icons.speed,
size: 21,
),
),
(
id: 2,
title: '设置为默认长按倍速',
icon: const Icon(
Icons.speed_sharp,
size: 21,
),
),
(
id: -1,
title: '删除该项',
icon: const Icon(
Icons.delete_outline,
size: 21,
),
),
];
Box video = GStorage.video;
// 添加自定义倍速
void onAddSpeed() {
double? customSpeed;
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('添加倍速'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 12),
TextField(
autofocus: true,
keyboardType: const TextInputType.numberWithOptions(
decimal: true,
),
decoration: const InputDecoration(
labelText: '自定义倍速',
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(6)),
),
),
onChanged: (value) {
customSpeed = double.tryParse(value);
},
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r'[\d\.]+')),
],
),
],
),
actions: [
TextButton(
onPressed: Get.back,
child: Text(
'取消',
style: TextStyle(color: Theme.of(context).colorScheme.outline),
),
),
TextButton(
onPressed: () {
if (customSpeed == null) {
SmartDialog.showToast('输入倍数不合法');
} else if (speedList.contains(customSpeed)) {
SmartDialog.showToast('该倍速已存在');
} else {
Get.back();
speedList
..add(customSpeed!)
..sort();
video.put(VideoBoxKey.speedsList, speedList);
setState(() {});
}
},
child: const Text('确认'),
),
],
);
},
);
}
// 设定倍速弹窗
void showBottomSheet(ThemeData theme, int index) {
showModalBottomSheet(
context: context,
useSafeArea: true,
isScrollControlled: true,
clipBehavior: Clip.hardEdge,
constraints: BoxConstraints(
maxWidth: min(640, context.mediaQueryShortestSide),
),
builder: (context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 10),
...sheetMenu.map(
(item) => ListTile(
enabled: enableAutoLongPressSpeed && item.id == 2
? false
: true,
onTap: () {
Get.back();
menuAction(index, item.id);
},
minLeadingWidth: 0,
iconColor: theme.colorScheme.onSurface,
leading: item.icon,
title: Text(
item.title,
style: const TextStyle(fontSize: 14),
),
),
),
SizedBox(height: 25 + MediaQuery.viewPaddingOf(context).bottom),
],
);
},
);
}
//
void menuAction(int index, int id) {
double speed = speedList[index];
// 设置
if (id == 1) {
// 设置默认倍速
playSpeedDefault = speed;
video.put(VideoBoxKey.playSpeedDefault, playSpeedDefault);
} else if (id == 2) {
// 设置默认长按倍速
longPressSpeedDefault = speed;
video.put(VideoBoxKey.longPressSpeedDefault, longPressSpeedDefault);
} else if (id == -1) {
if ([
1.0,
playSpeedDefault,
longPressSpeedDefault,
].contains(speed)) {
SmartDialog.showToast('不支持删除默认倍速');
return;
}
speedList.removeAt(index);
video.put(VideoBoxKey.speedsList, speedList);
}
setState(() {});
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
title: const Text('倍速设置'),
actions: [
TextButton(
onPressed: () async {
await video.delete(VideoBoxKey.speedsList);
speedList = Pref.speedList;
setState(() {});
},
child: const Text('重置'),
),
const SizedBox(width: 16),
],
),
body: ViewSafeArea(
child: ListView(
children: [
Padding(
padding: const EdgeInsets.only(
left: 14,
right: 14,
top: 6,
bottom: 0,
),
child: Text(
'点击下方按钮设置默认(长按)倍速',
style: TextStyle(color: theme.colorScheme.outline),
),
),
ListTile(
title: const Text('默认倍速'),
subtitle: Text(playSpeedDefault.toString()),
),
SetSwitchItem(
title: '动态长按倍速',
subtitle: '根据默认倍速长按时自动双倍',
setKey: SettingBoxKey.enableAutoLongPressSpeed,
defaultVal: enableAutoLongPressSpeed,
onChanged: (val) =>
setState(() => enableAutoLongPressSpeed = val),
),
if (!enableAutoLongPressSpeed)
ListTile(
title: const Text('默认长按倍速'),
subtitle: Text(longPressSpeedDefault.toString()),
),
Padding(
padding: const EdgeInsets.only(
left: 14,
right: 14,
bottom: 10,
top: 20,
),
child: Row(
children: [
Text(
'倍速列表',
style: theme.textTheme.titleMedium,
),
const SizedBox(width: 12),
TextButton(
onPressed: onAddSpeed,
child: const Text('添加'),
),
],
),
),
Padding(
padding: const EdgeInsets.only(
left: 18,
right: 18,
bottom: 30,
),
child: Wrap(
alignment: WrapAlignment.start,
spacing: 8,
runSpacing: 2,
children: List.generate(
speedList.length,
(index) => FilledButton.tonal(
onPressed: () => showBottomSheet(theme, index),
child: Text(speedList[index].toString()),
),
),
),
),
],
),
),
);
}
}