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 
31 class DataStream;
32 class JSONObject;
33 namespace Process
34 {
35 class AudioInlet;
36 class AudioOutlet;
37 }
38 namespace Curve
39 {
40 class Model;
41 }
42 namespace Scenario
43 {
44 class StateModel;
45 class TempoProcess;
46 
47 class 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 
57 public:
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;
89  void setStartState(const Id<StateModel>& eventId);
90 
91  const Id<StateModel>& endState() const;
92  void setEndState(const Id<StateModel>& endState);
93 
94  const TimeVal& date() const;
95  void setStartDate(const TimeVal& start);
96  void translate(const TimeVal& deltaTime);
97 
98  double heightPercentage() const;
99 
100  void startExecution();
101  void stopExecution();
102  // Resets the execution display recursively
103  void reset();
104 
105  void setHeightPercentage(double arg);
106  void setExecutionState(IntervalExecutionState);
107 
108  IntervalExecutionState executionState() const;
109 
110  // Mode
111  enum ViewMode : bool
112  {
113  Temporal = 0,
114  Nodal = 1
115  };
116  ViewMode viewMode() const noexcept;
117  void setViewMode(ViewMode v);
118  void viewModeChanged(ViewMode v)
119  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, viewModeChanged, v)
120 
121  // Full view properties:
122  ZoomRatio zoom() const;
123  void setZoom(const ZoomRatio& zoom);
124 
125  TimeVal midTime() const;
126  void setMidTime(const TimeVal& value);
127 
128  void setSmallViewVisible(bool);
129  bool smallViewVisible() const;
130 
131  const Rack& smallView() const noexcept { return m_smallView; }
132  const FullRack& fullView() const noexcept { return m_fullView; }
133 
134  void clearSmallView();
135  void clearFullView();
136  void replaceSmallView(const Rack& other);
137  void replaceFullView(const FullRack& other);
138 
139  // Adding and removing slots and layers is only for the small view
140  void addSlot(Slot s);
141  void addSlot(Slot s, int pos);
142  void removeSlot(int pos);
143 
144  void addLayer(int slot, Id<Process::ProcessModel>);
145  void removeLayer(int slot, Id<Process::ProcessModel>);
146 
147  void putLayerToFront(int slot, Id<Process::ProcessModel>);
148  void putLayerToFront(int slot, std::nullopt_t);
149 
150  void swapSlots(int pos1, int pos2, Slot::RackView fullview);
151 
152  double getSlotHeight(const SlotId& slot) const;
153  void setSlotHeight(const SlotId& slot, double height);
154  double getHeight() const noexcept;
155 
157  double getSlotHeightForProcess(const Id<Process::ProcessModel>& p) const;
158 
159  const Slot* findSmallViewSlot(int slot) const;
160  const Slot& getSmallViewSlot(int slot) const;
161  Slot& getSmallViewSlot(int slot);
162 
163  const FullSlot* findFullViewSlot(int slot) const;
164  const FullSlot& getFullViewSlot(int slot) const;
165  FullSlot& getFullViewSlot(int slot);
166 
167  bool muted() const noexcept { return m_muted; }
168  void setMuted(bool m);
169 
170  bool graphal() const noexcept { return m_graphal; }
171  void setGraphal(bool m);
172 
173  bool executing() const noexcept { return m_executing; }
174  void setExecuting(bool m);
175 
176  // Tempo stuff
177  bool hasTimeSignature() const noexcept { return m_hasSignature; }
178  void setHasTimeSignature(bool b);
179 
180  TimeVal contentDuration() const noexcept;
181 
182  TempoProcess* tempoCurve() const noexcept;
183 
184  void ancestorStartDateChanged();
185  void ancestorTempoChanged();
186 
187  void addSignature(TimeVal t, ossia::time_signature sig);
188  void removeSignature(TimeVal t);
189  void setTimeSignatureMap(const TimeSignatureMap& map);
190  const TimeSignatureMap& timeSignatureMap() const noexcept;
191 
192  ossia::musical_sync quantizationRate() const noexcept;
193  void setQuantizationRate(ossia::musical_sync b);
194 
195  void setStartMarker(TimeVal t);
196  TimeVal startMarker() const noexcept;
197 
198  void hasTimeSignatureChanged(bool arg_1)
199  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, hasTimeSignatureChanged, arg_1)
200  void timeSignaturesChanged(const TimeSignatureMap& arg_1)
201  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, timeSignaturesChanged, arg_1)
202  void quantizationRateChanged(ossia::musical_sync arg)
203  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, quantizationRateChanged, arg)
204 
205  void requestHeightChange(double y)
206  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, requestHeightChange, y)
207  void heightPercentageChanged(double arg_1)
208  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, heightPercentageChanged, arg_1)
209 
210  void dateChanged(const TimeVal& arg_1)
211  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, dateChanged, arg_1)
212  void startMarkerChanged(const TimeVal& arg_1)
213  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, startMarkerChanged, arg_1)
214 
215  void focusChanged(bool arg_1)
216  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, focusChanged, arg_1)
217  void executionStateChanged(Scenario::IntervalExecutionState arg_1)
218  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, executionStateChanged, arg_1)
219 
220  void executionEvent(Scenario::IntervalExecutionEvent ev)
221  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, executionEvent, ev)
222 
223  void smallViewVisibleChanged(bool fv)
224  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, smallViewVisibleChanged, fv)
225 
226  void rackChanged(Scenario::Slot::RackView fv)
227  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, rackChanged, fv)
228  void slotAdded(Scenario::SlotId arg_1)
229  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotAdded, arg_1)
230  void slotRemoved(Scenario::SlotId arg_1)
231  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotRemoved, arg_1)
232  void slotResized(Scenario::SlotId arg_1)
233  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotResized, arg_1)
234  void slotsSwapped(int slot1, int slot2, Slot::RackView fv)
235  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, slotsSwapped, slot1, slot2, fv)
236  void heightFinishedChanging()
237  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, heightFinishedChanging)
238 
239  void layerAdded(Scenario::SlotId arg_1, Id<Process::ProcessModel> arg_2)
240  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, layerAdded, arg_1, arg_2)
241  void layerRemoved(Scenario::SlotId arg_1, Id<Process::ProcessModel> arg_2)
242  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, layerRemoved, arg_1, arg_2)
243  void frontLayerChanged(int arg_1, OptionalId<Process::ProcessModel> arg_2)
244  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, frontLayerChanged, arg_1, arg_2)
245 
246  void mutedChanged(bool arg_1)
247  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, mutedChanged, arg_1)
248  void executingChanged(bool arg_1)
249  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, executingChanged, arg_1)
250 
251  void busChanged(bool arg_1) E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, busChanged, arg_1)
252 
253  void graphalChanged(bool arg_1)
254  E_SIGNAL(SCORE_PLUGIN_SCENARIO_EXPORT, graphalChanged, arg_1)
255 
256  PROPERTY(bool, muted READ muted WRITE setMuted NOTIFY mutedChanged)
257  PROPERTY(bool, graphal READ graphal WRITE setGraphal NOTIFY graphalChanged)
258  PROPERTY(
259  double, heightPercentage READ heightPercentage WRITE setHeightPercentage NOTIFY
260  heightPercentageChanged)
261 
262  PROPERTY(
263  bool, timeSignature READ hasTimeSignature WRITE setHasTimeSignature NOTIFY
264  hasTimeSignatureChanged)
265 
266  PROPERTY(
267  ossia::musical_sync, quantizationRate READ quantizationRate WRITE
268  setQuantizationRate NOTIFY quantizationRateChanged)
269 private:
270  void on_addProcess(Process::ProcessModel&);
271  void on_removingProcess(const Process::ProcessModel&);
272  void initConnections();
273 
274  // Model for the full view.
275  // Note : it is also present in m_intervalViewModels.
276  const score::DocumentContext& m_context;
277 
278  Rack m_smallView;
279  FullRack m_fullView;
280 
281  TimeSignatureMap m_signatures;
282 
283  Id<StateModel> m_startState;
284  Id<StateModel> m_endState;
285 
286  TimeVal m_startMarker;
287 
288  TimeVal m_date;
289  double m_heightPercentage{0.5};
290 
291  double m_nodalFullViewSlotHeight{100};
292  double m_quantRate{-1.0};
293 
294  ZoomRatio m_zoom{-1};
295  TimeVal m_center{};
296  IntervalExecutionState m_executionState : 2;
297  ViewMode m_viewMode : 1;
298  bool m_smallViewShown : 1;
299  bool m_muted : 1;
300  bool m_executing : 1;
301 
302  bool m_hasSignature : 1;
303  bool m_graphal : 1;
304 };
305 
306 SCORE_PLUGIN_SCENARIO_EXPORT
307 bool isInFullView(const Scenario::IntervalModel& cstr) noexcept;
308 SCORE_PLUGIN_SCENARIO_EXPORT
309 bool isInFullView(const Process::ProcessModel& cstr) noexcept;
310 
311 SCORE_PLUGIN_SCENARIO_EXPORT
312 bool isBus(
313  const Scenario::IntervalModel& model, const score::DocumentContext& ctx) noexcept;
314 
315 SCORE_PLUGIN_SCENARIO_EXPORT
316 QPointF newProcessPosition(const Scenario::IntervalModel& model) noexcept;
317 
319 {
320  const IntervalModel* parent;
321  const IntervalModel* lastFound;
322  TimeVal delta;
323 };
324 
325 SCORE_PLUGIN_SCENARIO_EXPORT
326 IntervalModel* closestParentInterval(const QObject*) noexcept;
327 
328 SCORE_PLUGIN_SCENARIO_EXPORT
329 ParentTimeInfo closestParentWithMusicalMetrics(const IntervalModel*);
330 SCORE_PLUGIN_SCENARIO_EXPORT
331 ParentTimeInfo closestParentWithTempo(const IntervalModel*);
332 SCORE_PLUGIN_SCENARIO_EXPORT
333 ParentTimeInfo closestParentWithQuantification(const IntervalModel* self);
334 
335 SCORE_PLUGIN_SCENARIO_EXPORT
336 TimeVal timeDelta(const IntervalModel* child, const IntervalModel* parent);
337 }
338 
339 DEFAULT_MODEL_METADATA(Scenario::IntervalModel, "Interval")
340 
341 Q_DECLARE_METATYPE(Scenario::IntervalModel::ViewMode)
342 W_REGISTER_ARGTYPE(Scenario::IntervalModel::ViewMode)
343 Q_DECLARE_METATYPE(QPointer<Scenario::IntervalModel>)
344 W_REGISTER_ARGTYPE(QPointer<Scenario::IntervalModel>)
345 
346 TR_TEXT_METADATA(, Scenario::IntervalModel, PrettyName_k, "Interval")
347 
348 Q_DECLARE_METATYPE(Scenario::IntervalModel*)
349 W_REGISTER_ARGTYPE(Scenario::IntervalModel*)
350 Q_DECLARE_METATYPE(const Scenario::IntervalModel*)
351 W_REGISTER_ARGTYPE(const Scenario::IntervalModel*)
Definition: QmlObjects.hpp:285
Definition: QmlObjects.hpp:312
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.
Definition: lib/score/tools/Metadata.hpp:42
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
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:57
Base for complex model objects.
Definition: EntityBase.hpp:24
Utilities and base classes for 1D curves.
Definition: FocusDispatcher.hpp:12
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
Main plug-in of score.
Definition: score-plugin-dataflow/Dataflow/PortItem.hpp:14
Base toolkit upon which the software is built.
Definition: Application.cpp:90
Definition: dataStructures.hpp:40
Definition: IntervalModel.hpp:319
Definition: Slot.hpp:54
Definition: TimeValue.hpp:21
Definition: DocumentContext.hpp:18