From 5b493a70b0ceb290bd58b17ec512a96b10e42a2a Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Thu, 9 Apr 2026 03:48:04 +0200 Subject: [PATCH] feat: show snackbar on playback speed change close #824 --- lib/services/keyboard_shortcuts_service.dart | 9 +++++++++ lib/utils/snackbar_helper.dart | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/lib/services/keyboard_shortcuts_service.dart b/lib/services/keyboard_shortcuts_service.dart index 76fd96e4..5bf6ef2c 100644 --- a/lib/services/keyboard_shortcuts_service.dart +++ b/lib/services/keyboard_shortcuts_service.dart @@ -8,6 +8,7 @@ import '../i18n/strings.g.dart'; import '../mpv/mpv.dart'; import 'settings_service.dart'; import '../utils/player_utils.dart'; +import '../utils/snackbar_helper.dart'; class KeyboardShortcutsService { static KeyboardShortcutsService? _instance; @@ -293,15 +294,18 @@ class KeyboardShortcutsService { final newRateUp = (player.state.rate + 0.25).clamp(0.25, 3.0); player.setRate(newRateUp); _settingsService.setDefaultPlaybackSpeed(newRateUp); + showGlobalSnackBar(_formatSpeed(newRateUp)); break; case 'speed_decrease': final newRateDown = (player.state.rate - 0.25).clamp(0.25, 3.0); player.setRate(newRateDown); _settingsService.setDefaultPlaybackSpeed(newRateDown); + showGlobalSnackBar(_formatSpeed(newRateDown)); break; case 'speed_reset': player.setRate(1.0); _settingsService.setDefaultPlaybackSpeed(1.0); + showGlobalSnackBar(_formatSpeed(1.0)); break; case 'sub_seek_next': player.command(['sub-seek', '1']); @@ -387,4 +391,9 @@ class KeyboardShortcutsService { return aModifiers.length == bModifiers.length && aModifiers.every((modifier) => bModifiers.contains(modifier)); } + + String _formatSpeed(double speed) { + final s = speed.toStringAsFixed(2).replaceFirst(RegExp(r'\.?0+$'), ''); + return '${s}x'; + } } diff --git a/lib/utils/snackbar_helper.dart b/lib/utils/snackbar_helper.dart index dc880892..25d0be85 100644 --- a/lib/utils/snackbar_helper.dart +++ b/lib/utils/snackbar_helper.dart @@ -61,6 +61,13 @@ void showGlobalErrorSnackBar(String message) { ); } +/// Shows an info snackbar using the root ScaffoldMessenger (survives navigation). +void showGlobalSnackBar(String message, {Duration duration = const Duration(seconds: 2)}) { + rootScaffoldMessengerKey.currentState + ?..removeCurrentSnackBar() + ..showSnackBar(SnackBar(content: Text(message), duration: duration)); +} + /// Shows a success snackbar with a message /// /// [context] The build context