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)
38 dsp::FileAudioSourceRegistry &file_audio_source_registry_;
39 dsp::PortRegistry &port_registry_;
41 structure::arrangement::ArrangerObjectRegistry &object_registry_;
44 AutomationTrackHolder (
Dependencies dependencies, QObject * parent =
nullptr)
45 : QObject (parent), dependencies_ (dependencies)
49 Dependencies dependencies,
51 QObject * parent =
nullptr)
54 automation_track_ = std::move (at);
55 automation_track_->setParent (
this);
62 double height ()
const {
return height_; }
63 void setHeight (
double height)
66 std::max (height,
static_cast<double> (MIN_AUTOMATION_TRACK_HEIGHT));
67 if (qFuzzyCompare (height, height_))
71 Q_EMIT heightChanged (height);
73 Q_SIGNAL
void heightChanged (
double height);
75 bool visible ()
const {
return visible_; }
76 void setVisible (
bool visible)
79 if (visible == visible_)
83 Q_EMIT visibleChanged (visible);
85 Q_SIGNAL
void visibleChanged (
bool visible);
88 void setCreatedByUser (
bool created)
94 Q_EMIT createdByUserChanged (created);
96 Q_SIGNAL
void createdByUserChanged (
bool created);
98 AutomationTrack * automationTrack ()
const
100 return automation_track_.get ();
113 Dependencies dependencies_;
125 double height_{ DEFAULT_AUTOMATION_TRACK_HEIGHT };
128 static constexpr auto kAutomationTrackKey =
"automationTrack"sv;
129 static constexpr auto kCreatedByUserKey =
"createdByUser"sv;
130 static constexpr auto kVisible =
"visible"sv;
131 static constexpr auto kHeightKey =
"height"sv;
132 friend void to_json (nlohmann::json &j,
const AutomationTrackHolder &nfo);
133 friend void from_json (
const nlohmann::json &j, AutomationTrackHolder &nfo);
139class AutomationTracklist :
public QAbstractListModel
144 bool automationVisible READ automationVisible WRITE setAutomationVisible
145 NOTIFY automationVisibleChanged)
148 using ArrangerObjectRegistry = arrangement::ArrangerObjectRegistry;
151 AutomationTracklist (
153 QObject * parent =
nullptr);
158 AutomationTrackHolderRole = Qt::UserRole + 1,
165 QHash<int, QByteArray> roleNames ()
const override;
166 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
168 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
171 showNextAvailableAutomationTrack (
AutomationTrack * current_automation_track);
175 bool automationVisible ()
const {
return automation_visible_; }
176 void setAutomationVisible (
bool visible);
177 Q_SIGNAL
void automationVisibleChanged (
bool visible);
181 friend void init_from (
182 AutomationTracklist &obj,
183 const AutomationTracklist &other,
197 return automation_tracks_.at (index)->automationTrack ();
209 int get_visible_automation_track_count_between (
233 const double automation_track_height,
234 const float normalized_val)
236 return static_cast<int> (
237 automation_track_height - (normalized_val * automation_track_height));
266 auto &automation_track_holders ()
const {
return automation_tracks_; }
268 auto automation_tracks ()
const
270 return std::views::transform (
271 automation_track_holders (),
272 [] (
const auto &th) {
return th->automationTrack (); });
276 get_previous_visible_automation_track (
const AutomationTrack &at)
const;
279 get_next_visible_automation_track (
const AutomationTrack &at)
const;
282 static constexpr auto kAutomationTracksKey =
"automationTracks"sv;
283 static constexpr auto kAutomationVisibleKey =
"automationVisible"sv;
284 friend void to_json (nlohmann::json &j,
const AutomationTracklist &ats);
285 friend void from_json (
const nlohmann::json &j, AutomationTracklist &ats);
287 auto &get_port_registry () {
return dependencies_.port_registry_; }
288 auto &get_port_registry ()
const {
return dependencies_.port_registry_; }
290 auto &automation_track_holders () {
return automation_tracks_; }
291 auto get_iterator_for_automation_track (
const AutomationTrack &at)
const
293 auto it = std::ranges::find (
294 automation_track_holders (), &at,
295 [&] (
const auto &ath) {
return ath->automationTrack (); });
296 if (it == automation_track_holders ().end ())
298 throw std::runtime_error (
"Automation track not found");
302 auto get_iterator_for_automation_track (
const AutomationTrack &at)
304 auto it = std::ranges::find (
305 automation_track_holders (), &at,
306 [&] (
const auto &ath) {
return ath->automationTrack (); });
307 if (it == automation_track_holders ().end ())
309 throw std::runtime_error (
"Automation track not found");
313 int get_automation_track_index (
const AutomationTrack &at)
const
315 return static_cast<int> (std::distance (
316 automation_track_holders ().begin (),
317 get_iterator_for_automation_track (at)));
321 AutomationTrackHolder::Dependencies dependencies_;
336 std::vector<utils::QObjectUniquePtr<AutomationTrackHolder>> automation_tracks_;
339 bool automation_visible_{};
341 BOOST_DESCRIBE_CLASS (
346 (automation_tracks_, automation_visible_))