diff --git a/src/apps.rs b/src/apps.rs index f780079..12c35a2 100644 --- a/src/apps.rs +++ b/src/apps.rs @@ -23,25 +23,29 @@ pub struct Menu { } impl Menu { - pub fn go_left(&mut self) { - if self.current_submenu_id > 0 { - self.current_submenu_id -= 1; + pub fn set_submenu_id(&mut self, id: usize) { + if id >= self.submenus.len() { + panic!("Invalid submenu id"); } - } - pub fn go_right(&mut self) { - if self.current_submenu_id < self.submenus.len() - 1 { - self.current_submenu_id += 1; - } - } - fn select_submenu(&mut self) { + self.current_submenu_id = id; self.selected_submenu = Some(self.submenus[self.current_submenu_id].clone()); } - pub fn get_deepest_selected_submenu(&self) -> &Menu { - match &self.selected_submenu { - Some(selected_submenu) => selected_submenu.get_deepest_selected_submenu(), - None => self, + pub fn get_deepest_selected_submenu_mut(&mut self) -> &mut Menu { + // Use a loop to traverse to the deepest submenu + let mut current_menu = self; + while let Some(ref mut selected_submenu) = current_menu.selected_submenu { + current_menu = selected_submenu; } + current_menu + } + pub fn get_deepest_selected_submenu(&self) -> &Menu { + // Use a loop to traverse to the deepest submenu + let mut current_menu = self; + while let Some(ref selected_submenu) = current_menu.selected_submenu { + current_menu = selected_submenu; + } + current_menu } } pub trait App { @@ -58,13 +62,39 @@ impl Spotify { fn new() -> Self { let spotify_menus = vec![ Box::new(Menu { - submenus: vec![], + submenus: vec![ + Box::new(Menu { + submenus: vec![], + current_submenu_id: 0, + selected_submenu: None, + name: "Liked Songs".to_string(), + }), + Box::new(Menu { + submenus: vec![], + current_submenu_id: 0, + selected_submenu: None, + name: "Recently Played".to_string(), + }), + ], current_submenu_id: 0, selected_submenu: None, name: "Playlists".to_string(), }), Box::new(Menu { - submenus: vec![], + submenus: vec![ + Box::new(Menu { + submenus: vec![], + current_submenu_id: 0, + selected_submenu: None, + name: "Mike Oldfield".to_string(), + }), + Box::new(Menu { + submenus: vec![], + current_submenu_id: 0, + selected_submenu: None, + name: "JM. Jarre".to_string(), + }), + ], current_submenu_id: 0, selected_submenu: None, name: "Artists".to_string(), diff --git a/src/ui.rs b/src/ui.rs index bb4cd7c..5960380 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -2,7 +2,7 @@ use femtovg::{Align, Baseline, Canvas, Color, Paint, Path, Renderer}; use crate::{hid::Beo5Event, Fonts}; -use crate::apps::{App, BeoApps}; +use crate::apps::{App, BeoApps, Menu}; use crate::roundy_math; pub struct BeoUi { @@ -85,36 +85,31 @@ impl BeoUi { if let Some(selected_app) = self.current_app() { let selected_menu = selected_app.base().main_menu.get_deepest_selected_submenu(); let menu_count = selected_menu.submenus.len(); + println!("helol menu_count: {}", menu_count); let max_angle = (menu_count - 1) as f32 * ANGLE_DEG_BETWEEN_MENU_ITEMS + 10.; + println!("max_angle: {}", max_angle); if self.angle_shift > max_angle { self.angle_shift = max_angle; } } - - self.choose_app_wheel_angle(); } - fn choose_app_wheel_angle(&mut self) { + pub fn get_selected_wheel_angle_menu_id(&self) -> Option { + println!("choose_app_wheel_angle"); + let angle = self.angle_shift; if let Some(selected_app) = self.current_app() { - let selected_menu = selected_app.base().main_menu.get_deepest_selected_submenu(); - let menu_count = selected_menu.submenus.len(); - let max_angle = (menu_count - 1) as f32 * -ANGLE_DEG_BETWEEN_MENU_ITEMS - 10.; + let actual_menu = selected_app.base().main_menu.get_deepest_selected_submenu(); + let menu_count = actual_menu.submenus.len(); + let max_angle = (menu_count - 1) as f32 * ANGLE_DEG_BETWEEN_MENU_ITEMS - 10.; - let angle = self.angle_shift; - println!("Angle before: {}", angle); - let angle = angle.max(max_angle); - let angle = angle.min(0.); + let angle = angle.min(max_angle); + let angle = angle.max(0.); - println!("Angle: {}", angle); - let menu_id_unrounded = (angle - max_angle) / ANGLE_DEG_BETWEEN_MENU_ITEMS; - println!("Menu id unrounded: {}", menu_id_unrounded); - let menu_id_unrounded = angle / ANGLE_DEG_BETWEEN_MENU_ITEMS; - println!("Menu id unrounded bis : {}", menu_id_unrounded); let menu_id = (angle / ANGLE_DEG_BETWEEN_MENU_ITEMS).round() as usize; - println!("Menu id: {}", menu_id); - //selected_app.base_mut().main_menu.selected_id = menu_id; + return Some(menu_id); } + None } pub fn accept_event(&mut self, event: Beo5Event) { @@ -124,16 +119,25 @@ impl BeoUi { self.choose_app_from_laser_pct(); } Beo5Event::LeftButtonPressed => { - println!("Left button pressed"); - if let Some(selected_app) = self.current_app_mut() { - selected_app.base_mut().main_menu.go_left(); + println!("Left button pressed. Will select submenu"); + let submenu_id = self.get_selected_wheel_angle_menu_id(); + match submenu_id { + Some(submenu_id) => { + self.current_app_mut() + .unwrap() + .base_mut() + .main_menu + .get_deepest_selected_submenu_mut() + .set_submenu_id(submenu_id); + self.angle_shift = 0.0; + } + None => { + println!("No submenu id found"); + } } } Beo5Event::RightButtonPressed => { println!("Right button pressed"); - if let Some(selected_app) = self.current_app_mut() { - selected_app.base_mut().main_menu.go_right(); - } } Beo5Event::SelectionWheelRel(rel_angle_eps) => { self.time_without_wheel_spin = 0.0; @@ -144,6 +148,15 @@ impl BeoUi { // TODO: pass event to current app } } + println!( + "Current submenu: {:?}", + self.current_app_mut() + .unwrap() + .base_mut() + .main_menu + .get_deepest_selected_submenu() + .name + ); } pub fn draw(&self, canvas: &mut Canvas, fonts: &Fonts) {