2 #include <State/Domain.hpp>
4 #include <Process/Dataflow/Port.hpp>
5 #include <Process/Dataflow/WidgetInlets.hpp>
7 #if defined(SCORE_HAS_GPU_JS)
8 #include <Gfx/TexturePort.hpp>
13 #include <score/tools/Debug.hpp>
15 #include <ossia/detail/math.hpp>
16 #include <ossia/detail/ssize.hpp>
17 #include <ossia/network/domain/domain.hpp>
21 #include <QQmlListProperty>
25 #include <libremidi/message.hpp>
30 W_REGISTER_ARGTYPE(QJSValue)
38 using QObject::QObject;
39 virtual ~
Inlet()
override;
41 virtual bool isEvent()
const {
return false; }
43 W_INLINE_PROPERTY_CREF(QString, address, {}, address, setAddress, addressChanged)
46 class Outlet :
public QObject
51 using QObject::QObject;
52 virtual ~
Outlet()
override;
55 W_INLINE_PROPERTY_CREF(QString, address, {}, address, setAddress, addressChanged)
65 W_PROPERTY(qreal, timestamp MEMBER timestamp)
66 W_PROPERTY(QVariant, value MEMBER value)
76 W_PROPERTY(qreal, timestamp MEMBER timestamp)
77 W_PROPERTY(QJSValue, value MEMBER value)
85 QVariantList m_values;
88 explicit ValueInlet(QObject* parent =
nullptr);
90 QVariant value()
const;
91 QVariantList values()
const {
return m_values; }
98 int length() const noexcept;
101 QVariant at(
int index) const noexcept;
104 void clear() { m_values.clear(); }
105 void setValue(QVariant value);
106 void addValue(QVariant&& val) { m_values.append(std::move(val)); }
107 void valueChanged(QVariant value) W_SIGNAL(valueChanged, value);
109 W_PROPERTY(QVariantList, values READ values)
110 W_PROPERTY(QVariant, value READ value NOTIFY valueChanged)
122 QVariant value()
const;
129 void clear() { m_value = QVariant{}; }
130 void setValue(QVariant value);
131 void valueChanged(QVariant value) W_SIGNAL(valueChanged, value);
133 W_PROPERTY(QVariant, value READ value NOTIFY valueChanged)
141 using ControlInlet::ControlInlet;
143 bool isEvent()
const override {
return true; }
147 return new Process::FloatSlider{(float)m_min, (
float)m_max, (float)m_init,
148 objectName(), id, parent};
151 W_INLINE_PROPERTY_VALUE(qreal, init, {0.5}, init, setInit, initChanged)
152 W_INLINE_PROPERTY_VALUE(qreal, min, {0.}, getMin, setMin, minChanged)
153 W_INLINE_PROPERTY_VALUE(qreal, max, {1.}, getMax, setMax, maxChanged)
161 using ControlInlet::ControlInlet;
163 bool isEvent()
const override {
return true; }
167 return new Process::IntSlider{m_min, m_max, m_init, objectName(), id, parent};
170 W_INLINE_PROPERTY_VALUE(
int, init, {0}, init, setInit, initChanged)
171 W_INLINE_PROPERTY_VALUE(
int, min, {0}, getMin, setMin, minChanged)
172 W_INLINE_PROPERTY_VALUE(
int, max, {127}, getMax, setMax, maxChanged)
180 using ControlInlet::ControlInlet;
181 virtual ~
Enum()
override;
182 bool isEvent()
const override {
return true; }
186 return new Process::Enum{m_choices, {}, current(), objectName(), id, parent};
189 auto getValues()
const {
return choices(); }
191 std::string current()
const
193 if(!m_choices.isEmpty() && ossia::valid_index(m_index, m_choices))
195 return m_choices[m_index].toStdString();
200 W_INLINE_PROPERTY_VALUE(
int, index, {}, index, setIndex, indexChanged)
201 W_INLINE_PROPERTY_CREF(QStringList, choices, {}, choices, setChoices, choicesChanged)
210 virtual ~
Toggle() override;
211 bool isEvent()
const override {
return true; }
214 return new Process::Toggle{m_checked, objectName(), id, parent};
217 W_INLINE_PROPERTY_VALUE(
bool, checked, {}, checked, setChecked, checkedChanged)
226 virtual ~
Button() override;
227 bool isEvent()
const override {
return true; }
230 return new Process::Button{objectName(), id, parent};
233 W_INLINE_PROPERTY_VALUE(
bool, checked, {}, checked, setChecked, checkedChanged)
243 bool isEvent()
const override {
return false; }
246 return new Process::ImpulseButton{objectName(), id, parent};
249 void impulse() W_SIGNAL(impulse);
257 using ControlInlet::ControlInlet;
259 bool isEvent()
const override {
return true; }
262 return new Process::LineEdit{m_text, objectName(), id, parent};
265 W_INLINE_PROPERTY_CREF(QString, text, {}, text, setText, textChanged)
275 std::vector<OutValueMessage> values;
279 const QJSValue& value()
const;
282 m_value = QJSValue{};
291 void setValue(
const QJSValue& value);
293 void addValue(qreal timestamp, QJSValue t);
296 W_PROPERTY(QJSValue, value READ value WRITE setValue)
304 explicit AudioInlet(QObject* parent =
nullptr);
306 const QVector<QVector<double>>& audio()
const;
307 void setAudio(
const QVector<QVector<double>>& audio);
309 QVector<double> channel(
int i)
const
311 if(m_audio.size() > i)
315 W_INVOKABLE(channel);
323 QVector<QVector<double>> m_audio;
337 p->setPropagate(
true);
341 const QVector<QVector<double>>& audio()
const;
343 void setChannel(
int i,
const QJSValue& v);
344 W_INVOKABLE(setChannel)
346 QVector<QVector<double>> m_audio;
356 W_PROPERTY(QByteArray, bytes MEMBER bytes)
364 explicit MidiInlet(QObject* parent =
nullptr);
366 template <
typename T>
367 void setMidi(
const T& arr)
370 for(
const libremidi::message& mess : arr)
372 const auto N = mess.size();
376 for(std::size_t i = 0; i < N; i++)
377 m[i] = mess.bytes[i];
379 m_midi.push_back(QVariant::fromValue(m));
383 QVariantList messages()
const {
return m_midi; }
384 W_INVOKABLE(messages);
400 explicit MidiOutlet(QObject* parent =
nullptr);
408 const QVector<QVector<int>>& midi()
const;
410 void setMessages(
const QVariantList m)
415 if(v.canConvert<QVector<int>>())
416 m_midi.push_back(v.value<QVector<int>>());
419 W_INVOKABLE(setMessages);
421 void add(QVector<int> m) { m_midi.push_back(std::move(m)); }
425 QVector<QVector<int>> m_midi;
428 #if defined(SCORE_HAS_GPU_JS)
429 class TextureOutlet :
public Outlet
431 W_OBJECT(TextureOutlet)
434 explicit TextureOutlet(QObject* parent =
nullptr);
435 virtual ~TextureOutlet()
override;
438 auto p =
new Gfx::TextureOutlet(
id, parent);
442 QQuickItem* item() noexcept {
return m_item; }
443 void setItem(QQuickItem* v) { m_item = v; }
445 W_PROPERTY(QQuickItem*, item READ item WRITE setItem CONSTANT)
447 QQuickItem* m_item{};
451 class Script :
public QObject
454 W_CLASSINFO(
"DefaultProperty",
"data")
456 "qt_QmlJSWrapperFactoryMethod", "_q_createJSWrapper(QV4::ExecutionEngine*)")
459 QQmlListProperty<QObject> data() noexcept {
return {
this, &m_data}; }
461 QJSValue& tick() noexcept {
return m_tick; }
462 void setTick(
const QJSValue& v) { m_tick = v; }
463 QJSValue& start() noexcept {
return m_start; }
464 void setStart(
const QJSValue& v) { m_start = v; }
465 QJSValue& stop() noexcept {
return m_stop; }
466 void setStop(
const QJSValue& v) { m_stop = v; }
467 QJSValue& pause() noexcept {
return m_pause; }
468 void setPause(
const QJSValue& v) { m_pause = v; }
469 QJSValue& resume() noexcept {
return m_resume; }
470 void setResume(
const QJSValue& v) { m_resume = v; }
471 W_PROPERTY(QJSValue, tick READ tick WRITE setTick CONSTANT)
472 W_PROPERTY(QJSValue, start READ start WRITE setStart CONSTANT)
473 W_PROPERTY(QJSValue, stop READ stop WRITE setStop CONSTANT)
474 W_PROPERTY(QJSValue, pause READ pause WRITE setPause CONSTANT)
475 W_PROPERTY(QJSValue, resume READ resume WRITE setResume CONSTANT)
476 W_PROPERTY(QQmlListProperty<QObject>, data READ data)
479 QList<QObject*> m_data;
488 inline QDataStream& operator<<(QDataStream& i,
const JS::MidiMessage& sel)
493 inline QDataStream& operator>>(QDataStream& i, JS::MidiMessage& sel)
498 inline QDataStream& operator<<(QDataStream& i,
const JS::InValueMessage& sel)
503 inline QDataStream& operator>>(QDataStream& i, JS::InValueMessage& sel)
508 inline QDataStream& operator<<(QDataStream& i,
const JS::OutValueMessage& sel)
513 inline QDataStream& operator>>(QDataStream& i, JS::OutValueMessage& sel)
518 Q_DECLARE_METATYPE(JS::ValueInlet*)
519 Q_DECLARE_METATYPE(JS::ValueOutlet*)
520 Q_DECLARE_METATYPE(JS::AudioInlet*)
521 Q_DECLARE_METATYPE(JS::AudioOutlet*)
522 Q_DECLARE_METATYPE(JS::MidiMessage)
523 Q_DECLARE_METATYPE(JS::MidiInlet*)
524 Q_DECLARE_METATYPE(JS::MidiOutlet*)
526 W_REGISTER_ARGTYPE(JS::ValueInlet*)
527 W_REGISTER_ARGTYPE(JS::ValueOutlet*)
528 W_REGISTER_ARGTYPE(JS::AudioInlet*)
529 W_REGISTER_ARGTYPE(JS::AudioOutlet*)
530 W_REGISTER_ARGTYPE(JS::MidiMessage)
531 W_REGISTER_ARGTYPE(JS::MidiInlet*)
532 W_REGISTER_ARGTYPE(JS::MidiOutlet*)
Definition: QmlObjects.hpp:285
Definition: QmlObjects.hpp:312
Definition: QmlObjects.hpp:109
Definition: QmlObjects.hpp:166
Definition: QmlObjects.hpp:131
Definition: QmlObjects.hpp:224
Definition: QmlObjects.hpp:149
Definition: QmlObjects.hpp:34
Definition: QmlObjects.hpp:240
Definition: QmlObjects.hpp:343
Definition: QmlObjects.hpp:334
Definition: QmlObjects.hpp:379
Definition: QmlObjects.hpp:46
Definition: score-lib-process/Process/Dataflow/Port.hpp:290
Definition: score-lib-process/Process/Dataflow/Port.hpp:313
Definition: score-lib-process/Process/Dataflow/Port.hpp:202
Definition: score-lib-process/Process/Dataflow/Port.hpp:176
Definition: score-lib-process/Process/Dataflow/Port.hpp:369
Definition: score-lib-process/Process/Dataflow/Port.hpp:392
Definition: score-lib-process/Process/Dataflow/Port.hpp:264
Definition: score-lib-process/Process/Dataflow/Port.hpp:481
Definition: score-lib-process/Process/Dataflow/Port.hpp:504
Definition: QmlObjects.hpp:435
Definition: QmlObjects.hpp:194
Definition: QmlObjects.hpp:77
Definition: QmlObjects.hpp:255
The id_base_t class.
Definition: Identifier.hpp:57
Definition: QmlObjects.hpp:57
Definition: QmlObjects.hpp:67