diff --git a/src/bin/main.rs b/src/bin/main.rs index 813e465..1c6baed 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -10,12 +10,12 @@ use alloc::boxed::Box; use creaturedex::card::mock::{MOCK_PAYLOAD, MOCK_PAYLOAD2}; use creaturedex::display::primary_lcd::{PrimaryLcdDisplay, init_primary_lcd}; -use creaturedex::display::views::card_view::render_nfc_payload; use creaturedex::drivers::nfc_pn532::NfcPn532Driver; use creaturedex::navigation::inputs::Inputs; use creaturedex::navigation::navigation; use creaturedex::navigation::state::NavigationState; use creaturedex::network::wifi::setup_wifi; +use creaturedex::views::card_view::render_nfc_payload; use embassy_executor::Spawner; use embassy_time::Timer; use embedded_graphics::draw_target::DrawTarget; diff --git a/src/display.rs b/src/display.rs index 8e7dab1..b700989 100644 --- a/src/display.rs +++ b/src/display.rs @@ -3,4 +3,3 @@ pub mod primary_lcd; pub mod secondary_oled; pub mod sprite; pub mod tertiary_lcd; -pub mod views; diff --git a/src/display/views.rs b/src/display/views.rs deleted file mode 100644 index 6fdd38d..0000000 --- a/src/display/views.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod card_view; -pub mod menu_view; -pub mod status_bar; diff --git a/src/display/views/menu_view.rs b/src/display/views/menu_view.rs deleted file mode 100644 index dd7ab64..0000000 --- a/src/display/views/menu_view.rs +++ /dev/null @@ -1 +0,0 @@ -// Menu view module diff --git a/src/lib.rs b/src/lib.rs index 7e00201..501ca20 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,3 +8,4 @@ pub mod drivers; pub mod navigation; pub mod network; pub mod storage; +pub mod views; diff --git a/src/navigation.rs b/src/navigation.rs index d228ed0..6bee9cb 100644 --- a/src/navigation.rs +++ b/src/navigation.rs @@ -1,7 +1,3 @@ pub mod inputs; -pub mod main_menu; -pub mod menu_item; pub mod navigation; -pub mod scan_menu; -pub mod settings_menu; pub mod state; diff --git a/src/navigation/navigation.rs b/src/navigation/navigation.rs index b0b008d..39539dd 100644 --- a/src/navigation/navigation.rs +++ b/src/navigation/navigation.rs @@ -1,5 +1,5 @@ -use crate::navigation::scan_menu::ScanMenu; -use crate::navigation::state::{NavigationState, ScreenItem}; +use crate::navigation::state::NavigationState; +use crate::views::view::View; use crate::{display::primary_lcd::PrimaryLcdDisplay, navigation::inputs::Inputs}; use embassy_futures::select::Either6; @@ -23,7 +23,7 @@ pub trait Navigable { &self, display: &mut PrimaryLcdDisplay<'static>, ) -> impl core::future::Future + Send; - fn handle_input(&self, input: Action) -> impl core::future::Future + Send; + fn handle_input(&self, input: Action) -> impl core::future::Future + Send; } #[embassy_executor::task] diff --git a/src/navigation/state.rs b/src/navigation/state.rs index 2d9da45..5fdcb13 100644 --- a/src/navigation/state.rs +++ b/src/navigation/state.rs @@ -1,53 +1,16 @@ -use crate::navigation::{ - main_menu::MainMenu, navigation::Navigable, scan_menu::ScanMenu, settings_menu::SettingsMenu, -}; +use crate::views::{main_menu::MainMenu, view::View}; use alloc::vec; use alloc::vec::Vec; -#[derive(Debug, Clone)] -pub enum ScreenItem { - Main(MainMenu), - Scan(ScanMenu), - Settings(SettingsMenu), -} - -impl Navigable for ScreenItem { - fn display( - &self, - display: &mut crate::display::primary_lcd::PrimaryLcdDisplay<'static>, - ) -> impl core::future::Future + Send { - async move { - match self { - ScreenItem::Main(main_menu) => main_menu.display(display).await, - ScreenItem::Scan(scan_menu) => scan_menu.display(display).await, - ScreenItem::Settings(settings_menu) => settings_menu.display(display).await, - } - } - } - - fn handle_input( - &self, - input: crate::navigation::navigation::Action, - ) -> impl core::future::Future + Send { - async move { - match self { - ScreenItem::Main(main_menu) => main_menu.handle_input(input).await, - ScreenItem::Scan(scan_menu) => scan_menu.handle_input(input).await, - ScreenItem::Settings(settings_menu) => settings_menu.handle_input(input).await, - } - } - } -} - #[derive(Debug, Clone)] pub struct NavigationState { - pub screens: Vec, + pub screens: Vec, } impl Default for NavigationState { fn default() -> Self { Self { - screens: vec![ScreenItem::Main(MainMenu { selected: 0 })], + screens: vec![View::Main(MainMenu { selected: 0 })], } } } @@ -57,7 +20,7 @@ impl NavigationState { Self::default() } - pub fn back(&mut self) -> ScreenItem { + pub fn back(&mut self) -> View { let screen = self.screens.pop().unwrap(); if self.screens.is_empty() { log::info!("last screen"); diff --git a/src/views.rs b/src/views.rs new file mode 100644 index 0000000..fa99794 --- /dev/null +++ b/src/views.rs @@ -0,0 +1,7 @@ +pub mod card_view; +pub mod main_menu; +pub mod menu_item; +pub mod scan_menu; +pub mod settings_menu; +pub mod status_bar; +pub mod view; diff --git a/src/display/views/card_view.rs b/src/views/card_view.rs similarity index 100% rename from src/display/views/card_view.rs rename to src/views/card_view.rs diff --git a/src/navigation/main_menu.rs b/src/views/main_menu.rs similarity index 59% rename from src/navigation/main_menu.rs rename to src/views/main_menu.rs index 3ebff0c..0cb2eec 100644 --- a/src/navigation/main_menu.rs +++ b/src/views/main_menu.rs @@ -1,16 +1,14 @@ use core::future; -use crate::{display::primary_lcd::PrimaryLcdDisplay, navigation::inputs::Inputs}; +use crate::display::primary_lcd::PrimaryLcdDisplay; -use crate::navigation::menu_item; -use crate::navigation::settings_menu::SettingsMenu; +use crate::views::{menu_item, settings_menu::SettingsMenu, view::View}; +use crate::navigation::navigation::{Action, Navigable}; use embedded_graphics::pixelcolor::Rgb565; use embedded_graphics::prelude::RgbColor; use embedded_graphics_core::draw_target::DrawTarget; -use super::state::ScreenItem; - pub const MAX_SELECTED: i32 = 3; #[derive(Debug, Clone)] @@ -18,7 +16,7 @@ pub struct MainMenu { pub selected: i32, } -impl super::navigation::Navigable for MainMenu { +impl Navigable for MainMenu { fn display( &self, display: &mut PrimaryLcdDisplay<'static>, @@ -32,32 +30,29 @@ impl super::navigation::Navigable for MainMenu { core::future::ready(()) } - fn handle_input( - &self, - input: super::navigation::Action, - ) -> impl core::future::Future + Send { + fn handle_input(&self, input: Action) -> impl core::future::Future + Send { let new_menu = match input { - super::navigation::Action::Up => { + Action::Up => { let new_selected = if (self.selected - 1) < 0 { MAX_SELECTED - 1 } else { self.selected - 1 }; - ScreenItem::Main(MainMenu { + View::Main(MainMenu { selected: new_selected, }) } - super::navigation::Action::Down => { + Action::Down => { let new_selected = self.selected.wrapping_add(1) % MAX_SELECTED; - ScreenItem::Main(MainMenu { + View::Main(MainMenu { selected: new_selected, }) } - super::navigation::Action::Ok => match self.selected { - 2 => ScreenItem::Settings(SettingsMenu { selected: 0 }), - _ => ScreenItem::Main(self.clone()), + Action::Ok => match self.selected { + 2 => View::Settings(SettingsMenu { selected: 0 }), + _ => View::Main(self.clone()), }, - _ => ScreenItem::Main(self.clone()), + _ => View::Main(self.clone()), }; future::ready(new_menu) diff --git a/src/navigation/menu_item.rs b/src/views/menu_item.rs similarity index 100% rename from src/navigation/menu_item.rs rename to src/views/menu_item.rs diff --git a/src/navigation/scan_menu.rs b/src/views/scan_menu.rs similarity index 94% rename from src/navigation/scan_menu.rs rename to src/views/scan_menu.rs index 31dc505..e113390 100644 --- a/src/navigation/scan_menu.rs +++ b/src/views/scan_menu.rs @@ -21,15 +21,15 @@ use embedded_graphics::text::Text; use embedded_graphics::text::TextStyleBuilder; use embedded_graphics_core::draw_target::DrawTarget; -use super::navigation::Action; -use super::state::ScreenItem; +use crate::navigation::navigation::{Action, Navigable}; +use crate::views::view::View; #[derive(Debug, Clone)] pub struct ScanMenu { pub progress: u8, // 0..255 } -impl super::navigation::Navigable for ScanMenu { +impl Navigable for ScanMenu { fn display( &self, display: &mut PrimaryLcdDisplay<'static>, @@ -82,14 +82,14 @@ impl super::navigation::Navigable for ScanMenu { core::future::ready(()) } - fn handle_input(&self, input: Action) -> impl core::future::Future + Send { + fn handle_input(&self, input: Action) -> impl core::future::Future + Send { async move { let new_progress = match input { Action::Up => self.progress.wrapping_add(5), _ => self.progress, }; - ScreenItem::Scan(ScanMenu { + View::Scan(ScanMenu { progress: new_progress, }) } diff --git a/src/navigation/settings_menu.rs b/src/views/settings_menu.rs similarity index 59% rename from src/navigation/settings_menu.rs rename to src/views/settings_menu.rs index 022e79f..9ace455 100644 --- a/src/navigation/settings_menu.rs +++ b/src/views/settings_menu.rs @@ -1,6 +1,7 @@ -use crate::navigation::menu_item; -use crate::navigation::state::ScreenItem; -use crate::{display::primary_lcd::PrimaryLcdDisplay, navigation::inputs::Inputs}; +use crate::display::primary_lcd::PrimaryLcdDisplay; + +use crate::navigation::navigation::{Action, Navigable}; +use crate::views::{menu_item, view::View}; use embedded_graphics::pixelcolor::Rgb565; use embedded_graphics::prelude::RgbColor; @@ -12,7 +13,7 @@ pub struct SettingsMenu { pub selected: i32, } -impl super::navigation::Navigable for SettingsMenu { +impl Navigable for SettingsMenu { fn display( &self, display: &mut PrimaryLcdDisplay<'static>, @@ -24,10 +25,7 @@ impl super::navigation::Navigable for SettingsMenu { core::future::ready(()) } - fn handle_input( - &self, - input: super::navigation::Action, - ) -> impl core::future::Future + Send { - async move { ScreenItem::Settings(SettingsMenu { selected: 0 }) } + fn handle_input(&self, input: Action) -> impl core::future::Future + Send { + async move { View::Settings(SettingsMenu { selected: 0 }) } } } diff --git a/src/display/views/status_bar.rs b/src/views/status_bar.rs similarity index 100% rename from src/display/views/status_bar.rs rename to src/views/status_bar.rs diff --git a/src/views/view.rs b/src/views/view.rs new file mode 100644 index 0000000..d9db225 --- /dev/null +++ b/src/views/view.rs @@ -0,0 +1,38 @@ +use crate::views::{main_menu::MainMenu, scan_menu::ScanMenu, settings_menu::SettingsMenu}; + +use crate::navigation::navigation::Navigable; + +#[derive(Debug, Clone)] +pub enum View { + Main(MainMenu), + Scan(ScanMenu), + Settings(SettingsMenu), +} + +impl Navigable for View { + fn display( + &self, + display: &mut crate::display::primary_lcd::PrimaryLcdDisplay<'static>, + ) -> impl core::future::Future + Send { + async move { + match self { + View::Main(main_menu) => main_menu.display(display).await, + View::Scan(scan_menu) => scan_menu.display(display).await, + View::Settings(settings_menu) => settings_menu.display(display).await, + } + } + } + + fn handle_input( + &self, + input: crate::navigation::navigation::Action, + ) -> impl core::future::Future + Send { + async move { + match self { + View::Main(main_menu) => main_menu.handle_input(input).await, + View::Scan(scan_menu) => scan_menu.handle_input(input).await, + View::Settings(settings_menu) => settings_menu.handle_input(input).await, + } + } + } +}