diff options
| author | Joe Carstairs <me@joeac.net> | 2025-08-25 18:22:00 +0100 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2025-08-25 18:22:00 +0100 |
| commit | 86487b8ff6e691f2b261a93733df8f4cc5dc7320 (patch) | |
| tree | 8d116acb31fe3bf8ce5d4201ae0bbc36ce6cc38a /schist_desktop_gui/src/gui/components/navigation.rs | |
| parent | fe85652e4d3e8906824baddaafd05d19105579b8 (diff) | |
refactor navigation
Diffstat (limited to 'schist_desktop_gui/src/gui/components/navigation.rs')
| -rw-r--r-- | schist_desktop_gui/src/gui/components/navigation.rs | 86 |
1 files changed, 55 insertions, 31 deletions
diff --git a/schist_desktop_gui/src/gui/components/navigation.rs b/schist_desktop_gui/src/gui/components/navigation.rs index bed3221..6dbe622 100644 --- a/schist_desktop_gui/src/gui/components/navigation.rs +++ b/schist_desktop_gui/src/gui/components/navigation.rs @@ -1,19 +1,9 @@ -mod new_navigation; mod update_navigation; mod view_navigation; mod view_navigation_button; -use new_navigation::new_navigation; -use update_navigation::update_navigation; -use view_navigation::view_navigation; -use view_navigation_button::view_navigation_button; - use std::fmt::Debug; -use iced::Element; - -use crate::traits::{Component, Viewable}; - #[derive(Clone, Debug)] pub struct Navigation<TOption> { options_before_active: Vec<TOption>, @@ -36,33 +26,67 @@ pub enum Action<TOption> { impl<TOption: Clone + Debug + PartialEq> Navigation<TOption> { pub fn new(active_option: Option<TOption>, options: Vec<TOption>) -> Self { - new_navigation(active_option, options) + let active_option_index = active_option.clone().map_or(Option::None, |active_option| { + options.iter().position(|option| option.eq(&active_option)) + }); + if let Some(active_option_index) = active_option_index { + let split = options.split_at(active_option_index); + Navigation { + options_before_active: split.0.to_vec(), + active_option: active_option, + options_after_active: split.1.split_at(1).1.to_vec(), + } + } else { + Navigation { + options_before_active: options, + active_option: active_option, + options_after_active: vec![], + } + } } } -impl<'a, TOption> Navigation<TOption> -where - TOption: Clone + PartialEq + Into<Element<'a, Message<TOption>>>, -{ - pub fn button(&'a self, option: &'a TOption) -> Element<'a, Message<TOption>> { - view_navigation_button(self, option) +#[cfg(test)] +mod test { + use super::Navigation; + + #[test] + fn when_active_option_at_start_of_options_then_finds_active_option() { + let navigation = Navigation::new(Some(1), vec![1, 2, 3, 4, 5]); + assert_eq!(Vec::<i32>::new(), navigation.options_before_active); + assert_eq!(Some(1), navigation.active_option); + assert_eq!(vec![2, 3, 4, 5], navigation.options_after_active); } -} -impl<'a, TOption> Viewable<'a, Message<TOption>> for Navigation<TOption> -where - TOption: Clone + PartialEq + Into<Element<'a, Message<TOption>>>, -{ - fn view(&'a self) -> iced::Element<'a, Message<TOption>> { - view_navigation(self) + #[test] + fn when_active_option_in_middle_of_options_then_finds_active_option() { + let navigation = Navigation::new(Some(3), vec![1, 2, 3, 4, 5]); + assert_eq!(vec![1, 2], navigation.options_before_active); + assert_eq!(Some(3), navigation.active_option); + assert_eq!(vec![4, 5], navigation.options_after_active); + } + + #[test] + fn when_active_option_at_end_of_options_then_finds_active_option() { + let navigation = Navigation::new(Some(5), vec![1, 2, 3, 4, 5]); + assert_eq!(vec![1, 2, 3, 4], navigation.options_before_active); + assert_eq!(Some(5), navigation.active_option); + assert_eq!(Vec::<i32>::new(), navigation.options_after_active); + } + + #[test] + fn when_active_option_not_in_options_then_appends_active_option() { + let navigation = Navigation::new(Some(6), vec![1, 2, 3, 4, 5]); + assert_eq!(vec![1, 2, 3, 4, 5], navigation.options_before_active); + assert_eq!(Some(6), navigation.active_option); + assert_eq!(Vec::<i32>::new(), navigation.options_after_active); } -} -impl<'a, TOption> Component<'a, Message<TOption>, Action<TOption>> for Navigation<TOption> -where - TOption: Clone + PartialEq + Into<Element<'a, Message<TOption>>>, -{ - fn update(&mut self, message: Message<TOption>) -> Action<TOption> { - update_navigation(self, message) + #[test] + fn when_no_active_option_then_all_options_are_before_active_option() { + let navigation = Navigation::new(None, vec![1, 2, 3, 4, 5]); + assert_eq!(vec![1, 2, 3, 4, 5], navigation.options_before_active); + assert_eq!(None, navigation.active_option); + assert_eq!(Vec::<i32>::new(), navigation.options_after_active); } } |
