romm_cli/tui/app/handlers/
navigation.rs1use 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 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 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}