use iced::Element; use super::{Message, Navigation}; pub enum SetOptionsResult { SetOptionsAndKeptSelection, SetOptionsAndSetSelectedOption(TOption), } impl<'a, TOption> Navigation where TOption: Clone + PartialEq + 'a, Element<'a, Message>: From<&'a TOption>, { pub fn set_options(&mut self, options: Vec) -> SetOptionsResult { 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(); options.last().cloned().map_or( SetOptionsResult::SetOptionsAndKeptSelection, SetOptionsResult::SetOptionsAndSetSelectedOption, ) } } }