60 void operator()(
const oscr::ossia_value_port
auto& in,
auto idx)
66 void operator()(
const oscr::ossia_audio_port
auto& in,
auto idx)
72 void operator()(
const oscr::ossia_midi_port
auto& in,
auto idx)
79 void operator()(
const avnd::audio_port
auto& in,
auto idx)
85 void operator()(
const avnd::midi_port
auto& in,
auto idx)
92 static QString toFilters(
const QSet<QString>& exts)
95 for(
const auto& s : exts)
102 res.resize(res.size() - 1);
106 template <
typename P>
107 static QString getFilters(P& p)
109 if constexpr(
requires { P::filters(); })
111 using filter =
decltype(P::filters());
112 if constexpr(
requires { filter::sound; } ||
requires { filter::audio; })
114 return QString{
"Sound files (%1)"}.arg(
117 else if constexpr(
requires { filter::video; })
120 QSet<QString> files = {
"mkv",
"mov",
"mp4",
"h264",
"avi",
"hap",
"mpg",
121 "mpeg",
"imf",
"mxf",
"mts",
"m2ts",
"mj2",
"webm"};
122 return QString{
"Videos (%1)"}.arg(toFilters(files));
124 else if constexpr(
requires { filter::image; })
127 return QString{
"Images (*.png *.jpg *.jpeg *.gif *.bmp *.tiff)"};
129 else if constexpr(
requires { filter::midi; })
131 return "MIDI (*.mid)";
133 else if constexpr(avnd::string_ish<filter>)
135 static constexpr auto text_filters = P::filters();
136 return fromStringView(P::filters());
143 else if constexpr(
requires { P::extensions(); })
145 static constexpr auto text_filters = P::extensions();
146 return fromStringView(text_filters);
154 template <
typename T>
155 requires avnd::soundfile_port<T>
156 void operator()(
const T& in,
auto idx)
158 static constexpr auto name = avnd::get_name<T>();
159 Process::FileChooserBase* p{};
160 if constexpr(
requires { T::waveform; })
162 p =
new Process::AudioFileChooser{
163 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
168 p =
new Process::FileChooser{
169 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
176 if constexpr(avnd::tag_file_watch<T>)
178 p->enableFileWatch();
182 template <
typename T>
183 requires avnd::midifile_port<T> || avnd::raw_file_port<T>
184 void operator()(
const T& in,
auto idx)
186 static constexpr auto name = avnd::get_name<T>();
188 auto p =
new Process::FileChooser{
189 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
194 if constexpr(avnd::tag_file_watch<T>)
196 p->enableFileWatch();
200 template <avnd::dynamic_ports_port T, std::
size_t N>
201 void operator()(
const T& in, avnd::field_index<N> i)
203 using port_type =
typename decltype(in.ports)::value_type;
208 template <avnd::parameter T, std::
size_t N>
209 requires(!oscr::ossia_port<T>)
210 void operator()(
const T& in, avnd::field_index<N>)
212 if constexpr(avnd::has_widget<T> || avnd::curve_port<T>)
214 auto p = oscr::make_control_in<Node, T>(
216 using port_ptr_type = std::decay_t<
decltype(p)>;
217 if constexpr(!std::is_same_v<port_ptr_type, std::nullptr_t>)
220 !std::is_same_v<port_ptr_type, Process::ControlInlet*>
221 && !std::is_same_v<port_ptr_type, Process::ValueInlet*>)
228 setupNewPort(in, vp);
235 setupNewPort(in, vp);
242 void operator()(
const avnd::texture_port
auto& in,
auto idx)
248 void operator()(
const avnd::geometry_port
auto& in,
auto idx)
256 template <std::
size_t Idx, avnd::message T>
257 void operator()(
const avnd::field_reflection<Idx, T>& in,
auto dummy)
264 template <std::
size_t Idx, avnd::unreflectable_message<Node> T>
265 void operator()(
const avnd::field_reflection<Idx, T>& in,
auto dummy)
272 void operator()(
const auto& ctrl,
auto idx)
275 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";
286 void operator()(
const oscr::ossia_value_port
auto& out,
auto idx)
289 setupNewPort(out, p);
292 void operator()(
const oscr::ossia_audio_port
auto& out,
auto idx)
295 setupNewPort(out, p);
298 void operator()(
const oscr::ossia_midi_port
auto& out,
auto idx)
301 setupNewPort(out, p);
305 template <avnd::dynamic_ports_port T, std::
size_t N>
306 void operator()(
const T& in, avnd::field_index<N> i)
308 using port_type =
typename decltype(in.ports)::value_type;
313 void operator()(
const avnd::audio_port
auto& out,
auto idx)
316 setupNewPort(out, p);
318 p->setPropagate(
true);
322 void operator()(
const avnd::midi_port
auto& out,
auto idx)
325 setupNewPort(out, p);
329 template <avnd::parameter T, std::
size_t N>
330 requires(!oscr::ossia_port<T>)
331 void operator()(
const T& out, avnd::field_index<N>)
333 if constexpr(avnd::has_widget<T>)
335 if(
auto p = oscr::make_control_out<T>(
345 setupNewPort(out, vp);
352 setupNewPort(out, vp);
359 void operator()(
const avnd::texture_port
auto& out,
auto idx)
362 setupNewPort(out, p);
365 void operator()(
const avnd::geometry_port
auto& out,
auto idx)
368 setupNewPort(out, p);
373 void operator()(
const avnd::curve_port
auto& out,
auto idx)
376 setupNewPort(out, p);
380 template <avnd::callback T, std::
size_t N>
381 void operator()(
const T& out, avnd::field_index<N>)
383 if constexpr(avnd::control<T>)
385 if(
auto p = oscr::make_control_out<T>(
395 setupNewPort(out, vp);
399 else if constexpr(
requires { T::control; })
403 setupNewPort(out, p);
409 setupNewPort(out, p);
415 void operator()(
const auto& ctrl,
auto idx)
417 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";