romm-cli 0.38.0

Rust-based CLI and TUI for the ROMM API
Documentation
use ratatui::widgets::{List, ListItem, ListState};
use ratatui::Frame;

use crate::tui::theme::RommStyles;

/// Simple main menu screen for choosing the high-level mode.
pub struct MainMenuScreen {
    pub selected: usize,
}

impl Default for MainMenuScreen {
    fn default() -> Self {
        Self::new()
    }
}

impl MainMenuScreen {
    pub fn new() -> Self {
        Self { selected: 0 }
    }

    pub fn next(&mut self) {
        self.selected = (self.selected + 1) % 5;
    }

    pub fn previous(&mut self) {
        self.selected = if self.selected == 0 {
            4
        } else {
            self.selected - 1
        };
    }

    pub fn render(&self, f: &mut Frame, area: ratatui::layout::Rect, styles: &RommStyles) {
        let items = vec![
            ListItem::new("Browse Games").style(styles.text()),
            ListItem::new("Search").style(styles.text()),
            ListItem::new("Downloads").style(styles.text()),
            ListItem::new("Settings").style(styles.text()),
            ListItem::new("Exit").style(styles.text()),
        ];

        let list = List::new(items)
            .block(styles.panel_block("Game Library"))
            .highlight_symbol(">> ")
            .highlight_style(styles.selection());

        let mut state = ListState::default();
        state.select(Some(self.selected));

        f.render_stateful_widget(list, area, &mut state);
    }
}