summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components/navigation.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2025-08-13 07:50:21 +0000
committerjoeac <me@joeac.net>2025-08-13 07:50:21 +0000
commitee3cd780e21260257b401c3f5cbababd9e27a15a (patch)
treeb0571649a1a1a7644dbc50183cc4c3a29966a963 /schist_desktop_gui/src/gui/components/navigation.rs
parent49342e8b553d5c92f1c043b3b0ce18bdf1c2cd44 (diff)
task-073
Co-authored-by: Joe Carstairs <jcarstairs@scottlogic.com> Reviewed-on: https://git.joeac.net/joeac/schist/pulls/1 Co-authored-by: Joe Carstairs <me@joeac.net> Co-committed-by: Joe Carstairs <me@joeac.net>
Diffstat (limited to 'schist_desktop_gui/src/gui/components/navigation.rs')
-rw-r--r--schist_desktop_gui/src/gui/components/navigation.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/schist_desktop_gui/src/gui/components/navigation.rs b/schist_desktop_gui/src/gui/components/navigation.rs
new file mode 100644
index 0000000..bed3221
--- /dev/null
+++ b/schist_desktop_gui/src/gui/components/navigation.rs
@@ -0,0 +1,68 @@
+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>,
+ active_option: Option<TOption>,
+ options_after_active: Vec<TOption>,
+}
+
+#[derive(Clone, Debug)]
+pub enum Message<TOption> {
+ SelectNext,
+ SelectOption(TOption),
+ SelectPrev,
+ SetOptions(Vec<TOption>),
+}
+
+pub enum Action<TOption> {
+ SelectOption(TOption),
+ None,
+}
+
+impl<TOption: Clone + Debug + PartialEq> Navigation<TOption> {
+ pub fn new(active_option: Option<TOption>, options: Vec<TOption>) -> Self {
+ new_navigation(active_option, options)
+ }
+}
+
+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)
+ }
+}
+
+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)
+ }
+}
+
+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)
+ }
+}