From d291e84f6139b67b45a634e5cdbc64f5cbfcefe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kav=C3=ADk?= Date: Sun, 6 Oct 2024 19:26:41 +0200 Subject: [PATCH] mode switcher --- frontend/src/header_panel.rs | 32 ++++++++++++++++++++++++++++++-- frontend/src/main.rs | 9 +++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/frontend/src/header_panel.rs b/frontend/src/header_panel.rs index 5007d73..39ff84a 100644 --- a/frontend/src/header_panel.rs +++ b/frontend/src/header_panel.rs @@ -1,10 +1,13 @@ -use crate::{platform, theme::*, Filename, Layout}; +use crate::{platform, theme::*, Filename, Layout, Mode}; use std::sync::Arc; use zoon::*; + + pub struct HeaderPanel { hierarchy: Mutable>>, layout: Mutable, + mode: Mutable, loaded_filename: Mutable>, } @@ -12,12 +15,14 @@ impl HeaderPanel { pub fn new( hierarchy: Mutable>>, layout: Mutable, + mode: Mutable, loaded_filename: Mutable>, ) -> impl Element { Self { hierarchy, layout, loaded_filename, + mode, } .root() } @@ -32,7 +37,8 @@ impl HeaderPanel { .s(Padding::new().top(5)) .s(Gap::both(15)) .item(self.load_button()) - .item(self.layout_switcher()), + .item(self.layout_switcher()) + .item(self.mode_switcher()) ) } @@ -167,4 +173,26 @@ impl HeaderPanel { }) }) } + + fn mode_switcher(&self) -> impl Element { + let mode = self.mode.clone(); + let (hovered, hovered_signal) = Mutable::new_and_signal(false); + Button::new() + .s(Padding::new().x(20).y(10)) + .s(Background::new().color_signal( + hovered_signal.map_bool(|| COLOR_MEDIUM_SLATE_BLUE, || COLOR_SLATE_BLUE), + )) + .s(RoundedCorners::all(15)) + .label_signal(mode.signal().map(|mode| match mode { + Mode::Waves => "Diagrams", + Mode::Diagrams => "Waves", + })) + .on_hovered_change(move |is_hovered| hovered.set_neq(is_hovered)) + .on_press(move || { + mode.update(|mode| match mode { + Mode::Waves => Mode::Diagrams, + Mode::Diagrams => Mode::Waves, + }) + }) + } } diff --git a/frontend/src/main.rs b/frontend/src/main.rs index b25c417..7c34913 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -26,6 +26,13 @@ enum Layout { Columns, } +#[derive(Clone, Copy, Default)] +enum Mode { + #[default] + Waves, + Diagrams, +} + type Filename = String; #[derive(Default)] @@ -51,6 +58,7 @@ fn root() -> impl Element { let hierarchy = STORE.hierarchy.clone(); let selected_var_refs = STORE.selected_var_refs.clone(); let layout: Mutable = <_>::default(); + let mode: Mutable = <_>::default(); let loaded_filename = STORE.loaded_filename.clone(); let canvas_controller = STORE.canvas_controller.clone(); Column::new() @@ -60,6 +68,7 @@ fn root() -> impl Element { .item(HeaderPanel::new( hierarchy.clone(), layout.clone(), + mode.clone(), loaded_filename.clone(), )) .item(