summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components/navigation.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2025-08-25 18:22:00 +0100
committerJoe Carstairs <me@joeac.net>2025-08-25 18:22:00 +0100
commit86487b8ff6e691f2b261a93733df8f4cc5dc7320 (patch)
tree8d116acb31fe3bf8ce5d4201ae0bbc36ce6cc38a /schist_desktop_gui/src/gui/components/navigation.rs
parentfe85652e4d3e8906824baddaafd05d19105579b8 (diff)
refactor navigation
Diffstat (limited to 'schist_desktop_gui/src/gui/components/navigation.rs')
-rw-r--r--schist_desktop_gui/src/gui/components/navigation.rs86
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);
}
}