From 691ef2b26b733426d293c468e78c3133c9bfe7df Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Mon, 10 Nov 2025 13:30:37 -0700 Subject: [PATCH] fix selection ui --- selection_ui/src/lib.rs | 28 +++++++++++++++++++--------- user-apps/gif/src/main.rs | 13 +++++++------ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/selection_ui/src/lib.rs b/selection_ui/src/lib.rs index a5d37d5..ccb175e 100644 --- a/selection_ui/src/lib.rs +++ b/selection_ui/src/lib.rs @@ -53,7 +53,6 @@ impl<'a> SelectionUi<'a> { loop { let key = get_key(); if key.state == KeyState::Pressed { - print!("Got Key press: {:?}", key.key); if let Some(s) = self.update(display, key.key)? { selection = Some(s); break; @@ -70,16 +69,18 @@ impl<'a> SelectionUi<'a> { display: &mut Display, key: KeyCode, ) -> Result, SelectionUiError<::Error>> { + print!("Got Key: {:?}", key); match key { - KeyCode::JoyDown => { + KeyCode::Down => { self.selection = (self.selection + 1).min(self.items.len() - 1); } - KeyCode::JoyUp => { + KeyCode::Up => { self.selection = self.selection.saturating_sub(1); } - KeyCode::Enter | KeyCode::JoyRight => return Ok(Some(self.selection)), - _ => return Ok(Some(self.selection)), + KeyCode::Enter | KeyCode::Right => return Ok(Some(self.selection)), + _ => return Ok(None), }; + print!("new selection: {:?}", self.selection); self.draw(display)?; Ok(None) } @@ -95,6 +96,13 @@ impl<'a> SelectionUi<'a> { return Err(SelectionUiError::SelectionListEmpty); } + if let Some(bounds) = self.last_bounds { + Rectangle::new(bounds.top_left, bounds.size) + .into_styled(PrimitiveStyle::with_fill(Rgb565::BLACK)) + .draw(display) + .map_err(|e| SelectionUiError::DisplayError(e))?; + } + let mut views: Vec>> = Vec::new(); for i in self.items { @@ -109,6 +117,10 @@ impl<'a> SelectionUi<'a> { .arrange() .align_to(&display_area, horizontal::Center, vertical::Center); + layout + .draw(display) + .map_err(|e| SelectionUiError::DisplayError(e))?; + // draw selected box if let Some(selected_bounds) = layout.inner().get(self.selection) { let selected_bounds = selected_bounds.bounding_box(); @@ -117,12 +129,10 @@ impl<'a> SelectionUi<'a> { .draw(display) .map_err(|e| SelectionUiError::DisplayError(e))?; - self.last_bounds = Some(layout.bounds()); + self.last_bounds = Some(selected_bounds); } - layout - .draw(display) - .map_err(|e| SelectionUiError::DisplayError(e)) + Ok(()) } } diff --git a/user-apps/gif/src/main.rs b/user-apps/gif/src/main.rs index 6ed7189..77f580b 100644 --- a/user-apps/gif/src/main.rs +++ b/user-apps/gif/src/main.rs @@ -3,7 +3,7 @@ extern crate alloc; use abi::{ - display::Display, + display::{Display, SCREEN_HEIGHT, SCREEN_WIDTH}, fs::{Entries, file_len, list_dir, read_file}, get_key, get_ms, keyboard::{KeyCode, KeyState}, @@ -70,17 +70,18 @@ pub fn main() { assert!(read == size); let gif = Gif::::from_slice(&buf).expect("Failed to parse gif"); - let height = gif.height(); + + let translation = Point::new( + (SCREEN_WIDTH as i32 - gif.width() as i32) / 2, + (SCREEN_HEIGHT as i32 - gif.height() as i32) / 2, + ); let mut frame_num = 0; loop { for mut frame in gif.frames() { let start = get_ms(); - frame - .translate_mut(Point::new(0, (320 - height as i32) / 2)) - .draw(&mut display) - .unwrap(); + frame.translate_mut(translation).draw(&mut display).unwrap(); frame_num += 1; if frame_num % 5 == 0 {