Systems grid and games list
- Cache SystemInfo list conversion in _SystemCardGridViewState, rebuilt only
when widget.systems or crossAxisCount changes - Move Theme.copyWith() and ScrollConfiguration.copyWith() to
didChangeDependencies to avoid rebuilding theme objects on every build - Add RepaintBoundary to AnimatedPositioned highlight border in systems grid
- Compile RegExp for letter detection to static final, avoiding recompilation
on every navigation keystroke - Replace context.watch with context.select to avoid full
games screen rebuilds on unrelated theme changes - Cache theme-dependent colors for letter indicator in didChangeDependencies
and add RepaintBoundary to isolate shadow repaints during AnimatedOpacity - Add Map<GameModel, int> index lookup to replace O(n) indexOf in _selectGame
RAM management on game launch
- Clear Flutter image cache and live images before launching emulator
- Release game list and index map from memory on launch, reload on return
- Clear SystemBackgroundProvider image on launch
- Add SystemBackgroundProvider.clear() method
- Hide games list UI content while game dialog is active to prevent
empty state widget rendering behind the dialog - Hide carousel and systems grid content while game dialog is active
using _isGameLaunching flag and ValueNotifier respectively - Apply same RAM-free logic for game launches from recent card in
both carousel and systems grid views - Rebuild game index map after reloading games on game close
Bug fixes
- Fix GamepadControl receiving keyboard focus causing Enter key to
trigger view mode dialog during system navigation; set canRequestFocus
false on InkWell so all keyboard input routes through GamepadNavigation - Fix music system always showing in systems list when music folder is
empty; remove isAlwaysVisibleVirtual special case so music follows
the same romCount > 0 visibility rule as all other systems