Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
automation_clip_canvas_item.h
1// SPDX-FileCopyrightText: © 2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <optional>
7#include <unordered_set>
8#include <utility>
9#include <vector>
10
11#include "gui/qquick/clip_canvas_item_base.h"
12#include "structure/arrangement/automation_clip.h"
13
14#include <QColor>
15#include <QItemSelectionModel>
16#include <QPointer>
17
18namespace zrythm::gui::qquick
19{
20
22
23class AutomationClipCanvasItem : public ClipCanvasItemBase
24{
25 Q_OBJECT
26 QML_NAMED_ELEMENT (AutomationClipCanvas)
27
28 Q_PROPERTY (
30 automationClip WRITE setAutomationClip NOTIFY automationClipChanged)
31 Q_PROPERTY (
32 QColor curveColor READ curveColor WRITE setCurveColor NOTIFY
33 curveColorChanged)
34 Q_PROPERTY (
35 QItemSelectionModel * selectionModel READ selectionModel WRITE
36 setSelectionModel NOTIFY selectionModelChanged)
37 Q_PROPERTY (
38 bool dragActive READ dragActive WRITE setDragActive NOTIFY dragActiveChanged)
39 Q_PROPERTY (
40 qreal dragDeltaPx READ dragDeltaPx WRITE setDragDeltaPx NOTIFY
41 dragDeltaPxChanged)
42 Q_PROPERTY (
43 qreal dragDeltaY READ dragDeltaY WRITE setDragDeltaY NOTIFY dragDeltaYChanged)
44 Q_PROPERTY (
45 bool drawPoints READ drawPoints WRITE setDrawPoints NOTIFY drawPointsChanged)
46 Q_PROPERTY (
47 bool applyLoops READ applyLoops WRITE setApplyLoops NOTIFY applyLoopsChanged)
48 Q_PROPERTY (
49 qreal hoveredX READ hoveredX WRITE setHoveredX NOTIFY hoveredXChanged)
50 Q_PROPERTY (qreal contentWidth READ contentWidth NOTIFY contentWidthChanged)
51 Q_PROPERTY (
52 qreal contentLeftMargin READ contentLeftMargin NOTIFY
53 contentLeftMarginChanged)
54public:
55 explicit AutomationClipCanvasItem (QQuickItem * parent = nullptr);
56
57 QCanvasPainterItemRenderer * createItemRenderer () const override;
58
59 structure::arrangement::AutomationClip * automationClip () const
60 {
61 return automation_clip_;
62 }
63 void setAutomationClip (structure::arrangement::AutomationClip * clip);
64
65 QColor curveColor () const { return curve_color_; }
66 void setCurveColor (const QColor &color);
67
68 QItemSelectionModel * selectionModel () const { return selection_model_; }
69 void setSelectionModel (QItemSelectionModel * model);
70
71 bool dragActive () const { return drag_active_; }
72 void setDragActive (bool active);
73 qreal dragDeltaPx () const { return drag_delta_px_; }
74 void setDragDeltaPx (qreal px);
75 qreal dragDeltaY () const { return drag_delta_y_; }
76 void setDragDeltaY (qreal dy);
77
80 bool drawPoints () const { return draw_points_; }
81 void setDrawPoints (bool draw);
82
88 bool applyLoops () const { return apply_loops_; }
89 void setApplyLoops (bool apply);
90
95 qreal hoveredX () const { return hovered_x_; }
96 void setHoveredX (qreal x);
97
102 qreal contentWidth () const;
103
107 qreal contentLeftMargin () const;
108
112 std::unordered_set<structure::arrangement::ArrangerObject::Uuid>
113 draggedUuids () const;
114
124 segmentHitTest (qreal x, qreal y, qreal tolerance) const;
125
126Q_SIGNALS:
127 void automationClipChanged ();
128 void curveColorChanged ();
129 void selectionModelChanged ();
130 void dragActiveChanged ();
131 void dragDeltaPxChanged ();
132 void dragDeltaYChanged ();
133 void drawPointsChanged ();
134 void applyLoopsChanged ();
135 void hoveredXChanged ();
136 void contentWidthChanged ();
137 void contentLeftMarginChanged ();
138
139private:
144 std::pair<double, double> computeEffectiveBounds () const;
145
149 void invalidateBounds ();
150
151private:
152 QPointer<structure::arrangement::AutomationClip> automation_clip_;
153 QColor curve_color_;
154 QPointer<QItemSelectionModel> selection_model_;
155 bool drag_active_ = false;
156 qreal drag_delta_px_ = 0.0;
157 qreal drag_delta_y_ = 0.0;
158 bool draw_points_ = false;
159 bool apply_loops_ = true;
161 qreal hovered_x_ = -1.0;
162 std::vector<QMetaObject::Connection> clip_connections_;
163 mutable std::optional<std::pair<double, double>> cached_bounds_;
164};
165
166} // namespace zrythm::gui::qquick
Q_INVOKABLE structure::arrangement::AutomationPoint * segmentHitTest(qreal x, qreal y, qreal tolerance) const
Hit-tests the curve for a curviness drag.
bool drawPoints() const
When true, small circles are drawn at each automation point.
std::unordered_set< structure::arrangement::ArrangerObject::Uuid > draggedUuids() const
Returns the set of UUIDs of currently selected (dragged) automation points.
qreal hoveredX() const
Canvas-local X of the cursor while it is over a draggable curve segment, or -1 when it is not.
qreal contentLeftMargin() const
How far left of the clip start (source 0) the canvas must extend, in pixels, so that points before th...
qreal contentWidth() const
The total width needed for the curve canvas to show every point on both sides of the clip: spans from...
bool applyLoops() const
When true (default), the renderer applies the clip's loop unwrapping (timeline clip preview).
Represents an automation clip, which contains a collection of automation points.
An automation point inside an AutomationTrack.