Tatooine
node.h
Go to the documentation of this file.
1#ifndef TATOOINE_FLOWEXPLORER_UI_NODE_H
2#define TATOOINE_FLOWEXPLORER_UI_NODE_H
3//==============================================================================
4#include <imgui-node-editor/imgui_node_editor.h>
10#include <tatooine/reflection.h>
11#include <tatooine/vec.h>
12#include <tatooine/gl/imgui.h>
13//==============================================================================
14namespace tatooine::flowexplorer {
15//==============================================================================
16struct scene;
17//==============================================================================
18} // namespace tatooine::flowexplorer
19//==============================================================================
21//==============================================================================
22namespace base {
23struct node : uuid_holder<ax::NodeEditor::NodeId>, serializable, toggleable {
24 private:
25 std::string m_title;
27 std::vector<std::unique_ptr<input_pin>> m_input_pins;
28 std::vector<std::unique_ptr<output_pin>> m_output_pins;
29 std::vector<std::unique_ptr<input_pin_property_link>> m_property_links;
30 std::unique_ptr<output_pin> m_self_pin = nullptr;
31
32 public:
34 node(std::string const& title, flowexplorer::scene& s);
35 template <typename T>
36 node(flowexplorer::scene& s, T& ref) : node{s} {
37 m_self_pin = make_output_pin(*this, "", ref);
38 }
39 //------------------------------------------------------------------------------
40 template <typename T>
41 node(std::string const& title, flowexplorer::scene& s, T& ref)
42 : node{title, s} {
43 m_self_pin = make_output_pin(*this, "", ref);
44 }
45 //------------------------------------------------------------------------------
46 virtual ~node() = default;
47 //============================================================================
48 template <typename... Ts>
49 auto insert_input_pin(std::string const& title,
50 icon_type const t = icon_type::flow) -> auto& {
51 m_input_pins.push_back(make_input_pin<Ts...>(*this, title, t));
52 return *m_input_pins.back();
53 }
54 //----------------------------------------------------------------------------
55 template <typename Prop>
56 auto insert_input_pin_property_link(input_pin& pin, Prop& prop) -> auto& {
58 m_property_links.push_back(make_input_pin_property_link<Prop>(pin, prop));
59 return *m_property_links.back();
60 }
61 //----------------------------------------------------------------------------
62 template <typename T>
63 auto insert_output_pin(std::string const& title, T& ref,
64 icon_type const t = icon_type::flow) -> auto& {
65 m_output_pins.push_back(make_output_pin(*this, title, ref, t));
66 return *m_output_pins.back();
67 }
68 //----------------------------------------------------------------------------
69 auto title() const -> auto const& { return m_title; }
70 auto title() -> auto& { return m_title; }
71 //----------------------------------------------------------------------------
72 auto scene() const -> auto const& { return *m_scene; }
73 auto scene() -> auto& { return *m_scene; }
74 //----------------------------------------------------------------------------
75 auto set_title(std::string const& title) { m_title = title; }
76 //----------------------------------------------------------------------------
77 auto has_self_pin() const -> bool { return m_self_pin != nullptr; }
78 //----------------------------------------------------------------------------
79 auto self_pin() const -> auto const& { return *m_self_pin; }
80 auto self_pin() -> auto& { return *m_self_pin; }
81 //----------------------------------------------------------------------------
82 auto input_pins() const -> auto const& { return m_input_pins; }
83 auto input_pins() -> auto& { return m_input_pins; }
84 //----------------------------------------------------------------------------
85 auto output_pins() const -> auto const& { return m_output_pins; }
86 auto output_pins() -> auto& { return m_output_pins; }
87 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
88 auto draw_node() -> void;
89 //----------------------------------------------------------------------------
90 auto node_position() const -> ImVec2;
91 //----------------------------------------------------------------------------
92 auto notify_property_changed(bool const notify_self = true) -> void;
93 //----------------------------------------------------------------------------
94 auto update_property_links() -> void {
95 bool changed = false;
96 for (auto& prop_link : m_property_links) {
97 changed |= prop_link->update();
98 }
99 if (changed) {
101 }
102 }
103 //----------------------------------------------------------------------------
104 // virtual methods
105 //----------------------------------------------------------------------------
106 virtual auto draw_properties() -> bool = 0;
107 virtual auto on_property_changed() -> void {}
108 virtual auto on_title_changed(std::string const& /*old_title*/) -> void {}
109 virtual auto on_pin_connected(input_pin& /*this_pin*/,
110 output_pin& /*other_pin*/) -> void {}
111 virtual auto on_pin_connected(output_pin& /*this_pin*/,
112 input_pin& /*other_pin*/) -> void {}
113 virtual auto on_pin_disconnected(input_pin& /*this_pin*/) -> void {}
114 virtual auto on_pin_disconnected(output_pin& /*this_pin*/) -> void {}
115 virtual auto type_name() const -> std::string_view = 0;
116 virtual auto update(std::chrono::duration<double> const& /*dt*/) -> void {}
117 virtual auto on_path_selected(std::string const& /*path*/) -> void {}
118};
119//==============================================================================
120} // namespace base
121//==============================================================================
122template <typename T>
124 //----------------------------------------------------------------------------
125 auto serialize(T const& t) const -> toml::table {
126 toml::table serialized_node;
127 reflection::for_each(t, [&serialized_node](auto const& name,
128 auto const& var) {
129 using var_t = std::decay_t<decltype(var)>;
130 if constexpr (is_same<size_t, var_t>) {
131 serialized_node.insert(name, (int)var);
132 } else if constexpr (is_same<std::string, var_t>) {
133 serialized_node.insert(name, var);
134 } else if constexpr (std::is_arithmetic_v<var_t>) {
135 serialized_node.insert(name, var);
136 } else if constexpr (is_same<std::array<int, 2>, var_t> ||
137 is_same<std::array<float, 2>, var_t> ||
138 is_same<std::array<double, 2>, var_t> ||
139 is_same<vec<int, 2>, var_t> ||
140 is_same<vec<float, 2>, var_t> ||
141 is_same<vec<double, 2>, var_t>) {
142 serialized_node.insert(name, toml::array{var.at(0), var.at(1)});
143 } else if constexpr (is_same<std::array<int, 3>, var_t> ||
144 is_same<std::array<float, 3>, var_t> ||
145 is_same<std::array<double, 3>, var_t> ||
146 is_same<vec<int, 3>, var_t> ||
147 is_same<vec<float, 3>, var_t> ||
148 is_same<vec<double, 3>, var_t>) {
149 serialized_node.insert(name,
150 toml::array{var.at(0), var.at(1), var.at(2)});
151 } else if constexpr (is_same<std::array<int, 4>, var_t> ||
152 is_same<std::array<float, 4>, var_t> ||
153 is_same<std::array<double, 4>, var_t> ||
154 is_same<vec<int, 4>, var_t> ||
155 is_same<vec<float, 4>, var_t> ||
156 is_same<vec<double, 4>, var_t>) {
157 serialized_node.insert(
158 name, toml::array{var.at(0), var.at(1), var.at(2), var.at(3)});
159 } else if constexpr (
160 is_same<int[2],
161 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
162 is_same<float[2],
163 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
164 is_same<double[2],
165 std::remove_cv_t<std::remove_reference_t<decltype(var)>>>) {
166 serialized_node.insert(name, toml::array{var[0], var[1]});
167 } else if constexpr (
168 is_same<int[3],
169 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
170 is_same<float[3],
171 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
172 is_same<double[3],
173 std::remove_cv_t<std::remove_reference_t<decltype(var)>>>) {
174 serialized_node.insert(name, toml::array{var[0], var[1], var[2]});
175 } else if constexpr (
176 is_same<int[4],
177 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
178 is_same<float[4],
179 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
180 is_same<double[4],
181 std::remove_cv_t<std::remove_reference_t<decltype(var)>>>) {
182 serialized_node.insert(name,
183 toml::array{var[0], var[1], var[2], var[3]});
184 }
185 });
186 return serialized_node;
187 }
188 //----------------------------------------------------------------------------
189 auto deserialize(T& t, toml::table const& serialized_node) -> void {
190 reflection::for_each(t, [&serialized_node](auto const& name, auto& var) {
191 using var_t = std::decay_t<decltype(var)>;
192 if constexpr (is_same<size_t, var_t>) {
193 var = (size_t)serialized_node[name].as_integer()->get();
194 } else if constexpr (is_same<std::string, var_t>) {
195 var = serialized_node[name].as_string()->get();
196 } else if constexpr (is_same<bool, var_t>) {
197 var = serialized_node[name].as_boolean()->get();
198 } else if constexpr (std::is_integral_v<var_t>) {
199 var = serialized_node[name].as_integer()->get();
200 } else if constexpr (std::is_floating_point_v<var_t>) {
201 var = serialized_node[name].as_floating_point()->get();
202 } else if constexpr (is_same<std::array<int, 2>, var_t> ||
203 is_same<vec<int, 2>, var_t>) {
204 auto const& arr = *serialized_node[name].as_array();
205
206 var.at(0) = arr[0].as_integer()->get();
207 var.at(1) = arr[1].as_integer()->get();
208 } else if constexpr (is_same<std::array<int, 3>, var_t> ||
209 is_same<vec<int, 3>, var_t>) {
210 auto const& arr = *serialized_node[name].as_array();
211
212 var.at(0) = arr[0].as_integer()->get();
213 var.at(1) = arr[1].as_integer()->get();
214 var.at(2) = arr[2].as_integer()->get();
215 } else if constexpr (is_same<std::array<int, 4>, var_t> ||
216 is_same<vec<int, 4>, var_t>) {
217 auto const& arr = *serialized_node[name].as_array();
218
219 var.at(0) = arr[0].as_integer()->get();
220 var.at(1) = arr[1].as_integer()->get();
221 var.at(2) = arr[2].as_integer()->get();
222 var.at(3) = arr[3].as_integer()->get();
223
224 } else if constexpr (is_same<std::array<float, 2>, var_t> ||
225 is_same<std::array<double, 2>, var_t>) {
226 auto const& arr = *serialized_node[name].as_array();
227
228 var[0] = arr[0].as_floating_point()->get();
229 var[1] = arr[1].as_floating_point()->get();
230 } else if constexpr (is_same<vec<float, 2>, var_t> ||
231 is_same<vec<double, 2>, var_t>) {
232 auto const& arr = *serialized_node[name].as_array();
233
234 var(0) = arr[0].as_floating_point()->get();
235 var(1) = arr[1].as_floating_point()->get();
236 } else if constexpr (is_same<std::array<float, 3>, var_t> ||
237 is_same<std::array<double, 3>, var_t> ||
238 is_same<vec<float, 3>, var_t> ||
239 is_same<vec<double, 3>, var_t>) {
240 auto const& arr = *serialized_node[name].as_array();
241
242 var.at(0) = arr[0].as_floating_point()->get();
243 var.at(1) = arr[1].as_floating_point()->get();
244 var.at(2) = arr[2].as_floating_point()->get();
245 } else if constexpr (is_same<std::array<float, 4>, var_t> ||
246 is_same<std::array<double, 4>, var_t> ||
247 is_same<vec<float, 4>, var_t> ||
248 is_same<vec<double, 4>, var_t>) {
249 auto const& arr = *serialized_node[name].as_array();
250
251 var.at(0) = arr[0].as_floating_point()->get();
252 var.at(1) = arr[1].as_floating_point()->get();
253 var.at(2) = arr[2].as_floating_point()->get();
254 var.at(3) = arr[3].as_floating_point()->get();
255 } else if constexpr (is_same<int[2],
256 std::remove_cv_t<std::remove_reference_t<
257 decltype(var)>>>) {
258 auto const& arr = *serialized_node[name].as_array();
259
260 var[0] = arr[0].as_integer()->get();
261 var[1] = arr[1].as_integer()->get();
262 } else if constexpr (is_same<int[3],
263 std::remove_cv_t<std::remove_reference_t<
264 decltype(var)>>>) {
265 auto const& arr = *serialized_node[name].as_array();
266
267 var[0] = arr[0].as_integer()->get();
268 var[1] = arr[1].as_integer()->get();
269 var[2] = arr[2].as_integer()->get();
270 } else if constexpr (is_same<int[4],
271 std::remove_cv_t<std::remove_reference_t<
272 decltype(var)>>>) {
273 auto const& arr = *serialized_node[name].as_array();
274
275 var[0] = arr[0].as_integer()->get();
276 var[1] = arr[1].as_integer()->get();
277 var[2] = arr[2].as_integer()->get();
278 var[3] = arr[3].as_integer()->get();
279
280 } else if constexpr (
281 is_same<float[2],
282 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
283 is_same<double[2],
284 std::remove_cv_t<std::remove_reference_t<decltype(var)>>>) {
285 auto const& arr = *serialized_node[name].as_array();
286
287 var.at[0] = arr[0].as_floating_point()->get();
288 var.at[1] = arr[1].as_floating_point()->get();
289 } else if constexpr (
290 is_same<float[3],
291 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
292 is_same<double[3],
293 std::remove_cv_t<std::remove_reference_t<decltype(var)>>>) {
294 auto const& arr = *serialized_node[name].as_array();
295
296 var[0] = arr[0].as_floating_point()->get();
297 var[1] = arr[1].as_floating_point()->get();
298 var[2] = arr[2].as_floating_point()->get();
299 } else if constexpr (
300 is_same<float[4],
301 std::remove_cv_t<std::remove_reference_t<decltype(var)>>> ||
302 is_same<double[4],
303 std::remove_cv_t<std::remove_reference_t<decltype(var)>>>) {
304 auto const& arr = *serialized_node[name].as_array();
305
306 var[0] = arr[0].as_floating_point()->get();
307 var[1] = arr[1].as_floating_point()->get();
308 var[2] = arr[2].as_floating_point()->get();
309 var[3] = arr[3].as_floating_point()->get();
310 }
311 });
312 }
313 //----------------------------------------------------------------------------
314 auto draw_properties(T& t) -> bool {
315 bool changed = false;
316 reflection::for_each(t, [&changed](auto const& name, auto& var) {
317 using var_t = std::decay_t<decltype(var)>;
318 if constexpr (is_same<std::string, var_t>) {
319 changed |= ImGui::InputText(name, &var);
320
321 } else if constexpr (is_same<size_t, var_t>) {
322 changed |= ImGui::DragSizeT(name, &var);
323
324 // float
325 } else if constexpr (is_same<float, var_t>) {
326 changed |= ImGui::DragFloat(name, &var, 0.1f);
327 } else if constexpr (is_same<std::array<float, 2>, var_t>) {
328 changed |= ImGui::DragFloat2(name, var.data(), 0.1f);
329
330 } else if constexpr (is_same<std::array<float, 3>, var_t>) {
331 changed |= ImGui::DragFloat3(name, var.data(), 0.1f);
332 } else if constexpr (is_same<std::array<float, 4>, var_t>) {
333 changed |= ImGui::DragFloat4(name, var.data(), 0.1f);
334 } else if constexpr (is_same<vec<float, 2>, var_t>) {
335 changed |= ImGui::DragFloat2(name, var.data(), 0.1f);
336 } else if constexpr (is_same<vec<float, 3>, var_t>) {
337 changed |= ImGui::DragFloat3(name, var.data(), 0.1f);
338 } else if constexpr (is_same<vec<float, 4>, var_t>) {
339 changed |= ImGui::DragFloat4(name, var.data(), 0.1f);
340
341 // double
342 } else if constexpr (is_same<double, var_t>) {
343 changed |= ImGui::DragDouble(name, &var, 0.1);
344 } else if constexpr (is_same<std::array<double, 2>, var_t>) {
345 changed |= ImGui::DragDouble2(name, var.data(), 0.1);
346 } else if constexpr (is_same<std::array<double, 3>, var_t>) {
347 changed |= ImGui::DragDouble3(name, var.data(), 0.1);
348 } else if constexpr (is_same<std::array<double, 4>, var_t>) {
349 changed |= ImGui::DragDouble4(name, var.data(), 0.1);
350 } else if constexpr (is_same<vec<double, 2>, var_t>) {
351 changed |= ImGui::DragDouble2(name, var.data(), 0.1);
352 } else if constexpr (is_same<vec<double, 3>, var_t>) {
353 changed |= ImGui::DragDouble3(name, var.data(), 0.1);
354 } else if constexpr (is_same<vec<double, 4>, var_t>) {
355 changed |= ImGui::DragDouble4(name, var.data(), 0.1);
356
357 // int
358 } else if constexpr (is_same<int, var_t>) {
359 changed |= ImGui::DragInt(name, &var, 1);
360 } else if constexpr (is_same<std::array<int, 2>, var_t>) {
361 changed |= ImGui::DragInt2(name, var.data(), 1);
362 } else if constexpr (is_same<std::array<int, 3>, var_t>) {
363 changed |= ImGui::DragInt3(name, var.data(), 1);
364 } else if constexpr (is_same<std::array<int, 4>, var_t>) {
365 changed |= ImGui::DragInt4(name, var.data(), 1);
366 } else if constexpr (is_same<vec<int, 2>, var_t>) {
367 changed |= ImGui::DragInt2(name, var.data(), 1);
368 } else if constexpr (is_same<vec<int, 3>, var_t>) {
369 changed |= ImGui::DragInt3(name, var.data(), 1);
370 } else if constexpr (is_same<vec<int, 4>, var_t>) {
371 changed |= ImGui::DragInt4(name, var.data(), 1);
372 }
373 });
374 return changed;
375 }
376 //----------------------------------------------------------------------------
377 constexpr auto type_name() const -> std::string_view {
378 return reflection::name<T>();
379 }
380};
381template <typename Child>
383 using base::node::node;
385 //============================================================================
386 auto serialize() const -> toml::table override final {
387 return serializer_t::serialize(*dynamic_cast<Child const*>(this));
388 }
389 //----------------------------------------------------------------------------
390 auto deserialize(toml::table const& serialized_node) -> void override {
391 node_serializer<Child>::deserialize(*dynamic_cast<Child*>(this),
392 serialized_node);
393 }
394 //----------------------------------------------------------------------------
395 auto draw_properties() -> bool override {
396 return node_serializer<Child>::draw_properties(*dynamic_cast<Child*>(this));
397 }
398 //----------------------------------------------------------------------------
399 auto type_name() const -> std::string_view override final {
401 }
402};
403//==============================================================================
404} // namespace tatooine::flowexplorer::ui
405//==============================================================================
407 using F = std::string_view (*)();
409};
410//------------------------------------------------------------------------------
412 using F = tatooine::flowexplorer::ui::base::
413 node* (*)(tatooine::flowexplorer::scene&, std::string_view const&);
415};
416//==============================================================================
417#define TATOOINE_FLOWEXPLORER_REGISTER_NAME(registered_function_, sec) \
418 static registration_name_t ptr_##registered_function_ \
419 __attribute((used, section(#sec))) = { \
420 .f = registered_function_, \
421 }
422//------------------------------------------------------------------------------
423#define TATOOINE_FLOWEXPLORER_REGISTER_FACTORY(registered_function_, sec) \
424 static registration_factory_t ptr_##registered_function_ \
425 __attribute((used, section(#sec))) = { \
426 .f = registered_function_, \
427 }
428//------------------------------------------------------------------------------
429#define TATOOINE_FLOWEXPLORER_REGISTER_NODE(type, ...) \
430 TATOOINE_MAKE_ADT_REFLECTABLE(type, ##__VA_ARGS__) \
431 namespace tatooine::flowexplorer::registration::type { \
432 static auto factory(::tatooine::flowexplorer::scene& s, \
433 std::string_view const& node_type_name) \
434 -> ::tatooine::flowexplorer::ui::base::node* { \
435 if (node_type_name == #type) { \
436 return s.nodes().emplace_back(new ::type{s}).get(); \
437 } \
438 return nullptr; \
439 } \
440 static constexpr auto name() -> std::string_view { return #type; } \
441 TATOOINE_FLOWEXPLORER_REGISTER_FACTORY(factory, factory_); \
442 TATOOINE_FLOWEXPLORER_REGISTER_NAME(name, name_); \
443 }
444//------------------------------------------------------------------------------
445#define TATOOINE_FLOWEXPLORER_REGISTER_RENDERABLE(type, ...) \
446 TATOOINE_MAKE_ADT_REFLECTABLE(type, ##__VA_ARGS__) \
447 namespace tatooine::flowexplorer::registration::type { \
448 static auto factory(::tatooine::flowexplorer::scene& s, \
449 std::string_view const& node_type_name) \
450 -> ::tatooine::flowexplorer::ui::base::node* { \
451 if (node_type_name == #type) { \
452 return s.renderables().emplace_back(new ::type{s}).get(); \
453 } \
454 return nullptr; \
455 } \
456 static constexpr auto name() -> std::string_view { return #type; } \
457 TATOOINE_FLOWEXPLORER_REGISTER_FACTORY(factory, factory_); \
458 TATOOINE_FLOWEXPLORER_REGISTER_NAME(name, name_); \
459 }
460//------------------------------------------------------------------------------
461#define iterate_registered_factories(elem) \
462 for (registration_factory_t* elem = &__start_factory_; \
463 elem != &__stop_factory_; ++elem)
464//------------------------------------------------------------------------------
465#define iterate_registered_names(elem) \
466 for (registration_name_t* elem = &__start_name_; elem != &__stop_name_; \
467 ++elem)
468//------------------------------------------------------------------------------
473//==============================================================================
474namespace tatooine::flowexplorer {
475//==============================================================================
476auto insert_registered_element(scene& s, std::string_view const& name)
477 -> ui::base::node*;
478//==============================================================================
479} // namespace tatooine::flowexplorer
480//==============================================================================
481#endif
482
DLL_API auto DragSizeT(char const *label, std::size_t *v, std::size_t v_speed=1, std::size_t v_min=0, std::size_t v_max=std::numeric_limits< std::size_t >::max()) -> bool
DLL_API auto DragDouble(const char *label, double *v, double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
DLL_API auto DragDouble2(const char *label, double v[2], double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
DLL_API auto DragDouble3(const char *label, double v[3], double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
DLL_API auto DragDouble4(const char *label, double v[4], double v_speed=1.0, double v_min=0.0, double v_max=0.0, const char *format="%.3lf", float power=1.0) -> bool
Definition: draw_icon.h:6
auto make_output_pin(base::node &n, std::string const &title, T &t, icon_type const it=icon_type::flow) -> std::unique_ptr< output_pin >
Definition: pin.h:174
icon_type
Definition: draw_icon.h:8
Definition: directories.h:6
auto insert_registered_element(scene &s, std::string_view const &name) -> ui::base::node *
constexpr auto for_each(T &&t, V &&v)
Iterate over each registered member.
Definition: reflection.h:48
static constexpr auto is_same
Definition: type_traits.h:42
registration_factory_t __start_factory_
registration_name_t __start_name_
registration_factory_t __stop_factory_
registration_name_t __stop_name_
Definition: node.h:411
tatooine::flowexplorer::ui::base::node *(*)(tatooine::flowexplorer::scene &, std::string_view const &) F
Definition: node.h:413
F f
Definition: node.h:414
Definition: node.h:406
F f
Definition: node.h:408
std::string_view(*)() F
Definition: node.h:407
auto serialize() const -> toml::table override
Definition: renderable.h:46
Definition: scene.h:17
Definition: serializable.h:8
Definition: toggleable.h:6
node(std::string const &title, flowexplorer::scene &s, T &ref)
Definition: node.h:41
virtual auto on_pin_connected(output_pin &, input_pin &) -> void
Definition: node.h:111
auto title() -> auto &
Definition: node.h:70
virtual auto on_pin_connected(input_pin &, output_pin &) -> void
Definition: node.h:109
auto input_pins() -> auto &
Definition: node.h:83
auto scene() const -> auto const &
Definition: node.h:72
node(std::string const &title, flowexplorer::scene &s)
auto set_title(std::string const &title)
Definition: node.h:75
flowexplorer::scene * m_scene
Definition: node.h:26
auto output_pins() -> auto &
Definition: node.h:86
std::vector< std::unique_ptr< input_pin_property_link > > m_property_links
Definition: node.h:29
auto input_pins() const -> auto const &
Definition: node.h:82
auto node_position() const -> ImVec2
auto title() const -> auto const &
Definition: node.h:69
auto update_property_links() -> void
Definition: node.h:94
virtual auto on_property_changed() -> void
Definition: node.h:107
virtual auto on_pin_disconnected(output_pin &) -> void
Definition: node.h:114
virtual auto update(std::chrono::duration< double > const &) -> void
Definition: node.h:116
virtual auto on_pin_disconnected(input_pin &) -> void
Definition: node.h:113
auto insert_input_pin_property_link(input_pin &pin, Prop &prop) -> auto &
Definition: node.h:56
node(flowexplorer::scene &s, T &ref)
Definition: node.h:36
virtual auto on_path_selected(std::string const &) -> void
Definition: node.h:117
auto self_pin() -> auto &
Definition: node.h:80
auto scene() -> auto &
Definition: node.h:73
std::vector< std::unique_ptr< input_pin > > m_input_pins
Definition: node.h:27
auto has_self_pin() const -> bool
Definition: node.h:77
virtual auto type_name() const -> std::string_view=0
auto insert_input_pin(std::string const &title, icon_type const t=icon_type::flow) -> auto &
Definition: node.h:49
virtual auto draw_properties() -> bool=0
auto self_pin() const -> auto const &
Definition: node.h:79
std::vector< std::unique_ptr< output_pin > > m_output_pins
Definition: node.h:28
auto output_pins() const -> auto const &
Definition: node.h:85
std::string m_title
Definition: node.h:25
auto insert_output_pin(std::string const &title, T &ref, icon_type const t=icon_type::flow) -> auto &
Definition: node.h:63
virtual auto on_title_changed(std::string const &) -> void
Definition: node.h:108
std::unique_ptr< output_pin > m_self_pin
Definition: node.h:30
auto notify_property_changed(bool const notify_self=true) -> void
auto serialize(T const &t) const -> toml::table
Definition: node.h:125
auto draw_properties(T &t) -> bool
Definition: node.h:314
auto deserialize(T &t, toml::table const &serialized_node) -> void
Definition: node.h:189
constexpr auto type_name() const -> std::string_view
Definition: node.h:377
Definition: node.h:382
auto deserialize(toml::table const &serialized_node) -> void override
Definition: node.h:390
auto type_name() const -> std::string_view override final
Definition: node.h:399
auto draw_properties() -> bool override
Definition: node.h:395
auto serialize() const -> toml::table override final
Definition: node.h:386
auto set_icon_type(icon_type const t)
Definition: pin.h:35
Definition: uuid_holder.h:11
Definition: hdf5.h:825