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)
26 Q_PROPERTY (
AutomationTrack * automationTrack READ automationTrack CONSTANT)
33 dsp::FileAudioSourceRegistry &file_audio_source_registry_;
34 dsp::PortRegistry &port_registry_;
36 structure::arrangement::ArrangerObjectRegistry &object_registry_;
39 AutomationTrackHolder (
Dependencies dependencies, QObject * parent =
nullptr)
40 : QObject (parent), dependencies_ (dependencies)
44 Dependencies dependencies,
46 QObject * parent =
nullptr)
49 automation_track_ = std::move (at);
50 automation_track_->setParent (
this);
57 double height ()
const {
return height_; }
58 void setHeight (
double height)
61 std::max (height,
static_cast<double> (MIN_AUTOMATION_TRACK_HEIGHT));
62 if (qFuzzyCompare (height, height_))
66 Q_EMIT heightChanged (height);
68 Q_SIGNAL
void heightChanged (
double height);
70 bool visible ()
const {
return visible_; }
71 void setVisible (
bool visible)
74 if (visible == visible_)
78 Q_EMIT visibleChanged (visible);
80 Q_SIGNAL
void visibleChanged (
bool visible);
82 AutomationTrack * automationTrack ()
const
84 return automation_track_.get ();
97 Dependencies dependencies_;
109 double height_{ DEFAULT_AUTOMATION_TRACK_HEIGHT };
112 static constexpr auto kAutomationTrackKey =
"automationTrack"sv;
113 static constexpr auto kCreatedByUserKey =
"createdByUser"sv;
114 static constexpr auto kVisible =
"visible"sv;
115 static constexpr auto kHeightKey =
"height"sv;
116 friend void to_json (nlohmann::json &j,
const AutomationTrackHolder &nfo)
118 j[kAutomationTrackKey] = nfo.automation_track_;
119 j[kCreatedByUserKey] = nfo.created_by_user_;
120 j[kVisible] = nfo.visible_;
121 j[kHeightKey] = nfo.height_;
123 friend void from_json (
const nlohmann::json &j, AutomationTrackHolder &nfo);
129class AutomationTracklist :
public QAbstractListModel
134 bool automationVisible READ automationVisible WRITE setAutomationVisible
135 NOTIFY automationVisibleChanged)
138 using ArrangerObjectRegistry = arrangement::ArrangerObjectRegistry;
141 AutomationTracklist (
143 QObject * parent =
nullptr);
148 AutomationTrackHolderRole = Qt::UserRole + 1,
155 QHash<int, QByteArray> roleNames ()
const override;
156 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
158 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
161 showNextAvailableAutomationTrack (
AutomationTrack * current_automation_track);
165 bool automationVisible ()
const {
return automation_visible_; }
166 void setAutomationVisible (
bool visible);
167 Q_SIGNAL
void automationVisibleChanged (
bool visible);
171 friend void init_from (
172 AutomationTracklist &obj,
173 const AutomationTracklist &other,
187 return automation_tracks_.at (index)->automationTrack ();
199 int get_visible_automation_track_count_between (
223 const double automation_track_height,
224 const float normalized_val)
226 return static_cast<int> (
227 automation_track_height - (normalized_val * automation_track_height));
256 auto &automation_track_holders ()
const {
return automation_tracks_; }
258 auto automation_tracks ()
const
260 return std::views::transform (
261 automation_track_holders (),
262 [] (
const auto &th) {
return th->automationTrack (); });
266 get_previous_visible_automation_track (
const AutomationTrack &at)
const;
269 get_next_visible_automation_track (
const AutomationTrack &at)
const;
272 static constexpr auto kAutomationTracksKey =
"automationTracks"sv;
273 static constexpr auto kAutomationVisibleKey =
"automationVisible"sv;
274 friend void to_json (nlohmann::json &j,
const AutomationTracklist &ats)
276 j[kAutomationTracksKey] = ats.automation_tracks_;
277 j[kAutomationVisibleKey] = ats.automation_visible_;
279 friend void from_json (
const nlohmann::json &j, AutomationTracklist &ats);
281 auto &get_port_registry () {
return dependencies_.port_registry_; }
282 auto &get_port_registry ()
const {
return dependencies_.port_registry_; }
284 auto &automation_track_holders () {
return automation_tracks_; }
285 auto get_iterator_for_automation_track (
const AutomationTrack &at)
const
287 auto it = std::ranges::find (
288 automation_track_holders (), &at,
289 [&] (
const auto &ath) {
return ath->automationTrack (); });
290 if (it == automation_track_holders ().end ())
292 throw std::runtime_error (
"Automation track not found");
296 auto get_iterator_for_automation_track (
const AutomationTrack &at)
298 auto it = std::ranges::find (
299 automation_track_holders (), &at,
300 [&] (
const auto &ath) {
return ath->automationTrack (); });
301 if (it == automation_track_holders ().end ())
303 throw std::runtime_error (
"Automation track not found");
307 int get_automation_track_index (
const AutomationTrack &at)
const
309 return static_cast<int> (std::distance (
310 automation_track_holders ().begin (),
311 get_iterator_for_automation_track (at)));
315 AutomationTrackHolder::Dependencies dependencies_;
330 std::vector<utils::QObjectUniquePtr<AutomationTrackHolder>> automation_tracks_;
333 bool automation_visible_{};
335 BOOST_DESCRIBE_CLASS (
340 (automation_tracks_, automation_visible_))