Tatooine
pin.h
Go to the documentation of this file.
1#ifndef TATOOINE_FLOWEXPLORER_UI_PIN_H
2#define TATOOINE_FLOWEXPLORER_UI_PIN_H
3//==============================================================================
4#include <imgui-node-editor/imgui_node_editor.h>
10//==============================================================================
12//==============================================================================
13namespace base {
14struct node;
15}
16struct link;
17//==============================================================================
18struct pin : uuid_holder<ax::NodeEditor::PinId>, toggleable {
19 private:
20 std::string m_title;
24
25 public:
26 pin(base::node& n, pinkind kind, std::string const& title,
27 icon_type const t = icon_type::flow);
28
29 auto node() const -> auto const& { return m_node; }
30 auto node() -> auto& { return m_node; }
31 auto title() -> auto& { return m_title; }
32 auto title() const -> auto const& { return m_title; }
33 auto kind() const { return m_kind; }
34 auto draw(size_t const icon_size, float const alpha) const -> void;
35 auto set_icon_type(icon_type const t) { m_icon_type = t; }
36
37 virtual auto is_linked() const -> bool = 0;
38};
39//==============================================================================
40struct output_pin;
41struct input_pin : pin {
42 friend struct output_pin;
43 private:
44 std::vector<std::type_info const*> m_types;
45 struct link* m_link = nullptr;
46
47 public:
48 input_pin(base::node& n, std::vector<std::type_info const*> types,
49 std::string const& title, icon_type const t);
50 virtual ~input_pin() = default;
51
52 auto types() const -> auto const& { return m_types; }
53 auto is_linked() const -> bool override { return m_link != nullptr; }
54 auto link() const -> auto const& { return *m_link; }
55 auto link() -> auto& { return *m_link; }
56 auto link(struct link & l) -> void;
57 auto unlink() -> void;
58 private:
59 auto unlink_from_output() -> void;
60 public:
61 template <typename T>
62 auto get_linked_as() -> T&;
63 template <typename T>
64 auto get_linked_as() const -> T const&;
65 auto linked_type() const -> std::type_info const&;
66 auto set_active(bool active = true) -> void override;
67};
68//==============================================================================
72 virtual ~input_pin_property_link() = default;
73 virtual auto update() -> bool = 0;
74};
75// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
76template <typename Prop>
81 virtual ~input_pin_property_link_impl() = default;
82 virtual auto update() -> bool {
83 bool changed = false;
84 if (m_pin.is_linked()) {
85 auto const& linked = m_pin.get_linked_as<Prop>();
86
87 if (linked != m_property) {
88 m_property = linked;
89 changed = true;
90 }
91 }
92 return changed;
93 }
94};
95//==============================================================================
96struct output_pin : pin {
97 friend struct input_pin;
98 private:
99 std::vector<struct link*> m_links;
100
101 public:
102 output_pin(base::node& n, std::string const& title, icon_type const t);
103 virtual ~output_pin() = default;
104
105 auto link(struct link & l) -> void;
106 auto unlink(struct link& l) -> void;
107 auto unlink_all() -> void;
108
109 private:
110 auto unlink_from_input(struct link & l) -> void;
111 public:
112 auto is_linked() const -> bool override { return !m_links.empty(); }
113 auto links() const -> auto const& { return m_links; }
114 auto links() -> auto& { return m_links; }
115 virtual auto type() const -> std::type_info const& = 0;
116
117 template <typename T>
118 auto get_as() -> T&;
119
120 auto set_active(bool active = true) -> void override;
121};
122//==============================================================================
123template <typename T>
125 private:
127
128 public:
129 output_pin_impl(base::node& n, std::string const& title, T& ref,
130 icon_type const t)
131 : output_pin{n, title, t}, m_ref{ref} {}
132 virtual ~output_pin_impl() = default;
133 auto type() const -> std::type_info const& override {
134 return typeid(T);
135 }
136
137 auto get_as() -> T& { return m_ref; }
138 auto get_as() const -> T const& { return m_ref; }
139};
140//==============================================================================
141template <typename T>
142auto output_pin::get_as() -> T& {
143 if (typeid(T) != this->type()) {
144 throw std::runtime_error{"Types do not match."};
145 }
146 return dynamic_cast<output_pin_impl<T>*>(this)->get_as();
147}
148//==============================================================================
149template <typename T>
151 return link().output().get_as<T>();
152}
153//------------------------------------------------------------------------------
154template <typename T>
155auto input_pin::get_linked_as() const -> T const& {
156 return link().output().get_as<T>();
157}
158//==============================================================================
159template <typename... Ts>
160auto make_input_pin(base::node& n, std::string const& title,
161 icon_type const t = icon_type::flow)
162 -> std::unique_ptr<input_pin> {
163 return std::make_unique<input_pin>(
164 n, std::vector{&typeid(std::decay_t<Ts>)...}, title, t);
165}
166//------------------------------------------------------------------------------
167template <typename Prop>
169 -> std::unique_ptr<input_pin_property_link> {
170 return std::make_unique<input_pin_property_link_impl<Prop>>(pin, prop);
171}
172//------------------------------------------------------------------------------
173template <typename T>
174auto make_output_pin(base::node& n, std::string const& title, T& t,
175 icon_type const it = icon_type::flow)
176 -> std::unique_ptr<output_pin> {
177 return std::make_unique<output_pin_impl<T>>(n, title, t, it);
178}
179//==============================================================================
180} // namespace tatooine::flowexplorer::ui
181//==============================================================================
182#include "node.h"
183#endif
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
auto make_input_pin_property_link(input_pin &pin, Prop &prop) -> std::unique_ptr< input_pin_property_link >
Definition: pin.h:168
auto make_input_pin(base::node &n, std::string const &title, icon_type const t=icon_type::flow) -> std::unique_ptr< input_pin >
Definition: pin.h:160
pinkind
Definition: pinkind.h:6
icon_type
Definition: draw_icon.h:8
Definition: toggleable.h:6
virtual constexpr auto set_active(bool active=true) -> void
Definition: toggleable.h:18
std::vector< std::type_info const * > m_types
Definition: pin.h:44
auto link(struct link &l) -> void
auto is_linked() const -> bool override
Definition: pin.h:53
auto get_linked_as() -> T &
Definition: pin.h:150
input_pin(base::node &n, std::vector< std::type_info const * > types, std::string const &title, icon_type const t)
auto link() const -> auto const &
Definition: pin.h:54
auto link() -> auto &
Definition: pin.h:55
auto types() const -> auto const &
Definition: pin.h:52
auto get_as() const -> T const &
Definition: pin.h:138
auto type() const -> std::type_info const &override
Definition: pin.h:133
auto get_as() -> T &
Definition: pin.h:137
output_pin_impl(base::node &n, std::string const &title, T &ref, icon_type const t)
Definition: pin.h:129
auto set_active(bool active=true) -> void override
output_pin(base::node &n, std::string const &title, icon_type const t)
auto is_linked() const -> bool override
Definition: pin.h:112
auto unlink(struct link &l) -> void
virtual auto type() const -> std::type_info const &=0
auto links() -> auto &
Definition: pin.h:114
auto links() const -> auto const &
Definition: pin.h:113
std::vector< struct link * > m_links
Definition: pin.h:99
auto unlink_from_input(struct link &l) -> void
auto get_as() -> T &
Definition: pin.h:142
auto link(struct link &l) -> void
auto kind() const
Definition: pin.h:33
auto node() const -> auto const &
Definition: pin.h:29
std::string m_title
Definition: pin.h:20
auto draw(size_t const icon_size, float const alpha) const -> void
virtual auto is_linked() const -> bool=0
auto set_icon_type(icon_type const t)
Definition: pin.h:35
pin(base::node &n, pinkind kind, std::string const &title, icon_type const t=icon_type::flow)
auto title() -> auto &
Definition: pin.h:31
icon_type m_icon_type
Definition: pin.h:23
auto node() -> auto &
Definition: pin.h:30
pinkind m_kind
Definition: pin.h:22
auto title() const -> auto const &
Definition: pin.h:32
base::node & m_node
Definition: pin.h:21
Definition: uuid_holder.h:11