Loading...
Searching...
No Matches
IntervalModel.hpp
1#pragma once
2#include <Process/Dataflow/TimeSignature.hpp>
3#include <Process/Instantiations.hpp>
4#include <Process/Process.hpp>
5#include <Process/TimeValue.hpp>
6
7#include <Scenario/Document/Interval/ExecutionState.hpp>
8#include <Scenario/Document/Interval/IntervalDurations.hpp>
9#include <Scenario/Document/Interval/Slot.hpp>
10#include <Scenario/Document/Interval/TimeSignatureMap.hpp>
11#include <Scenario/Document/Metatypes.hpp>
12#include <Scenario/Document/ModelConsistency.hpp>
13
14#include <score/model/Component.hpp>
15#include <score/model/EntityImpl.hpp>
16#include <score/model/EntityMap.hpp>
17#include <score/model/IdentifiedObject.hpp>
18#include <score/model/Identifier.hpp>
19#include <score/selection/Selectable.hpp>
20#include <score/serialization/MapSerialization.hpp>
21#include <score/tools/Metadata.hpp>
22#include <score/tools/std/Optional.hpp>
23
24#include <QObject>
25#include <QPointer>
26
27#include <nano_signal_slot.hpp>
28
29#include <verdigris>
30
31class DataStream;
32class JSONObject;
33namespace Process
34{
35class AudioInlet;
36class AudioOutlet;
37}
38namespace Curve
39{
40class Model;
41}
42namespace Scenario
43{
44class StateModel;
45class TempoProcess;
46
47class SCORE_PLUGIN_SCENARIO_EXPORT IntervalModel final
48 : public score::Entity<IntervalModel>
49 , public Nano::Observer
50{
51 W_OBJECT(IntervalModel)
52
53 SCORE_SERIALIZE_FRIENDS
54 friend struct IntervalSaveData;
55 friend struct SlotPath;
56
57public:
58 std::unique_ptr<Process::AudioInlet> inlet;
59 std::unique_ptr<Process::AudioOutlet> outlet;
60
63
64 Selectable selection{this};
65 ModelConsistency consistency{nullptr};
66 IntervalDurations duration{*this};
67
69 IntervalModel(
70 const Id<IntervalModel>&, double yPos, const score::DocumentContext& ctx,
71 QObject* parent);
72
73 ~IntervalModel();
74
75 // Serialization
76 IntervalModel(
77 DataStream::Deserializer& vis, const score::DocumentContext& ctx, QObject* parent);
78 IntervalModel(
79 JSONObject::Deserializer& vis, const score::DocumentContext& ctx, QObject* parent);
80 IntervalModel(
82 QObject* parent);
83 IntervalModel(
85 QObject* parent);
86
87 const score::DocumentContext& context() const noexcept { return m_context; }
88 const Id<StateModel>& startState() const noexcept;
89 void setStartState(const Id<StateModel>& eventId);
90
91 const Id<StateModel>& endState() const noexcept;
92 void setEndState(const Id<StateModel>& endState);
93
94 const TimeVal& date() const noexcept;
95 void setStartDate(const TimeVal& start);
96 void translate(const TimeVal& deltaTime);
97
104 double dateInFlicks() const noexcept { return date().impl; }
105
106 double heightPercentage() const noexcept;
107
108 void startExecution();
109 void stopExecution();
110 // Resets the execution display recursively
111 void reset();
112
113 void setHeightPercentage(double arg);
114 void setExecutionState(IntervalExecutionState);
115
116 IntervalExecutionState executionState() const;
117
118 // Mode
119 enum ViewMode : bool
120 {
121 Temporal = 0,
122 Nodal = 1
123 };
124 ViewMode viewMode() const noexcept;
125 void setViewMode(ViewMode v);
126 void viewModeChanged(ViewMode v)
127 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, viewModeChanged, v)
128
129 // Node view properties (both small and full view)
134 std::optional<QPointF> nodalCenter() const noexcept;
135 void setNodalCenter(QPointF center);
138 QPointF legacyNodalOffset() const noexcept;
139 double nodalScale() const noexcept;
140 void setNodalScale(double z);
141
142 // Full view properties:
143 ZoomRatio zoom() const noexcept;
144 void setZoom(const ::ZoomRatio& zoom);
145
146 TimeVal midTime() const noexcept;
147 void setMidTime(const TimeVal& value);
148
149 void setSmallViewVisible(bool);
150 bool smallViewVisible() const noexcept;
151
152 const Rack& smallView() const noexcept { return m_smallView; }
153 const FullRack& fullView() const noexcept { return m_fullView; }
154
155 void clearSmallView();
156 void clearFullView();
157 void replaceSmallView(const Rack& other);
162 void restoreSmallView(const Rack& other);
163 void replaceFullView(const FullRack& other);
164
165 // Adding and removing slots and layers is only for the small view
166 void addSlot(Slot s);
167 void addSlot(Slot s, int pos);
168 void removeSlot(int pos);
169
170 void addLayer(int slot, Id<Process::ProcessModel>);
171 void removeLayer(int slot, Id<Process::ProcessModel>);
172
173 void putLayerToFront(int slot, Id<Process::ProcessModel>);
174 void putLayerToFront(int slot, std::nullopt_t);
175
176 void swapSlots(int pos1, int pos2, Slot::RackView fullview);
177
178 double getSlotHeight(const SlotId& slot) const;
179 void setSlotHeight(const SlotId& slot, double height);
180 double getHeight() const noexcept;
181
183 double getSlotHeightForProcess(const Id<Process::ProcessModel>& p) const;
184
185 const Slot* findSmallViewSlot(int slot) const;
186 const Slot& getSmallViewSlot(int slot) const;
187 Slot& getSmallViewSlot(int slot);
188
189 const FullSlot* findFullViewSlot(int slot) const;
190 const FullSlot& getFullViewSlot(int slot) const;
191 FullSlot& getFullViewSlot(int slot);
192
193 bool muted() const noexcept { return m_muted; }
194 void setMuted(bool m);
195
196 bool graphal() const noexcept { return m_graphal; }
197 void setGraphal(bool m);
198
199 bool executing() const noexcept { return m_executing; }
200 void setExecuting(bool m);
201
202 // Tempo stuff
203 bool hasTimeSignature() const noexcept { return m_hasSignature; }
204 void setHasTimeSignature(bool b);
205
206 TimeVal contentDuration() const noexcept;
207
208 TempoProcess* tempoCurve() const noexcept;
209
210 void ancestorStartDateChanged();
211 void ancestorTempoChanged();
212
213 void addSignature(TimeVal t, ossia::time_signature sig);
214 void removeSignature(TimeVal t);
215 void setTimeSignatureMap(const TimeSignatureMap& map);
216 const TimeSignatureMap& timeSignatureMap() const noexcept;
217
218 ossia::musical_sync quantizationRate() const noexcept;
219 void setQuantizationRate(ossia::musical_sync b);
220
221 void setStartMarker(TimeVal t);
222 TimeVal startMarker() const noexcept;
223 double startMarkerInFlicks() const noexcept { return startMarker().impl; }
224 inline IntervalDurations* getDurations() noexcept { return &duration; }
225
226 void hasTimeSignatureChanged(bool arg_1)
227 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, hasTimeSignatureChanged, arg_1)
228 void timeSignaturesChanged(const TimeSignatureMap& arg_1)
229 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, timeSignaturesChanged, arg_1)
230 void quantizationRateChanged(ossia::musical_sync arg)
231 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, quantizationRateChanged, arg)
232
233 void requestHeightChange(double y)
234 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, requestHeightChange, y)
235 void heightPercentageChanged(double arg_1)
236 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, heightPercentageChanged, arg_1)
237
238 void dateChanged(const TimeVal& arg_1)
239 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, dateChanged, arg_1)
240 void startMarkerChanged(const TimeVal& arg_1)
241 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, startMarkerChanged, arg_1)
242
243 void focusChanged(bool arg_1)
244 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, focusChanged, arg_1)
245 void executionStateChanged(Scenario::IntervalExecutionState arg_1)
246 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, executionStateChanged, arg_1)
247
248 void executionEvent(Scenario::IntervalExecutionEvent ev)
249 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, executionEvent, ev)
250
251 void smallViewVisibleChanged(bool fv)
252 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, smallViewVisibleChanged, fv)
253
254 void rackChanged(Scenario::Slot::RackView fv)
255 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, rackChanged, fv)
256 void slotAdded(Scenario::SlotId arg_1)
257 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotAdded, arg_1)
258 void slotRemoved(Scenario::SlotId arg_1)
259 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotRemoved, arg_1)
260 void slotResized(Scenario::SlotId arg_1)
261 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotResized, arg_1)
262 void slotsSwapped(int slot1, int slot2, Slot::RackView fv)
263 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotsSwapped, slot1, slot2, fv)
264 void heightFinishedChanging()
265 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, heightFinishedChanging)
266
267 void layerAdded(Scenario::SlotId arg_1, Id<Process::ProcessModel> arg_2)
268 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, layerAdded, arg_1, arg_2)
269 void layerRemoved(Scenario::SlotId arg_1, Id<Process::ProcessModel> arg_2)
270 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, layerRemoved, arg_1, arg_2)
271 void frontLayerChanged(int arg_1, OptionalId<Process::ProcessModel> arg_2)
272 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, frontLayerChanged, arg_1, arg_2)
273
274 void mutedChanged(bool arg_1)
275 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, mutedChanged, arg_1)
276 void executingChanged(bool arg_1)
277 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, executingChanged, arg_1)
278
279 void busChanged(bool arg_1) E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, busChanged, arg_1)
280
281 void graphalChanged(bool arg_1)
282 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, graphalChanged, arg_1)
283
284 void nodalCenterChanged(QPointF arg_1)
285 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, nodalCenterChanged, arg_1)
286 void nodalScaleChanged(double arg_1)
287 E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, nodalScaleChanged, arg_1)
288
289 PROPERTY(bool, muted READ muted WRITE setMuted NOTIFY mutedChanged)
290 PROPERTY(bool, graphal READ graphal WRITE setGraphal NOTIFY graphalChanged)
291 PROPERTY(
292 double, heightPercentage READ heightPercentage WRITE setHeightPercentage NOTIFY
293 heightPercentageChanged)
294
295 PROPERTY(
296 bool, timeSignature READ hasTimeSignature WRITE setHasTimeSignature NOTIFY
297 hasTimeSignatureChanged)
298
299 PROPERTY(
300 ossia::musical_sync, quantizationRate READ quantizationRate WRITE
301 setQuantizationRate NOTIFY quantizationRateChanged)
302 W_PROPERTY(IntervalDurations*, durations READ getDurations CONSTANT)
303
304 PROPERTY(double, date READ dateInFlicks NOTIFY dateChanged)
305 PROPERTY(
306 double, startMarker READ startMarkerInFlicks NOTIFY startMarkerChanged)
307
308private:
309 void on_addProcess(Process::ProcessModel&);
310 void on_removingProcess(const Process::ProcessModel&);
311 void initConnections();
312
313 // Model for the full view.
314 // Note : it is also present in m_intervalViewModels.
315 const score::DocumentContext& m_context;
316
317 Rack m_smallView;
318 FullRack m_fullView;
319
320 TimeSignatureMap m_signatures;
321
322 Id<StateModel> m_startState;
323 Id<StateModel> m_endState;
324
325 TimeVal m_startMarker;
326
327 TimeVal m_date;
328 double m_heightPercentage{0.5};
329
330 double m_nodalFullViewSlotHeight{100};
331 double m_quantRate{-1.0};
332
333 ::ZoomRatio m_zoom{-1};
334 TimeVal m_center{};
335 QPointF m_nodalOffset{};
336 std::optional<QPointF> m_nodalCenter{};
337 double m_nodalScale{1.0};
338 IntervalExecutionState m_executionState : 2;
339 ViewMode m_viewMode : 1;
340 bool m_smallViewShown : 1;
341 bool m_muted : 1;
342 bool m_executing : 1;
343
344 bool m_hasSignature : 1;
345 bool m_graphal : 1;
346};
347
348SCORE_PLUGIN_SCENARIO_EXPORT
349bool isInFullView(const Scenario::IntervalModel& cstr) noexcept;
350SCORE_PLUGIN_SCENARIO_EXPORT
351bool isInFullView(const Process::ProcessModel& cstr) noexcept;
352
353SCORE_PLUGIN_SCENARIO_EXPORT
354bool isBus(
355 const Scenario::IntervalModel& model, const score::DocumentContext& ctx) noexcept;
356
359SCORE_PLUGIN_SCENARIO_EXPORT
360QSizeF nodeFootprint(const Process::ProcessModel& process) noexcept;
361
363static const constexpr double nodeHorizontalMargin = 40.;
364
366static const constexpr double nodeVerticalMargin = 20.;
367
371SCORE_PLUGIN_SCENARIO_EXPORT
372QPointF freeProcessPosition(
373 const Scenario::IntervalModel& model, QPointF desired, QSizeF size,
374 bool towardsRight = true, const Process::ProcessModel* ignore = nullptr) noexcept;
375
380SCORE_PLUGIN_SCENARIO_EXPORT
382 const Scenario::IntervalModel& model, QPointF desired, QSizeF size,
383 const Process::ProcessModel* ignore = nullptr) noexcept;
384
385SCORE_PLUGIN_SCENARIO_EXPORT
386QPointF newProcessPosition(const Scenario::IntervalModel& model) noexcept;
387
389SCORE_PLUGIN_SCENARIO_EXPORT
391 const Scenario::IntervalModel& model,
392 const Process::ProcessModel& previous) noexcept;
393
397SCORE_PLUGIN_SCENARIO_EXPORT
399 const Scenario::IntervalModel& model, const Process::ProcessModel& next,
400 const Process::ProcessModel* created = nullptr) noexcept;
401
403{
404 const IntervalModel* parent;
405 const IntervalModel* lastFound;
406 TimeVal delta;
407};
408
409SCORE_PLUGIN_SCENARIO_EXPORT
410IntervalModel* closestParentInterval(const QObject*) noexcept;
411
412SCORE_PLUGIN_SCENARIO_EXPORT
413ParentTimeInfo closestParentWithMusicalMetrics(const IntervalModel*);
414SCORE_PLUGIN_SCENARIO_EXPORT
415ParentTimeInfo closestParentWithTempo(const IntervalModel*);
416SCORE_PLUGIN_SCENARIO_EXPORT
417ParentTimeInfo closestParentWithQuantification(const IntervalModel* self);
418
419SCORE_PLUGIN_SCENARIO_EXPORT
420TimeVal timeDelta(const IntervalModel* child, const IntervalModel* parent);
421}
422
423DEFAULT_MODEL_METADATA(Scenario::IntervalModel, "Interval")
424
425Q_DECLARE_METATYPE(Scenario::IntervalModel::ViewMode)
426W_REGISTER_ARGTYPE(Scenario::IntervalModel::ViewMode)
427Q_DECLARE_METATYPE(QPointer<Scenario::IntervalModel>)
428W_REGISTER_ARGTYPE(QPointer<Scenario::IntervalModel>)
429
430TR_TEXT_METADATA(, Scenario::IntervalModel, PrettyName_k, "Interval")
431
432Q_DECLARE_METATYPE(Scenario::IntervalModel*)
433W_REGISTER_ARGTYPE(Scenario::IntervalModel*)
434Q_DECLARE_METATYPE(const Scenario::IntervalModel*)
435W_REGISTER_ARGTYPE(const Scenario::IntervalModel*)
Definition VisitorInterface.hpp:53
Definition DataStreamVisitor.hpp:202
Definition VisitorInterface.hpp:61
Definition JSONVisitor.hpp:423
Metadata to get the name that will be shown in the user interface.
The Process class.
Definition score-lib-process/Process/Process.hpp:80
Definition IntervalModel.hpp:50
score::EntityMap< Process::ProcessModel, true > processes
Definition IntervalModel.hpp:62
Definition ModelConsistency.hpp:11
The Selectable class.
Definition Selectable.hpp:14
The id_base_t class.
Definition Identifier.hpp:59
Base for complex model objects.
Definition EntityBase.hpp:24
The EntityMap class.
Definition EntityMap.hpp:37
Utilities and base classes for 1D curves.
Definition FocusDispatcher.hpp:12
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Main plug-in of score.
Definition score-plugin-dataflow/Dataflow/PortItem.hpp:13
QPointF newProcessPositionAfter(const IntervalModel &model, const Process::ProcessModel &previous) noexcept
Position for a node created right after previous in the signal chain.
Definition IntervalModel.cpp:1199
QPointF freeProcessPositionBelow(const IntervalModel &model, QPointF desired, QSizeF size, const Process::ProcessModel *ignore) noexcept
Definition IntervalModel.cpp:1155
QSizeF nodeFootprint(const Process::ProcessModel &process) noexcept
Definition IntervalModel.cpp:1109
QPointF newProcessPositionBefore(const IntervalModel &model, const Process::ProcessModel &next, const Process::ProcessModel *created) noexcept
Definition IntervalModel.cpp:1212
QPointF freeProcessPosition(const IntervalModel &model, QPointF desired, QSizeF size, bool towardsRight, const Process::ProcessModel *ignore) noexcept
Definition IntervalModel.cpp:1131
Base toolkit upon which the software is built.
Definition Application.cpp:83
STL namespace.
Definition dataStructures.hpp:40
Definition IntervalModel.hpp:403
Definition Slot.hpp:88
Definition Slot.hpp:56
Definition TimeValue.hpp:21
Definition DocumentContext.hpp:18