mode switcher

This commit is contained in:
Martin Kavík 2024-10-06 19:26:41 +02:00
parent ad68d2c282
commit d291e84f61
2 changed files with 39 additions and 2 deletions

View file

@ -1,10 +1,13 @@
use crate::{platform, theme::*, Filename, Layout}; use crate::{platform, theme::*, Filename, Layout, Mode};
use std::sync::Arc; use std::sync::Arc;
use zoon::*; use zoon::*;
pub struct HeaderPanel { pub struct HeaderPanel {
hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>, hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>,
layout: Mutable<Layout>, layout: Mutable<Layout>,
mode: Mutable<Mode>,
loaded_filename: Mutable<Option<Filename>>, loaded_filename: Mutable<Option<Filename>>,
} }
@ -12,12 +15,14 @@ impl HeaderPanel {
pub fn new( pub fn new(
hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>, hierarchy: Mutable<Option<Arc<wellen::Hierarchy>>>,
layout: Mutable<Layout>, layout: Mutable<Layout>,
mode: Mutable<Mode>,
loaded_filename: Mutable<Option<Filename>>, loaded_filename: Mutable<Option<Filename>>,
) -> impl Element { ) -> impl Element {
Self { Self {
hierarchy, hierarchy,
layout, layout,
loaded_filename, loaded_filename,
mode,
} }
.root() .root()
} }
@ -32,7 +37,8 @@ impl HeaderPanel {
.s(Padding::new().top(5)) .s(Padding::new().top(5))
.s(Gap::both(15)) .s(Gap::both(15))
.item(self.load_button()) .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,
})
})
}
} }

View file

@ -26,6 +26,13 @@ enum Layout {
Columns, Columns,
} }
#[derive(Clone, Copy, Default)]
enum Mode {
#[default]
Waves,
Diagrams,
}
type Filename = String; type Filename = String;
#[derive(Default)] #[derive(Default)]
@ -51,6 +58,7 @@ fn root() -> impl Element {
let hierarchy = STORE.hierarchy.clone(); let hierarchy = STORE.hierarchy.clone();
let selected_var_refs = STORE.selected_var_refs.clone(); let selected_var_refs = STORE.selected_var_refs.clone();
let layout: Mutable<Layout> = <_>::default(); let layout: Mutable<Layout> = <_>::default();
let mode: Mutable<Mode> = <_>::default();
let loaded_filename = STORE.loaded_filename.clone(); let loaded_filename = STORE.loaded_filename.clone();
let canvas_controller = STORE.canvas_controller.clone(); let canvas_controller = STORE.canvas_controller.clone();
Column::new() Column::new()
@ -60,6 +68,7 @@ fn root() -> impl Element {
.item(HeaderPanel::new( .item(HeaderPanel::new(
hierarchy.clone(), hierarchy.clone(),
layout.clone(), layout.clone(),
mode.clone(),
loaded_filename.clone(), loaded_filename.clone(),
)) ))
.item( .item(