summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-02-07 11:52:08 +0000
committerJoe Carstairs <me@joeac.net>2026-02-07 12:02:27 +0000
commit1664e741ad35ce52a01788c34029f0b2ea477e32 (patch)
treedd6bd7c83a7e834c75815a786d67b5188cdd1f48 /schist_desktop_gui/src/gui/components/navigation/navigate_navigation.rs
parent179878d12ba10ac242da2044f4c6dfe4d4829e59 (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.rs31
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()