feat: custom for/backward duration

Closes #366
Closes #601

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-04 10:35:52 +08:00
parent 09c8a41c52
commit 08aedbf0b0
6 changed files with 46 additions and 16 deletions

View File

@@ -759,6 +759,15 @@ List<SettingsModel> get playSettings => [
setKey: SettingBoxKey.enableSlideFS,
defaultVal: true,
),
_getVideoFilterSelectModel(
context: Get.context!,
title: '快进/快退时长',
suffix: 's',
key: SettingBoxKey.fastForBackwardDuration,
values: [5, 10, 15],
defaultValue: 10,
isFilter: false,
),
SettingsModel(
settingsType: SettingsType.normal,
title: '自动启用字幕',
@@ -2479,19 +2488,23 @@ SettingsModel _getVideoFilterSelectModel({
String? suffix,
required String key,
required List<int> values,
int defaultValue = 0,
bool isFilter = true,
}) {
int value = GStorage.setting.get(key, defaultValue: 0);
int value = GStorage.setting.get(key, defaultValue: defaultValue);
return SettingsModel(
settingsType: SettingsType.normal,
title: '$title过滤',
title: '$title${isFilter ? '过滤' : ''}',
leading: const Icon(Icons.timelapse_outlined),
getSubtitle: () => '过滤掉$title小于$value${suffix ?? ""}」的视频',
getSubtitle: () => isFilter
? '过滤掉$title小于$value${suffix ?? ""}」的视频'
: '当前$title:「$value${suffix ?? ""}',
onTap: (setState) async {
var result = await showDialog<int>(
context: context,
builder: (context) {
return SelectDialog<int>(
title: '选择$title0即不过滤',
title: '选择$title${isFilter ? '0即不过滤' : ''}',
value: value,
values: (values
..addIf(!values.contains(value), value)

View File

@@ -257,6 +257,7 @@ class PlPlayerController {
late final enableSlideVolumeBrightness = GStorage.enableSlideVolumeBrightness;
late final enableSlideFS = GStorage.enableSlideFS;
late final enableDragSubtitle = GStorage.enableDragSubtitle;
late final fastForBackwardDuration = GStorage.fastForBackwardDuration;
/// 弹幕权重
int danmakuWeight = 0;

View File

@@ -1704,6 +1704,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
child: child,
),
child: BackwardSeekIndicator(
duration:
plPlayerController.fastForBackwardDuration,
onSubmitted: (Duration value) {
_mountSeekBackwardButton.value = false;
final Player player = widget
@@ -1733,6 +1735,8 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
child: child,
),
child: ForwardSeekIndicator(
duration:
plPlayerController.fastForBackwardDuration,
onSubmitted: (Duration value) {
_mountSeekForwardButton.value = false;
final Player player = widget

View File

@@ -4,11 +4,14 @@ import 'package:flutter/material.dart';
class BackwardSeekIndicator extends StatefulWidget {
// final void Function(Duration) onChanged;
final void Function(Duration) onSubmitted;
final ValueChanged<Duration> onSubmitted;
final int duration;
const BackwardSeekIndicator({
super.key,
// required this.onChanged,
required this.onSubmitted,
required this.duration,
});
@override
@@ -16,15 +19,16 @@ class BackwardSeekIndicator extends StatefulWidget {
}
class BackwardSeekIndicatorState extends State<BackwardSeekIndicator> {
Duration value = const Duration(seconds: 10);
late Duration duration;
Timer? timer;
@override
void initState() {
super.initState();
duration = Duration(seconds: widget.duration);
timer = Timer(const Duration(milliseconds: 400), () {
widget.onSubmitted.call(value);
widget.onSubmitted.call(duration);
});
}
@@ -37,12 +41,12 @@ class BackwardSeekIndicatorState extends State<BackwardSeekIndicator> {
void increment() {
timer?.cancel();
timer = Timer(const Duration(milliseconds: 400), () {
widget.onSubmitted.call(value);
widget.onSubmitted.call(duration);
});
// widget.onChanged.call(value);
// 重复点击 快退秒数累加10
setState(() {
value += const Duration(seconds: 10);
duration += Duration(seconds: widget.duration);
});
}
@@ -75,7 +79,7 @@ class BackwardSeekIndicatorState extends State<BackwardSeekIndicator> {
),
const SizedBox(height: 8.0),
Text(
'快退${value.inSeconds}',
'快退${duration.inSeconds}',
style: const TextStyle(
fontSize: 12.0,
color: Colors.white,

View File

@@ -4,11 +4,14 @@ import 'package:flutter/material.dart';
class ForwardSeekIndicator extends StatefulWidget {
// final void Function(Duration) onChanged;
final void Function(Duration) onSubmitted;
final ValueChanged<Duration> onSubmitted;
final int duration;
const ForwardSeekIndicator({
super.key,
// required this.onChanged,
required this.onSubmitted,
required this.duration,
});
@override
@@ -16,15 +19,16 @@ class ForwardSeekIndicator extends StatefulWidget {
}
class ForwardSeekIndicatorState extends State<ForwardSeekIndicator> {
Duration value = const Duration(seconds: 10);
late Duration duration;
Timer? timer;
@override
void initState() {
super.initState();
duration = Duration(seconds: widget.duration);
timer = Timer(const Duration(milliseconds: 400), () {
widget.onSubmitted.call(value);
widget.onSubmitted.call(duration);
});
}
@@ -37,12 +41,12 @@ class ForwardSeekIndicatorState extends State<ForwardSeekIndicator> {
void increment() {
timer?.cancel();
timer = Timer(const Duration(milliseconds: 400), () {
widget.onSubmitted.call(value);
widget.onSubmitted.call(duration);
});
// widget.onChanged.call(value);
// 重复点击 快进秒数累加10
setState(() {
value += const Duration(seconds: 10);
duration += Duration(seconds: widget.duration);
});
}
@@ -74,7 +78,7 @@ class ForwardSeekIndicatorState extends State<ForwardSeekIndicator> {
),
const SizedBox(height: 8.0),
Text(
'快进${value.inSeconds}',
'快进${duration.inSeconds}',
style: const TextStyle(
fontSize: 12.0,
color: Colors.white,

View File

@@ -439,6 +439,9 @@ class GStorage {
static bool get enableDragSubtitle => GStorage.setting
.get(SettingBoxKey.enableDragSubtitle, defaultValue: false);
static int get fastForBackwardDuration => GStorage.setting
.get(SettingBoxKey.fastForBackwardDuration, defaultValue: 10);
static List<double> get dynamicDetailRatio => List<double>.from(setting
.get(SettingBoxKey.dynamicDetailRatio, defaultValue: [60.0, 40.0]));
@@ -720,6 +723,7 @@ class SettingBoxKey {
liveQualityCellular = 'liveQualityCellular',
appFontWeight = 'appFontWeight',
enableDragSubtitle = 'enableDragSubtitle',
fastForBackwardDuration = 'fastForBackwardDuration',
// Sponsor Block
enableSponsorBlock = 'enableSponsorBlock',