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);
117 friend void from_json (
const nlohmann::json &j, AutomationTrackHolder &nfo);
123class AutomationTracklist :
public QAbstractListModel
128 bool automationVisible READ automationVisible WRITE setAutomationVisible
129 NOTIFY automationVisibleChanged)
132 using ArrangerObjectRegistry = arrangement::ArrangerObjectRegistry;
135 AutomationTracklist (
137 QObject * parent =
nullptr);
142 AutomationTrackHolderRole = Qt::UserRole + 1,
149 QHash<int, QByteArray> roleNames ()
const override;
150 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
152 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
155 showNextAvailableAutomationTrack (
AutomationTrack * current_automation_track);
159 bool automationVisible ()
const {
return automation_visible_; }
160 void setAutomationVisible (
bool visible);
161 Q_SIGNAL
void automationVisibleChanged (
bool visible);
165 friend void init_from (
166 AutomationTracklist &obj,
167 const AutomationTracklist &other,
181 return automation_tracks_.at (index)->automationTrack ();
193 int get_visible_automation_track_count_between (
217 const double automation_track_height,
218 const float normalized_val)
220 return static_cast<int> (
221 automation_track_height - (normalized_val * automation_track_height));
250 auto &automation_track_holders ()
const {
return automation_tracks_; }
252 auto automation_tracks ()
const
254 return std::views::transform (
255 automation_track_holders (),
256 [] (
const auto &th) {
return th->automationTrack (); });
260 get_previous_visible_automation_track (
const AutomationTrack &at)
const;
263 get_next_visible_automation_track (
const AutomationTrack &at)
const;
266 static constexpr auto kAutomationTracksKey =
"automationTracks"sv;
267 static constexpr auto kAutomationVisibleKey =
"automationVisible"sv;
268 friend void to_json (nlohmann::json &j,
const AutomationTracklist &ats);
269 friend void from_json (
const nlohmann::json &j, AutomationTracklist &ats);
271 auto &get_port_registry () {
return dependencies_.port_registry_; }
272 auto &get_port_registry ()
const {
return dependencies_.port_registry_; }
274 auto &automation_track_holders () {
return automation_tracks_; }
275 auto get_iterator_for_automation_track (
const AutomationTrack &at)
const
277 auto it = std::ranges::find (
278 automation_track_holders (), &at,
279 [&] (
const auto &ath) {
return ath->automationTrack (); });
280 if (it == automation_track_holders ().end ())
282 throw std::runtime_error (
"Automation track not found");
286 auto get_iterator_for_automation_track (
const AutomationTrack &at)
288 auto it = std::ranges::find (
289 automation_track_holders (), &at,
290 [&] (
const auto &ath) {
return ath->automationTrack (); });
291 if (it == automation_track_holders ().end ())
293 throw std::runtime_error (
"Automation track not found");
297 int get_automation_track_index (
const AutomationTrack &at)
const
299 return static_cast<int> (std::distance (
300 automation_track_holders ().begin (),
301 get_iterator_for_automation_track (at)));
305 AutomationTrackHolder::Dependencies dependencies_;
320 std::vector<utils::QObjectUniquePtr<AutomationTrackHolder>> automation_tracks_;
323 bool automation_visible_{};
325 BOOST_DESCRIBE_CLASS (
330 (automation_tracks_, automation_visible_))