diff options
| author | Joe Carstairs <me@joeac.net> | 2026-02-07 11:52:08 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2026-02-07 12:02:27 +0000 |
| commit | 1664e741ad35ce52a01788c34029f0b2ea477e32 (patch) | |
| tree | dd6bd7c83a7e834c75815a786d67b5188cdd1f48 /schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs | |
| parent | 179878d12ba10ac242da2044f4c6dfe4d4829e59 (diff) | |
task-001: can navigate file screen options with keyboard
Diffstat (limited to 'schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs')
| -rw-r--r-- | schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs b/schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs index f399cd0..72bc503 100644 --- a/schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs +++ b/schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs @@ -1,24 +1,39 @@ use iced::Element; -use crate::traits::{Navigable, NavigationResult}; +use crate::traits::{Focusable, Navigable, NavigationResult}; use super::{Message, Navigation}; impl<'a, TOption> Navigable<TOption> for Navigation<TOption> where - TOption: Clone + PartialEq + 'a, + TOption: Clone + Focusable + PartialEq + 'a, Element<'a, Message<TOption>>: From<&'a TOption>, { fn move_next(&mut self) -> NavigationResult<TOption> { - if let Some(next) = self.options_after_active.clone().first() { + if let Some(next) = self.options_after_active.clone().first_mut() { self.options_before_active = vec![ self.options_before_active.clone(), - self.active_option.clone().map_or(vec![], |o| vec![o]), + self.active_option.clone().map_or_else(Vec::new, |mut o| { + o.unfocus(); + vec![o] + }), ] .concat(); + next.focus(); self.active_option = Some(next.clone()); - self.options_after_active = self.options_after_active.split_at(1).1.to_vec(); + self.options_after_active.remove(0); NavigationResult::Moved(next.clone()) + } else if let Some(first) = self + .options_before_active + .clone() + .first_mut() + .filter(|_| self.active_option.is_none()) + { + self.options_after_active = self.options_before_active.split_at(1).1.to_vec(); + self.options_before_active = Vec::new(); + first.focus(); + self.active_option = Some(first.clone()); + NavigationResult::Moved(first.clone()) } else { NavigationResult::LastOption } @@ -27,11 +42,15 @@ where fn move_prev(&mut self) -> NavigationResult<TOption> { if let Some(prev) = self.options_before_active.clone().last() { self.options_after_active = vec![ - self.active_option.clone().map_or(vec![], |o| vec![o]), + self.active_option.clone().map_or(vec![], |mut o| { + o.unfocus(); + vec![o] + }), self.options_after_active.clone(), ] .concat(); self.active_option = Some(prev.clone()); + self.active_option.iter_mut().for_each(TOption::focus); self.options_before_active = self .options_before_active .split_last() |
