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 <memory>
29#include <optional>
30#include <vector>
31#include <verdigris>
32
34namespace ossia
35{
36class value;
37}
38namespace score
39{
40class Command;
41struct DocumentContext;
42}
43namespace Process
44{
50enum class FoldMode : int8_t
51{
52 Auto,
53 Folded,
54 Unfolded
55};
56
57class Port;
58class Inlet;
59class ControlInlet;
60class Outlet;
61class AudioInlet;
62class AudioOutlet;
63class MidiInlet;
64class MidiOutlet;
65struct Monitor;
66class ProcessModelFactory;
67class LayerFactory;
68class ProcessModel;
69class LayerFactory;
70class ExternalFileMap;
71struct Inlets;
72struct Outlets;
73
79class SCORE_LIB_PROCESS_EXPORT ProcessModel
80 : public score::Entity<ProcessModel>
81 , public score::SerializableInterface<ProcessModel>
82{
83 W_OBJECT(ProcessModel)
84 SCORE_SERIALIZE_FRIENDS
85public:
86 Selectable selection{this};
88 TimeVal duration, const Id<ProcessModel>& id, const QString& name,
89 QObject* parent);
90
91 ProcessModel(DataStream::Deserializer& vis, QObject* parent);
92 ProcessModel(JSONObject::Deserializer& vis, QObject* parent);
93
94 virtual ~ProcessModel();
95
96 // If the process can have multiple distinct implementations
97 // for which presets are incompatible, e.g. VST, Faust...
98 // This allows to differentiate them
99 virtual QString effect() const noexcept;
100
101 // A user-friendly text to show to the users
102 virtual QString prettyName() const noexcept;
103 virtual QString prettyShortName() const noexcept = 0;
104 virtual QString category() const noexcept = 0;
105 virtual QStringList tags() const noexcept = 0;
106 virtual ProcessFlags flags() const noexcept = 0;
107
110 void setParentDuration(ExpandMode mode, const TimeVal& t) noexcept;
111
112 virtual TimeVal contentDuration() const noexcept;
113
114 void setDuration(const TimeVal& other) noexcept;
115 const TimeVal& duration() const noexcept;
118 double durationInFlicks() const noexcept { return duration().impl; }
119
121 QPointF position() const noexcept;
122 QSizeF size() const noexcept;
123
124 void setPosition(const QPointF& v);
125 void setSize(const QSizeF& v);
126
127 void positionChanged(QPointF p) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, positionChanged, p)
128 void sizeChanged(QSizeF p) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, sizeChanged, p)
129
130 PROPERTY(
131 QPointF, position W_READ position W_WRITE setPosition W_NOTIFY positionChanged)
132 PROPERTY(QSizeF, size W_READ size W_WRITE setSize W_NOTIFY sizeChanged)
133
134 FoldMode foldMode() const noexcept;
135 void setFoldMode(FoldMode v);
136 void foldModeChanged(FoldMode v) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, foldModeChanged, v)
137 PROPERTY(
138 FoldMode, foldMode W_READ foldMode W_WRITE setFoldMode W_NOTIFY foldModeChanged)
139
142 bool folded() const noexcept;
143
147 QSizeF foldedSize() const noexcept { return m_foldedSize; }
148 void setFoldedSize(QSizeF v) noexcept { m_foldedSize = v; }
149
151 virtual ProcessStateDataInterface* startStateData() const noexcept;
152 virtual ProcessStateDataInterface* endStateData() const noexcept;
153
155 virtual Selection selectableChildren() const noexcept;
156 virtual Selection selectedChildren() const noexcept;
157 virtual void setSelection(const Selection& s) const noexcept;
158
159 double getSlotHeight() const noexcept;
160 void setSlotHeight(double) noexcept;
161
162 const Process::Inlets& inlets() const noexcept { return m_inlets; }
163 const Process::Outlets& outlets() const noexcept { return m_outlets; }
164
165 Process::Inlet* inlet(const Id<Process::Port>&) const noexcept;
166 Process::Outlet* outlet(const Id<Process::Port>&) const noexcept;
167
168 virtual void loadPreset(const Preset& preset);
169 virtual Preset savePreset() const noexcept;
170 virtual std::vector<Process::Preset> builtinPresets() const noexcept;
172 virtual bool presetMatches(const Preset& preset) const noexcept;
177 virtual bool presetChangesPorts(const Preset& preset) const noexcept;
180 bool scriptPresetChangesPorts(const Preset& preset) const noexcept;
181
182 // Called when an ancestor was moved in the timeline
183 virtual void ancestorStartDateChanged();
184 virtual void ancestorTempoChanged();
185
186 virtual void forEachControl(
187 smallfun::function<void(Process::ControlInlet&, const ossia::value&)>) const;
188
196 virtual void mapExternalFiles(Process::ExternalFileMap& map);
197
203 virtual bool externalSourceOutOfDate() const noexcept;
204
208 virtual score::Command*
209 refreshFromExternalSource(const score::DocumentContext& ctx) const;
210
211 void externalSourceOutOfDateChanged(bool v)
212 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, externalSourceOutOfDateChanged, v)
213
214 // Magnetism
215 virtual std::optional<Process::MagneticInfo>
216 magneticPosition(const QObject* o, const TimeVal t) const noexcept;
217
220 bool scriptable() const noexcept { return m_scriptable; }
221 void setScriptable(bool b);
222 void scriptableChanged(bool b) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, scriptableChanged, b)
223 PROPERTY(
224 bool, scriptable W_READ scriptable W_WRITE setScriptable W_NOTIFY scriptableChanged)
225
226 // Clip duration things
227 bool loops() const noexcept { return m_loops; }
228 void setLoops(bool b);
229 void loopsChanged(bool b) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, loopsChanged, b)
230 PROPERTY(bool, loops W_READ loops W_WRITE setLoops W_NOTIFY loopsChanged)
231
232 TimeVal startOffset() const noexcept { return m_startOffset; }
233 void setStartOffset(TimeVal b);
234 void startOffsetChanged(TimeVal b)
235 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, startOffsetChanged, b)
236 PROPERTY(
237 TimeVal,
238 startOffset W_READ startOffset W_WRITE setStartOffset W_NOTIFY startOffsetChanged)
239
240 TimeVal loopDuration() const noexcept { return m_loopDuration; }
241 void setLoopDuration(TimeVal b);
242 void loopDurationChanged(TimeVal b)
243 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, loopDurationChanged, b)
244 PROPERTY(
245 TimeVal, loopDuration W_READ loopDuration W_WRITE setLoopDuration W_NOTIFY
246 loopDurationChanged)
247
248 virtual void setCreatingControls(bool ok);
249 bool creatingControls() const noexcept;
250 void creatingControlsChanged(bool b)
251 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, creatingControlsChanged, b)
252 PROPERTY(
253 bool, creatingControls W_READ creatingControls W_WRITE setCreatingControls W_NOTIFY
254 creatingControlsChanged)
255
256 // FIXME ugh
257 QWidget* scriptUI{};
258 QWidget* externalUI{};
259
263 const QString& scriptEditorPlacement() const noexcept
264 {
265 return m_scriptEditorPlacement;
266 }
267 void setScriptEditorPlacement(const QString& p) noexcept
268 {
269 m_scriptEditorPlacement = p;
270 }
271 const QString& processUIPlacement() const noexcept { return m_processUIPlacement; }
272 void setProcessUIPlacement(const QString& p) noexcept { m_processUIPlacement = p; }
273
275 bool executing() const noexcept { return m_executing; }
276 void setExecuting(bool v);
277 void startExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, startExecution)
278 void stopExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, stopExecution)
279 void resetExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, resetExecution)
280
283 void executionPosition(double arg_1)
284 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, executionPosition, arg_1)
285
286 void durationChanged(const TimeVal& arg_1)
287 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, durationChanged, arg_1)
288
289 PROPERTY(double, duration W_READ durationInFlicks W_NOTIFY durationChanged)
290 void useParentDurationChanged(bool arg_1)
291 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, useParentDurationChanged, arg_1)
292
293 void slotHeightChanged(double arg_1)
294 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, slotHeightChanged, arg_1)
295 void prettyNameChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, prettyNameChanged)
296
297 void inletsChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, inletsChanged)
298 void outletsChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, outletsChanged)
299
300 void controlAdded(const Id<Process::Port>& arg_1)
301 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlAdded, arg_1)
302 void controlRemoved(const Process::Port& arg_1)
303 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlRemoved, arg_1)
304 void controlOutletAdded(const Id<Process::Port>& arg_1)
305 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlOutletAdded, arg_1)
306 void controlOutletRemoved(const Process::Port& arg_1)
307 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlOutletRemoved, arg_1)
308
309 void benchmark(double arg_1) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, benchmark, arg_1)
310 void externalUIVisible(bool v) const
311 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, externalUIVisible, v)
312 void scriptUIVisible(bool v) const
313 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, scriptUIVisible, v)
314
315 void flagsChanged() const
316 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, flagsChanged)
317
320 const std::shared_ptr<Monitor>& monitor() const noexcept { return m_monitor; }
321 void setMonitor(std::shared_ptr<Monitor> m);
322 void monitorChanged() const E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, monitorChanged)
323
324protected:
325 // Used to scale the process.
326 // This should be commutative :
327 // setDurationWithScale(2); setDurationWithScale(3);
328 // yields the same result as :
329 // setDurationWithScale(3); setDurationWithScale(2);
330 virtual void setDurationAndScale(const TimeVal& newDuration) noexcept;
331
332 // Does nothing if newDuration < currentDuration
333 virtual void setDurationAndGrow(const TimeVal& newDuration) noexcept;
334
335 // Does nothing if newDuration > currentDuration
336 virtual void setDurationAndShrink(const TimeVal& newDuration) noexcept;
337
338 Process::Inlets m_inlets;
339 Process::Outlets m_outlets;
340
341private:
342 TimeVal m_duration{};
343 double m_slotHeight{};
344 TimeVal m_startOffset{};
345 TimeVal m_loopDuration{};
346 QPointF m_position{};
347 QSizeF m_size{};
348 QSizeF m_foldedSize{};
349 QString m_scriptEditorPlacement;
350 QString m_processUIPlacement;
351 std::shared_ptr<Monitor> m_monitor;
352 bool m_loops{};
353 bool m_scriptable{};
354 bool m_executing{};
355 FoldMode m_foldMode{FoldMode::Auto};
356};
357
358SCORE_LIB_PROCESS_EXPORT
359ProcessModel* parentProcess(QObject* obj) noexcept;
360SCORE_LIB_PROCESS_EXPORT
361const ProcessModel* parentProcess(const QObject* obj) noexcept;
362
363SCORE_LIB_PROCESS_EXPORT
364QString processLocalTreeAddress(const Process::ProcessModel& proc);
365}
366DEFAULT_MODEL_METADATA(Process::ProcessModel, "Process")
367
368Q_DECLARE_METATYPE(Id<Process::ProcessModel>)
369W_REGISTER_ARGTYPE(Id<Process::ProcessModel>)
370W_REGISTER_ARGTYPE(OptionalId<Process::ProcessModel>)
371
372Q_DECLARE_METATYPE(Process::ProcessModel*)
373Q_DECLARE_METATYPE(const Process::ProcessModel*)
374W_REGISTER_ARGTYPE(Process::FoldMode)
375W_REGISTER_ARGTYPE(Process::ProcessModel*)
376W_REGISTER_ARGTYPE(const Process::ProcessModel*)
377W_REGISTER_ARGTYPE(QPointer<const Process::ProcessModel>)
378W_REGISTER_ARGTYPE(QPointer<Process::ProcessModel>)
379
380Q_DECLARE_METATYPE(std::shared_ptr<Process::Preset>)
381W_REGISTER_ARGTYPE(std::shared_ptr<Process::Preset>)
Definition DataStreamVisitor.hpp:202
Definition JSONVisitor.hpp:423
Definition Port.hpp:221
Definition Port.hpp:329
Definition Port.hpp:106
The Process class.
Definition score-lib-process/Process/Process.hpp:82
double durationInFlicks() const noexcept
Definition score-lib-process/Process/Process.hpp:118
const QString & scriptEditorPlacement() const noexcept
Definition score-lib-process/Process/Process.hpp:263
bool executing() const noexcept
Execution.
Definition score-lib-process/Process/Process.hpp:275
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
bool loadPreset(const Process::ProcessModel &proc, const Process::Preset &preset, const score::DocumentContext &ctx)
Definition PresetTree.cpp:167
ProcessFlags
Various settings for processes.
Definition ProcessFlags.hpp:17
FoldMode
Definition score-lib-process/Process/Process.hpp:51
Base toolkit upon which the software is built.
Definition Application.cpp:83
STL namespace.
Definition PortForward.hpp:23
Definition Monitor.hpp:27
Definition PortForward.hpp:27
Definition TimeValue.hpp:21