2#include <State/Domain.hpp>
4#include <Process/Dataflow/Port.hpp>
5#include <Process/Dataflow/WidgetInlets.hpp>
7#include <JS/Qml/QtMetatypes.hpp>
9#include <libremidi/detail/conversion.hpp>
11#if defined(SCORE_HAS_GPU_JS)
12#include <Gfx/TexturePort.hpp>
16#include <score/tools/Debug.hpp>
18#include <ossia/detail/math.hpp>
19#include <ossia/detail/ssize.hpp>
20#include <ossia/network/domain/domain.hpp>
22#include <ossia-qt/js_utilities.hpp>
27#include <QQmlListProperty>
31#include <libremidi/message.hpp>
32#include <libremidi/ump.hpp>
34#include <score_plugin_js_export.h>
35#include <wobjectimpl.h>
42class SCORE_PLUGIN_JS_EXPORT
Inlet :
public QObject
47 using QObject::QObject;
50 virtual bool isEvent()
const {
return false; }
52 W_INLINE_PROPERTY_CREF(QString, address, {}, address, setAddress, addressChanged)
55class SCORE_PLUGIN_JS_EXPORT
Outlet :
public QObject
60 using QObject::QObject;
64 W_INLINE_PROPERTY_CREF(QString, address, {}, address, setAddress, addressChanged)
74 W_PROPERTY(qreal, timestamp MEMBER timestamp)
75 W_PROPERTY(QVariant, value MEMBER value)
85 W_PROPERTY(qreal, timestamp MEMBER timestamp)
86 W_PROPERTY(QJSValue, value MEMBER value)
94 QVariantList m_values;
97 explicit ValueInlet(QObject* parent =
nullptr);
99 QVariant value()
const;
100 QVariantList values()
const {
return m_values; }
107 int length()
const noexcept;
110 QVariant at(
int index)
const noexcept;
113 void clear() { m_values.clear(); }
114 void setValue(QVariant value);
115 void addValue(QVariant&& val) { m_values.append(std::move(val)); }
116 void valueChanged(QVariant value) W_SIGNAL(valueChanged, value);
118 W_PROPERTY(QVariantList, values READ values)
119 W_PROPERTY(QVariant, value READ value NOTIFY valueChanged)
131 QVariant value()
const noexcept;
138 void clear() { m_value = QVariant{}; }
139 virtual void setValue(QVariant value);
140 void valueChanged(QVariant value) W_SIGNAL(valueChanged, value);
142 W_PROPERTY(QVariant, value READ value NOTIFY valueChanged)
145template <
typename Impl,
typename ValueType,
typename OssiaType>
151 using ControlInlet::ControlInlet;
153 bool isEvent()
const override {
return true; }
156 return new Impl(objectName(),
id, parent);
159 void clear() { m_value = {}; }
160 ValueType value()
const noexcept {
return m_value; }
161 void setValue(QVariant value)
override
163 auto conv = value.value<ValueType>();
167 m_value = std::move(conv);
168 valueChanged(m_value);
170 void setValue(ValueType value)
176 valueChanged(m_value);
178 void valueChanged(ValueType value) W_SIGNAL(valueChanged, value);
180 W_PROPERTY(ValueType, value READ value NOTIFY valueChanged)
192 using GenericControlInlet::GenericControlInlet;
198 using GenericControlInlet::GenericControlInlet;
204 using GenericControlInlet::GenericControlInlet;
210 using GenericControlInlet::GenericControlInlet;
213template <
typename Impl = Process::FloatSl
ider>
221 bool isEvent()
const override {
return true; }
225 return new Impl{(float)m_min, (
float)m_max, (float)m_init,
226 this->objectName(), id, parent};
229 W_INLINE_PROPERTY_VALUE(qreal, init, {0.5}, init, setInit, initChanged)
230 W_INLINE_PROPERTY_VALUE(qreal, min, {0.}, getMin, setMin, minChanged)
231 W_INLINE_PROPERTY_VALUE(qreal, max, {1.}, getMax, setMax, maxChanged)
235template <
typename Impl = Process::IntSl
ider>
243 bool isEvent()
const override {
return true; }
247 return new Impl{m_min, m_max, m_init, this->objectName(), id, parent};
250 W_INLINE_PROPERTY_VALUE(
int, init, {0}, init, setInit, initChanged)
251 W_INLINE_PROPERTY_VALUE(
int, min, {0}, getMin, setMin, minChanged)
252 W_INLINE_PROPERTY_VALUE(
int, max, {127}, getMax, setMax, maxChanged)
256static constexpr auto vec2(
double v)
258 return QVector2D{(float)v, (
float)v};
260static constexpr auto vec3(
double v)
262 return QVector3D{(float)v, (
float)v, (float)v};
264static constexpr auto vec4(
double v)
266 return QVector4D{(float)v, (
float)v, (float)v, (
float)v};
268static constexpr auto vec_to_ossia(QVector2D v)
270 return ossia::vec2f{(float)v[0], (
float)v[1]};
272static constexpr auto vec_to_ossia(QVector3D v)
274 return ossia::vec3f{(float)v[0], (
float)v[1], (float)v[2]};
276static constexpr auto vec_to_ossia(QVector4D v)
278 return ossia::vec4f{(float)v[0], (
float)v[1], (float)v[2], (
float)v[3]};
281template <
typename Impl>
290 bool isEvent()
const override {
return true; }
294 if constexpr(std::is_constructible_v<
295 Impl, ossia::vec2f, ossia::vec2f, ossia::vec2f, bool, QString,
300 vec_to_ossia(m_init),
305 else if constexpr(std::is_constructible_v<
306 Impl, ossia::vec2f, ossia::vec2f, ossia::vec2f, QString,
311 vec_to_ossia(m_init),
316 return new Impl{vec_to_ossia(m_init), this->objectName(), id, parent};
319 W_INLINE_PROPERTY_VALUE(QVector2D, init, {vec2(0.)}, init, setInit, initChanged);
320 W_INLINE_PROPERTY_VALUE(QVector2D, min, {vec2(0.)}, getMin, setMin, minChanged);
321 W_INLINE_PROPERTY_VALUE(QVector2D, max, {vec2(1.)}, getMax, setMax, maxChanged);
325template <
typename Impl>
334 bool isEvent()
const override {
return true; }
341 vec_to_ossia(m_init),
348 W_INLINE_PROPERTY_VALUE(QVector2D, init, {vec2(0.)}, init, setInit, initChanged);
349 W_INLINE_PROPERTY_VALUE(QVector2D, min, {vec2(0.)}, getMin, setMin, minChanged);
350 W_INLINE_PROPERTY_VALUE(QVector2D, max, {vec2(1.)}, getMax, setMax, maxChanged);
354template <
typename Impl>
363 bool isEvent()
const override {
return true; }
367 return new Impl(m_min, m_max, vec_to_ossia(m_init), this->objectName(),
id, parent);
370 W_INLINE_PROPERTY_VALUE(QVector2D, init, {vec2(0.)}, init, setInit, initChanged);
371 W_INLINE_PROPERTY_VALUE(
float, min, {0.}, getMin, setMin, minChanged);
372 W_INLINE_PROPERTY_VALUE(
float, max, {1.}, getMax, setMax, maxChanged);
376template <
typename Impl>
385 bool isEvent()
const override {
return true; }
389 if constexpr(std::is_constructible_v<
390 Impl, ossia::vec3f, ossia::vec3f, ossia::vec3f, bool, QString,
395 vec_to_ossia(m_init),
400 else if constexpr(std::is_constructible_v<
401 Impl, ossia::vec3f, ossia::vec3f, ossia::vec3f, QString,
406 vec_to_ossia(m_init),
411 return new Impl{vec_to_ossia(m_init), this->objectName(), id, parent};
414 W_INLINE_PROPERTY_VALUE(QVector3D, init, {vec3(0.)}, init, setInit, initChanged);
415 W_INLINE_PROPERTY_VALUE(QVector3D, min, {vec3(0.)}, getMin, setMin, minChanged);
416 W_INLINE_PROPERTY_VALUE(QVector3D, max, {vec3(1.)}, getMax, setMax, maxChanged);
420template <
typename Impl>
429 bool isEvent()
const override {
return true; }
436 vec_to_ossia(m_init),
443 W_INLINE_PROPERTY_VALUE(QVector3D, init, {vec3(0.)}, init, setInit, initChanged);
444 W_INLINE_PROPERTY_VALUE(QVector3D, min, {vec3(0.)}, getMin, setMin, minChanged);
445 W_INLINE_PROPERTY_VALUE(QVector3D, max, {vec3(1.)}, getMax, setMax, maxChanged);
449template <
typename Impl>
458 bool isEvent()
const override {
return true; }
462 if constexpr(std::is_constructible_v<
463 Impl, ossia::vec4f, ossia::vec4f, ossia::vec4f, QString,
468 vec_to_ossia(m_init),
473 return new Impl{vec_to_ossia(m_init), this->objectName(), id, parent};
476 W_INLINE_PROPERTY_VALUE(QVector4D, init, {vec4(0.)}, init, setInit, initChanged);
477 W_INLINE_PROPERTY_VALUE(QVector4D, min, {vec4(0.)}, getMin, setMin, minChanged);
478 W_INLINE_PROPERTY_VALUE(QVector4D, max, {vec4(1.)}, getMax, setMax, maxChanged);
487 using ControlInlet::ControlInlet;
488 virtual ~Enum()
override;
489 bool isEvent()
const override {
return true; }
493 return new Process::Enum{m_choices, {}, current(), objectName(), id, parent};
496 auto getValues()
const {
return choices(); }
498 std::string current()
const
500 if(!m_choices.isEmpty() && ossia::valid_index(m_index, m_choices))
502 return m_choices[m_index].toStdString();
507 W_INLINE_PROPERTY_VALUE(
int, index, {}, index, setIndex, indexChanged)
508 W_INLINE_PROPERTY_CREF(QStringList, choices, {}, choices, setChoices, choicesChanged)
516 using ControlInlet::ControlInlet;
518 bool isEvent()
const override {
return true; }
522 std::vector<std::pair<QString, ossia::value>> choices;
523 choices.reserve(m_choices.size());
524 for(
auto& c : m_choices)
525 choices.emplace_back(c, c.toStdString());
529 auto getValues()
const {
return choices(); }
531 std::string current()
const
533 if(!m_choices.isEmpty() && ossia::valid_index(m_index, m_choices))
535 return m_choices[m_index].toStdString();
540 W_INLINE_PROPERTY_VALUE(
int, index, {}, index, setIndex, indexChanged)
541 W_INLINE_PROPERTY_CREF(QStringList, choices, {}, choices, setChoices, choicesChanged)
549 using ControlInlet::ControlInlet;
551 bool isEvent()
const override {
return true; }
557 W_INLINE_PROPERTY_VALUE(
bool, checked, {}, checked, setChecked, checkedChanged)
565 using ControlInlet::ControlInlet;
567 bool isEvent()
const override {
return true; }
573 W_INLINE_PROPERTY_VALUE(
bool, checked, {}, checked, setChecked, checkedChanged)
581 using ControlInlet::ControlInlet;
583 bool isEvent()
const override {
return false; }
589 void impulse() W_SIGNAL(impulse);
597 using ControlInlet::ControlInlet;
599 bool isEvent()
const override {
return true; }
605 W_INLINE_PROPERTY_CREF(QString, text, {}, text, setText, textChanged)
617 bool isEvent()
const override {
return true; }
620 auto col = init().toRgb();
622 (float)col.redF(), (float)col.greenF(), (float)col.blueF(), (float)col.alphaF()};
626 void setValue(QVariant value)
override
628 auto vec = value.value<QVector4D>();
629 auto conv = QColor::fromRgbF(vec[0], vec[1], vec[2], vec[3]);
633 m_value = std::move(conv);
634 valueChanged(m_value);
636 W_INLINE_PROPERTY_CREF(QColor, init, {}, init, setInit, initChanged)
645 std::vector<OutValueMessage> values;
649 const QJSValue& value()
const;
652 m_value = QJSValue{};
661 void setValue(
const QJSValue& value);
663 void addValue(qreal timestamp, QJSValue t);
666 W_PROPERTY(QJSValue, value READ value WRITE setValue)
674 explicit AudioInlet(QObject* parent =
nullptr);
676 QVector<QVector<double>>& audio();
677 const QVector<QVector<double>>& audio()
const;
678 void setAudio(
const QVector<QVector<double>>& audio);
679 void setAudio(QVector<QVector<double>>&& audio);
681 QVector<double> channel(
int i)
const
683 if(m_audio.size() > i)
687 W_INVOKABLE(channel);
695 QVector<QVector<double>> m_audio;
709 p->setPropagate(
true);
713 const QVector<QVector<double>>& audio()
const;
715 void setChannel(
int i,
const QJSValue& v);
716 W_INVOKABLE(setChannel)
718 QVector<QVector<double>> m_audio;
728 W_PROPERTY(QByteArray, bytes MEMBER bytes)
736 explicit MidiInlet(QObject* parent =
nullptr);
738 template <
typename T>
739 void setMidi(
const T& arr)
742 for(
const libremidi::ump& mess : arr)
744 auto m1 = libremidi::midi1_from_ump(mess);
745 const auto N = mess.size();
749 for(std::size_t i = 0; i < N; i++)
752 m_midi.push_back(QVariant::fromValue(m));
756 QVariantList messages()
const {
return m_midi; }
757 W_INVOKABLE(messages);
773 explicit MidiOutlet(QObject* parent =
nullptr);
781 const QVector<QVector<int>>& midi()
const;
783 void setMessages(
const QVariantList m)
788 if(v.canConvert<QVector<int>>())
789 m_midi.push_back(v.value<QVector<int>>());
792 W_INVOKABLE(setMessages);
794 void add(QVector<int> m) { m_midi.push_back(std::move(m)); }
798 QVector<QVector<int>> m_midi;
801#if defined(SCORE_HAS_GPU_JS)
802class TextureInlet :
public Inlet
804 W_OBJECT(TextureInlet)
807 explicit TextureInlet(QObject* parent =
nullptr);
808 virtual ~TextureInlet()
override;
811 auto p =
new Gfx::TextureInlet(objectName(),
id, parent);
815 QQuickItem* item() const noexcept {
return m_item; }
817 W_PROPERTY(QQuickItem*, item READ item CONSTANT)
819 QQuickItem* m_item{};
822class TextureOutlet :
public Outlet
824 W_OBJECT(TextureOutlet)
827 explicit TextureOutlet(QObject* parent =
nullptr);
828 virtual ~TextureOutlet()
override;
831 auto p =
new Gfx::TextureOutlet(objectName(),
id, parent);
835 QQuickItem* item() const noexcept {
return m_item; }
836 void setItem(QQuickItem* v) { m_item = v; }
838 W_PROPERTY(QQuickItem*, item READ item WRITE setItem CONSTANT)
840 QQuickItem* m_item{};
847 W_CLASSINFO(
"DefaultProperty",
"data")
850 QQmlListProperty<QObject> data()
noexcept {
return {
this, &m_data}; }
851 W_PROPERTY(QQmlListProperty<QObject>, data READ data)
853 const QJSValue& tick()
const noexcept {
return m_tick; }
854 void setTick(
const QJSValue& v) { m_tick = v; }
855 W_PROPERTY(QJSValue, tick READ tick WRITE setTick CONSTANT)
857 const QJSValue& start()
const noexcept {
return m_start; }
858 void setStart(
const QJSValue& v) { m_start = v; }
859 W_PROPERTY(QJSValue, start READ start WRITE setStart CONSTANT)
861 const QJSValue& stop()
const noexcept {
return m_stop; }
862 void setStop(
const QJSValue& v) { m_stop = v; }
863 W_PROPERTY(QJSValue, stop READ stop WRITE setStop CONSTANT)
865 const QJSValue& pause()
const noexcept {
return m_pause; }
866 void setPause(
const QJSValue& v) { m_pause = v; }
867 W_PROPERTY(QJSValue, pause READ pause WRITE setPause CONSTANT)
869 const QJSValue& resume()
const noexcept {
return m_resume; }
870 void setResume(
const QJSValue& v) { m_resume = v; }
871 W_PROPERTY(QJSValue, resume READ resume WRITE setResume CONSTANT)
873 const QJSValue& uiEvent()
const noexcept {
return m_uiEvent; }
874 void setUiEvent(
const QJSValue& v) { m_uiEvent = v; }
875 W_PROPERTY(QJSValue, uiEvent READ uiEvent WRITE setUiEvent CONSTANT)
877 void uiSend(
const QJSValue& v) W_SIGNAL(uiSend, v);
879 const QJSValue& loadState()
const noexcept {
return m_loadState; }
880 void setLoadState(
const QJSValue& v) { m_loadState = v; }
881 W_PROPERTY(QJSValue, loadState READ loadState WRITE setLoadState CONSTANT)
883 const QJSValue& stateUpdated()
const noexcept {
return m_stateUpdated; }
884 void setStateUpdated(
const QJSValue& v) { m_stateUpdated = v; }
885 W_PROPERTY(QJSValue, stateUpdated READ stateUpdated WRITE setStateUpdated CONSTANT)
888 QList<QObject*> m_data;
895 QJSValue m_loadState;
896 QJSValue m_stateUpdated;
904 const QJSValue& executionEvent()
const noexcept {
return m_executionEvent; }
905 void setExecutionEvent(
const QJSValue& v) { m_executionEvent = v; }
906 W_PROPERTY(QJSValue, executionEvent READ executionEvent WRITE setExecutionEvent CONSTANT)
908 const QJSValue& loadState()
const noexcept {
return m_loadState; }
909 void setLoadState(
const QJSValue& v) { m_loadState = v; }
910 W_PROPERTY(QJSValue, loadState READ loadState WRITE setLoadState CONSTANT)
912 const QJSValue& stateUpdated()
const noexcept {
return m_stateUpdated; }
913 void setStateUpdated(
const QJSValue& v) { m_stateUpdated = v; }
914 W_PROPERTY(QJSValue, stateUpdated READ stateUpdated WRITE setStateUpdated CONSTANT)
916 void executionSend(
const QJSValue& v)
917 W_SIGNAL(executionSend, v);
919 void beginUpdateState(
const QString& name)
920 W_SIGNAL(beginUpdateState, name);
921 void updateState(
const QString& k,
const QJSValue& v)
922 W_SIGNAL(updateState, k, v);
923 void endUpdateState()
924 W_SIGNAL(endUpdateState);
925 void cancelUpdateState()
926 W_SIGNAL(cancelUpdateState);
928 W_SIGNAL(clearState);
929 void replaceState(
const QJSValue& v)
930 W_SIGNAL(replaceState, v);
933 W_INVOKABLE(inlet, (
int));
935 W_INVOKABLE(outlet, (
int));
937 W_INVOKABLE(inlet, (
const QString&));
939 W_INVOKABLE(outlet, (
const QString&));
945 QJSValue m_executionEvent;
946 QJSValue m_loadState;
947 QJSValue m_stateUpdated;
952inline QDataStream& operator<<(QDataStream& i,
const JS::MidiMessage& sel)
Definition QmlObjects.hpp:670
Definition QmlObjects.hpp:699
Definition QmlObjects.hpp:512
Definition QmlObjects.hpp:123
Definition QmlObjects.hpp:483
Definition QmlObjects.hpp:357
Definition QmlObjects.hpp:284
Definition QmlObjects.hpp:379
Definition QmlObjects.hpp:452
Definition QmlObjects.hpp:215
Definition QmlObjects.hpp:147
Definition QmlObjects.hpp:610
Definition QmlObjects.hpp:577
Definition QmlObjects.hpp:43
Definition QmlObjects.hpp:328
Definition QmlObjects.hpp:423
Definition QmlObjects.hpp:237
Definition QmlObjects.hpp:593
Definition QmlObjects.hpp:732
Definition QmlObjects.hpp:722
Definition QmlObjects.hpp:769
Definition QmlObjects.hpp:56
Definition QmlObjects.hpp:845
Definition QmlObjects.hpp:900
Definition QmlObjects.hpp:545
Definition QmlObjects.hpp:90
Definition QmlObjects.hpp:639
The Process class.
Definition score-lib-process/Process/Process.hpp:62
The id_base_t class.
Definition Identifier.hpp:59
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Definition QmlObjects.hpp:202
Definition QmlObjects.hpp:196
Definition QmlObjects.hpp:68
Definition QmlObjects.hpp:190
Definition QmlObjects.hpp:79
Definition QmlObjects.hpp:208
Definition WidgetInlets.hpp:444
Definition WidgetInlets.hpp:464
Definition WidgetInlets.hpp:512
Definition WidgetInlets.hpp:349
Definition WidgetInlets.hpp:324