From c88aae2110754b14dd4c0fc1ecac7c4298cf4e2e Mon Sep 17 00:00:00 2001 From: Setzer22 Date: Thu, 24 Feb 2022 20:10:25 +0100 Subject: [PATCH] More serde derives and adjust NodeTemplateIter return value --- egui_node_graph/src/id_type.rs | 1 + egui_node_graph/src/node_finder.rs | 12 ++++++------ egui_node_graph/src/traits.rs | 2 +- egui_node_graph/src/ui_state.rs | 1 + egui_node_graph_example/src/app.rs | 20 +++++++------------- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/egui_node_graph/src/id_type.rs b/egui_node_graph/src/id_type.rs index 3ed325e..666ef92 100644 --- a/egui_node_graph/src/id_type.rs +++ b/egui_node_graph/src/id_type.rs @@ -2,6 +2,7 @@ slotmap::new_key_type! { pub struct NodeId; } slotmap::new_key_type! { pub struct InputId; } slotmap::new_key_type! { pub struct OutputId; } +#[cfg_attr(feature = "persistence", derive(serde::Serialize, serde::Deserialize))] #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] pub enum AnyParameterId { Input(InputId), diff --git a/egui_node_graph/src/node_finder.rs b/egui_node_graph/src/node_finder.rs index 854a426..36f925a 100644 --- a/egui_node_graph/src/node_finder.rs +++ b/egui_node_graph/src/node_finder.rs @@ -4,6 +4,7 @@ use crate::{color_hex_utils::*, NodeTemplateIter, NodeTemplateTrait}; use egui::*; +#[cfg_attr(feature = "persistence", derive(serde::Serialize, serde::Deserialize))] pub struct NodeFinder { pub query: String, /// Reset every frame. When set, the node finder will be moved at that position @@ -56,14 +57,13 @@ where Frame::default().margin(vec2(10.0, 10.0)).show(ui, |ui| { for kind in all_kinds.all_kinds() { - let kind_name = kind.node_finder_label(); + let kind_name = kind.node_finder_label().to_string(); if kind_name.contains(self.query.as_str()) { - if query_submit { - submitted_archetype = Some(kind); - query_submit = false; - } if ui.selectable_label(false, kind_name).clicked() { submitted_archetype = Some(kind); + } else if query_submit { + submitted_archetype = Some(kind); + query_submit = false; } } } @@ -71,6 +71,6 @@ where }); }); - submitted_archetype.cloned() + submitted_archetype } } diff --git a/egui_node_graph/src/traits.rs b/egui_node_graph/src/traits.rs index 571ac77..5be8908 100644 --- a/egui_node_graph/src/traits.rs +++ b/egui_node_graph/src/traits.rs @@ -50,7 +50,7 @@ where /// the node finder. pub trait NodeTemplateIter { type Item; - fn all_kinds(&self) -> Box + '_>; + fn all_kinds(&self) -> Vec; } /// This trait must be implemented by the `NodeTemplate` generic parameter of diff --git a/egui_node_graph/src/ui_state.rs b/egui_node_graph/src/ui_state.rs index d60dc7b..a2ccea1 100644 --- a/egui_node_graph/src/ui_state.rs +++ b/egui_node_graph/src/ui_state.rs @@ -10,6 +10,7 @@ pub struct PanZoom { pub zoom: f32, } +#[cfg_attr(feature = "persistence", derive(Serialize, Deserialize))] pub struct GraphEditorState { pub graph: Graph, /// Nodes are drawn in this order. Draw order is important because nodes diff --git a/egui_node_graph_example/src/app.rs b/egui_node_graph_example/src/app.rs index 20273b1..ceea0de 100644 --- a/egui_node_graph_example/src/app.rs +++ b/egui_node_graph_example/src/app.rs @@ -195,22 +195,16 @@ pub struct AllMyNodeTemplates; impl NodeTemplateIter for AllMyNodeTemplates { type Item = MyNodeTemplate; - fn all_kinds(&self) -> Box + '_> { + fn all_kinds(&self) -> Vec { // This function must return a list of node kinds, which the node finder // will use to display it to the user. Crates like strum can reduce the // boilerplate in enumerating all variants of an enum. - // - // The Box here is required because traits in Rust cannot be generic - // over return parameters, so you can't return an iterator. - Box::new( - [ - MyNodeTemplate::AddScalar, - MyNodeTemplate::SubtractScalar, - MyNodeTemplate::VectorTimesScalar, - MyNodeTemplate::AddVector, - ] - .iter(), - ) + vec![ + MyNodeTemplate::AddScalar, + MyNodeTemplate::SubtractScalar, + MyNodeTemplate::VectorTimesScalar, + MyNodeTemplate::AddVector, + ] } }