From 5707c080116247d3c5f8d78ac3a37d86f735c365 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Mon, 13 Jan 2025 12:21:25 +0800 Subject: [PATCH] feat: seek from viewpoint Closes #153 Signed-off-by: bggRGjQaUbCoE --- lib/common/widgets/segment_progress_bar.dart | 8 ++--- lib/pages/video/detail/controller.dart | 2 +- lib/plugin/pl_player/view.dart | 31 +++++++++++++++++++ .../pl_player/widgets/bottom_control.dart | 31 +++++++++++++++++++ 4 files changed, 67 insertions(+), 5 deletions(-) diff --git a/lib/common/widgets/segment_progress_bar.dart b/lib/common/widgets/segment_progress_bar.dart index 67a5085e..866c7e4b 100644 --- a/lib/common/widgets/segment_progress_bar.dart +++ b/lib/common/widgets/segment_progress_bar.dart @@ -75,7 +75,7 @@ class SegmentProgressBar extends CustomPainter { canvas.drawRect( Rect.fromLTRB( 0, - -_defHeight, + -_defHeight - 2, size.width, 0, ), @@ -86,9 +86,9 @@ class SegmentProgressBar extends CustomPainter { canvas.drawRect( Rect.fromLTWH( segmentStart, - -_defHeight, + -_defHeight - 2, segmentEnd == segmentStart ? 2 : segmentEnd - segmentStart, - size.height + _defHeight, + size.height + _defHeight + 2, ), paint, ); @@ -98,7 +98,7 @@ class SegmentProgressBar extends CustomPainter { : (segmentStart - prevStart - textPainter.width) / 2 + prevStart + 1; - double textY = (-_defHeight - textPainter.height) / 2; + double textY = (-_defHeight - textPainter.height) / 2 - 1; textPainter.paint(canvas, Offset(textX, textY)); } else { canvas.drawRect( diff --git a/lib/pages/video/detail/controller.dart b/lib/pages/video/detail/controller.dart index c9a10dcd..6fa12d7d 100644 --- a/lib/pages/video/detail/controller.dart +++ b/lib/pages/video/detail/controller.dart @@ -2001,7 +2001,7 @@ class VideoDetailController extends GetxController return Segment( start, start, - Colors.black87, + Colors.black.withOpacity(0.5), item?['content'], item?['imgUrl'], item?['from'], diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index e5fcc6b6..d3969570 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -1052,6 +1052,37 @@ class _PLVideoPlayerState extends State child: Stack( alignment: Alignment.bottomCenter, children: [ + if (plPlayerController.viewPointList.isNotEmpty && + plPlayerController.showVP.value) + LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + height: 20, + child: Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: (event) { + try { + double seg = event.localPosition.dx / + constraints.maxWidth; + Segment item = plPlayerController + .viewPointList + .where((item) { + return item.start >= seg; + }).reduce((a, b) => + a.start < b.start ? a : b); + if (item.from != null) { + plPlayerController.seekTo( + Duration(seconds: item.from!)); + } + // debugPrint('${item.title},,${item.from}'); + } catch (e) { + debugPrint('$e'); + } + }, + ), + ); + }, + ), ProgressBar( progress: Duration(seconds: value), buffered: Duration(seconds: buffer), diff --git a/lib/plugin/pl_player/widgets/bottom_control.dart b/lib/plugin/pl_player/widgets/bottom_control.dart index 2c40460c..bfc36624 100644 --- a/lib/plugin/pl_player/widgets/bottom_control.dart +++ b/lib/plugin/pl_player/widgets/bottom_control.dart @@ -52,6 +52,37 @@ class BottomControl extends StatelessWidget implements PreferredSizeWidget { child: Stack( alignment: Alignment.bottomCenter, children: [ + if (controller?.viewPointList.isNotEmpty == true && + controller?.showVP.value == true) + LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 20, + margin: const EdgeInsets.only(bottom: 5.25), + child: Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: (event) { + try { + double seg = event.localPosition.dx / + constraints.maxWidth; + Segment? item = controller?.viewPointList + .where((item) { + return item.start >= seg; + }).reduce((a, b) => + a.start < b.start ? a : b); + if (item?.from != null) { + controller?.seekTo( + Duration(seconds: item!.from!)); + } + // debugPrint('${item?.title},,${item?.from}'); + } catch (e) { + debugPrint('$e'); + } + }, + ), + ); + }, + ), ProgressBar( progress: Duration(seconds: value), buffered: Duration(seconds: buffer),