use iced::Element; use crate::traits::Focusable; use super::{Message, Navigation}; pub enum SetOptionsResult { SetOptionsAndKeptSelection, SetOptionsAndSetSelectedOption(TOption), } impl<'a, TOption> Navigation where TOption: Clone + Focusable + PartialEq + 'a, Element<'a, Message>: From<&'a TOption>, { pub fn set_options(&mut self, options: &mut Vec) -> SetOptionsResult { options.iter_mut().for_each(TOption::unfocus); let active_option_index = self.active_option .clone() .map_or(Option::None, |active_option| { options .iter() .position(|option| active_option == option.clone()) }); if let Some(active_option_index) = active_option_index { let split = options.split_at(active_option_index); self.options_before_active = split.0.to_vec(); self.options_after_active = split.1.split_at(1).1.to_vec(); SetOptionsResult::SetOptionsAndKeptSelection } else { self.options_before_active = options .split_last() .map_or_else(Vec::new, |(_last, rest)| rest.to_vec()); self.active_option = options.last().cloned(); self.active_option.iter_mut().for_each(TOption::focus); options.last().cloned().map_or( SetOptionsResult::SetOptionsAndKeptSelection, SetOptionsResult::SetOptionsAndSetSelectedOption, ) } } }