Loading...
Searching...
No Matches
JSProcessModel.hpp
1#pragma once
2#include <Process/Process.hpp>
3#include <Process/Script/ScriptProcess.hpp>
4
5#include <JS/JSProcessMetadata.hpp>
6#include <JS/Qml/QmlObjects.hpp>
7#include <score/serialization/MapSerialization.hpp>
8#include <QQmlComponent>
9
10#include <score_plugin_js_export.h>
11
12#include <memory>
13#include <verdigris>
14class QQuickItem;
15
16namespace JS
17{
18class Script;
19class ProcessModel;
20
21struct QmlSource {
22 QmlSource() = default;
23 ~QmlSource() = default;
24 QmlSource(const QmlSource&) = default;
25 QmlSource(QmlSource&&) = default;
26
27 QmlSource(const QString& execution, const QString& ui)
28 : execution{execution}
29 , ui{ui}
30 {
31 }
32
33 QmlSource(const std::vector<QString>& vec)
34 {
35 SCORE_ASSERT(vec.size() == 2);
36 execution = vec[0];
37 ui = vec[1];
38 }
39
40 QmlSource& operator=(const QmlSource&) = default;
41 QmlSource& operator=(QmlSource&&) = default;
42
43 QString execution;
44 QString ui;
45
47 {
48 const QString name;
49 const QString QmlSource::*pointer;
50 const std::string_view language{};
51 };
52
53 static const inline std::array<MemberSpec, 2> specification{
54 MemberSpec{QObject::tr("Execution"), &QmlSource::execution, "QML"},
55 MemberSpec{QObject::tr("GUI"), &QmlSource::ui, "QML"},
56 };
57
58 friend bool operator!=(const QmlSource& lhs, const std::vector<QString>& rhs) {
59 return rhs.size() != 2 || lhs.execution != rhs[0]|| lhs.ui != rhs[1];
60 }
61 friend bool operator!=(const std::vector<QString>& rhs, const QmlSource& lhs) {
62 return rhs.size() != 2 || lhs.execution != rhs[0]|| lhs.ui != rhs[1];
63 }
64};
65
66
68{
69 struct Cache
70 {
71 QByteArray key;
72 std::unique_ptr<QQmlComponent> component{};
73 std::unique_ptr<JS::Script> object{};
74 };
75
77 getExecution(const JS::ProcessModel& process, const QByteArray& str, bool isFile) noexcept;
78 QQmlComponent*
79 getUi(const JS::ProcessModel& process, const QByteArray& str, bool isFile) noexcept;
80 const Cache* tryGet(const QByteArray& str, bool isFile) const noexcept;
81
84
85private:
86 std::vector<Cache> m_map;
87
88};
89
90class SCORE_PLUGIN_JS_EXPORT ProcessModel final : public Process::ProcessModel
91{
92 SCORE_SERIALIZE_FRIENDS
93 PROCESS_METADATA_IMPL_NOFLAGS(JS::ProcessModel)
94 W_OBJECT(ProcessModel)
95public:
96 bool hasExternalUI() const noexcept { return bool(m_ui_component); }
97
98 explicit ProcessModel(
99 const TimeVal& duration, const QString& data, const Id<Process::ProcessModel>& id,
100 QObject* parent);
101
102 template <typename Impl>
103 explicit ProcessModel(Impl& vis, QObject* parent)
104 : Process::ProcessModel{vis, parent}
105 {
106 vis.writeTo(*this);
107 }
108 Process::ProcessFlags flags() const noexcept override;
109 void setExecutionScript(const QString& script);
110 const QString& executionScript() const noexcept { return m_program.execution; }
111 void executionScriptOk() W_SIGNAL(executionScriptOk);
112 void executionScriptChanged(const QString& arg_1) W_SIGNAL(executionScriptChanged, arg_1);
113 const QByteArray& qmlData() const noexcept { return m_qmlData; }
114
115 void setUiScript(const QString& script);
116 const QString& uiScript() const noexcept { return m_program.ui; }
117 void uiScriptOk() W_SIGNAL(uiScriptOk);
118 void uiScriptChanged(const QString& arg_1) W_SIGNAL(uiScriptChanged, arg_1);
119
120 void setState(const JS::JSState& s);
121 void updateState(const QString& k, const ossia::value& v);
122 const JS::JSState& state() const noexcept { return m_state; }
123 void stateChanged() W_SIGNAL(stateChanged);
124 void stateElementChanged(const QString& k, const ossia::value& v) W_SIGNAL(stateElementChanged, k, v);
125
126 JS::Script* currentExecutionObject() const noexcept;
127 QQuickItem* currentUI() const noexcept;
128 bool isGpu() const noexcept;
129 bool hasUi() const noexcept;
130 QWidget* createWindowForUI(const score::DocumentContext& ctx,
131 QWidget* parent) const noexcept;
132 QQuickItem* createItemForUI(const score::DocumentContext& ctx) const noexcept;
133
134 ~ProcessModel() override;
135
136 bool validate(const std::vector<QString>& str) const noexcept;
137 void errorMessage(const QString& arg_2) const
138 W_SIGNAL(errorMessage, arg_2);
139
140 const QmlSource& program() const noexcept { return m_program; }
141 [[nodiscard]] Process::ScriptChangeResult setProgram(const QmlSource& f);
142 void programChanged() W_SIGNAL(programChanged);
143
144
145 void uiToExecution(const QVariant& v) W_SIGNAL(uiToExecution, v);
146 void executionToUi(const QVariant& v) W_SIGNAL(executionToUi, v);
147
148 PROPERTY(QString, executionScript READ executionScript WRITE setExecutionScript NOTIFY executionScriptChanged)
149 PROPERTY(QString, uiScript READ uiScript WRITE setUiScript NOTIFY uiScriptChanged)
150 PROPERTY(JS::QmlSource, program READ program WRITE setProgram NOTIFY programChanged)
151 PROPERTY(JS::JSState, state READ state WRITE setState NOTIFY stateChanged)
152private:
153 QString effect() const noexcept override;
154 void loadPreset(const Process::Preset& preset) override;
155 Process::Preset savePreset() const noexcept override;
156 Process::ScriptChangeResult setQmlData(const QByteArray&, bool isFile);
157
158 QmlSource m_program;
159 QByteArray m_qmlData;
160
161 QQmlComponent* m_ui_component{};
162 mutable QPointer<QQuickItem> m_ui_object{};
163
164 mutable ComponentCache m_cache;
165 JS::JSState m_state;
166 bool m_isFile{};
167};
168}
169
170W_REGISTER_ARGTYPE(JS::JSState)
Definition JSProcessModel.hpp:91
Definition QmlObjects.hpp:845
The Process class.
Definition score-lib-process/Process/Process.hpp:62
The id_base_t class.
Definition Identifier.hpp:59
ProcessFlags
Various settings for processes.
Definition ProcessFlags.hpp:17
Definition JSProcessModel.hpp:70
Definition JSProcessModel.hpp:68
Definition JSProcessModel.hpp:47
Definition JSProcessModel.hpp:21
Definition Preset.hpp:32
Definition ScriptProcess.hpp:14
Definition TimeValue.hpp:21
Definition DocumentContext.hpp:18