From 0658be825e2e036289913e6690a55b691bb7fc61 Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Wed, 27 Nov 2024 11:57:08 -0700 Subject: [PATCH] Work on some more stuff --- src/nodes/constants.rs | 56 +++++++++++++++++++++++++----------- src/pane_manager.rs | 12 ++++---- src/panes/pipeline_editor.rs | 50 ++++++++++++++++++-------------- 3 files changed, 74 insertions(+), 44 deletions(-) diff --git a/src/nodes/constants.rs b/src/nodes/constants.rs index 1ad2b0c..78353c6 100644 --- a/src/nodes/constants.rs +++ b/src/nodes/constants.rs @@ -1,5 +1,5 @@ use eframe::epaint::Color32; -use egui::Ui; +use egui::{Id, Ui}; use egui_snarl::{InPin, OutPin}; use egui_snarl::ui::{PinInfo, WireStyle}; use crate::pane_manager::{Pane, PaneMode, PaneState, PsudoCreationContext}; @@ -8,16 +8,20 @@ use crate::panes::pipeline_editor::Node; #[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct Constants { - vars: Vec, + vars: Vec<(String, String)>, popup_open: bool, + uid: Id, } #[typetag::serde] impl Node for Constants { fn new() -> Self { - Self { + let mut s = Self { vars: Vec::new(), popup_open: false, - } + uid: Id::new(rand::random::()), + }; + s.vars.push(("VAR".to_string(), "Change Me".to_string())); + s } fn get_name(&self) -> &str { @@ -33,12 +37,13 @@ impl Node for Constants { 0 } fn outputs(&self) -> usize { - 1 + self.vars.len() } - fn show_input(&self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } - fn show_output(&self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + fn show_output(&mut self, pin: &OutPin, ui: &mut Ui, _scale: f32) -> PinInfo { + ui.label(self.vars.iter().nth(pin.id.output).unwrap().0.clone()); PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } fn can_rx(&self, _other: &Box) -> bool { @@ -47,16 +52,35 @@ impl Node for Constants { fn can_tx(&self, _other: &Box) -> bool { true } - fn context_menu(&self, ui: &mut Ui) { - egui::Window::new("TEST").show(ui.ctx(), |ui| { - ui.heading("EEEEE"); - }); - // if ui.button("Edit").clicked() { - // self.popup_open = !self.popup_open; - // } + fn context_menu(&mut self, ui: &mut Ui) { + // egui::Window::new("TEST").show(ui.ctx(), |ui| { + // ui.heading("EEEEE"); + // }); + if ui.button("Edit").clicked() { + self.popup_open = !self.popup_open; + ui.close_menu(); + } } - fn update(&self, ui: &mut Ui) { - + fn update(&mut self, ui: &mut Ui) { + if self.popup_open { + egui::Window::new("Edit - ".to_owned() + self.get_name()).id(self.uid).show(ui.ctx(), |ui| { + egui::Grid::new("my_grid").striped(true) + .max_col_width(9999.) + .show(ui, |ui| { + for (i, (var1, var2)) in &mut self.vars.iter().enumerate() { + if var1.is_empty() { + self.vars.remove() + } + ui.add(egui::TextEdit::singleline(var1)); + ui.add(egui::TextEdit::singleline(var2)); + ui.end_row(); + } + }); + if ui.button("ADD").clicked() { + self.vars.push(("VAR".to_string(), "Change Me".to_string())); + } + }); + } } } diff --git a/src/pane_manager.rs b/src/pane_manager.rs index 231e507..3626332 100644 --- a/src/pane_manager.rs +++ b/src/pane_manager.rs @@ -122,7 +122,7 @@ impl PaneManager { } ui.menu_button(self.panes[i].id.clone(), |ui| { - if ui.button("Center").clicked() { + if ui.button(({ if self.panes[i].mode == PaneMode::Center { "*" } else { " " } }).to_owned() + "Center").clicked() { for a in 0..len { let pane2: &mut PaneState = &mut self.panes[a]; if pane2.mode == PaneMode::Center { @@ -132,23 +132,23 @@ impl PaneManager { self.panes[i].mode = PaneMode::Center; ui.close_menu(); } - if ui.button("Windowed").clicked() { + if ui.button(({ if self.panes[i].mode == PaneMode::Windowed { "*" } else { " " } }).to_owned() + "Window").clicked() { self.panes[i].mode = PaneMode::Windowed; ui.close_menu(); } - if ui.button("Left").clicked() { + if ui.button(({ if self.panes[i].mode == PaneMode::Left { "*" } else { " " } }).to_owned() + "Left").clicked() { self.panes[i].mode = PaneMode::Left; ui.close_menu(); } - if ui.button("Right").clicked() { + if ui.button(({ if self.panes[i].mode == PaneMode::Right { "*" } else { " " } }).to_owned() + "Right").clicked() { self.panes[i].mode = PaneMode::Right; ui.close_menu(); } - if ui.button("Bottom").clicked() { + if ui.button(({ if self.panes[i].mode == PaneMode::Bottom { "*" } else { " " } }).to_owned() + "Bottom").clicked() { self.panes[i].mode = PaneMode::Bottom; ui.close_menu(); } - if ui.button("Hidden").clicked() { + if ui.button(({ if self.panes[i].mode == PaneMode::Hidden { "*" } else { " " } }).to_owned() + "Hidden").clicked() { self.panes[i].mode = PaneMode::Hidden; ui.close_menu(); } diff --git a/src/panes/pipeline_editor.rs b/src/panes/pipeline_editor.rs index 7578e00..d6c84f6 100644 --- a/src/panes/pipeline_editor.rs +++ b/src/panes/pipeline_editor.rs @@ -1,3 +1,4 @@ +use eframe::emath::Rect; use crate::pane_manager::{Pane, PaneMode, PaneState, PsudoCreationContext}; @@ -148,12 +149,12 @@ pub trait Node { fn duplicate(&self) -> Box; fn inputs(&self) -> usize; fn outputs(&self) -> usize; - fn show_input(&self, pin: &InPin, ui: &mut Ui, scale: f32) -> PinInfo; - fn show_output(&self, pin: &OutPin, ui: &mut Ui, scale: f32) -> PinInfo; + fn show_input(&mut self, pin: &InPin, ui: &mut Ui, scale: f32) -> PinInfo; + fn show_output(&mut self, pin: &OutPin, ui: &mut Ui, scale: f32) -> PinInfo; fn can_rx(&self, other: &Box) -> bool; fn can_tx(&self, other: &Box) -> bool; - fn context_menu(&self, ui: &mut Ui); - fn update(&self, ui: &mut Ui); + fn context_menu(&mut self, ui: &mut Ui); + fn update(&mut self, ui: &mut Ui); } #[derive(Clone, serde::Serialize, serde::Deserialize)] @@ -172,16 +173,16 @@ impl Node for Node1 { fn outputs(&self) -> usize { 1 } - fn show_input(&self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } - fn show_output(&self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } + fn show_output(&mut self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } fn can_rx(&self, _other: &Box) -> bool { true } fn can_tx(&self, _other: &Box) -> bool { true } - fn context_menu(&self, ui: &mut Ui) { ui.label("Test!"); } - fn update(&self, ui: &mut Ui) {} + fn context_menu(&mut self, ui: &mut Ui) { ui.label("Test!"); } + fn update(&mut self, ui: &mut Ui) {} } #[derive(Clone, serde::Serialize, serde::Deserialize)] @@ -200,16 +201,16 @@ impl Node for Node2 { fn outputs(&self) -> usize { 1 } - fn show_input(&self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } - fn show_output(&self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } + fn show_output(&mut self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } fn can_rx(&self, _other: &Box) -> bool { true } fn can_tx(&self, _other: &Box) -> bool { true } - fn context_menu(&self, ui: &mut Ui) { ui.label("Test!"); } - fn update(&self, ui: &mut Ui) {} + fn context_menu(&mut self, ui: &mut Ui) { ui.label("Test!"); } + fn update(&mut self, ui: &mut Ui) {} } #[derive(Clone, serde::Serialize, serde::Deserialize)] @@ -228,16 +229,16 @@ impl Node for crate::panes::pipeline_editor::Node3 { fn outputs(&self) -> usize { 2 } - fn show_input(&self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } - fn show_output(&self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square() } + fn show_output(&mut self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { PinInfo::square().with_fill(Color32::RED).with_wire_style(WireStyle::Bezier3) } fn can_rx(&self, _other: &Box) -> bool { true } fn can_tx(&self, _other: &Box) -> bool { true } - fn context_menu(&self, ui: &mut Ui) { ui.label("Test!"); } - fn update(&self, ui: &mut Ui) {} + fn context_menu(&mut self, ui: &mut Ui) { ui.label("Test!"); } + fn update(&mut self, ui: &mut Ui) {} } @@ -286,7 +287,7 @@ impl SnarlViewer> for NodeViewer { snarl: &mut Snarl>, ) -> PinInfo { snarl - .get_node(pin.id.node) + .get_node_mut(pin.id.node) .unwrap() .show_input(pin, ui, scale) } @@ -299,7 +300,7 @@ impl SnarlViewer> for NodeViewer { snarl: &mut Snarl>, ) -> PinInfo { snarl - .get_node(pin.id.node) + .get_node_mut(pin.id.node) .unwrap() .show_output(pin, ui, scale) } @@ -349,25 +350,30 @@ impl SnarlViewer> for NodeViewer { snarl: &mut Snarl>, ) { ui.label("Node menu"); + snarl.get_node_mut(nodeid).unwrap().context_menu(ui); if ui.button("Remove").clicked() { snarl.remove_node(nodeid); ui.close_menu(); } else if ui.button("Duplicate").clicked() { - snarl.insert_node(Pos2 {x:0.,y:0.}, snarl.get_node(nodeid).unwrap().duplicate()); + let node = snarl.get_node_mut(nodeid).unwrap().duplicate(); + snarl.insert_node(Pos2 {x:0.,y:0.}, node); ui.close_menu(); // }// else if ui.button("Remove All Connections").clicked() { // ui. // ui.close_menu(); - } else { - snarl.get_node(nodeid).unwrap().context_menu(ui); } } + fn has_body(&mut self, node: &Box) -> bool { + true + } + fn show_body(&mut self, node: NodeId, inputs: &[InPin], outputs: &[OutPin], ui: &mut Ui, scale: f32, snarl: &mut Snarl>) { - snarl.get_node(node).unwrap().update(ui); + snarl.get_node_mut(node).unwrap().update(ui); } } + impl NodeViewer { pub fn add_node_menu(pos: Pos2, ui: &mut Ui, snarl: &mut Snarl>) { ui.label("Add node");