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)
41 AutomationTrackHolder (
Dependencies dependencies, QObject * parent =
nullptr)
42 : QObject (parent), dependencies_ (dependencies)
46 Dependencies dependencies,
48 QObject * parent =
nullptr)
51 automation_track_ = std::move (at);
52 automation_track_->setParent (
this);
59 double height ()
const {
return height_; }
60 void setHeight (
double height)
63 std::max (height,
static_cast<double> (MIN_AUTOMATION_TRACK_HEIGHT));
64 if (qFuzzyCompare (height, height_))
68 Q_EMIT heightChanged (height);
70 Q_SIGNAL
void heightChanged (
double height);
72 bool visible ()
const {
return visible_; }
73 void setVisible (
bool visible)
76 if (visible == visible_)
80 Q_EMIT visibleChanged (visible);
82 Q_SIGNAL
void visibleChanged (
bool visible);
85 void setCreatedByUser (
bool created)
91 Q_EMIT createdByUserChanged (created);
93 Q_SIGNAL
void createdByUserChanged (
bool created);
95 AutomationTrack * automationTrack ()
const
97 return automation_track_.get ();
110 Dependencies dependencies_;
122 double height_{ DEFAULT_AUTOMATION_TRACK_HEIGHT };
125 static constexpr auto kAutomationTrackKey =
"automationTrack"sv;
126 static constexpr auto kCreatedByUserKey =
"createdByUser"sv;
127 static constexpr auto kVisible =
"visible"sv;
128 static constexpr auto kHeightKey =
"height"sv;
129 friend void to_json (nlohmann::json &j,
const AutomationTrackHolder &nfo);
130 friend void from_json (
const nlohmann::json &j, AutomationTrackHolder &nfo);
136class AutomationTracklist :
public QAbstractListModel
141 bool automationVisible READ automationVisible WRITE setAutomationVisible
142 NOTIFY automationVisibleChanged)
146 AutomationTracklist (
148 QObject * parent =
nullptr);
153 AutomationTrackHolderRole = Qt::UserRole + 1,
160 QHash<int, QByteArray> roleNames ()
const override;
161 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
163 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
166 showNextAvailableAutomationTrack (
AutomationTrack * current_automation_track);
170 bool automationVisible ()
const {
return automation_visible_; }
171 void setAutomationVisible (
bool visible);
172 Q_SIGNAL
void automationVisibleChanged (
bool visible);
176 friend void init_from (
177 AutomationTracklist &obj,
178 const AutomationTracklist &other,
192 return automation_tracks_.at (index)->automationTrack ();
204 int get_visible_automation_track_count_between (
228 const double automation_track_height,
229 const float normalized_val)
231 return static_cast<int> (
232 automation_track_height - (normalized_val * automation_track_height));
261 auto &automation_track_holders ()
const {
return automation_tracks_; }
263 auto automation_tracks ()
const
265 return std::views::transform (
266 automation_track_holders (),
267 [] (
const auto &th) {
return th->automationTrack (); });
271 get_previous_visible_automation_track (
const AutomationTrack &at)
const;
274 get_next_visible_automation_track (
const AutomationTrack &at)
const;
277 static constexpr auto kAutomationTracksKey =
"automationTracks"sv;
278 static constexpr auto kAutomationVisibleKey =
"automationVisible"sv;
279 friend void to_json (nlohmann::json &j,
const AutomationTracklist &ats);
280 friend void from_json (
const nlohmann::json &j, AutomationTracklist &ats);
282 auto &automation_track_holders () {
return automation_tracks_; }
283 auto get_iterator_for_automation_track (
const AutomationTrack &at)
const
285 auto it = std::ranges::find (
286 automation_track_holders (), &at,
287 [&] (
const auto &ath) {
return ath->automationTrack (); });
288 if (it == automation_track_holders ().end ())
290 throw std::runtime_error (
"Automation track not found");
294 auto get_iterator_for_automation_track (
const AutomationTrack &at)
296 auto it = std::ranges::find (
297 automation_track_holders (), &at,
298 [&] (
const auto &ath) {
return ath->automationTrack (); });
299 if (it == automation_track_holders ().end ())
301 throw std::runtime_error (
"Automation track not found");
305 int get_automation_track_index (
const AutomationTrack &at)
const
307 return static_cast<int> (std::distance (
308 automation_track_holders ().begin (),
309 get_iterator_for_automation_track (at)));
313 AutomationTrackHolder::Dependencies dependencies_;
328 std::vector<utils::QObjectUniquePtr<AutomationTrackHolder>> automation_tracks_;
331 bool automation_visible_{};
333 BOOST_DESCRIBE_CLASS (
338 (automation_tracks_, automation_visible_))