mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
mod: member archive: show progress
Closes #225 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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/danmu.dart';
|
||||||
import 'package:PiliPlus/common/widgets/stat/view.dart';
|
import 'package:PiliPlus/common/widgets/stat/view.dart';
|
||||||
import 'package:PiliPlus/common/widgets/video_popup_menu.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:PiliPlus/models/space_archive/item.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
@@ -98,6 +99,22 @@ class VideoCardHMemberVideo extends StatelessWidget {
|
|||||||
bottom: 6.0,
|
bottom: 6.0,
|
||||||
type: 'gray',
|
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();
|
||||||
|
}
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
27
lib/common/widgets/video_progress_indicator.dart
Normal file
27
lib/common/widgets/video_progress_indicator.dart
Normal file
@@ -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<Rect> {
|
||||||
|
@override
|
||||||
|
Rect getClip(Size size) {
|
||||||
|
return Rect.fromLTWH(0, 8, size.width, size.height - 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReclip(CustomClipper<Rect> oldClipper) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,6 +60,7 @@ class Item {
|
|||||||
String? publishTimeText;
|
String? publishTimeText;
|
||||||
List<Badge>? badges;
|
List<Badge>? badges;
|
||||||
Map? season;
|
Map? season;
|
||||||
|
Map? history;
|
||||||
|
|
||||||
Item({
|
Item({
|
||||||
this.title,
|
this.title,
|
||||||
@@ -97,6 +98,7 @@ class Item {
|
|||||||
this.publishTimeText,
|
this.publishTimeText,
|
||||||
this.badges,
|
this.badges,
|
||||||
this.season,
|
this.season,
|
||||||
|
this.history,
|
||||||
});
|
});
|
||||||
|
|
||||||
factory Item.fromJson(Map<String, dynamic> json) => _$ItemFromJson(json);
|
factory Item.fromJson(Map<String, dynamic> json) => _$ItemFromJson(json);
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ Item _$ItemFromJson(Map<String, dynamic> json) => Item(
|
|||||||
?.map((e) => Badge.fromJson(e as Map<String, dynamic>))
|
?.map((e) => Badge.fromJson(e as Map<String, dynamic>))
|
||||||
.toList(),
|
.toList(),
|
||||||
season: json['season'],
|
season: json['season'],
|
||||||
|
history: json['history'],
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$ItemToJson(Item instance) => <String, dynamic>{
|
Map<String, dynamic> _$ItemToJson(Item instance) => <String, dynamic>{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:PiliPlus/common/widgets/image_save.dart';
|
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/common/multi_select_controller.dart';
|
||||||
import 'package:PiliPlus/pages/fav_search/controller.dart';
|
import 'package:PiliPlus/pages/fav_search/controller.dart';
|
||||||
import 'package:PiliPlus/utils/app_scheme.dart';
|
import 'package:PiliPlus/utils/app_scheme.dart';
|
||||||
@@ -273,20 +274,10 @@ class HistoryItem extends StatelessWidget {
|
|||||||
left: 0,
|
left: 0,
|
||||||
right: 0,
|
right: 0,
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
child: ClipRect(
|
child: videoProgressIndicator(
|
||||||
clipper: _Clipper(),
|
videoItem.progress == -1
|
||||||
child: ClipRRect(
|
? 1
|
||||||
borderRadius: BorderRadius.only(
|
: videoItem.progress / videoItem.duration,
|
||||||
bottomLeft: Radius.circular(12),
|
|
||||||
bottomRight: Radius.circular(12),
|
|
||||||
),
|
|
||||||
child: LinearProgressIndicator(
|
|
||||||
minHeight: 12,
|
|
||||||
value: videoItem.progress == -1
|
|
||||||
? 100
|
|
||||||
: videoItem.progress / videoItem.duration,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -410,15 +401,3 @@ class HistoryItem extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _Clipper extends CustomClipper<Rect> {
|
|
||||||
@override
|
|
||||||
Rect getClip(Size size) {
|
|
||||||
return Rect.fromLTWH(0, 8, size.width, size.height - 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool shouldReclip(CustomClipper<Rect> oldClipper) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user