20class AutomationTrackHolder :
public QObject
24 Q_PROPERTY (
double height READ height WRITE setHeight NOTIFY heightChanged)
25 Q_PROPERTY (
bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
27 bool createdByUser READ createdByUser WRITE setCreatedByUser NOTIFY
31 automationTrack CONSTANT)
39 dsp::TimebaseProvider * timebase_provider_ =
nullptr;
42 AutomationTrackHolder (
Dependencies dependencies, QObject * parent =
nullptr)
43 : QObject (parent), dependencies_ (dependencies)
47 Dependencies dependencies,
49 QObject * parent =
nullptr)
52 automation_track_ = std::move (at);
53 automation_track_->setParent (
this);
60 double height ()
const {
return height_; }
61 void setHeight (
double height)
64 std::max (height,
static_cast<double> (MIN_AUTOMATION_TRACK_HEIGHT));
65 if (qFuzzyCompare (height, height_))
69 Q_EMIT heightChanged (height);
71 Q_SIGNAL
void heightChanged (
double height);
73 bool visible ()
const {
return visible_; }
74 void setVisible (
bool visible)
77 if (visible == visible_)
81 Q_EMIT visibleChanged (visible);
83 Q_SIGNAL
void visibleChanged (
bool visible);
86 void setCreatedByUser (
bool created)
92 Q_EMIT createdByUserChanged (created);
94 Q_SIGNAL
void createdByUserChanged (
bool created);
96 AutomationTrack * automationTrack ()
const
98 return automation_track_.get ();
111 Dependencies dependencies_;
123 double height_{ DEFAULT_AUTOMATION_TRACK_HEIGHT };
126 static constexpr auto kAutomationTrackKey =
"automationTrack"sv;
127 static constexpr auto kCreatedByUserKey =
"createdByUser"sv;
128 static constexpr auto kVisible =
"visible"sv;
129 static constexpr auto kHeightKey =
"height"sv;
130 friend void to_json (nlohmann::json &j,
const AutomationTrackHolder &nfo);
131 friend void from_json (
const nlohmann::json &j, AutomationTrackHolder &nfo);
137class AutomationTracklist :
public QAbstractListModel
142 bool automationVisible READ automationVisible WRITE setAutomationVisible
143 NOTIFY automationVisibleChanged)
147 AutomationTracklist (
149 QObject * parent =
nullptr);
154 AutomationTrackHolderRole = Qt::UserRole + 1,
161 QHash<int, QByteArray> roleNames ()
const override;
162 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
164 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
167 showNextAvailableAutomationTrack (
AutomationTrack * current_automation_track);
171 bool automationVisible ()
const {
return automation_visible_; }
172 void setAutomationVisible (
bool visible);
173 Q_SIGNAL
void automationVisibleChanged (
bool visible);
177 friend void init_from (
178 AutomationTracklist &obj,
179 const AutomationTracklist &other,
193 return automation_tracks_.at (index)->automationTrack ();
205 int get_visible_automation_track_count_between (
229 const double automation_track_height,
230 const float normalized_val)
232 return static_cast<int> (
233 automation_track_height - (normalized_val * automation_track_height));
262 auto &automation_track_holders ()
const {
return automation_tracks_; }
264 auto automation_tracks ()
const
266 return std::views::transform (
267 automation_track_holders (),
268 [] (
const auto &th) {
return th->automationTrack (); });
272 get_previous_visible_automation_track (
const AutomationTrack &at)
const;
275 get_next_visible_automation_track (
const AutomationTrack &at)
const;
278 static constexpr auto kAutomationTracksKey =
"automationTracks"sv;
279 static constexpr auto kAutomationVisibleKey =
"automationVisible"sv;
280 friend void to_json (nlohmann::json &j,
const AutomationTracklist &ats);
281 friend void from_json (
const nlohmann::json &j, AutomationTracklist &ats);
283 auto &automation_track_holders () {
return automation_tracks_; }
284 auto get_iterator_for_automation_track (
const AutomationTrack &at)
const
286 auto it = std::ranges::find (
287 automation_track_holders (), &at,
288 [&] (
const auto &ath) {
return ath->automationTrack (); });
289 if (it == automation_track_holders ().end ())
291 throw std::runtime_error (
"Automation track not found");
295 auto get_iterator_for_automation_track (
const AutomationTrack &at)
297 auto it = std::ranges::find (
298 automation_track_holders (), &at,
299 [&] (
const auto &ath) {
return ath->automationTrack (); });
300 if (it == automation_track_holders ().end ())
302 throw std::runtime_error (
"Automation track not found");
306 int get_automation_track_index (
const AutomationTrack &at)
const
308 return static_cast<int> (std::distance (
309 automation_track_holders ().begin (),
310 get_iterator_for_automation_track (at)));
314 AutomationTrackHolder::Dependencies dependencies_;
329 std::vector<utils::QObjectUniquePtr<AutomationTrackHolder>> automation_tracks_;
332 bool automation_visible_{};
334 BOOST_DESCRIBE_CLASS (
339 (automation_tracks_, automation_visible_))