mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-09 07:28:14 -07:00
feature: Handle all media segments skipping (#167)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
parent
7877cae8ea
commit
a06591084b
4 changed files with 54 additions and 66 deletions
|
|
@ -60,47 +60,26 @@ class OpenQueueButton extends ConsumerWidget {
|
|||
}
|
||||
}
|
||||
|
||||
class IntroSkipButton extends ConsumerWidget {
|
||||
class SkipSegmentButton extends ConsumerWidget {
|
||||
final String label;
|
||||
final bool isOverlayVisible;
|
||||
|
||||
final Function()? skipIntro;
|
||||
const IntroSkipButton({this.skipIntro, required this.isOverlayVisible, super.key});
|
||||
final Function() pressedSkip;
|
||||
const SkipSegmentButton({required this.label, required this.isOverlayVisible, required this.pressedSkip, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return ElevatedButton(
|
||||
onPressed: () => skipIntro?.call(),
|
||||
style: ElevatedButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))),
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [Text("(S)kip Intro"), Icon(Icons.skip_next_rounded)],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class OutroSkipButton extends ConsumerWidget {
|
||||
final bool isOverlayVisible;
|
||||
final Function()? skipOutro;
|
||||
const OutroSkipButton({this.skipOutro, required this.isOverlayVisible, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
// final semiHideSkip = skipCredits.
|
||||
return AnimatedOpacity(
|
||||
opacity: 1,
|
||||
duration: const Duration(milliseconds: 250),
|
||||
opacity: isOverlayVisible ? 0.85 : 0,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
child: ElevatedButton(
|
||||
onPressed: () => skipOutro?.call(),
|
||||
onPressed: pressedSkip,
|
||||
style: ElevatedButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5))),
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [Text("(S)kip Credits"), Icon(Icons.skip_next_rounded)],
|
||||
children: [Text(label), const Icon(Icons.skip_next_rounded)],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -54,8 +54,7 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
bool _onKey(KeyEvent value) {
|
||||
final mediaSegments = ref.read(playBackModel.select((value) => value?.mediaSegments));
|
||||
final position = ref.read(mediaPlaybackProvider).position;
|
||||
bool showIntroSkipButton = mediaSegments?.intro?.inRange(position) ?? false;
|
||||
bool showOutroSkipButton = mediaSegments?.outro?.inRange(position) ?? false;
|
||||
MediaSegment? segment = mediaSegments?.atPosition(position);
|
||||
if (value is KeyRepeatEvent) {
|
||||
if (value.logicalKey == LogicalKeyboardKey.arrowUp) {
|
||||
resetTimer();
|
||||
|
|
@ -70,10 +69,8 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
}
|
||||
if (value is KeyDownEvent) {
|
||||
if (value.logicalKey == LogicalKeyboardKey.keyS) {
|
||||
if (showIntroSkipButton) {
|
||||
skipIntro(mediaSegments);
|
||||
} else if (showOutroSkipButton) {
|
||||
skipOutro(mediaSegments);
|
||||
if (segment != null) {
|
||||
skipToSegmentEnd(segment);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -158,32 +155,22 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final position = ref.watch(mediaPlaybackProvider.select((value) => value.position));
|
||||
bool showIntroSkipButton = mediaSegments?.intro?.inRange(position) ?? false;
|
||||
bool showOutroSkipButton = mediaSegments?.outro?.inRange(position) ?? false;
|
||||
MediaSegment? segment = mediaSegments?.atPosition(position);
|
||||
bool forceShow = segment?.forceShow(position) ?? false;
|
||||
return Stack(
|
||||
children: [
|
||||
if (showIntroSkipButton)
|
||||
if (segment != null)
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: IntroSkipButton(
|
||||
isOverlayVisible: showOverlay,
|
||||
skipIntro: () => skipIntro(mediaSegments),
|
||||
child: SkipSegmentButton(
|
||||
label: context.localized.skipButtonLabel(segment.type.label(context).toLowerCase()),
|
||||
isOverlayVisible: forceShow ? true : showOverlay,
|
||||
pressedSkip: () => skipToSegmentEnd(segment),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (showOutroSkipButton)
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(32),
|
||||
child: OutroSkipButton(
|
||||
isOverlayVisible: showOverlay,
|
||||
skipOutro: () => skipOutro(mediaSegments),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
|
|
@ -580,18 +567,10 @@ class _DesktopControlsState extends ConsumerState<DesktopControls> {
|
|||
);
|
||||
}
|
||||
|
||||
void skipIntro(MediaSegmentsModel? mediaSegments) {
|
||||
resetTimer();
|
||||
final end = mediaSegments?.intro?.end;
|
||||
if (end != null) {
|
||||
ref.read(videoPlayerProvider).seek(end);
|
||||
}
|
||||
}
|
||||
|
||||
void skipOutro(MediaSegmentsModel? mediaSegments) {
|
||||
resetTimer();
|
||||
final end = mediaSegments?.outro?.end;
|
||||
void skipToSegmentEnd(MediaSegment? mediaSegments) {
|
||||
final end = mediaSegments?.end;
|
||||
if (end != null) {
|
||||
resetTimer();
|
||||
ref.read(videoPlayerProvider).seek(end);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue