score-lib-process/Control/Widgets.hpp
1 #pragma once
2 #include <Process/Dataflow/ControlWidgetDomains.hpp>
3 #include <Process/Dataflow/ControlWidgets.hpp>
4 #include <Process/Dataflow/WidgetInlets.hpp>
5 
6 #include <score/plugins/DeserializeKnownSubType.hpp>
7 
8 //#include <ossia/dataflow/port.hpp>
9 #include <ossia/dataflow/safe_nodes/port.hpp>
10 #include <ossia/detail/timed_vec.hpp>
11 #include <ossia/network/dataspace/dataspace.hpp>
12 
13 #include <score_lib_process_export.h>
14 namespace Control
15 {
16 
17 struct OutControl final : ossia::safe_nodes::control_out
18 {
19  static const constexpr bool must_validate = false;
20  using type = ossia::value;
21 
22  constexpr OutControl(const char* name)
23  : ossia::safe_nodes::control_out{name}
24  {
25  }
26 
27  auto create_outlet(Id<Process::Port> id, QObject* parent) const
28  {
29  return new Process::ControlOutlet{id, parent};
30  }
31  auto create_outlet(DataStream::Deserializer& id, QObject* parent) const
32  {
33  return deserialize_known_interface<Process::ControlOutlet>(id, parent);
34  }
35  auto create_outlet(JSONObject::Deserializer&& id, QObject* parent) const
36  {
37  return deserialize_known_interface<Process::ControlOutlet>(id, parent);
38  }
39 
40  const ossia::value& fromValue(const ossia::value& v) const { return v; }
41  const ossia::value& toValue(const ossia::value& v) const { return v; }
42 };
43 
44 struct InControl final : ossia::safe_nodes::control_in
45 {
46  static const constexpr bool must_validate = false;
47  using type = ossia::value;
48 
49  constexpr InControl(const char* name)
50  : ossia::safe_nodes::control_in{name}
51  {
52  }
53 
54  auto create_inlet(Id<Process::Port> id, QObject* parent) const
55  {
56  return new Process::ControlInlet{id, parent};
57  }
58  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
59  {
60  return deserialize_known_interface<Process::ControlInlet>(id, parent);
61  }
62  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
63  {
64  return deserialize_known_interface<Process::ControlInlet>(id, parent);
65  }
66 
67  void setup_exec(auto& v) const { }
68  const ossia::value& fromValue(const ossia::value& v) const { return v; }
69  const ossia::value& toValue(const ossia::value& v) const { return v; }
70 };
71 
72 template <
73  typename Model_T, typename T, typename Normalizer = WidgetFactory::LinearNormalizer>
74 struct FloatControl final
75  : ossia::safe_nodes::control_in
76  , WidgetFactory::FloatControl<T, Normalizer, true>
77 {
78  static const constexpr bool must_validate = false;
79  using type = float;
80  const float min{};
81  const float max{};
82  const float init{};
83 
84  constexpr FloatControl(const char* name, float v1, float v2, float v3)
85  : ossia::safe_nodes::control_in{name}
86  , min{v1}
87  , max{v2}
88  , init{v3}
89  {
90  }
91 
92  auto getMin() const { return min; }
93  auto getMax() const { return max; }
94 
95  auto create_inlet(Id<Process::Port> id, QObject* parent) const
96  {
97  return new Model_T{min, max, init, QString::fromUtf8(name.data(), name.size()),
98  id, parent};
99  }
100  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
101  {
102  return deserialize_known_interface<Model_T>(id, parent);
103  }
104  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
105  {
106  return deserialize_known_interface<Model_T>(id, parent);
107  }
108 
109  void setup_exec(auto& v) const
110  {
111  v->type = ossia::val_type::FLOAT;
112  v->domain = ossia::domain_base<float>(this->min, this->max);
113  }
114 
115  float fromValue(const ossia::value& v) const { return ossia::convert<float>(v); }
116  ossia::value toValue(float v) const { return v; }
117 };
118 
119 template <typename T>
120 struct FloatDisplay final
121  : ossia::safe_nodes::control_out
122  , WidgetFactory::FloatControl<T, WidgetFactory::LinearNormalizer, false>
123 {
124  static const constexpr bool must_validate = false;
125  using type = float;
126  const float min{};
127  const float max{};
128  const float init{};
129 
130  constexpr FloatDisplay(const char* name, float v1, float v2, float v3)
131  : ossia::safe_nodes::control_out{name}
132  , min{v1}
133  , max{v2}
134  , init{v3}
135  {
136  }
137 
138  auto getMin() const { return min; }
139  auto getMax() const { return max; }
140 
141  auto create_outlet(Id<Process::Port> id, QObject* parent) const
142  {
143  return new Process::Bargraph{
144  min, max, init, QString::fromUtf8(name.data(), name.size()), id, parent};
145  }
146  auto create_outlet(DataStream::Deserializer& id, QObject* parent) const
147  {
148  return deserialize_known_interface<Process::Bargraph>(id, parent);
149  }
150  auto create_outlet(JSONObject::Deserializer&& id, QObject* parent) const
151  {
152  return deserialize_known_interface<Process::Bargraph>(id, parent);
153  }
154 
155  void setup_exec(auto& v) const
156  {
157  v->type = ossia::val_type::FLOAT;
158  v->domain = ossia::domain_base<float>(this->min, this->max);
159  }
160 
161  float fromValue(const ossia::value& v) const { return ossia::convert<float>(v); }
162  ossia::value toValue(float v) const { return v; }
163 };
164 
168  Process::LogFloatSlider, score::QGraphicsLogSlider, WidgetFactory::LogNormalizer>;
169 using LogFloatKnob = FloatControl<
170  Process::LogFloatSlider, score::QGraphicsLogKnob, WidgetFactory::LogNormalizer>;
171 // FIXME the process implementation is missing.
172 
174 
175 struct IntSlider final
176  : ossia::safe_nodes::control_in
178 {
179  using type = int;
180  const int min{};
181  const int max{};
182  const int init{};
183 
184  static const constexpr bool must_validate = false;
185  constexpr IntSlider(const char* name, int v1, int v2, int v3)
186  : ossia::safe_nodes::control_in{name}
187  , min{v1}
188  , max{v2}
189  , init{v3}
190  {
191  }
192 
193  int fromValue(const ossia::value& v) const { return ossia::convert<int>(v); }
194  ossia::value toValue(int v) const { return v; }
195 
196  auto getMin() const { return min; }
197  auto getMax() const { return max; }
198 
199  auto create_inlet(Id<Process::Port> id, QObject* parent) const
200  {
201  return new Process::IntSlider{
202  min, max, init, QString::fromUtf8(name.data(), name.size()), id, parent};
203  }
204  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
205  {
206  return deserialize_known_interface<Process::IntSlider>(id, parent);
207  }
208  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
209  {
210  return deserialize_known_interface<Process::IntSlider>(id, parent);
211  }
212 
213  void setup_exec(auto& v) const
214  {
215  v->type = ossia::val_type::INT;
216  v->domain = ossia::domain_base<int32_t>(this->min, this->max);
217  }
218 };
219 
220 struct IntSpinBox final
221  : ossia::safe_nodes::control_in
223 {
224  static const constexpr bool must_validate = false;
225  using type = int;
226  const int min{};
227  const int max{};
228  const int init{};
229 
230  int fromValue(const ossia::value& v) const { return ossia::convert<int>(v); }
231  ossia::value toValue(int v) const { return v; }
232 
233  constexpr IntSpinBox(const char* name, int v1, int v2, int v3)
234  : ossia::safe_nodes::control_in{name}
235  , min{v1}
236  , max{v2}
237  , init{v3}
238  {
239  }
240 
241  auto getMin() const { return min; }
242  auto getMax() const { return max; }
243 
244  auto create_inlet(Id<Process::Port> id, QObject* parent) const
245  {
246  return new Process::IntSpinBox{
247  min, max, init, QString::fromUtf8(name.data(), name.size()), id, parent};
248  }
249  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
250  {
251  return deserialize_known_interface<Process::IntSpinBox>(id, parent);
252  }
253  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
254  {
255  return deserialize_known_interface<Process::IntSpinBox>(id, parent);
256  }
257  void setup_exec(auto& v) const
258  {
259  v->type = ossia::val_type::INT;
260  v->domain = ossia::domain_base<int32_t>(this->min, this->max);
261  }
262 };
263 
264 struct Button final
265  : ossia::safe_nodes::control_in
267 {
268  static const constexpr bool must_validate = false;
269 
270  constexpr Button(const char* name)
271  : ossia::safe_nodes::control_in{name}
272  {
273  }
274 
275  using type = bool;
276  auto create_inlet(Id<Process::Port> id, QObject* parent) const
277  {
278  return new Process::Button{QString::fromUtf8(name.data(), name.size()), id, parent};
279  }
280  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
281  {
282  return deserialize_known_interface<Process::Button>(id, parent);
283  }
284  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
285  {
286  return deserialize_known_interface<Process::Button>(id, parent);
287  }
288 
289  bool fromValue(const ossia::value& v) const { return ossia::convert<bool>(v); }
290  ossia::value toValue(bool v) const { return v; }
291 
292  void setup_exec(auto& v) const
293  {
294  v->type = ossia::val_type::BOOL;
295  v->domain = ossia::domain_base<bool>();
296  }
297 };
298 
299 struct ImpulseButton final
300  : ossia::safe_nodes::control_in
302 {
303  static const constexpr bool must_validate = false;
304  constexpr ImpulseButton(const char* name)
305  : ossia::safe_nodes::control_in{name}
306  {
307  }
308 
309  using type = ossia::impulse;
310  auto create_inlet(Id<Process::Port> id, QObject* parent) const
311  {
312  return new Process::ImpulseButton{
313  QString::fromUtf8(name.data(), name.size()), id, parent};
314  }
315  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
316  {
317  return deserialize_known_interface<Process::ImpulseButton>(id, parent);
318  }
319  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
320  {
321  return deserialize_known_interface<Process::ImpulseButton>(id, parent);
322  }
323 
324  ossia::impulse fromValue(const ossia::value& v) const { return {}; }
325  ossia::value toValue(const ossia::value& v) const { return ossia::impulse{}; }
326 
327  void setup_exec(auto& v) const
328  {
329  v->type = ossia::val_type::BOOL;
330  v->domain = ossia::domain_base<ossia::impulse>();
331  }
332 };
333 
334 struct Toggle final
335  : ossia::safe_nodes::control_in
337 {
338  static const constexpr bool must_validate = false;
339  constexpr Toggle(const char* name, bool v1)
340  : ossia::safe_nodes::control_in{name}
341  , init{v1}
342  {
343  }
344 
345  using type = bool;
346  const bool init{};
347  auto create_inlet(Id<Process::Port> id, QObject* parent) const
348  {
349  return new Process::Toggle{
350  init, QString::fromUtf8(name.data(), name.size()), id, parent};
351  }
352  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
353  {
354  return deserialize_known_interface<Process::Toggle>(id, parent);
355  }
356  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
357  {
358  return deserialize_known_interface<Process::Toggle>(id, parent);
359  }
360 
361  bool fromValue(const ossia::value& v) const { return ossia::convert<bool>(v); }
362  ossia::value toValue(bool v) const { return v; }
363 
364  void setup_exec(auto& v) const
365  {
366  v->type = ossia::val_type::BOOL;
367  v->domain = ossia::domain_base<bool>();
368  }
369 };
370 
371 struct ChooserToggle final
372  : ossia::safe_nodes::control_in
374 {
375  static const constexpr bool must_validate = false;
376 
377  constexpr ChooserToggle(const char* name, std::array<const char*, 2> alt, bool v1)
378  : ossia::safe_nodes::control_in{name}
379  , alternatives{alt}
380  , init{v1}
381  {
382  }
383  using type = bool;
384  std::array<const char*, 2> alternatives;
385  const bool init{};
386 
387  bool fromValue(const ossia::value& v) const { return ossia::convert<bool>(v); }
388  ossia::value toValue(bool v) const { return v; }
389 
390  auto create_inlet(Id<Process::Port> id, QObject* parent) const
391  {
392  return new Process::ChooserToggle{
393  {alternatives[0], alternatives[1]},
394  init,
395  QString::fromUtf8(name.data(), name.size()),
396  id,
397  parent};
398  }
399  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
400  {
401  return deserialize_known_interface<Process::ChooserToggle>(id, parent);
402  }
403  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
404  {
405  return deserialize_known_interface<Process::ChooserToggle>(id, parent);
406  }
407  void setup_exec(auto& v) const
408  {
409  v->type = ossia::val_type::BOOL;
410  v->domain = ossia::domain_base<bool>();
411  }
412 };
413 
414 struct LineEdit final
415  : ossia::safe_nodes::control_in
417 {
418  static const constexpr bool must_validate = false;
419  constexpr LineEdit(const char* name, const char* init)
420  : ossia::safe_nodes::control_in{name}
421  , init{init}
422  {
423  }
424 
425  std::string fromValue(const ossia::value& v) const
426  {
427  return ossia::convert<std::string>(v);
428  }
429  ossia::value toValue(std::string v) const { return ossia::value{std::move(v)}; }
430 
431  using type = std::string;
432  const std::string_view init{};
433  auto create_inlet(Id<Process::Port> id, QObject* parent) const
434  {
435  return new Process::LineEdit{
436  init.data(), QString::fromUtf8(name.data(), name.size()), id, parent};
437  }
438  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
439  {
440  return deserialize_known_interface<Process::LineEdit>(id, parent);
441  }
442  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
443  {
444  return deserialize_known_interface<Process::LineEdit>(id, parent);
445  }
446  void setup_exec(auto& v) const { v->type = ossia::val_type::STRING; }
447 };
448 
449 struct Soundfile final
450  : ossia::safe_nodes::control_in
452 {
453  static const constexpr bool must_validate = false;
454  constexpr Soundfile(std::string_view name)
455  : ossia::safe_nodes::control_in{name.data()}
456  {
457  }
458 
459  std::string fromValue(const ossia::value& v) const
460  {
461  return ossia::convert<std::string>(v);
462  }
463  ossia::value toValue(std::string v) const { return ossia::value{std::move(v)}; }
464 
465  using type = std::string;
466  auto create_inlet(Id<Process::Port> id, QObject* parent) const
467  {
468  return new Process::LineEdit{
469  "", QString::fromUtf8(name.data(), name.size()), id, parent};
470  }
471  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
472  {
473  return deserialize_known_interface<Process::LineEdit>(id, parent);
474  }
475  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
476  {
477  return deserialize_known_interface<Process::LineEdit>(id, parent);
478  }
479  void setup_exec(auto& v) const { v->type = ossia::val_type::STRING; }
480 };
481 
482 template <typename T, std::size_t N>
483 struct ComboBox final
484  : ossia::safe_nodes::control_in
486 {
487  static const constexpr bool must_validate = false;
488  using type = T;
489  const std::size_t init{};
490  const std::array<std::pair<const char*, T>, N> values;
491 
492  static constexpr auto count() { return N; }
493 
494  constexpr ComboBox(
495  const char* name, std::size_t in, std::array<std::pair<const char*, T>, N> arr)
496  : ossia::safe_nodes::control_in{name}
497  , init{in}
498  , values{arr}
499  {
500  }
501 
502  const auto& getValues() const { return values; }
503 
504  auto create_inlet(Id<Process::Port> id, QObject* parent) const
505  {
506  std::vector<std::pair<QString, ossia::value>> vec;
507  for(auto& v : values)
508  vec.emplace_back(v.first, v.second);
509 
510  return new Process::ComboBox(
511  vec, values[init].second, QString::fromUtf8(name.data(), name.size()), id,
512  parent);
513  }
514  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
515  {
516  return deserialize_known_interface<Process::ComboBox>(id, parent);
517  }
518  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
519  {
520  return deserialize_known_interface<Process::ComboBox>(id, parent);
521  }
522 
523  T fromValue(const ossia::value& v) const { return ossia::convert<T>(v); }
524  ossia::value toValue(T v) const { return ossia::value{std::move(v)}; }
525 
526  void setup_exec(auto& v) const { v->type = ossia::val_type::STRING; }
527 };
528 
529 template <std::size_t N>
530 struct EnumBase
531  : ossia::safe_nodes::control_in
533 {
534  using type = std::string;
535  const std::size_t init{};
536  const std::array<const char*, N> values;
537  using Pixmaps_T = std::array<const char*, 2 * N>;
538  Pixmaps_T pixmaps;
539 
540  const auto& getValues() const { return values; }
541 
542  constexpr EnumBase(
543  const char* name, std::size_t i, const std::array<const char*, N>& v)
544  : ossia::safe_nodes::control_in{name}
545  , init{i}
546  , values{v}
547  , pixmaps{}
548  {
549  }
550 
551  constexpr EnumBase(
552  const char* name, std::size_t i, const std::array<const char*, N>& v,
553  const Pixmaps_T& pixmaps)
554  : ossia::safe_nodes::control_in{name}
555  , init{i}
556  , values{v}
557  , pixmaps{pixmaps}
558  {
559  }
560 
561  ossia::value toValue(std::string v) const { return ossia::value{std::move(v)}; }
562 
563  ossia::value toValue(int v) const
564  {
565  if(ossia::valid_index(v, values))
566  return ossia::value{std::string(values[v])};
567  else
568  return ossia::value{};
569  }
570 
571  auto create_inlet(Id<Process::Port> id, QObject* parent) const
572  {
573  return new Process::Enum{
574  std::vector<std::string>(values.begin(), values.end()),
575  pixmaps[0] == nullptr ? std::vector<QString>{}
576  : std::vector<QString>{pixmaps.begin(), pixmaps.end()},
577  values[init],
578  QString::fromUtf8(name.data(), name.size()),
579  id,
580  parent};
581  }
582  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
583  {
584  return deserialize_known_interface<Process::Enum>(id, parent);
585  }
586  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
587  {
588  return deserialize_known_interface<Process::Enum>(id, parent);
589  }
590 
591  void setup_exec(auto& v) const { }
592 };
593 
594 template <std::size_t N>
595 struct Enum final : EnumBase<N>
596 {
597  constexpr Enum(const char* name, std::size_t i, const std::array<const char*, N>& v)
598  : EnumBase<N>{name, i, v}
599  {
600  }
601 
602  constexpr Enum(
603  const char* name, std::size_t i, const std::array<const char*, N>& v,
604  const typename EnumBase<N>::Pixmaps_T& pixmaps)
605  : EnumBase<N>{name, i, v, pixmaps}
606  {
607  }
608 
609  static const constexpr bool must_validate = true;
610 
611  void convert(
612  const ossia::timed_vec<std::string>& source, ossia::timed_vec<std::string>& sink)
613  {
614  sink = source;
615  }
616 
617  template <typename Sink>
618  void convert(const ossia::timed_vec<std::string>& source, ossia::timed_vec<Sink>& sink)
619  {
620  sink.clear();
621  sink.container.reserve(source.size());
622  for(auto& [timestamp, value] : source)
623  {
624  if(auto it = ossia::find(this->values, value); it != this->values.end())
625  {
626  sink[timestamp] = static_cast<Sink>(it - this->values.begin());
627  }
628  }
629  }
630  bool fromValue(const ossia::value& v, std::string& str) const
631  {
632  switch(v.get_type())
633  {
634  case ossia::val_type::INT: {
635  int t = *v.target<int>();
636  if(ossia::valid_index(t, this->values))
637  {
638  str = this->values[t];
639  return true;
640  }
641  break;
642  }
643  case ossia::val_type::STRING: {
644  auto t = v.target<std::string>();
645  if(auto it = ossia::find(this->values, *t); it != this->values.end())
646  {
647  str = *t;
648  return true;
649  }
650  break;
651  }
652  default:
653  break;
654  }
655 
656  return false;
657  }
658  template <typename T>
659  bool fromValue(const ossia::value& v, T& integer_like) const
660  {
661  switch(v.get_type())
662  {
663  case ossia::val_type::INT: {
664  int t = *v.target<int>();
665  if(ossia::valid_index(t, this->values))
666  {
667  integer_like = t;
668  return true;
669  }
670  break;
671  }
672  case ossia::val_type::STRING: {
673  auto t = v.target<std::string>();
674  if(auto it = ossia::find(this->values, *t); it != this->values.end())
675  {
676  integer_like = it - this->values.begin();
677  return true;
678  }
679  break;
680  }
681  default:
682  break;
683  }
684 
685  return false;
686  }
687 
688  auto fromValue(const ossia::value& v) const
689  {
690  auto t = v.target<std::string>();
691  if(t)
692  {
693  if(auto it = ossia::find(this->values, *t); it != this->values.end())
694  {
695  return std::optional<std::string>{*t};
696  }
697  }
698  return std::optional<std::string>{};
699  }
700 };
701 
702 template <std::size_t N>
703 struct UnvalidatedEnum final : EnumBase<N>
704 {
705  constexpr UnvalidatedEnum(
706  const char* name, std::size_t i, const std::array<const char*, N>& v)
707  : EnumBase<N>{name, i, v}
708  {
709  }
710 
711  constexpr UnvalidatedEnum(
712  const char* name, std::size_t i, const std::array<const char*, N>& v,
713  const typename EnumBase<N>::Pixmaps_T& pixmaps)
714  : EnumBase<N>{name, i, v, pixmaps}
715  {
716  }
717 
718  static const constexpr bool must_validate = false;
719  auto fromValue(const ossia::value& v) const
720  {
721  auto t = v.target<std::string>();
722  if(t)
723  return *t;
724  return std::string{};
725  }
726 };
727 
728 template <typename T1, typename T2>
729 constexpr auto make_enum(const T1& t1, std::size_t s, const T2& t2)
730 {
731  return Control::Enum<T2{}.size()>(t1, s, t2);
732 }
733 template <typename T1, typename T2, typename Pixmaps_T>
734 constexpr auto
735 make_enum(const T1& t1, std::size_t s, const T2& t2, const Pixmaps_T& pixmaps)
736 {
737  return Control::Enum<T2{}.size()>(t1, s, t2, pixmaps);
738 }
739 template <typename T1, typename T2>
740 constexpr auto make_unvalidated_enum(const T1& t1, std::size_t s, const T2& t2)
741 {
742  return Control::UnvalidatedEnum<T2{}.size()>(t1, s, t2);
743 }
744 
745 struct XYSlider final
746  : ossia::safe_nodes::control_in
748 {
749  static const constexpr bool must_validate = false;
750  constexpr XYSlider(
751  const char* name, ossia::vec2f min, ossia::vec2f max, ossia::vec2f init = {})
752  : ossia::safe_nodes::control_in{name}
753  , min{min}
754  , max{max}
755  , init{init}
756  {
757  }
758  constexpr XYSlider(const char* name, float min, float max, float init = {})
759  : ossia::safe_nodes::control_in{name}
760  , min{min, min}
761  , max{max, max}
762  , init{init, init}
763  {
764  }
765 
766  using type = ossia::vec2f;
767  const ossia::vec2f min, max, init{};
768  auto create_inlet(Id<Process::Port> id, QObject* parent) const
769  {
770  return new Process::XYSlider{
771  min, max, init, QString::fromUtf8(name.data(), name.size()), id, parent};
772  }
773  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
774  {
775  return deserialize_known_interface<Process::XYSlider>(id, parent);
776  }
777  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
778  {
779  return deserialize_known_interface<Process::XYSlider>(id, parent);
780  }
781 
782  ossia::vec2f fromValue(const ossia::value& v) const
783  {
784  return ossia::convert<ossia::vec2f>(v);
785  }
786  ossia::value toValue(ossia::vec2f v) const { return v; }
787 
788  void setup_exec(auto& v) const
789  {
790  v->domain = ossia::vecf_domain<2>(min, max);
791  v->type = ossia::val_type::VEC2F;
792  }
793 };
794 struct HSVSlider final
795  : ossia::safe_nodes::control_in
797 {
798  static const constexpr bool must_validate = false;
799  constexpr HSVSlider(const char* name, ossia::vec4f init = {})
800  : ossia::safe_nodes::control_in{name}
801  , init{init}
802  {
803  }
804 
805  using type = ossia::vec4f;
806  const ossia::vec4f init{};
807  auto create_inlet(Id<Process::Port> id, QObject* parent) const
808  {
809  return new Process::HSVSlider{
810  init, QString::fromUtf8(name.data(), name.size()), id, parent};
811  }
812  auto create_inlet(DataStream::Deserializer& id, QObject* parent) const
813  {
814  return deserialize_known_interface<Process::HSVSlider>(id, parent);
815  }
816  auto create_inlet(JSONObject::Deserializer&& id, QObject* parent) const
817  {
818  return deserialize_known_interface<Process::HSVSlider>(id, parent);
819  }
820 
821  ossia::vec4f fromValue(const ossia::value& v) const
822  {
823  return ossia::convert<ossia::vec4f>(v);
824  }
825  ossia::value toValue(ossia::vec4f v) const { return v; }
826 
827  void setup_exec(auto& v) const { v->type = ossia::rgba_u{}; }
828 };
829 
830 }
Definition: DataStreamVisitor.hpp:202
Definition: JSONVisitor.hpp:423
Definition: score-lib-process/Process/Dataflow/Port.hpp:202
Definition: score-lib-process/Process/Dataflow/Port.hpp:415
The id_base_t class.
Definition: Identifier.hpp:57
Definition: QGraphicsLogKnob.hpp:16
Definition: QGraphicsLogSlider.hpp:17
Definition: score-lib-process/Control/Widgets.hpp:267
Definition: score-lib-process/Control/Widgets.hpp:374
Definition: score-lib-process/Control/Widgets.hpp:486
Definition: score-lib-process/Control/Widgets.hpp:533
Definition: score-lib-process/Control/Widgets.hpp:596
Definition: score-lib-process/Control/Widgets.hpp:77
Definition: score-lib-process/Control/Widgets.hpp:123
Definition: score-lib-process/Control/Widgets.hpp:797
Definition: score-lib-process/Control/Widgets.hpp:302
Definition: score-lib-process/Control/Widgets.hpp:45
Definition: score-lib-process/Control/Widgets.hpp:178
Definition: score-lib-process/Control/Widgets.hpp:223
Definition: score-lib-process/Control/Widgets.hpp:417
Definition: score-lib-process/Control/Widgets.hpp:18
Definition: score-lib-process/Control/Widgets.hpp:452
Definition: score-lib-process/Control/Widgets.hpp:337
Definition: score-lib-process/Control/Widgets.hpp:704
Definition: score-lib-process/Control/Widgets.hpp:748
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:741
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:786
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:1182
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:1089
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:103
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:1292
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:697
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:224
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:449
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:866
Definition: ControlWidgetDomains.hpp:15
Definition: ControlWidgetDomains.hpp:120
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:648
Definition: plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:1336