2 #include <Process/Dataflow/Port.hpp>
4 #include <score/tools/Debug.hpp>
6 #include <ossia/detail/math.hpp>
7 #include <ossia/network/domain/domain.hpp>
11 namespace WidgetFactory
16 static constexpr
double to01(
double min,
double range,
double val) noexcept
18 return (val - min) / range;
21 static constexpr
double from01(
double min,
double range,
double val) noexcept
23 return min + val * range;
27 static double to01(
const T& slider,
double val) noexcept
29 auto min = slider.getMin();
30 auto max = slider.getMax();
33 return to01(min, max - min, val);
37 static double from01(
const T& slider,
double val) noexcept
39 auto min = slider.getMin();
40 auto max = slider.getMax();
43 return from01(min, max - min, val);
47 static ossia::vec2f to01(
const T& slider, ossia::vec2f val) noexcept
50 const auto min = slider.getMin();
51 const auto max = slider.getMax();
52 res[0] = to01(min[0], max[0] - min[0], val[0]);
53 res[1] = to01(min[1], max[1] - min[1], val[1]);
58 static ossia::vec2f from01(
const T& slider, ossia::vec2f val) noexcept
61 const auto min = slider.getMin();
62 const auto max = slider.getMax();
63 res[0] = from01(min[0], max[0] - min[0], val[0]);
64 res[1] = from01(min[1], max[1] - min[1], val[1]);
69 static ossia::vec3f to01(
const T& slider, ossia::vec3f val) noexcept
72 const auto min = slider.getMin();
73 const auto max = slider.getMax();
74 res[0] = to01(min[0], max[0] - min[0], val[0]);
75 res[1] = to01(min[1], max[1] - min[1], val[1]);
76 res[2] = to01(min[2], max[2] - min[2], val[2]);
81 static ossia::vec3f from01(
const T& slider, ossia::vec3f val) noexcept
84 const auto min = slider.getMin();
85 const auto max = slider.getMax();
86 res[0] = from01(min[0], max[0] - min[0], val[0]);
87 res[1] = from01(min[1], max[1] - min[1], val[1]);
88 res[2] = from01(min[2], max[2] - min[2], val[2]);
93 static ossia::vec4f to01(
const T& slider, ossia::vec4f val) noexcept
96 const auto min = slider.getMin();
97 const auto max = slider.getMax();
98 res[0] = to01(min[0], max[0] - min[0], val[0]);
99 res[1] = to01(min[1], max[1] - min[1], val[1]);
100 res[2] = to01(min[2], max[2] - min[2], val[2]);
101 res[3] = to01(min[3], max[3] - min[3], val[3]);
105 template <
typename T>
106 static ossia::vec4f from01(
const T& slider, ossia::vec4f val) noexcept
109 const auto min = slider.getMin();
110 const auto max = slider.getMax();
111 res[0] = from01(min[0], max[0] - min[0], val[0]);
112 res[1] = from01(min[1], max[1] - min[1], val[1]);
113 res[2] = from01(min[2], max[2] - min[2], val[2]);
114 res[3] = from01(min[3], max[3] - min[3], val[3]);
121 static double to01(
double min,
double range,
double val) noexcept
123 return ossia::log_to_normalized(min, range, val);
126 static double from01(
double min,
double range,
double val) noexcept
128 return ossia::normalized_to_log(min, range, val);
131 template <
typename T>
132 static double to01(
const T& slider,
double val) noexcept
134 auto min = slider.getMin();
135 auto max = slider.getMax();
138 return to01(min, max - min, val);
141 template <
typename T>
142 static double from01(
const T& slider,
double val) noexcept
144 auto min = slider.getMin();
145 auto max = slider.getMax();
148 return from01(min, max - min, val);
152 template <
typename Norm_T>
157 template <
typename T>
160 min = slider.getMin();
161 max = slider.getMax();
166 constexpr
double to01(
double val)
const noexcept
168 return Norm_T::to01(min, max - min, val);
171 constexpr
double from01(
double val)
const noexcept
173 return Norm_T::from01(min, max - min, val);
177 template <
typename Norm_T,
typename Sl
ider_T>
180 const Slider_T& slider;
187 constexpr
double to01(
double val)
const noexcept {
return Norm_T::to01(slider, val); }
189 constexpr
double from01(
double val)
const noexcept
191 return Norm_T::from01(slider, val);
195 template <
typename T,
typename Control_T,
typename W
idget_T>
196 static void bindFloatDomain(
const T& slider, Control_T& inlet, Widget_T& widget)
198 auto min = slider.getMin();
199 auto max = slider.getMax();
203 widget.setRange(min, max);
205 if constexpr(std::is_base_of_v<Process::ControlInlet, T>)
207 SCORE_ASSERT(&slider == &inlet);
208 QObject::connect(&inlet, &Control_T::domainChanged, &widget, [&slider, &widget] {
209 auto min = slider.getMin();
210 auto max = slider.getMax();
214 widget.setRange(min, max);
219 template <
typename T,
typename Control_T,
typename W
idget_T>
220 static void bindIntDomain(
const T& slider, Control_T& inlet, Widget_T& widget)
222 auto min = slider.getMin();
223 auto max = slider.getMax();
227 widget.setRange(min, max);
229 if constexpr(std::is_base_of_v<Process::ControlInlet, T>)
231 SCORE_ASSERT(&slider == &inlet);
232 QObject::connect(&inlet, &Control_T::domainChanged, &widget, [&slider, &widget] {
233 auto min = slider.getMin();
234 auto max = slider.getMax();
238 widget.setRange(min, max);
243 template <
typename T,
typename Control_T,
typename W
idget_T>
244 static void bindVec2Domain(
const T& slider, Control_T& inlet, Widget_T& widget)
246 auto update_range = [&widget, &inlet] {
247 auto min = ossia::get_min(inlet.domain());
248 auto max = ossia::get_max(inlet.domain());
249 auto min_float = min.template target<float>();
250 auto max_float = max.template target<float>();
251 if(min_float && max_float)
253 if(*max_float - *min_float == 0)
254 *max_float = *min_float + 1;
255 widget.setRange({*min_float, *min_float}, {*max_float, *max_float});
259 auto min_vec2 = min.template target<ossia::vec2f>();
260 auto max_vec2 = max.template target<ossia::vec2f>();
261 if(min_vec2 && max_vec2)
263 auto& min = *min_vec2;
264 auto& max = *max_vec2;
265 for(std::size_t i = 0; i < min.size(); i++)
267 if(max[i] - min[i] == 0)
271 widget.setRange(min, max);
278 if constexpr(std::is_base_of_v<Process::ControlInlet, T>)
280 SCORE_ASSERT(&slider == &inlet);
281 QObject::connect(&inlet, &Control_T::domainChanged, &widget, update_range);
285 template <
typename T,
typename Control_T,
typename W
idget_T>
286 static void bindVec3Domain(
const T& slider, Control_T& inlet, Widget_T& widget)
288 auto update_range = [&widget, &inlet] {
289 auto min = ossia::get_min(inlet.domain());
290 auto max = ossia::get_max(inlet.domain());
291 auto min_float = min.template target<float>();
292 auto max_float = max.template target<float>();
293 if(min_float && max_float)
295 if(*max_float - *min_float == 0)
296 *max_float = *min_float + 1;
298 {*min_float, *min_float, *min_float}, {*max_float, *max_float, *max_float});
302 auto min_vec3 = min.template target<ossia::vec3f>();
303 auto max_vec3 = max.template target<ossia::vec3f>();
304 if(min_vec3 && max_vec3)
306 auto& min = *min_vec3;
307 auto& max = *max_vec3;
308 for(std::size_t i = 0; i < min.size(); i++)
310 if(max[i] - min[i] == 0)
314 widget.setRange(min, max);
321 if constexpr(std::is_base_of_v<Process::ControlInlet, T>)
323 SCORE_ASSERT(&slider == &inlet);
324 QObject::connect(&inlet, &Control_T::domainChanged, &widget, update_range);