summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components/navigation/update_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/update_navigation.rs
parentfe85652e4d3e8906824baddaafd05d19105579b8 (diff)
refactor navigation
Diffstat (limited to 'schist_desktop_gui/src/gui/components/navigation/update_navigation.rs')
-rw-r--r--schist_desktop_gui/src/gui/components/navigation/update_navigation.rs225
1 files changed, 114 insertions, 111 deletions
diff --git a/schist_desktop_gui/src/gui/components/navigation/update_navigation.rs b/schist_desktop_gui/src/gui/components/navigation/update_navigation.rs
index f86867f..c44ddd8 100644
--- a/schist_desktop_gui/src/gui/components/navigation/update_navigation.rs
+++ b/schist_desktop_gui/src/gui/components/navigation/update_navigation.rs
@@ -1,127 +1,130 @@
use iced::Element;
+use crate::traits::Component;
+
use super::{Action, Message, Navigation};
-pub fn update_navigation<'a, TOption>(
- navigation: &mut Navigation<TOption>,
- message: Message<TOption>,
-) -> Action<TOption>
+impl<'a, TOption> Component<'a, Message<TOption>, Action<TOption>> for Navigation<TOption>
where
- TOption: Clone + PartialEq + Into<Element<'a, Message<TOption>>>,
+ TOption: Clone + PartialEq + 'a,
+ Element<'a, Message<TOption>>: From<&'a TOption>,
{
- match message {
- Message::SelectOption(option) => {
- if navigation
- .active_option
- .as_ref()
- .is_some_and(|active_option| active_option.clone() == option)
- {
- Action::None
- } else if let Some(index) = navigation
- .options_before_active
- .iter()
- .position(|o| o.clone() == option)
- {
- let split = navigation.options_before_active.split_at(index);
- navigation.options_after_active = vec![
+ fn update(&mut self, message: Message<TOption>) -> Action<TOption> {
+ let navigation: &mut Navigation<TOption> = self;
+ match message {
+ Message::SelectOption(option) => {
+ if navigation
+ .active_option
+ .as_ref()
+ .is_some_and(|active_option| TOption::eq(active_option, &option))
+ {
+ Action::None
+ } else if let Some(index) = navigation
+ .options_before_active
+ .iter()
+ .position(|o| TOption::eq(o, &option))
+ {
+ let split = navigation.options_before_active.split_at(index);
+ navigation.options_after_active = vec![
+ navigation
+ .active_option
+ .clone()
+ .map_or(vec![], |active_option| vec![active_option]),
+ split.1.split_at(1).1.to_vec(),
+ navigation.options_after_active.clone(),
+ ]
+ .concat();
+ navigation.options_before_active = split.0.to_vec();
+ navigation.active_option = Some(option.clone());
+ Action::SelectOption(option)
+ } else if let Some(index) = navigation
+ .options_after_active
+ .iter()
+ .position(|o| TOption::eq(o, &option))
+ {
+ let split = navigation.options_after_active.split_at(index);
+ navigation.options_before_active = vec![
+ navigation.options_before_active.clone(),
+ split.0.to_vec(),
+ navigation
+ .active_option
+ .clone()
+ .map_or(vec![], |active_option| vec![active_option]),
+ ]
+ .concat();
+ navigation.active_option = Some(option.clone());
+ navigation.options_after_active = split.1.split_at(1).1.to_vec();
+ Action::SelectOption(option)
+ } else {
+ if let Some(active_option) = &navigation.active_option {
+ navigation.options_before_active.push(active_option.clone());
+ }
navigation
- .active_option
- .clone()
- .map_or(vec![], |active_option| vec![active_option]),
- split.1.split_at(1).1.to_vec(),
- navigation.options_after_active.clone(),
- ]
- .concat();
- navigation.options_before_active = split.0.to_vec();
- navigation.active_option = Some(option.clone());
- Action::SelectOption(option)
- } else if let Some(index) = navigation
- .options_after_active
- .iter()
- .position(|o| o.clone() == option)
- {
- let split = navigation.options_after_active.split_at(index);
- navigation.options_before_active = vec![
- navigation.options_before_active.clone(),
- split.0.to_vec(),
+ .options_before_active
+ .append(&mut navigation.options_after_active);
+ navigation.active_option = Some(option.clone());
+ navigation.options_after_active = vec![];
+ Action::SelectOption(option)
+ }
+ }
+ Message::SetOptions(options) => {
+ let active_option_index =
navigation
.active_option
.clone()
- .map_or(vec![], |active_option| vec![active_option]),
- ]
- .concat();
- navigation.active_option = Some(option.clone());
- navigation.options_after_active = split.1.split_at(1).1.to_vec();
- Action::SelectOption(option)
- } else {
- if let Some(active_option) = &navigation.active_option {
- navigation.options_before_active.push(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);
+ navigation.options_before_active = split.0.to_vec();
+ navigation.options_after_active = split.1.split_at(1).1.to_vec();
+ Action::None
+ } else {
+ navigation.options_before_active = options
+ .split_last()
+ .map_or_else(Vec::new, |(_last, rest)| rest.to_vec());
+ navigation.active_option = options.last().cloned();
+ options
+ .last()
+ .cloned()
+ .map_or(Action::None, Action::SelectOption)
}
- navigation
- .options_before_active
- .append(&mut navigation.options_after_active);
- navigation.active_option = Some(option.clone());
- navigation.options_after_active = vec![];
- Action::SelectOption(option)
}
- }
- Message::SetOptions(options) => {
- let active_option_index =
- navigation
- .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);
- navigation.options_before_active = split.0.to_vec();
- navigation.options_after_active = split.1.split_at(1).1.to_vec();
- Action::None
- } else {
- navigation.options_before_active = options
- .split_last()
- .map_or_else(Vec::new, |(_last, rest)| rest.to_vec());
- navigation.active_option = options.last().cloned();
- options
- .last()
- .cloned()
- .map_or(Action::None, Action::SelectOption)
- }
- }
- Message::SelectNext => {
- if let Some(next) = navigation.options_after_active.clone().first() {
- navigation.options_before_active = vec![
- navigation.options_before_active.clone(),
- navigation.active_option.clone().map_or(vec![], |o| vec![o]),
- ]
- .concat();
- navigation.active_option = Some(next.clone());
- navigation.options_after_active =
- navigation.options_after_active.split_at(1).1.to_vec();
- Action::SelectOption(next.clone())
- } else {
- Action::None
+ Message::SelectNext => {
+ if let Some(next) = navigation.options_after_active.clone().first() {
+ navigation.options_before_active = vec![
+ navigation.options_before_active.clone(),
+ navigation.active_option.clone().map_or(vec![], |o| vec![o]),
+ ]
+ .concat();
+ navigation.active_option = Some(next.clone());
+ navigation.options_after_active =
+ navigation.options_after_active.split_at(1).1.to_vec();
+ Action::SelectOption(next.clone())
+ } else {
+ Action::None
+ }
}
- }
- Message::SelectPrev => {
- if let Some(prev) = navigation.options_before_active.clone().last() {
- navigation.options_after_active = vec![
- navigation.active_option.clone().map_or(vec![], |o| vec![o]),
- navigation.options_after_active.clone(),
- ]
- .concat();
- navigation.active_option = Some(prev.clone());
- navigation.options_before_active = navigation
- .options_before_active
- .split_last()
- .map(|split| split.1.to_vec())
- .unwrap_or_else(Vec::new);
- Action::SelectOption(prev.clone())
- } else {
- Action::None
+ Message::SelectPrev => {
+ if let Some(prev) = navigation.options_before_active.clone().last() {
+ navigation.options_after_active = vec![
+ navigation.active_option.clone().map_or(vec![], |o| vec![o]),
+ navigation.options_after_active.clone(),
+ ]
+ .concat();
+ navigation.active_option = Some(prev.clone());
+ navigation.options_before_active = navigation
+ .options_before_active
+ .split_last()
+ .map(|split| split.1.to_vec())
+ .unwrap_or_else(Vec::new);
+ Action::SelectOption(prev.clone())
+ } else {
+ Action::None
+ }
}
}
}