Loading...
Searching...
No Matches
score-lib-process/Process/Process.hpp
1#pragma once
2#include <Process/Dataflow/PortForward.hpp>
3#include <Process/ExpandMode.hpp>
4#include <Process/Preset.hpp>
5#include <Process/ProcessFlags.hpp>
6#include <Process/TimeValue.hpp>
7
8#include <Magnetism/MagneticInfo.hpp>
9
10#include <score/model/Component.hpp>
11#include <score/model/EntityImpl.hpp>
12#include <score/model/Identifier.hpp>
13#include <score/model/ModelMetadata.hpp>
14#include <score/plugins/SerializableInterface.hpp>
15#include <score/selection/Selectable.hpp>
16#include <score/selection/Selection.hpp>
17#include <score/serialization/VisitorInterface.hpp>
18#include <score/tools/Metadata.hpp>
19
20#include <ossia/detail/small_vector.hpp>
21
22#include <QString>
23
24#include <QMetaProperty>
25#include <score_lib_process_export.h>
26#include <smallfun.hpp>
27
28#include <optional>
29#include <vector>
30#include <verdigris>
31
33namespace ossia
34{
35class value;
36}
37namespace score
38{
39class Command;
40struct DocumentContext;
41}
42namespace Process
43{
49enum class FoldMode : int8_t
50{
51 Auto,
52 Folded,
53 Unfolded
54};
55
56class Port;
57class Inlet;
58class ControlInlet;
59class Outlet;
60class AudioInlet;
61class AudioOutlet;
62class MidiInlet;
63class MidiOutlet;
64class ProcessModelFactory;
65class LayerFactory;
66class ProcessModel;
67class LayerFactory;
68class ExternalFileMap;
69struct Inlets;
70struct Outlets;
71
77class SCORE_LIB_PROCESS_EXPORT ProcessModel
78 : public score::Entity<ProcessModel>
79 , public score::SerializableInterface<ProcessModel>
80{
81 W_OBJECT(ProcessModel)
82 SCORE_SERIALIZE_FRIENDS
83public:
84 Selectable selection{this};
86 TimeVal duration, const Id<ProcessModel>& id, const QString& name,
87 QObject* parent);
88
89 ProcessModel(DataStream::Deserializer& vis, QObject* parent);
90 ProcessModel(JSONObject::Deserializer& vis, QObject* parent);
91
92 virtual ~ProcessModel();
93
94 // If the process can have multiple distinct implementations
95 // for which presets are incompatible, e.g. VST, Faust...
96 // This allows to differentiate them
97 virtual QString effect() const noexcept;
98
99 // A user-friendly text to show to the users
100 virtual QString prettyName() const noexcept;
101 virtual QString prettyShortName() const noexcept = 0;
102 virtual QString category() const noexcept = 0;
103 virtual QStringList tags() const noexcept = 0;
104 virtual ProcessFlags flags() const noexcept = 0;
105
108 void setParentDuration(ExpandMode mode, const TimeVal& t) noexcept;
109
110 virtual TimeVal contentDuration() const noexcept;
111
112 void setDuration(const TimeVal& other) noexcept;
113 const TimeVal& duration() const noexcept;
116 double durationInFlicks() const noexcept { return duration().impl; }
117
119 QPointF position() const noexcept;
120 QSizeF size() const noexcept;
121
122 void setPosition(const QPointF& v);
123 void setSize(const QSizeF& v);
124
125 void positionChanged(QPointF p) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, positionChanged, p)
126 void sizeChanged(QSizeF p) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, sizeChanged, p)
127
128 PROPERTY(
129 QPointF, position W_READ position W_WRITE setPosition W_NOTIFY positionChanged)
130 PROPERTY(QSizeF, size W_READ size W_WRITE setSize W_NOTIFY sizeChanged)
131
132 FoldMode foldMode() const noexcept;
133 void setFoldMode(FoldMode v);
134 void foldModeChanged(FoldMode v) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, foldModeChanged, v)
135 PROPERTY(
136 FoldMode, foldMode W_READ foldMode W_WRITE setFoldMode W_NOTIFY foldModeChanged)
137
140 bool folded() const noexcept;
141
143 virtual ProcessStateDataInterface* startStateData() const noexcept;
144 virtual ProcessStateDataInterface* endStateData() const noexcept;
145
147 virtual Selection selectableChildren() const noexcept;
148 virtual Selection selectedChildren() const noexcept;
149 virtual void setSelection(const Selection& s) const noexcept;
150
151 double getSlotHeight() const noexcept;
152 void setSlotHeight(double) noexcept;
153
154 const Process::Inlets& inlets() const noexcept { return m_inlets; }
155 const Process::Outlets& outlets() const noexcept { return m_outlets; }
156
157 Process::Inlet* inlet(const Id<Process::Port>&) const noexcept;
158 Process::Outlet* outlet(const Id<Process::Port>&) const noexcept;
159
160 virtual void loadPreset(const Preset& preset);
161 virtual Preset savePreset() const noexcept;
162 virtual std::vector<Process::Preset> builtinPresets() const noexcept;
164 virtual bool presetMatches(const Preset& preset) const noexcept;
165
166 // Called when an ancestor was moved in the timeline
167 virtual void ancestorStartDateChanged();
168 virtual void ancestorTempoChanged();
169
170 virtual void forEachControl(
171 smallfun::function<void(Process::ControlInlet&, const ossia::value&)>) const;
172
180 virtual void mapExternalFiles(Process::ExternalFileMap& map);
181
187 virtual bool externalSourceOutOfDate() const noexcept;
188
192 virtual score::Command*
193 refreshFromExternalSource(const score::DocumentContext& ctx) const;
194
195 void externalSourceOutOfDateChanged(bool v)
196 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, externalSourceOutOfDateChanged, v)
197
198 // Magnetism
199 virtual std::optional<Process::MagneticInfo>
200 magneticPosition(const QObject* o, const TimeVal t) const noexcept;
201
202 // Clip duration things
203 bool loops() const noexcept { return m_loops; }
204 void setLoops(bool b);
205 void loopsChanged(bool b) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, loopsChanged, b)
206 PROPERTY(bool, loops W_READ loops W_WRITE setLoops W_NOTIFY loopsChanged)
207
208 TimeVal startOffset() const noexcept { return m_startOffset; }
209 void setStartOffset(TimeVal b);
210 void startOffsetChanged(TimeVal b)
211 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, startOffsetChanged, b)
212 PROPERTY(
213 TimeVal,
214 startOffset W_READ startOffset W_WRITE setStartOffset W_NOTIFY startOffsetChanged)
215
216 TimeVal loopDuration() const noexcept { return m_loopDuration; }
217 void setLoopDuration(TimeVal b);
218 void loopDurationChanged(TimeVal b)
219 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, loopDurationChanged, b)
220 PROPERTY(
221 TimeVal, loopDuration W_READ loopDuration W_WRITE setLoopDuration W_NOTIFY
222 loopDurationChanged)
223
224 virtual void setCreatingControls(bool ok);
225 bool creatingControls() const noexcept;
226 void creatingControlsChanged(bool b)
227 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, creatingControlsChanged, b)
228 PROPERTY(
229 bool, creatingControls W_READ creatingControls W_WRITE setCreatingControls W_NOTIFY
230 creatingControlsChanged)
231
232 // FIXME ugh
233 QWidget* scriptUI{};
234 QWidget* externalUI{};
235
239 const QString& scriptEditorPlacement() const noexcept
240 {
241 return m_scriptEditorPlacement;
242 }
243 void setScriptEditorPlacement(const QString& p) noexcept
244 {
245 m_scriptEditorPlacement = p;
246 }
247 const QString& processUIPlacement() const noexcept { return m_processUIPlacement; }
248 void setProcessUIPlacement(const QString& p) noexcept { m_processUIPlacement = p; }
249
251 bool executing() const noexcept { return m_executing; }
252 void setExecuting(bool v);
253 void startExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, startExecution)
254 void stopExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, stopExecution)
255 void resetExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, resetExecution)
256
259 void executionPosition(double arg_1)
260 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, executionPosition, arg_1)
261
262 void durationChanged(const TimeVal& arg_1)
263 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, durationChanged, arg_1)
264
265 PROPERTY(double, duration W_READ durationInFlicks W_NOTIFY durationChanged)
266 void useParentDurationChanged(bool arg_1)
267 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, useParentDurationChanged, arg_1)
268
269 void slotHeightChanged(double arg_1)
270 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, slotHeightChanged, arg_1)
271 void prettyNameChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, prettyNameChanged)
272
273 void inletsChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, inletsChanged)
274 void outletsChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, outletsChanged)
275
276 void controlAdded(const Id<Process::Port>& arg_1)
277 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlAdded, arg_1)
278 void controlRemoved(const Process::Port& arg_1)
279 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlRemoved, arg_1)
280 void controlOutletAdded(const Id<Process::Port>& arg_1)
281 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlOutletAdded, arg_1)
282 void controlOutletRemoved(const Process::Port& arg_1)
283 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlOutletRemoved, arg_1)
284
285 void benchmark(double arg_1) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, benchmark, arg_1)
286 void externalUIVisible(bool v) const
287 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, externalUIVisible, v)
288 void scriptUIVisible(bool v) const
289 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, scriptUIVisible, v)
290
291 void flagsChanged() const
292 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, flagsChanged)
293
294protected:
295 // Used to scale the process.
296 // This should be commutative :
297 // setDurationWithScale(2); setDurationWithScale(3);
298 // yields the same result as :
299 // setDurationWithScale(3); setDurationWithScale(2);
300 virtual void setDurationAndScale(const TimeVal& newDuration) noexcept;
301
302 // Does nothing if newDuration < currentDuration
303 virtual void setDurationAndGrow(const TimeVal& newDuration) noexcept;
304
305 // Does nothing if newDuration > currentDuration
306 virtual void setDurationAndShrink(const TimeVal& newDuration) noexcept;
307
308 Process::Inlets m_inlets;
309 Process::Outlets m_outlets;
310
311private:
312 TimeVal m_duration{};
313 double m_slotHeight{};
314 TimeVal m_startOffset{};
315 TimeVal m_loopDuration{};
316 QPointF m_position{};
317 QSizeF m_size{};
318 QString m_scriptEditorPlacement;
319 QString m_processUIPlacement;
320 bool m_loops{};
321 bool m_executing{};
322 FoldMode m_foldMode{FoldMode::Auto};
323};
324
325SCORE_LIB_PROCESS_EXPORT
326ProcessModel* parentProcess(QObject* obj) noexcept;
327SCORE_LIB_PROCESS_EXPORT
328const ProcessModel* parentProcess(const QObject* obj) noexcept;
329
330SCORE_LIB_PROCESS_EXPORT
331QString processLocalTreeAddress(const Process::ProcessModel& proc);
332}
333DEFAULT_MODEL_METADATA(Process::ProcessModel, "Process")
334
335Q_DECLARE_METATYPE(Id<Process::ProcessModel>)
336W_REGISTER_ARGTYPE(Id<Process::ProcessModel>)
337W_REGISTER_ARGTYPE(OptionalId<Process::ProcessModel>)
338
339Q_DECLARE_METATYPE(Process::ProcessModel*)
340Q_DECLARE_METATYPE(const Process::ProcessModel*)
341W_REGISTER_ARGTYPE(Process::FoldMode)
342W_REGISTER_ARGTYPE(Process::ProcessModel*)
343W_REGISTER_ARGTYPE(const Process::ProcessModel*)
344W_REGISTER_ARGTYPE(QPointer<const Process::ProcessModel>)
345W_REGISTER_ARGTYPE(QPointer<Process::ProcessModel>)
346
347Q_DECLARE_METATYPE(std::shared_ptr<Process::Preset>)
348W_REGISTER_ARGTYPE(std::shared_ptr<Process::Preset>)
Definition DataStreamVisitor.hpp:202
Definition JSONVisitor.hpp:423
Definition Port.hpp:192
Definition Port.hpp:300
Definition Port.hpp:104
The Process class.
Definition score-lib-process/Process/Process.hpp:80
double durationInFlicks() const noexcept
Definition score-lib-process/Process/Process.hpp:116
const QString & scriptEditorPlacement() const noexcept
Definition score-lib-process/Process/Process.hpp:239
bool executing() const noexcept
Execution.
Definition score-lib-process/Process/Process.hpp:251
Definition ProcessStateDataInterface.hpp:24
The Selectable class.
Definition Selectable.hpp:14
Definition Selection.hpp:12
The id_base_t class.
Definition Identifier.hpp:59
Base for complex model objects.
Definition EntityBase.hpp:24
Generic serialization method for abstract classes.
Definition SerializableInterface.hpp:21
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
ProcessFlags
Various settings for processes.
Definition ProcessFlags.hpp:17
FoldMode
Definition score-lib-process/Process/Process.hpp:50
Base toolkit upon which the software is built.
Definition Application.cpp:108
STL namespace.
Definition PortForward.hpp:23
Definition PortForward.hpp:27
Definition TimeValue.hpp:21