Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-09 12:59:19 +08:00
parent f4261dd8f7
commit df81a33ae0
2 changed files with 75 additions and 55 deletions

View File

@@ -482,7 +482,7 @@ class VideoDetailController extends GetxController
Timer? skipTimer; Timer? skipTimer;
late final listKey = GlobalKey<AnimatedListState>(); late final listKey = GlobalKey<AnimatedListState>();
late final listData = <SegmentModel>[]; late final List listData = [];
Future _vote(String uuid, int type) async { Future _vote(String uuid, int type) async {
Request() Request()
@@ -841,16 +841,7 @@ class VideoDetailController extends GetxController
item.hasSkipped = true; item.hasSkipped = true;
onSkip(item); onSkip(item);
} else if (item.skipType == SkipType.skipManually) { } else if (item.skipType == SkipType.skipManually) {
listData.insert(0, item); onAddItem(item);
listKey.currentState?.insertItem(0);
skipTimer ??= Timer.periodic(const Duration(seconds: 3), (_) {
if (listData.isNotEmpty) {
onRemoveItem(listData.length - 1, listData.last);
} else {
skipTimer?.cancel();
skipTimer = null;
}
});
} }
break; break;
} }
@@ -860,7 +851,20 @@ class VideoDetailController extends GetxController
} }
} }
void onRemoveItem(int index, SegmentModel item) { void onAddItem(item) {
listData.insert(0, item);
listKey.currentState?.insertItem(0);
skipTimer ??= Timer.periodic(const Duration(seconds: 4), (_) {
if (listData.isNotEmpty) {
onRemoveItem(listData.length - 1, listData.last);
} else {
skipTimer?.cancel();
skipTimer = null;
}
});
}
void onRemoveItem(int index, item) {
EasyThrottle.throttle('onRemoveItem', const Duration(milliseconds: 500), EasyThrottle.throttle('onRemoveItem', const Duration(milliseconds: 500),
() { () {
try { try {
@@ -873,7 +877,7 @@ class VideoDetailController extends GetxController
}); });
} }
Widget buildItem(SegmentModel item, Animation<double> animation) { Widget buildItem(item, Animation<double> animation) {
return Align( return Align(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: SlideTransition( child: SlideTransition(
@@ -898,10 +902,33 @@ class VideoDetailController extends GetxController
Theme.of(Get.context!).colorScheme.onSecondaryContainer, Theme.of(Get.context!).colorScheme.onSecondaryContainer,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
fontSize: 14, fontSize: 14,
text: '跳过: ${item.segmentType.shortTitle}', text: item is SegmentModel
? '跳过: ${item.segmentType.shortTitle}'
: '上次看到第${item + 1}P点击跳转',
onTap: (_) { onTap: (_) {
onSkip(item); if (item is int) {
onRemoveItem(listData.indexOf(item), item); try {
VideoIntroController videoIntroController =
Get.find<VideoIntroController>(tag: heroTag);
Part part =
videoIntroController.videoDetail.value.pages![item];
videoIntroController.changeSeasonOrbangu(
null,
bvid,
part.cid,
IdUtils.bv2av(bvid),
null,
);
SmartDialog.showToast('已跳至第${item + 1}P');
} catch (e) {
debugPrint('$e');
SmartDialog.showToast('跳转失败');
}
onRemoveItem(listData.indexOf(item), item);
} else if (item is SegmentModel) {
onSkip(item);
onRemoveItem(listData.indexOf(item), item);
}
}, },
), ),
), ),
@@ -1957,44 +1984,7 @@ class VideoDetailController extends GetxController
int index = videoIntroController.videoDetail.value.pages! int index = videoIntroController.videoDetail.value.pages!
.indexWhere((item) => item.cid == res['last_play_cid']); .indexWhere((item) => item.cid == res['last_play_cid']);
if (index != -1) { if (index != -1) {
SmartDialog.showAttach( onAddItem(index);
targetContext: childKey.currentContext,
alignment: Alignment.topCenter,
maskColor: Colors.transparent,
displayTime: Duration(seconds: 4),
builder: (context) => GestureDetector(
onTap: () {
SmartDialog.dismiss();
Part part =
videoIntroController.videoDetail.value.pages![index];
videoIntroController.changeSeasonOrbangu(
null,
bvid,
part.cid,
IdUtils.bv2av(bvid),
null,
);
},
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 4),
margin: const EdgeInsets.only(bottom: 15),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.secondaryContainer,
borderRadius: BorderRadius.circular(8),
),
child: Text(
'上次看到第${index + 1}P点击跳转',
style: TextStyle(
fontSize: 14,
color: Theme.of(context)
.colorScheme
.onSecondaryContainer,
),
),
),
),
);
} }
} }
} }

View File

@@ -1347,7 +1347,8 @@ class _VideoDetailPageState extends State<VideoDetailPage>
manualPlayerWidget, manualPlayerWidget,
], ],
if (videoDetailController.enableSponsorBlock) if (videoDetailController.enableSponsorBlock ||
videoDetailController.continuePlayingPart)
Positioned( Positioned(
left: 16, left: 16,
bottom: isFullScreen ? max(75, Get.height * 0.25) : 75, bottom: isFullScreen ? max(75, Get.height * 0.25) : 75,
@@ -1368,6 +1369,35 @@ class _VideoDetailPageState extends State<VideoDetailPage>
), ),
), ),
), ),
// for debug
// Positioned(
// right: 16,
// bottom: 75,
// child: FilledButton.tonal(
// onPressed: () {
// videoDetailController.onAddItem(
// SegmentModel(
// UUID: '',
// segmentType: SegmentType.sponsor,
// segment: Pair(first: 0, second: 0),
// skipType: SkipType.alwaysSkip,
// ),
// );
// },
// child: Text('skip'),
// ),
// ),
// Positioned(
// right: 16,
// bottom: 120,
// child: FilledButton.tonal(
// onPressed: () {
// videoDetailController.onAddItem(2);
// },
// child: Text('index'),
// ),
// ),
], ],
); );