From 2a6721eb00c7304149ed580934f0a36faac427af Mon Sep 17 00:00:00 2001 From: Freddo3000 Date: Fri, 21 Jul 2023 16:23:19 +0200 Subject: [PATCH] Vizia GUI refactoring --- src/gui_vizia/components/add.rs | 2 +- src/gui_vizia/components/constant.rs | 2 +- src/gui_vizia/components/mem.rs | 2 +- src/gui_vizia/components/mux.rs | 2 +- src/gui_vizia/components/probe.rs | 2 +- src/gui_vizia/components/register.rs | 2 +- src/gui_vizia/components/sext.rs | 2 +- src/gui_vizia/components/wire.rs | 2 +- src/gui_vizia/gui.rs | 144 ++------------------ src/gui_vizia/gui_components.rs | 4 + src/gui_vizia/{ => gui_components}/grid.rs | 0 src/gui_vizia/{ => gui_components}/menu.rs | 2 +- src/gui_vizia/{ => gui_components}/popup.rs | 0 src/gui_vizia/gui_components/simulator.rs | 0 src/gui_vizia/mod.rs | 5 +- src/gui_vizia/views.rs | 1 + src/gui_vizia/views/simulator/leftpane.rs | 100 ++++++++++++++ src/gui_vizia/views/simulator/mod.rs | 31 +++++ src/gui_vizia/views/simulator/rightpane.rs | 13 ++ src/gui_vizia/views/simulator/simpane.rs | 56 ++++++++ 20 files changed, 225 insertions(+), 147 deletions(-) create mode 100644 src/gui_vizia/gui_components.rs rename src/gui_vizia/{ => gui_components}/grid.rs (100%) rename src/gui_vizia/{ => gui_components}/menu.rs (99%) rename src/gui_vizia/{ => gui_components}/popup.rs (100%) create mode 100644 src/gui_vizia/gui_components/simulator.rs create mode 100644 src/gui_vizia/views.rs create mode 100644 src/gui_vizia/views/simulator/leftpane.rs create mode 100644 src/gui_vizia/views/simulator/mod.rs create mode 100644 src/gui_vizia/views/simulator/rightpane.rs create mode 100644 src/gui_vizia/views/simulator/simpane.rs diff --git a/src/gui_vizia/components/add.rs b/src/gui_vizia/components/add.rs index 7414e07e..a25cc2ba 100644 --- a/src/gui_vizia/components/add.rs +++ b/src/gui_vizia/components/add.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Add, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip}, }; use vizia::{ diff --git a/src/gui_vizia/components/constant.rs b/src/gui_vizia/components/constant.rs index 3b059612..fd5c6609 100644 --- a/src/gui_vizia/components/constant.rs +++ b/src/gui_vizia/components/constant.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Constant, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip}, }; use vizia::{ diff --git a/src/gui_vizia/components/mem.rs b/src/gui_vizia/components/mem.rs index a62f0a6b..e687db4f 100644 --- a/src/gui_vizia/components/mem.rs +++ b/src/gui_vizia/components/mem.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Mem, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip}, }; use vizia::{ diff --git a/src/gui_vizia/components/mux.rs b/src/gui_vizia/components/mux.rs index b69353be..5f971273 100644 --- a/src/gui_vizia/components/mux.rs +++ b/src/gui_vizia/components/mux.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, Input, ViziaComponent}, components::Mux, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip, GuiData}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip, GuiData}, }; use vizia::{ diff --git a/src/gui_vizia/components/probe.rs b/src/gui_vizia/components/probe.rs index d48efc89..b004da84 100644 --- a/src/gui_vizia/components/probe.rs +++ b/src/gui_vizia/components/probe.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Probe, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip, GuiData}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip, GuiData}, }; use vizia::{ diff --git a/src/gui_vizia/components/register.rs b/src/gui_vizia/components/register.rs index c5c1850b..d7660b41 100644 --- a/src/gui_vizia/components/register.rs +++ b/src/gui_vizia/components/register.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Register, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip}, }; use vizia::{ diff --git a/src/gui_vizia/components/sext.rs b/src/gui_vizia/components/sext.rs index 643c3e09..4ef55f12 100644 --- a/src/gui_vizia/components/sext.rs +++ b/src/gui_vizia/components/sext.rs @@ -2,7 +2,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Sext, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip}, }; use vizia::{ diff --git a/src/gui_vizia/components/wire.rs b/src/gui_vizia/components/wire.rs index b681c6d5..76588c56 100644 --- a/src/gui_vizia/components/wire.rs +++ b/src/gui_vizia/components/wire.rs @@ -1,7 +1,7 @@ use crate::{ common::{Component, ViziaComponent}, components::Wire, - gui_vizia::{popup::NewPopup, tooltip::new_component_tooltip}, + gui_vizia::{gui_components::popup::NewPopup, tooltip::new_component_tooltip}, }; use vizia::{ diff --git a/src/gui_vizia/gui.rs b/src/gui_vizia/gui.rs index 6c39671e..d2948e6f 100644 --- a/src/gui_vizia/gui.rs +++ b/src/gui_vizia/gui.rs @@ -1,11 +1,14 @@ use crate::common::{ComponentStore, Simulator}; -use crate::gui_vizia::{grid::Grid, keymap::init_keymap, menu::Menu, transport::Transport}; +use crate::gui_vizia::gui_components as gui_components; +use gui_components::*; +use crate::gui_vizia::{ keymap::init_keymap, transport::Transport}; use rfd::FileDialog; use std::collections::HashSet; use std::path::PathBuf; -use vizia::{icons, prelude::*}; +use vizia::prelude::*; use log::*; +use crate::gui_vizia::views::simulator::SimView; #[derive(Lens, Clone)] pub struct GuiData { @@ -110,7 +113,6 @@ impl GuiData { trace!("opened"); } } - pub fn gui(cs: &ComponentStore, path: &PathBuf) { let mut clock = 0; let simulator = Simulator::new(cs, &mut clock); @@ -139,7 +141,7 @@ pub fn gui(cs: &ComponentStore, path: &PathBuf) { VStack::new(cx, |cx| { // Menu - Menu::new(cx, |cx| { + menu::Menu::new(cx, |cx| { HStack::new(cx, |cx| { Transport::new(cx).size(Auto); Label::new(cx, GuiData::clock.map(|clock| format!("Clock #{}", clock))) @@ -155,138 +157,7 @@ pub fn gui(cs: &ComponentStore, path: &PathBuf) { .background_color(Color::lightgray()) .height(Auto); - HStack::new(cx, |cx| { - HStack::new(cx, |cx| { - // Left pane - Binding::new( - cx, - GuiData::simulator.then(Simulator::ordered_components), - |cx, wrapper_oc| { - VStack::new(cx, |cx| { - Label::new(cx, "Left").top(Pixels(0.0)); - let oc = wrapper_oc.get(cx); - for (i, c) in oc.iter().enumerate() { - VStack::new(cx, |cx| { - // left pane bar - HStack::new(cx, move |cx| { - Button::new( - cx, - move |cx| { - cx.emit(GuiEvent::ToggleExpandLeftPanel(i)) - }, - |cx| { - Label::new( - cx, - GuiData::expanded.map(move |expanded| { - if expanded.contains(&i) { - // expanded - icons::ICON_CHEVRON_DOWN - } else { - // folded - icons::ICON_CHEVRON_RIGHT - } - }), - ) - .class("icon") - }, - ) - .left(Pixels(5.0)) - .top(Stretch(1.0)) - .bottom(Stretch(1.0)) - .right(Stretch(1.0)) - .size(Auto); - let (id, _) = c.get_id_ports(); - - Label::new(cx, &format!("Instance: {}", &id)) - .left(Pixels(5.0)) - .top(Stretch(1.0)) - .bottom(Stretch(1.0)) - .right(Stretch(1.0)) - .size(Auto); - - Button::new( - cx, - move |cx| cx.emit(GuiEvent::HideLeftPanel(i)), - |cx| Label::new(cx, icons::ICON_X).class("icon"), - ) - .right(Pixels(1.0)) - .top(Pixels(1.0)) - .bottom(Pixels(1.0)); - }) - .background_color(Color::lightgrey()) - .height(Auto) - .border_color(Color::darkgray()) - .border_width(Pixels(1.0)); - // left view expanded or folded - VStack::new(cx, |cx| c.left_view(cx)).display( - GuiData::expanded.map(move |hs_expanded| { - if hs_expanded.contains(&i) { - Display::Flex - } else { - Display::None - } - }), - ); - }) - .display( - GuiData::visible.map(move |hs_visible| { - if hs_visible.contains(&i) { - Display::Flex - } else { - Display::None - } - }), - ); - } - }) - .border_color(Color::black()) - .border_width(Pixels(1.0)); - }, - ); - }); - ScrollView::new(cx, 0.0, 0.0, true, true, |cx| { - // Grid area - Grid::new(cx, |cx| { - // (re-)bind all components when simulator changed - Binding::new( - cx, - GuiData::simulator.then(Simulator::ordered_components), - |cx, wrapper_oc| { - VStack::new(cx, |cx| { - let oc = wrapper_oc.get(cx); - for (i, c) in oc.iter().enumerate() { - error!("comp id {}", i); - VStack::new(cx, |cx| { - c.view(cx); - }) - .position_type(PositionType::SelfDirected) - .size(Auto) - .on_mouse_down( - move |ex, button| { - if button == MouseButton::Right { - error!("on_mouse_down {:?}", i); - ex.emit(GuiEvent::ShowLeftPanel(i)) - } - }, - ); - } - }) - .border_color(Color::black()) - .border_width(Pixels(1.0)) - .overflow(Overflow::Hidden); - }, - ) - }) - .height(Pixels(1080.0)) - .width(Pixels(1920.0)); - }) - // .size(Units::Pixels(300.0)) - .class("bg-default"); - - // Right pane - Label::new(cx, "Right").top(Pixels(0.0)); - }); // // HStack::new(cx, |cx| { @@ -310,7 +181,10 @@ pub fn gui(cs: &ComponentStore, path: &PathBuf) { }) .on_blur(|cx| cx.emit(GuiEvent::HideAbout)) .class("modal"); + + SimView::new(cx, (30.0, 50.0, 20.0)); }); + }) .title("SyncRim") .run(); diff --git a/src/gui_vizia/gui_components.rs b/src/gui_vizia/gui_components.rs new file mode 100644 index 00000000..191d43eb --- /dev/null +++ b/src/gui_vizia/gui_components.rs @@ -0,0 +1,4 @@ +pub mod menu; +pub mod simulator; +pub mod popup; +pub mod grid; \ No newline at end of file diff --git a/src/gui_vizia/grid.rs b/src/gui_vizia/gui_components/grid.rs similarity index 100% rename from src/gui_vizia/grid.rs rename to src/gui_vizia/gui_components/grid.rs diff --git a/src/gui_vizia/menu.rs b/src/gui_vizia/gui_components/menu.rs similarity index 99% rename from src/gui_vizia/menu.rs rename to src/gui_vizia/gui_components/menu.rs index 0be9d4c4..5d91b261 100644 --- a/src/gui_vizia/menu.rs +++ b/src/gui_vizia/gui_components/menu.rs @@ -7,7 +7,7 @@ pub(crate) struct Menu {} impl View for Menu {} impl Menu { - pub(crate) fn new(cx: &mut Context, content: F) -> Handle<'_, Self> + pub fn new(cx: &mut Context, content: F) -> Handle<'_, Self> where F: FnOnce(&mut Context), { diff --git a/src/gui_vizia/popup.rs b/src/gui_vizia/gui_components/popup.rs similarity index 100% rename from src/gui_vizia/popup.rs rename to src/gui_vizia/gui_components/popup.rs diff --git a/src/gui_vizia/gui_components/simulator.rs b/src/gui_vizia/gui_components/simulator.rs new file mode 100644 index 00000000..e69de29b diff --git a/src/gui_vizia/mod.rs b/src/gui_vizia/mod.rs index ea26ca1e..29f9126a 100644 --- a/src/gui_vizia/mod.rs +++ b/src/gui_vizia/mod.rs @@ -1,12 +1,11 @@ -mod grid; mod gui; pub mod hover; mod keymap; -mod menu; -pub mod popup; pub mod tooltip; mod transport; #[cfg(feature = "components")] pub mod components; +pub mod gui_components; +mod views; pub use gui::*; diff --git a/src/gui_vizia/views.rs b/src/gui_vizia/views.rs new file mode 100644 index 00000000..282c95c7 --- /dev/null +++ b/src/gui_vizia/views.rs @@ -0,0 +1 @@ +pub mod simulator; diff --git a/src/gui_vizia/views/simulator/leftpane.rs b/src/gui_vizia/views/simulator/leftpane.rs new file mode 100644 index 00000000..2ec446a5 --- /dev/null +++ b/src/gui_vizia/views/simulator/leftpane.rs @@ -0,0 +1,100 @@ +use vizia::icons; +use vizia::prelude::*; +use crate::common::Simulator; +use crate::gui_vizia::{GuiData, GuiEvent}; + +pub struct LeftPane {} + +impl View for LeftPane {} + +impl LeftPane { + pub fn new(cx: &mut Context) -> Handle { + Self {}.build(cx, |cx|{ + Binding::new( + cx, + GuiData::simulator.then(Simulator::ordered_components), + |cx, wrapper_oc| { + VStack::new(cx, |cx| { + Label::new(cx, "Left").top(Pixels(0.0)); + let oc = wrapper_oc.get(cx); + for (i, c) in oc.iter().enumerate() { + VStack::new(cx, |cx| { + // left pane bar + HStack::new(cx, move |cx| { + Button::new( + cx, + move |cx| { + cx.emit(GuiEvent::ToggleExpandLeftPanel(i)) + }, + |cx| { + Label::new( + cx, + GuiData::expanded.map(move |expanded| { + if expanded.contains(&i) { + // expanded + icons::ICON_CHEVRON_DOWN + } else { + // folded + icons::ICON_CHEVRON_RIGHT + } + }), + ) + .class("icon") + }, + ) + .left(Pixels(5.0)) + .top(Stretch(1.0)) + .bottom(Stretch(1.0)) + .right(Stretch(1.0)) + .size(Auto); + let (id, _) = c.get_id_ports(); + + Label::new(cx, &format!("Instance: {}", &id)) + .left(Pixels(5.0)) + .top(Stretch(1.0)) + .bottom(Stretch(1.0)) + .right(Stretch(1.0)) + .size(Auto); + + Button::new( + cx, + move |cx| cx.emit(GuiEvent::HideLeftPanel(i)), + |cx| Label::new(cx, icons::ICON_X).class("icon"), + ) + .right(Pixels(1.0)) + .top(Pixels(1.0)) + .bottom(Pixels(1.0)); + }) + .background_color(Color::lightgrey()) + .height(Auto) + .border_color(Color::darkgray()) + .border_width(Pixels(1.0)); + // left view expanded or folded + VStack::new(cx, |cx| c.left_view(cx)).display( + GuiData::expanded.map(move |hs_expanded| { + if hs_expanded.contains(&i) { + Display::Flex + } else { + Display::None + } + }), + ); + }) + .display( + GuiData::visible.map(move |hs_visible| { + if hs_visible.contains(&i) { + Display::Flex + } else { + Display::None + } + }), + ); + } + }) + .border_color(Color::black()) + .border_width(Pixels(1.0)); + }, + ); + }) + } +} \ No newline at end of file diff --git a/src/gui_vizia/views/simulator/mod.rs b/src/gui_vizia/views/simulator/mod.rs new file mode 100644 index 00000000..2fb8d7d5 --- /dev/null +++ b/src/gui_vizia/views/simulator/mod.rs @@ -0,0 +1,31 @@ +mod leftpane; +mod simpane; +mod rightpane; + +use serde_derive::{Deserialize, Serialize}; +use vizia::prelude::*; + +use leftpane::LeftPane; +use rightpane::RightPane; +use simpane::SimPane; + +#[derive(Serialize, Deserialize)] +pub struct SimView { + ratio: (f32, f32, f32) +} + +impl View for SimView {} + +impl SimView { + pub fn new(cx: &mut Context, ratio: (f32, f32, f32)) -> Handle { + Self{ + ratio + }.build(cx, |cx|{ + HStack::new(cx, |cx| { + LeftPane::new(cx).width(Percentage(ratio.0)); + SimPane::new(cx).width(Percentage(ratio.1)); + RightPane::new(cx).width(Percentage(ratio.2)); + }); + }) + } +} diff --git a/src/gui_vizia/views/simulator/rightpane.rs b/src/gui_vizia/views/simulator/rightpane.rs new file mode 100644 index 00000000..4101d849 --- /dev/null +++ b/src/gui_vizia/views/simulator/rightpane.rs @@ -0,0 +1,13 @@ +use vizia::prelude::*; + +pub struct RightPane {} + +impl View for RightPane {} + +impl RightPane { + pub fn new(cx: &mut Context) -> Handle { + Self {}.build(cx, |cx|{ + Label::new(cx, "Right").top(Pixels(0.0)); + }) + } +} diff --git a/src/gui_vizia/views/simulator/simpane.rs b/src/gui_vizia/views/simulator/simpane.rs new file mode 100644 index 00000000..cf45b431 --- /dev/null +++ b/src/gui_vizia/views/simulator/simpane.rs @@ -0,0 +1,56 @@ +use log::error; +use vizia::prelude::*; +use crate::common::Simulator; +use crate::gui_vizia::gui_components::grid::Grid; +use crate::gui_vizia::{GuiData, GuiEvent}; + +pub struct SimPane { + +} + +impl View for SimPane {} + +impl SimPane { + pub fn new(cx: &mut Context) -> Handle { + Self {}.build(cx, |cx| { + ScrollView::new(cx, 0.0, 0.0, true, true, |cx| { + // Grid area + Grid::new(cx, |cx| { + // (re-)bind all components when simulator changed + Binding::new( + cx, + GuiData::simulator.then(Simulator::ordered_components), + |cx, wrapper_oc| { + VStack::new(cx, |cx| { + let oc = wrapper_oc.get(cx); + for (i, c) in oc.iter().enumerate() { + error!("comp id {}", i); + VStack::new(cx, |cx| { + c.view(cx); + }) + .position_type(PositionType::SelfDirected) + .size(Auto) + .on_mouse_down( + move |ex, button| { + if button == MouseButton::Right { + error!("on_mouse_down {:?}", i); + ex.emit(GuiEvent::ShowLeftPanel(i)) + } + }, + ); + } + }) + .border_color(Color::black()) + .border_width(Pixels(1.0)) + .overflow(Overflow::Hidden); + }, + ) + }) + .height(Pixels(1080.0)) + .width(Pixels(1920.0)); + }) + // .size(Units::Pixels(300.0)) + .class("bg-default"); + }) + } +} \ No newline at end of file