use iced::Element; use crate::traits::{Focusable, Navigable, NavigationResult}; use super::{Message, Navigation}; impl<'a, TOption> Navigable for Navigation where TOption: Clone + Focusable + PartialEq + 'a, Element<'a, Message>: From<&'a TOption>, { fn move_next(&mut self) -> NavigationResult { 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_else(Vec::new, |mut o| { o.unfocus(); vec![o] }), ] .concat(); next.focus(); self.active_option = Some(next.clone()); 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 } } fn move_prev(&mut self) -> NavigationResult { if let Some(prev) = self.options_before_active.clone().last() { self.options_after_active = vec![ 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() .map(|split| split.1.to_vec()) .unwrap_or_else(Vec::new); NavigationResult::Moved(prev.clone()) } else { NavigationResult::LastOption } } }