12class TrackLaneList :
public QAbstractListModel
16 bool lanesVisible READ lanesVisible WRITE setLanesVisible NOTIFY
24 TrackLanePtrRole = Qt::UserRole + 1,
30 structure::arrangement::ArrangerObjectRegistry &obj_registry,
31 dsp::FileAudioSourceRegistry &file_audio_source_registry,
32 QObject * parent =
nullptr);
33 ~TrackLaneList ()
override;
34 Z_DISABLE_COPY_MOVE (TrackLaneList)
39 QHash<int, QByteArray> roleNames ()
const override;
40 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
42 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
44 Q_INVOKABLE
TrackLane * getFirstLane ()
const
46 return lanes_.front ().get ();
49 bool lanesVisible ()
const {
return lanes_visible_; }
50 void setLanesVisible (
bool visible)
52 if (lanes_visible_ == visible)
55 lanes_visible_ = visible;
56 Q_EMIT lanesVisibleChanged (visible);
58 Q_SIGNAL
void lanesVisibleChanged (
bool visible);
64 Q_INVOKABLE
TrackLane * insertLane (
size_t index);
65 Q_INVOKABLE
void removeLane (
size_t index);
67 Q_INVOKABLE
void moveLane (
size_t from_index,
size_t to_index);
74 friend void init_from (
79 [[nodiscard]]
size_t size () const noexcept {
return lanes_.size (); }
81 [[nodiscard]]
bool empty () const noexcept {
return lanes_.empty (); }
83 TrackLane * at (
size_t idx)
const {
return lanes_.at (idx).get (); }
86 void reserve (
size_t size) { lanes_.reserve (size); }
88 void push_back (utils::QObjectUniquePtr<TrackLane> &&lane)
90 const int idx =
static_cast<int> (lanes_.size ());
91 beginInsertRows (QModelIndex (), idx, idx);
92 lane->setParent (
this);
93 lanes_.emplace_back (std::move (lane));
103 const int idx =
static_cast<int> (lanes_.size () - 1);
104 beginRemoveRows (QModelIndex (), idx, idx);
105 auto lane = std::move (lanes_.back ());
118 QModelIndex (), 0,
static_cast<int> (lanes_.size () - 1));
124 auto &lanes ()
const {
return lanes_; }
126 auto lanes_view ()
const
129 | std::views::transform (&utils::QObjectUniquePtr<TrackLane>::get);
140 return std::ranges::fold_left (
141 lanes_view () | std::views::transform (&TrackLane::height), 0,
156 static constexpr auto kLanesKey =
"lanes"sv;
157 static constexpr std::string_view kLanesVisibleKey =
"lanesVisible";
158 friend void to_json (nlohmann::json &j,
const TrackLaneList &p)
160 j[kLanesKey] = p.lanes_;
161 j[kLanesVisibleKey] = p.lanes_visible_;
163 friend void from_json (
const nlohmann::json &j,
TrackLaneList &p)
166 for (
const auto &lane_json : j.at (kLanesKey))
168 p.lanes_.emplace_back (
169 utils::make_qobject_unique<TrackLane> (p.dependencies_, &p));
170 lane_json.get_to (*p.lanes_.back ());
172 j.at (kLanesVisibleKey).get_to (p.lanes_visible_);
175 void erase (
size_t pos);
177 void update_default_lane_names ();
180 TrackLane::TrackLaneDependencies dependencies_;
181 std::vector<utils::QObjectUniquePtr<TrackLane>> lanes_;
184 bool lanes_visible_ =
false;
186 BOOST_DESCRIBE_CLASS (TrackLaneList, (), (), (), (lanes_, lanes_visible_))