diff --git a/lib/widgets/side_navigation_rail.dart b/lib/widgets/side_navigation_rail.dart index cf5b198c..e9cc4dc6 100644 --- a/lib/widgets/side_navigation_rail.dart +++ b/lib/widgets/side_navigation_rail.dart @@ -23,6 +23,7 @@ class _FocusStateTracker { final Map _nodes = {}; final Set _focused = {}; final VoidCallback _onChanged; + String? _lastFocusedKey; // Track last focused item for restoration _FocusStateTracker(this._onChanged); @@ -34,6 +35,7 @@ class _FocusStateTracker { final wasFocused = _focused.contains(key); if (node.hasFocus && !wasFocused) { _focused.add(key); + _lastFocusedKey = key; // Remember this key for restoration _onChanged(); } else if (!node.hasFocus && wasFocused) { _focused.remove(key); @@ -44,6 +46,9 @@ class _FocusStateTracker { }); } + /// Get the last focused key (for focus restoration) + String? get lastFocusedKey => _lastFocusedKey; + /// Check if a key is currently focused bool isFocused(String key) => _focused.contains(key); @@ -67,6 +72,10 @@ class _FocusStateTracker { _nodes.remove(key); _focused.remove(key); } + // Clear last focused if it was pruned + if (_lastFocusedKey != null && !validKeys.contains(_lastFocusedKey)) { + _lastFocusedKey = null; + } } } @@ -258,23 +267,18 @@ class SideNavigationRailState extends State { }); } - /// Focus the currently selected nav item + /// Focus the last focused nav item, or Home as fallback void focusActiveItem() { - if (widget.selectedLibraryKey != null) { - // A library is selected - focus that library item - _focusTracker.nodeFor(widget.selectedLibraryKey!)?.requestFocus(); - } else { - // Focus main nav item based on selectedIndex - final key = switch (widget.selectedIndex) { - 0 => _kHome, - 1 => _kLibraries, - 2 => _kSearch, - 3 => _kDownloads, - 4 => _kSettings, - _ => null, - }; - if (key != null) _focusTracker.nodeFor(key)?.requestFocus(); + // Try to restore last focused item + if (_focusTracker.lastFocusedKey != null) { + final node = _focusTracker.nodeFor(_focusTracker.lastFocusedKey!); + if (node != null) { + node.requestFocus(); + return; + } } + // Fallback: focus Home if nothing was previously focused + _focusTracker.nodeFor(_kHome)?.requestFocus(); } /// Fetch, filter, and order libraries (pure logic, no state changes)