Skip to main content

romm_cli/tui/app/handlers/
navigation.rs

1//! Library startup and overlay restore helpers.
2
3use std::time::Instant;
4
5use crate::core::startup_library_snapshot;
6
7use super::super::{App, AppScreen};
8use crate::tui::screens::LibraryBrowseScreen;
9
10impl App {
11    pub(in crate::tui::app) fn is_overlay_screen(screen: &AppScreen) -> bool {
12        matches!(
13            screen,
14            AppScreen::Search(_) | AppScreen::Settings(_) | AppScreen::Download(_)
15        )
16    }
17
18    /// Short-lived placeholder during `mem::replace` screen swaps.
19    pub(in crate::tui::app) fn transient_screen_placeholder(&self) -> AppScreen {
20        AppScreen::LibraryBrowse(Box::new(LibraryBrowseScreen::new(
21            Vec::new(),
22            Vec::new(),
23            self.config.tui_layout.library_left_panel_percent,
24        )))
25    }
26
27    /// Open library browse (startup home) with snapshot preload and metadata refresh.
28    pub fn open_library_browse(&mut self) {
29        let start = Instant::now();
30        let snap = startup_library_snapshot::load_snapshot();
31        let (platforms, collections, from_disk) = match snap {
32            Some(s) => (s.platforms, s.collections, true),
33            None => (Vec::new(), Vec::new(), false),
34        };
35        let mut lib = LibraryBrowseScreen::new(
36            platforms,
37            collections,
38            self.config.tui_layout.library_left_panel_percent,
39        );
40        if from_disk && lib.list_len() > 0 {
41            lib.set_metadata_footer(Some("Refreshing library metadata in background…".into()));
42        } else if lib.list_len() == 0 {
43            lib.set_metadata_footer(Some("Loading library metadata…".into()));
44        }
45        if lib.list_len() > 0 {
46            let key = lib.cache_key();
47            let expected = lib.expected_rom_count();
48            let req = Self::selected_rom_request_for_library(&lib);
49            lib.set_rom_loading(expected > 0);
50            self.queue_primary_rom_load(key, req, expected, "startup_first_selection");
51        }
52        self.screen = AppScreen::LibraryBrowse(Box::new(lib));
53        self.spawn_library_metadata_refresh();
54        tracing::debug!(
55            "library-open latency_ms={} snapshot_hit={}",
56            start.elapsed().as_millis(),
57            from_disk
58        );
59    }
60
61    pub(in crate::tui::app) fn restore_screen_or_library(&mut self, stored: Option<AppScreen>) {
62        self.screen = stored.unwrap_or_else(|| {
63            let mut lib = LibraryBrowseScreen::new(
64                Vec::new(),
65                Vec::new(),
66                self.config.tui_layout.library_left_panel_percent,
67            );
68            lib.set_metadata_footer(Some("Loading library metadata…".into()));
69            AppScreen::LibraryBrowse(Box::new(lib))
70        });
71        if matches!(self.screen, AppScreen::LibraryBrowse(_)) {
72            self.spawn_library_metadata_refresh();
73        }
74    }
75}