37class SCORE_PLUGIN_JS_EXPORT
js_node final :
public ossia::graph_node
41 ossia::execution_state& st,
42 std::shared_ptr<const LocalTree::ScriptableSnapshot> names);
45 [[nodiscard]] std::string label()
const noexcept override {
return "javascript"; }
47 void run(
const ossia::token_request& t, ossia::exec_state_facade)
noexcept override;
48 void clear()
noexcept override;
49 void setupComponent();
50 void setScript(
const QString& rootPath,
const QString& val);
52 ossia::execution_state& m_st;
54 std::shared_ptr<QQmlEngine> m_engine{};
55 QQmlContext* m_context{};
56 std::vector<Inlet*> m_jsInlets;
57 std::vector<std::pair<ControlInlet*, ossia::inlet_ptr>> m_ctrlInlets;
58 std::vector<std::pair<Impulse*, ossia::inlet_ptr>> m_impulseInlets;
59 std::vector<std::pair<ValueInlet*, ossia::inlet_ptr>> m_valInlets;
60 std::vector<std::pair<ValueOutlet*, ossia::outlet_ptr>> m_valOutlets;
61 std::vector<std::pair<AudioInlet*, ossia::inlet_ptr>> m_audInlets;
62 std::vector<std::pair<AudioOutlet*, ossia::outlet_ptr>> m_audOutlets;
63 std::vector<std::pair<MidiInlet*, ossia::inlet_ptr>> m_midInlets;
64 std::vector<std::pair<MidiOutlet*, ossia::outlet_ptr>> m_midOutlets;
66 ossia::qt::qml_engine_functions* m_execFuncs{};
68 std::shared_ptr<const LocalTree::ScriptableSnapshot>
m_names;
70 bool m_namesChanged{};
73 std::optional<QJSValueList> m_tickCall;
74 QPointer<QObject> m_uiContext;
75 QPointer<JS::ProcessModel> m_modelContext;
76 std::function<void(QVariant)> m_messageToUi;
77 std::size_t m_gcIndex{};
79 JS::JSState m_modelState;
86 void setControl(std::size_t index,
const QVariant& val)
88 if(index >= m_jsInlets.size())
90 if(
auto v = qobject_cast<ValueInlet*>(m_jsInlets[index]))
92 else if(
auto v = qobject_cast<ControlInlet*>(m_jsInlets[index]))
95 void impulse(std::size_t index)
97 if(index >= m_jsInlets.size())
99 if(
auto v = qobject_cast<Impulse*>(m_jsInlets[index]))
103 void uiMessage(
const QVariant& v)
108 const auto& on_ui = this->m_object->uiEvent();
109 if(!on_ui.isCallable())
112 on_ui.call({JS::variantToJs(*m_engine, v)});
115 void stateElementChanged(
const QString& k,
const ossia::value& v)
120 const auto& on_stateUpdated = this->m_object->stateUpdated();
121 if(!on_stateUpdated.isCallable())
126 if(
auto res = v.apply(ossia::qt::ossia_to_qvariant{}); res.isValid())
127 on_stateUpdated.call({k, JS::variantToJs(*m_engine, res)});
129 on_stateUpdated.call({k, QJSValue{}});
132 on_stateUpdated.call({k, QJSValue{}});