63 template <oscr::ossia_value_port T>
64 void operator()(
const T& in,
auto idx)
70 template <oscr::ossia_audio_port T>
71 void operator()(
const T& in,
auto idx)
77 template <oscr::ossia_m
idi_port T>
78 void operator()(
const T& in,
auto idx)
85 template <avnd::audio_port T>
86 void operator()(
const T& in,
auto idx)
92 template <avnd::m
idi_port T>
93 void operator()(
const T& in,
auto idx)
100 static QString toFilters(
const QSet<QString>& exts)
103 for(
const auto& s : exts)
110 res.resize(res.size() - 1);
114 template <
typename P>
115 static QString getFilters(P& p)
117 if constexpr(
requires { P::filters(); })
119 using filter =
decltype(P::filters());
120 if constexpr(
requires { filter::sound; } ||
requires { filter::audio; })
122 return QString{
"Sound files (%1)"}.arg(
125 else if constexpr(
requires { filter::video; })
128 QSet<QString> files = {
"mkv",
"mov",
"mp4",
"h264",
"avi",
"hap",
"mpg",
129 "mpeg",
"imf",
"mxf",
"mts",
"m2ts",
"mj2",
"webm"};
130 return QString{
"Videos (%1)"}.arg(toFilters(files));
132 else if constexpr(
requires { filter::image; })
135 return QString{
"Images (*.png *.jpg *.jpeg *.gif *.bmp *.tiff)"};
137 else if constexpr(
requires { filter::midi; })
139 return "MIDI (*.mid)";
141 else if constexpr(avnd::string_ish<filter>)
143 static constexpr auto text_filters = P::filters();
144 return fromStringView(P::filters());
151 else if constexpr(
requires { P::extensions(); })
153 static constexpr auto text_filters = P::extensions();
154 return fromStringView(text_filters);
162 template <avnd::soundfile_port T>
163 void operator()(
const T& in,
auto idx)
165 static constexpr auto name = avnd::get_name<T>();
166 Process::FileChooserBase* p{};
167 if constexpr(
requires { T::waveform; })
169 p =
new Process::AudioFileChooser{
170 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
175 p =
new Process::FileChooser{
176 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
180 p->displayHandledExplicitly =
true;
183 if constexpr(avnd::tag_file_watch<T>)
185 p->enableFileWatch();
189 template <
typename T>
190 requires avnd::midifile_port<T> || avnd::raw_file_port<T>
191 void operator()(
const T& in,
auto idx)
193 static constexpr auto name = avnd::get_name<T>();
195 auto p =
new Process::FileChooser{
196 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
198 p->displayHandledExplicitly =
true;
201 if constexpr(avnd::tag_file_watch<T>)
203 p->enableFileWatch();
207 template <avnd::dynamic_ports_port T, std::
size_t N>
208 void operator()(
const T& in, avnd::field_index<N> i)
210 using port_type =
typename decltype(in.ports)::value_type;
215 template <avnd::parameter T, std::
size_t N>
216 requires(!oscr::ossia_port<T>)
217 void operator()(
const T& in, avnd::field_index<N>)
219 if constexpr(avnd::has_widget<T> || avnd::curve_port<T>)
221 auto p = oscr::make_control_in<Node, T>(
223 using port_ptr_type = std::decay_t<
decltype(p)>;
224 if constexpr(!std::is_same_v<port_ptr_type, std::nullptr_t>)
227 !std::is_same_v<port_ptr_type, Process::ControlInlet*>
228 && !std::is_same_v<port_ptr_type, Process::ValueInlet*>)
229 p->displayHandledExplicitly =
true;
236 setupNewPort(in, vp);
243 setupNewPort(in, vp);
249 template <avnd::buffer_port T>
250 void operator()(
const T& in,
auto idx)
253 auto p =
new Gfx::TextureInlet(portName<T>(),
Id<Process::Port>(inlet++), &self);
259 template <avnd::texture_port T>
260 void operator()(
const T& in,
auto idx)
263 auto p =
new Gfx::TextureInlet(portName<T>(),
Id<Process::Port>(inlet++), &self);
269 template <avnd::geometry_port T>
270 void operator()(
const T& in,
auto idx)
279 template <std::
size_t Idx, avnd::message T>
280 void operator()(
const avnd::field_reflection<Idx, T>& in,
auto dummy)
287 template <std::
size_t Idx, avnd::unreflectable_message<Node> T>
288 void operator()(
const avnd::field_reflection<Idx, T>& in,
auto dummy)
295 void operator()(
const auto& ctrl,
auto idx)
298 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";
309 template <oscr::ossia_value_port T>
310 void operator()(
const T& out,
auto idx)
313 setupNewPort(out, p);
317 template <oscr::ossia_audio_port T>
318 void operator()(
const T& out,
auto idx)
321 setupNewPort(out, p);
325 template <oscr::ossia_m
idi_port T>
326 void operator()(
const T& out,
auto idx)
329 setupNewPort(out, p);
333 template <avnd::dynamic_ports_port T, std::
size_t N>
334 void operator()(
const T& in, avnd::field_index<N> i)
336 using port_type =
typename decltype(in.ports)::value_type;
341 template <avnd::audio_port T>
342 void operator()(
const T& out,
auto idx)
345 setupNewPort(out, p);
347 p->setPropagate(
true);
351 template <avnd::m
idi_port T>
352 void operator()(
const T& out,
auto idx)
355 setupNewPort(out, p);
359 template <avnd::parameter T, std::
size_t N>
360 requires(!oscr::ossia_port<T>)
361 void operator()(
const T& out, avnd::field_index<N>)
363 if constexpr(avnd::has_widget<T>)
365 if(
auto p = oscr::make_control_out<T>(
368 p->displayHandledExplicitly =
true;
376 setupNewPort(out, vp);
384 setupNewPort(out, vp);
390 template <avnd::buffer_port T>
391 void operator()(
const T& out,
auto idx)
394 auto p =
new Gfx::TextureOutlet(portName<T>(),
Id<Process::Port>(outlet++), &self);
395 setupNewPort(out, p);
400 template <avnd::texture_port T>
401 void operator()(
const T& out,
auto idx)
404 auto p =
new Gfx::TextureOutlet(portName<T>(),
Id<Process::Port>(outlet++), &self);
405 setupNewPort(out, p);
410 template <avnd::geometry_port T>
411 void operator()(
const T& out,
auto idx)
415 setupNewPort(out, p);
420 template <avnd::curve_port T>
421 void operator()(
const T& out,
auto idx)
424 setupNewPort(out, p);
428 template <avnd::callback T, std::
size_t N>
429 void operator()(
const T& out, avnd::field_index<N>)
431 if constexpr(avnd::control<T>)
433 if(
auto p = oscr::make_control_out<T>(
444 setupNewPort(out, vp);
448 else if constexpr(
requires { T::control; })
453 setupNewPort(out, p);
459 setupNewPort(out, p);
465 void operator()(
const auto& ctrl,
auto idx)
467 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";