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>
17#include <score/tools/Debug.hpp>
19#include <ossia/detail/math.hpp>
20#include <ossia/detail/ssize.hpp>
21#include <ossia/network/domain/domain.hpp>
23#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>
151 using ControlInlet::ControlInlet;
153 bool isEvent()
const override {
return true; }
156 return new Impl(
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)
190 using GenericControlInlet::GenericControlInlet;
196 using GenericControlInlet::GenericControlInlet;
202 using GenericControlInlet::GenericControlInlet;
208 using GenericControlInlet::GenericControlInlet;
214 using GenericControlInlet::GenericControlInlet;
220 using GenericControlInlet::GenericControlInlet;
226 using GenericControlInlet::GenericControlInlet;
232 using GenericControlInlet::GenericControlInlet;
238 using GenericControlInlet::GenericControlInlet;
244 using GenericControlInlet::GenericControlInlet;
250 using GenericControlInlet::GenericControlInlet;
256 using GenericControlInlet::GenericControlInlet;
259template <
typename Impl = Process::FloatSl
ider>
267 bool isEvent()
const override {
return true; }
271 return new Impl{(float)m_min, (
float)m_max, (float)m_init,
272 this->objectName(), id, parent};
275 W_INLINE_PROPERTY_VALUE(qreal, init, {0.5}, init, setInit, initChanged)
276 W_INLINE_PROPERTY_VALUE(qreal, min, {0.}, getMin, setMin, minChanged)
277 W_INLINE_PROPERTY_VALUE(qreal, max, {1.}, getMax, setMax, maxChanged)
281template <
typename Impl = Process::IntSl
ider>
289 bool isEvent()
const override {
return true; }
293 return new Impl{m_min, m_max, m_init, this->objectName(), id, parent};
296 W_INLINE_PROPERTY_VALUE(
int, init, {0}, init, setInit, initChanged)
297 W_INLINE_PROPERTY_VALUE(
int, min, {0}, getMin, setMin, minChanged)
298 W_INLINE_PROPERTY_VALUE(
int, max, {127}, getMax, setMax, maxChanged)
307 using ControlInlet::ControlInlet;
308 virtual ~Enum()
override;
309 bool isEvent()
const override {
return true; }
313 return new Process::Enum{m_choices, {}, current(), objectName(), id, parent};
316 auto getValues()
const {
return choices(); }
318 std::string current()
const
320 if(!m_choices.isEmpty() && ossia::valid_index(m_index, m_choices))
322 return m_choices[m_index].toStdString();
327 W_INLINE_PROPERTY_VALUE(
int, index, {}, index, setIndex, indexChanged)
328 W_INLINE_PROPERTY_CREF(QStringList, choices, {}, choices, setChoices, choicesChanged)
336 using ControlInlet::ControlInlet;
338 bool isEvent()
const override {
return true; }
342 std::vector<std::pair<QString, ossia::value>> choices;
343 choices.reserve(m_choices.size());
344 for(
auto& c : m_choices)
345 choices.emplace_back(c, c.toStdString());
346 return new Process::ComboBox{choices, current(), objectName(), id, parent};
349 auto getValues()
const {
return choices(); }
351 std::string current()
const
353 if(!m_choices.isEmpty() && ossia::valid_index(m_index, m_choices))
355 return m_choices[m_index].toStdString();
360 W_INLINE_PROPERTY_VALUE(
int, index, {}, index, setIndex, indexChanged)
361 W_INLINE_PROPERTY_CREF(QStringList, choices, {}, choices, setChoices, choicesChanged)
369 using ControlInlet::ControlInlet;
371 bool isEvent()
const override {
return true; }
374 return new Process::Toggle{m_checked, objectName(), id, parent};
377 W_INLINE_PROPERTY_VALUE(
bool, checked, {}, checked, setChecked, checkedChanged)
385 using ControlInlet::ControlInlet;
387 bool isEvent()
const override {
return true; }
390 return new Process::Button{objectName(), id, parent};
393 W_INLINE_PROPERTY_VALUE(
bool, checked, {}, checked, setChecked, checkedChanged)
401 using ControlInlet::ControlInlet;
403 bool isEvent()
const override {
return false; }
406 return new Process::ImpulseButton{objectName(), id, parent};
409 void impulse() W_SIGNAL(impulse);
417 using ControlInlet::ControlInlet;
419 bool isEvent()
const override {
return true; }
422 return new Process::LineEdit{m_text, objectName(), id, parent};
425 W_INLINE_PROPERTY_CREF(QString, text, {}, text, setText, textChanged)
435 std::vector<OutValueMessage> values;
439 const QJSValue& value()
const;
442 m_value = QJSValue{};
451 void setValue(
const QJSValue& value);
453 void addValue(qreal timestamp, QJSValue t);
456 W_PROPERTY(QJSValue, value READ value WRITE setValue)
464 explicit AudioInlet(QObject* parent =
nullptr);
466 const QVector<QVector<double>>& audio()
const;
467 void setAudio(
const QVector<QVector<double>>& audio);
469 QVector<double> channel(
int i)
const
471 if(m_audio.size() > i)
475 W_INVOKABLE(channel);
483 QVector<QVector<double>> m_audio;
497 p->setPropagate(
true);
501 const QVector<QVector<double>>& audio()
const;
503 void setChannel(
int i,
const QJSValue& v);
504 W_INVOKABLE(setChannel)
506 QVector<QVector<double>> m_audio;
516 W_PROPERTY(QByteArray, bytes MEMBER bytes)
524 explicit MidiInlet(QObject* parent =
nullptr);
526 template <
typename T>
527 void setMidi(
const T& arr)
530 for(
const libremidi::ump& mess : arr)
532 auto m1 = libremidi::midi1_from_ump(mess);
533 const auto N = mess.size();
537 for(std::size_t i = 0; i < N; i++)
540 m_midi.push_back(QVariant::fromValue(m));
544 QVariantList messages()
const {
return m_midi; }
545 W_INVOKABLE(messages);
561 explicit MidiOutlet(QObject* parent =
nullptr);
569 const QVector<QVector<int>>& midi()
const;
571 void setMessages(
const QVariantList m)
576 if(v.canConvert<QVector<int>>())
577 m_midi.push_back(v.value<QVector<int>>());
580 W_INVOKABLE(setMessages);
582 void add(QVector<int> m) { m_midi.push_back(std::move(m)); }
586 QVector<QVector<int>> m_midi;
589#if defined(SCORE_HAS_GPU_JS)
590class TextureOutlet :
public Outlet
592 W_OBJECT(TextureOutlet)
595 explicit TextureOutlet(QObject* parent =
nullptr);
596 virtual ~TextureOutlet()
override;
599 auto p =
new Gfx::TextureOutlet(
id, parent);
603 QQuickItem* item() noexcept {
return m_item; }
604 void setItem(QQuickItem* v) { m_item = v; }
606 W_PROPERTY(QQuickItem*, item READ item WRITE setItem CONSTANT)
608 QQuickItem* m_item{};
615 W_CLASSINFO(
"DefaultProperty",
"data")
617 "qt_QmlJSWrapperFactoryMethod",
"_q_createJSWrapper(QV4::ExecutionEngine*)")
620 QQmlListProperty<QObject> data()
noexcept {
return {
this, &m_data}; }
622 QJSValue& tick()
noexcept {
return m_tick; }
623 void setTick(
const QJSValue& v) { m_tick = v; }
624 QJSValue& start()
noexcept {
return m_start; }
625 void setStart(
const QJSValue& v) { m_start = v; }
626 QJSValue& stop()
noexcept {
return m_stop; }
627 void setStop(
const QJSValue& v) { m_stop = v; }
628 QJSValue& pause()
noexcept {
return m_pause; }
629 void setPause(
const QJSValue& v) { m_pause = v; }
630 QJSValue& resume()
noexcept {
return m_resume; }
631 void setResume(
const QJSValue& v) { m_resume = v; }
632 W_PROPERTY(QJSValue, tick READ tick WRITE setTick CONSTANT)
633 W_PROPERTY(QJSValue, start READ start WRITE setStart CONSTANT)
634 W_PROPERTY(QJSValue, stop READ stop WRITE setStop CONSTANT)
635 W_PROPERTY(QJSValue, pause READ pause WRITE setPause CONSTANT)
636 W_PROPERTY(QJSValue, resume READ resume WRITE setResume CONSTANT)
637 W_PROPERTY(QQmlListProperty<QObject>, data READ data)
640 QList<QObject*> m_data;
649inline QDataStream& operator<<(QDataStream& i,
const JS::MidiMessage& sel)
Definition QmlObjects.hpp:460
Definition QmlObjects.hpp:487
Definition QmlObjects.hpp:332
Definition QmlObjects.hpp:123
Definition QmlObjects.hpp:303
Definition QmlObjects.hpp:261
Definition QmlObjects.hpp:147
Definition QmlObjects.hpp:397
Definition QmlObjects.hpp:43
Definition QmlObjects.hpp:283
Definition QmlObjects.hpp:413
Definition QmlObjects.hpp:520
Definition QmlObjects.hpp:510
Definition QmlObjects.hpp:557
Definition QmlObjects.hpp:56
Definition QmlObjects.hpp:613
Definition QmlObjects.hpp:365
Definition QmlObjects.hpp:90
Definition QmlObjects.hpp:429
The id_base_t class.
Definition Identifier.hpp:57
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1116
Definition QmlObjects.hpp:248
Definition QmlObjects.hpp:242
Definition QmlObjects.hpp:188
Definition QmlObjects.hpp:206
Definition QmlObjects.hpp:68
Definition QmlObjects.hpp:194
Definition QmlObjects.hpp:200
Definition QmlObjects.hpp:236
Definition QmlObjects.hpp:79
Definition QmlObjects.hpp:254
Definition QmlObjects.hpp:212
Definition QmlObjects.hpp:224
Definition QmlObjects.hpp:218
Definition QmlObjects.hpp:230