fix: back improvements

This commit is contained in:
edde746
2026-01-24 21:40:02 +01:00
parent b7ec24c2c1
commit 0fc2708a51
15 changed files with 268 additions and 133 deletions
@@ -16,6 +16,7 @@ import '../../widgets/desktop_app_bar.dart';
import '../../providers/settings_provider.dart';
import '../../focus/dpad_navigator.dart';
import '../../focus/input_mode_tracker.dart';
import '../../focus/key_event_utils.dart';
import 'playlist_item_card.dart';
import '../../i18n/strings.g.dart';
import '../../utils/dialogs.dart';
@@ -369,10 +370,24 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen<PlaylistDetai
/// Handle key events for list navigation
KeyEventResult _handleListKeyEvent(FocusNode node, KeyEvent event) {
if (event is! KeyDownEvent) return KeyEventResult.ignored;
final key = event.logicalKey;
final backResult = handleBackKeyAction(event, () {
if (_movingIndex != null) {
// Cancel move mode, set flag to prevent PopScope exit
_backHandledByKeyEvent = true;
_cancelMoveMode();
} else {
// Navigate to app bar on BACK, set flag to prevent PopScope exit
_handleBackFromContent();
}
});
if (backResult != KeyEventResult.ignored) {
return backResult;
}
if (event is! KeyDownEvent) return KeyEventResult.ignored;
if (_movingIndex != null) {
// Move mode - arrows reorder the item
if (key.isUpKey && _movingIndex! > 0) {
@@ -411,12 +426,6 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen<PlaylistDetai
_persistMoveToServer(oldIndex, newIndex);
return KeyEventResult.handled;
}
if (key.isBackKey) {
// Cancel move mode, set flag to prevent PopScope exit
_backHandledByKeyEvent = true;
_cancelMoveMode();
return KeyEventResult.handled;
}
} else {
// Navigation mode
if (key.isUpKey) {
@@ -481,11 +490,6 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen<PlaylistDetai
}
return KeyEventResult.handled;
}
if (key.isBackKey) {
// Navigate to app bar on BACK, set flag to prevent PopScope exit
_handleBackFromContent();
return KeyEventResult.handled;
}
}
return KeyEventResult.ignored;
@@ -493,12 +497,17 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen<PlaylistDetai
/// Handle key events when app bar is focused
KeyEventResult _handleAppBarKeyEvent(FocusNode node, KeyEvent event) {
if (event is! KeyDownEvent) return KeyEventResult.ignored;
final key = event.logicalKey;
final hasDelete = !widget.playlist.smart;
final maxButton = hasDelete ? 2 : 1;
final backResult = handleBackKeyAction(event, () => Navigator.pop(context));
if (backResult != KeyEventResult.ignored) {
return backResult;
}
if (event is! KeyDownEvent) return KeyEventResult.ignored;
if (key.isLeftKey && _appBarFocusedButton > 0) {
setState(() => _appBarFocusedButton--);
_focusAppBarButton(_appBarFocusedButton);
@@ -525,11 +534,6 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen<PlaylistDetai
_triggerAppBarButton(_appBarFocusedButton);
return KeyEventResult.handled;
}
if (key.isBackKey) {
// Already on app bar, exit the screen
Navigator.pop(context);
return KeyEventResult.handled;
}
return KeyEventResult.ignored;
}
@@ -701,6 +705,7 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen<PlaylistDetai
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) {
if (BackKeyCoordinator.consumeIfHandled()) return;
if (didPop) return;
final shouldPop = _handleBackNavigation();
if (shouldPop && mounted) {