From 4267a3b8e0ac7661c1bd33918f2e0ec745a04258 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Tue, 11 Feb 2025 17:20:54 +0800 Subject: [PATCH] mod: member archive: show progress Closes #225 Signed-off-by: bggRGjQaUbCoE --- .../widgets/video_card_h_member_video.dart | 17 ++++++++++ .../widgets/video_progress_indicator.dart | 27 ++++++++++++++++ lib/models/space_archive/item.dart | 2 ++ lib/models/space_archive/item.g.dart | 1 + lib/pages/history/widgets/item.dart | 31 +++---------------- 5 files changed, 52 insertions(+), 26 deletions(-) create mode 100644 lib/common/widgets/video_progress_indicator.dart diff --git a/lib/common/widgets/video_card_h_member_video.dart b/lib/common/widgets/video_card_h_member_video.dart index 7b0d0744..74c85640 100644 --- a/lib/common/widgets/video_card_h_member_video.dart +++ b/lib/common/widgets/video_card_h_member_video.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/common/widgets/image_save.dart'; import 'package:PiliPlus/common/widgets/stat/danmu.dart'; import 'package:PiliPlus/common/widgets/stat/view.dart'; import 'package:PiliPlus/common/widgets/video_popup_menu.dart'; +import 'package:PiliPlus/common/widgets/video_progress_indicator.dart'; import 'package:PiliPlus/models/space_archive/item.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -98,6 +99,22 @@ class VideoCardHMemberVideo extends StatelessWidget { bottom: 6.0, type: 'gray', ), + if (videoItem.history != null) + Builder(builder: (context) { + try { + return Positioned( + left: 0, + right: 0, + bottom: 0, + child: videoProgressIndicator( + videoItem.history!['progress'] / + videoItem.history!['duration'], + ), + ); + } catch (_) { + return const SizedBox.shrink(); + } + }), ], ); }, diff --git a/lib/common/widgets/video_progress_indicator.dart b/lib/common/widgets/video_progress_indicator.dart new file mode 100644 index 00000000..7d88fc69 --- /dev/null +++ b/lib/common/widgets/video_progress_indicator.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +Widget videoProgressIndicator(double progress) => ClipRect( + clipper: ProgressClipper(), + child: ClipRRect( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(12), + bottomRight: Radius.circular(12), + ), + child: LinearProgressIndicator( + minHeight: 12, + value: progress, + ), + ), + ); + +class ProgressClipper extends CustomClipper { + @override + Rect getClip(Size size) { + return Rect.fromLTWH(0, 8, size.width, size.height - 8); + } + + @override + bool shouldReclip(CustomClipper oldClipper) { + return false; + } +} diff --git a/lib/models/space_archive/item.dart b/lib/models/space_archive/item.dart index 303bc94d..ac564c6b 100644 --- a/lib/models/space_archive/item.dart +++ b/lib/models/space_archive/item.dart @@ -60,6 +60,7 @@ class Item { String? publishTimeText; List? badges; Map? season; + Map? history; Item({ this.title, @@ -97,6 +98,7 @@ class Item { this.publishTimeText, this.badges, this.season, + this.history, }); factory Item.fromJson(Map json) => _$ItemFromJson(json); diff --git a/lib/models/space_archive/item.g.dart b/lib/models/space_archive/item.g.dart index 44eaeef0..1efefc48 100644 --- a/lib/models/space_archive/item.g.dart +++ b/lib/models/space_archive/item.g.dart @@ -48,6 +48,7 @@ Item _$ItemFromJson(Map json) => Item( ?.map((e) => Badge.fromJson(e as Map)) .toList(), season: json['season'], + history: json['history'], ); Map _$ItemToJson(Item instance) => { diff --git a/lib/pages/history/widgets/item.dart b/lib/pages/history/widgets/item.dart index a3110b39..3db1645b 100644 --- a/lib/pages/history/widgets/item.dart +++ b/lib/pages/history/widgets/item.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/widgets/image_save.dart'; +import 'package:PiliPlus/common/widgets/video_progress_indicator.dart'; import 'package:PiliPlus/pages/common/multi_select_controller.dart'; import 'package:PiliPlus/pages/fav_search/controller.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; @@ -273,20 +274,10 @@ class HistoryItem extends StatelessWidget { left: 0, right: 0, bottom: 0, - child: ClipRect( - clipper: _Clipper(), - child: ClipRRect( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(12), - bottomRight: Radius.circular(12), - ), - child: LinearProgressIndicator( - minHeight: 12, - value: videoItem.progress == -1 - ? 100 - : videoItem.progress / videoItem.duration, - ), - ), + child: videoProgressIndicator( + videoItem.progress == -1 + ? 1 + : videoItem.progress / videoItem.duration, ), ), ], @@ -410,15 +401,3 @@ class HistoryItem extends StatelessWidget { ); } } - -class _Clipper extends CustomClipper { - @override - Rect getClip(Size size) { - return Rect.fromLTWH(0, 8, size.width, size.height - 8); - } - - @override - bool shouldReclip(CustomClipper oldClipper) { - return false; - } -}