readdy/src/apps/menu.rs
2024-09-18 13:23:15 +02:00

102 lines
2.6 KiB
Rust

use crate::Button;
use super::*;
use profont::PROFONT_18_POINT;
use strum::IntoEnumIterator;
#[derive(Debug, Clone, Copy, Default, PartialEq, strum::EnumIter)]
enum MenuEntry {
#[default]
Labirynth,
Pairs,
}
impl MenuEntry {
fn as_str(&self) -> &str {
match self {
MenuEntry::Labirynth => "Labirynt",
MenuEntry::Pairs => "Pary",
}
}
fn position(&self) -> Point {
match self {
MenuEntry::Labirynth => Point::new(20, 38),
MenuEntry::Pairs => Point::new(20, 68),
}
}
}
pub struct Menu {
selected: MenuEntry,
}
impl Menu {
pub fn new() -> Menu {
Menu {
selected: MenuEntry::default(),
}
}
}
impl App for Menu {
fn start(&mut self, _trng: &mut Trng) {}
fn update(&mut self, ctx: &Context) -> Action {
let Some(button) = ctx.button_pressed else {
return Action::Noop;
};
match button {
Button::Up => match self.selected {
MenuEntry::Labirynth => return Action::Noop,
MenuEntry::Pairs => {
self.selected = MenuEntry::Labirynth;
}
},
Button::Down => match self.selected {
MenuEntry::Labirynth => {
self.selected = MenuEntry::Pairs;
}
MenuEntry::Pairs => return Action::Noop,
},
Button::Circle => match self.selected {
MenuEntry::Labirynth => return Action::StartMaze,
MenuEntry::Pairs => return Action::StartPairs,
},
_ => return Action::Noop,
};
Action::Noop
}
fn draw(&self, display: &mut Display290TriColor) {
let style = MonoTextStyle::new(&PROFONT_18_POINT, TriColor::Black);
let selected_style = MonoTextStyle::new(&PROFONT_18_POINT, TriColor::Red);
MenuEntry::iter().for_each(|entry| {
if entry == self.selected {
let _ = Text::with_text_style(
"> ",
Point::new(2, entry.position().y),
selected_style,
TextStyle::default(),
)
.draw(display)
.unwrap();
};
let _ = Text::with_text_style(
entry.as_str(),
entry.position(),
if entry == self.selected {
selected_style
} else {
style
},
TextStyle::default(),
)
.draw(display)
.unwrap();
});
}
}