mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-20 17:16:29 +08:00
283 lines
8.3 KiB
Dart
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()),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|