64 template <oscr::ossia_value_port T>
65 void operator()(
const T& in,
auto idx)
71 template <oscr::ossia_audio_port T>
72 void operator()(
const T& in,
auto idx)
78 template <oscr::ossia_m
idi_port T>
79 void operator()(
const T& in,
auto idx)
86 template <avnd::audio_port T>
87 void operator()(
const T& in,
auto idx)
93 template <avnd::m
idi_port T>
94 void operator()(
const T& in,
auto idx)
101 static QString toFilters(
const QSet<QString>& exts)
104 for(
const auto& s : exts)
111 res.resize(res.size() - 1);
115 template <
typename P>
116 static QString getFilters(P& p)
118 if constexpr(
requires { P::filters(); })
120 using filter =
decltype(P::filters());
121 if constexpr(
requires { filter::sound; } ||
requires { filter::audio; })
123 return QString{
"Sound files (%1)"}.arg(
126 else if constexpr(
requires { filter::video; })
129 QSet<QString> files = {
"mkv",
"mov",
"mp4",
"h264",
"avi",
"hap",
"mpg",
"mpeg",
130 "imf",
"mxf",
"mts",
"m2ts",
"mj2",
"webm",
"y4m",
"nut",
"ts"};
131 return QString{
"Videos (%1)"}.arg(toFilters(files));
133 else if constexpr(
requires { filter::image; })
136 return QString{
"Images (*.png *.jpg *.jpeg *.gif *.bmp *.tiff)"};
138 else if constexpr(
requires { filter::midi; })
140 return "MIDI (*.mid)";
142 else if constexpr(avnd::string_ish<filter>)
144 static constexpr auto text_filters = P::filters();
145 return fromStringView(P::filters());
152 else if constexpr(
requires { P::extensions(); })
154 static constexpr auto text_filters = P::extensions();
155 return fromStringView(text_filters);
163 template <avnd::soundfile_port T>
164 void operator()(
const T& in,
auto idx)
166 static constexpr auto name = avnd::get_name<T>();
168 if constexpr(
requires { T::waveform; })
171 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
177 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
181 p->displayHandledExplicitly =
true;
184 if constexpr(avnd::tag_file_watch<T>)
186 p->enableFileWatch();
190 template <
typename T>
191 requires avnd::midifile_port<T> || avnd::raw_file_port<T>
192 void operator()(
const T& in,
auto idx)
194 static constexpr auto name = avnd::get_name<T>();
197 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
199 p->displayHandledExplicitly =
true;
202 if constexpr(avnd::tag_file_watch<T>)
204 p->enableFileWatch();
208 template <avnd::dynamic_ports_port T, std::
size_t N>
209 void operator()(
const T& in, avnd::field_index<N> i)
211 using port_type =
typename decltype(in.ports)::value_type;
216 template <avnd::parameter_port T, std::
size_t N>
217 requires(!oscr::ossia_port<T>)
218 void operator()(
const T& in, avnd::field_index<N>)
220 if constexpr(avnd::has_widget<T> || avnd::curve_port<T>)
222 auto p = oscr::make_control_in<Node, T>(
224 using port_ptr_type = std::decay_t<
decltype(p)>;
225 if constexpr(!std::is_same_v<port_ptr_type, std::nullptr_t>)
228 !std::is_same_v<port_ptr_type, Process::ControlInlet*>
229 && !std::is_same_v<port_ptr_type, Process::ValueInlet*>)
230 p->displayHandledExplicitly =
true;
239 setupNewPort(in, vp);
246 setupNewPort(in, vp);
252 template <avnd::buffer_port T>
253 void operator()(
const T& in,
auto idx)
256 auto p =
new Gfx::TextureInlet(portName<T>(),
Id<Process::Port>(inlet++), &self);
262 template <avnd::texture_port T>
263 void operator()(
const T& in,
auto idx)
266 auto p =
new Gfx::TextureInlet(portName<T>(),
Id<Process::Port>(inlet++), &self);
272 template <avnd::geometry_port T>
273 void operator()(
const T& in,
auto idx)
287 template <scene_port T>
288 requires(!avnd::geometry_port<T>)
289 void operator()(
const T& in,
auto idx)
298 template <std::
size_t Idx, avnd::message T>
299 void operator()(
const avnd::field_reflection<Idx, T>& in,
auto dummy)
306 template <std::
size_t Idx, avnd::unreflectable_message<Node> T>
307 void operator()(
const avnd::field_reflection<Idx, T>& in,
auto dummy)
314 void operator()(
const auto& ctrl,
auto idx)
317 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";
328 template <oscr::ossia_value_port T>
329 void operator()(
const T& out,
auto idx)
332 setupNewPort(out, p);
336 template <oscr::ossia_audio_port T>
337 void operator()(
const T& out,
auto idx)
340 setupNewPort(out, p);
344 template <oscr::ossia_m
idi_port T>
345 void operator()(
const T& out,
auto idx)
348 setupNewPort(out, p);
352 template <avnd::dynamic_ports_port T, std::
size_t N>
353 void operator()(
const T& in, avnd::field_index<N> i)
355 using port_type =
typename decltype(in.ports)::value_type;
360 template <avnd::audio_port T>
361 void operator()(
const T& out,
auto idx)
364 setupNewPort(out, p);
366 p->setPropagate(
true);
370 template <avnd::m
idi_port T>
371 void operator()(
const T& out,
auto idx)
374 setupNewPort(out, p);
378 template <avnd::parameter_port T, std::
size_t N>
379 requires(!oscr::ossia_port<T>)
380 void operator()(
const T& out, avnd::field_index<N>)
382 if constexpr(avnd::has_widget<T>)
384 if(
auto p = oscr::make_control_out<T>(
387 p->displayHandledExplicitly =
true;
388 setupNewPort(out, p);
396 setupNewPort(out, vp);
404 setupNewPort(out, vp);
410 template <avnd::buffer_port T>
411 void operator()(
const T& out,
auto idx)
414 auto p =
new Gfx::TextureOutlet(portName<T>(),
Id<Process::Port>(outlet++), &self);
415 setupNewPort(out, p);
420 template <avnd::texture_port T>
421 void operator()(
const T& out,
auto idx)
424 auto p =
new Gfx::TextureOutlet(portName<T>(),
Id<Process::Port>(outlet++), &self);
425 setupNewPort(out, p);
430 template <avnd::gpu_render_target_output_port T>
431 void operator()(
const T& out,
auto idx)
434 auto p =
new Gfx::TextureOutlet(portName<T>(),
Id<Process::Port>(outlet++), &self);
435 setupNewPort(out, p);
440 template <avnd::geometry_port T>
441 void operator()(
const T& out,
auto idx)
445 setupNewPort(out, p);
453 template <scene_port T>
454 requires(!avnd::geometry_port<T>)
455 void operator()(
const T& out,
auto idx)
459 setupNewPort(out, p);
464 template <avnd::curve_port T>
465 void operator()(
const T& out,
auto idx)
468 setupNewPort(out, p);
472 template <avnd::callback T, std::
size_t N>
473 void operator()(
const T& out, avnd::field_index<N>)
475 if constexpr(avnd::control_port<T>)
477 if(
auto p = oscr::make_control_out<T>(
488 setupNewPort(out, vp);
492 else if constexpr(
requires { T::control; })
497 setupNewPort(out, p);
503 setupNewPort(out, p);
509 void operator()(
const auto& ctrl,
auto idx)
511 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";