Skip to main content

romm_cli/tui/screens/
main_menu.rs

1use ratatui::widgets::{List, ListItem, ListState};
2use ratatui::Frame;
3
4use crate::tui::theme::RommStyles;
5
6/// Simple main menu screen for choosing the high-level mode.
7pub struct MainMenuScreen {
8    pub selected: usize,
9}
10
11impl Default for MainMenuScreen {
12    fn default() -> Self {
13        Self::new()
14    }
15}
16
17impl MainMenuScreen {
18    pub fn new() -> Self {
19        Self { selected: 0 }
20    }
21
22    pub fn next(&mut self) {
23        self.selected = (self.selected + 1) % 5;
24    }
25
26    pub fn previous(&mut self) {
27        self.selected = if self.selected == 0 {
28            4
29        } else {
30            self.selected - 1
31        };
32    }
33
34    pub fn render(&self, f: &mut Frame, area: ratatui::layout::Rect, styles: &RommStyles) {
35        let items = vec![
36            ListItem::new("Browse Games").style(styles.text()),
37            ListItem::new("Search").style(styles.text()),
38            ListItem::new("Downloads").style(styles.text()),
39            ListItem::new("Settings").style(styles.text()),
40            ListItem::new("Exit").style(styles.text()),
41        ];
42
43        let list = List::new(items)
44            .block(styles.panel_block("Game Library"))
45            .highlight_symbol(">> ")
46            .highlight_style(styles.selection());
47
48        let mut state = ListState::default();
49        state.select(Some(self.selected));
50
51        f.render_stateful_widget(list, area, &mut state);
52    }
53}