Loading...
Searching...
No Matches
ExecutorUpdateControlValueInUi.hpp
1#pragma once
2#include <Process/Process.hpp>
3
4#include <Crousti/ProcessModel.hpp>
5
6#include <avnd/binding/ossia/node.hpp>
7
8namespace oscr
9{
10template <typename Node>
12{
13 using ExecNode = safe_node<Node>;
15
16 typename ExecNode::control_input_values_type& arr;
17 QPointer<Model> element;
18
19 template <avnd::dynamic_ports_port Field, std::size_t N, std::size_t NField>
20 void operator()(Field& field, avnd::predicate_index<N>, avnd::field_index<NField>)
21 {
22 if(!element)
23 return;
24 for(auto p : element->avnd_input_idx_to_model_ports(NField))
25 {
26 if(auto inlet = qobject_cast<Process::ControlInlet*>(p))
27 {
28 using namespace std;
29 // FIXME handle dynamic ports correctly
30 // inlet->setExecutionValue(oscr::to_ossia_value(field, get<N>(arr)));
31 }
32 }
33 }
34
35 template <typename Field, std::size_t N, std::size_t NField>
36 void operator()(Field& field, avnd::predicate_index<N>, avnd::field_index<NField>)
37 {
38 if(!element)
39 return;
40 auto p = element->avnd_input_idx_to_model_ports(NField)[0];
41 if(auto inlet = qobject_cast<Process::ControlInlet*>(p))
42 {
43 using namespace std;
44 inlet->setExecutionValue(oscr::to_ossia_value(field, get<N>(arr)));
45 }
46 }
47};
48
49template <typename Node>
51{
52 using ExecNode = safe_node<Node>;
54 typename ExecNode::control_output_values_type& arr;
55 QPointer<Model> element;
56
57 template <typename Field, std::size_t N, std::size_t NField>
58 void operator()(Field& field, avnd::predicate_index<N>, avnd::field_index<NField>)
59 {
60 if(!element)
61 return;
62 using namespace std;
63 auto ports = element->avnd_output_idx_to_model_ports(NField);
64 SCORE_ASSERT(!ports.empty());
65 auto outlet = safe_cast<Process::ControlOutlet*>(ports[0]);
66 outlet->setValue(oscr::to_ossia_value(field, get<N>(arr)));
67 }
68
69 template <avnd::dynamic_ports_port Field, std::size_t N, std::size_t NField>
70 void operator()(Field& field, avnd::predicate_index<N>, avnd::field_index<NField>)
71 {
72 if(!element)
73 return;
74 using namespace std;
75 // FIXME handle dynamic ports correctly
76 // auto outlet
77 // = safe_cast<Process::ControlOutlet*>(modelPort<Node>(element->outlets(), NField));
78 // outlet->setValue(oscr::to_ossia_value(field, get<N>(arr)));
79 }
80};
81
82template <typename Node>
84{
85 using ExecNode = safe_node<Node>;
87 std::weak_ptr<ExecNode> weak_node;
88 QPointer<Model> element;
89
90 void handle_controls(ExecNode& node) const noexcept
91 {
92 using namespace ossia::safe_nodes;
93 // TODO disconnect the connection ? it will be disconnected shortly
94 // after...
95
96 typename ExecNode::control_input_values_type arr;
97 bool ok = false;
98 while(node.control.ins_queue.try_dequeue(arr))
99 {
100 ok = true;
101 }
102 if(ok)
103 {
104 for(auto state : node.impl.full_state())
105 {
106 avnd::control_input_introspection<Node>::for_all_n2(
107 state.inputs, update_control_in_value_in_ui<Node>{arr, element});
108 }
109 }
110 }
111
112 void handle_control_outs(ExecNode& node) const noexcept
113 {
114 using namespace ossia::safe_nodes;
115 // TODO disconnect the connection ? it will be disconnected shortly
116 // after...
117 typename ExecNode::control_output_values_type arr;
118 bool ok = false;
119 while(node.control.outs_queue.try_dequeue(arr))
120 {
121 ok = true;
122 }
123 if(ok)
124 {
125 // FIXME not thread safe?
126 avnd::control_output_introspection<Node>::for_all_n2(
127 avnd::get_outputs<Node>(node.impl),
129 }
130 }
131
132 void operator()() const noexcept
133 {
134 if(auto node = weak_node.lock())
135 {
136 static constexpr const auto control_count
137 = avnd::control_input_introspection<Node>::size;
138 static constexpr const auto control_out_count
139 = avnd::control_output_introspection<Node>::size;
140 if constexpr(control_count > 0)
141 handle_controls(*node);
142
143 if constexpr(control_out_count > 0)
144 handle_control_outs(*node);
145 }
146 }
147};
148}
Definition score-plugin-avnd/Crousti/ProcessModel.hpp:86
Definition Factories.hpp:19
STL namespace.
Definition ExecutorUpdateControlValueInUi.hpp:12
Definition ExecutorUpdateControlValueInUi.hpp:51
Definition ExecutorUpdateControlValueInUi.hpp:84