mod: video: cancellable slide seek

Closes #319

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-02-25 16:53:26 +08:00
parent 1a54f61355
commit 81eeda0a68
2 changed files with 42 additions and 6 deletions

View File

@@ -1152,14 +1152,40 @@ class PlPlayerController {
_isSliderMoving.value = true; _isSliderMoving.value = true;
} }
double? slideDy;
bool? hasToast;
void updateSlideDy(double dy) {
slideDy ??= 0;
slideDy = slideDy! + dy;
if (slideDy!.abs() >= 100) {
if (hasToast != true) {
hasToast = true;
SmartDialog.showToast(
'取消${sliderPosition.value > position.value ? '快进' : '快退'}',
);
}
} else {
if (hasToast == true) {
hasToast = null;
SmartDialog.showToast(
sliderPosition.value > position.value ? '快进' : '快退',
);
}
}
}
void onUpdatedSliderProgress(Duration value) { void onUpdatedSliderProgress(Duration value) {
_sliderTempPosition.value = value; _sliderTempPosition.value = value;
_sliderPosition.value = value; _sliderPosition.value = value;
updateSliderPositionSecond(); updateSliderPositionSecond();
} }
void onChangedSliderEnd() { void onChangedSliderEnd([bool? isCancel]) {
feedBack(); if (isCancel != true) {
feedBack();
}
slideDy = null;
hasToast = null;
_isSliderMoving.value = false; _isSliderMoving.value = false;
_hideTaskControls(); _hideTaskControls();
} }

View File

@@ -771,6 +771,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
curSliderPosition + (delta.dx * scale).round()); curSliderPosition + (delta.dx * scale).round());
final Duration result = final Duration result =
pos.clamp(Duration.zero, plPlayerController.duration.value); pos.clamp(Duration.zero, plPlayerController.duration.value);
plPlayerController.updateSlideDy(delta.dy);
plPlayerController.onUpdatedSliderProgress(result); plPlayerController.onUpdatedSliderProgress(result);
plPlayerController.onChangedSliderStart(); plPlayerController.onChangedSliderStart();
if (plPlayerController.showSeekPreview) { if (plPlayerController.showSeekPreview) {
@@ -778,7 +779,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
plPlayerController.previewDx.value = result.inMilliseconds / plPlayerController.previewDx.value = result.inMilliseconds /
plPlayerController plPlayerController
.durationSeconds.value.inMilliseconds * .durationSeconds.value.inMilliseconds *
context.size!.width; renderBox.size.width;
if (plPlayerController.showPreview.value.not) { if (plPlayerController.showPreview.value.not) {
plPlayerController.showPreview.value = true; plPlayerController.showPreview.value = true;
} }
@@ -834,10 +835,19 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
plPlayerController.showPreview.value = false; plPlayerController.showPreview.value = false;
} }
if (plPlayerController.isSliderMoving.value) { if (plPlayerController.isSliderMoving.value) {
plPlayerController.onChangedSliderEnd(); bool isCancel = plPlayerController.slideDy != null &&
plPlayerController.seekTo( plPlayerController.slideDy!.abs() >= 100;
plPlayerController.onChangedSliderEnd(isCancel);
if (isCancel) {
plPlayerController.onUpdatedSliderProgress(
plPlayerController.position.value,
);
} else {
plPlayerController.seekTo(
plPlayerController.sliderPosition.value, plPlayerController.sliderPosition.value,
type: 'slider'); type: 'slider',
);
}
} }
interacting = false; interacting = false;
_initialFocalPoint = Offset.zero; _initialFocalPoint = Offset.zero;