8#include "structure/tracks/track_span.h"
10#include <QtQmlIntegration/qqmlintegration.h>
12namespace zrythm::structure::tracks
22class TrackCollection :
public QAbstractListModel
26 int numSoloedTracks READ numSoloedTracks NOTIFY numSoloedTracksChanged)
28 int numMutedTracks READ numMutedTracks NOTIFY numMutedTracksChanged)
30 int numListenedTracks READ numListenedTracks NOTIFY numListenedTracksChanged)
37 TrackPtrRole = Qt::UserRole + 1,
53 TrackRegistry &track_registry,
54 QObject * parent =
nullptr)
noexcept;
55 ~TrackCollection ()
noexcept override;
56 Z_DISABLE_COPY_MOVE (TrackCollection)
62 QHash<int, QByteArray> roleNames ()
const override;
63 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
65 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
67 Q_INVOKABLE
void setTrackExpanded (
const Track * track,
bool expanded);
69 int numSoloedTracks ()
const;
70 Q_SIGNAL
void numSoloedTracksChanged ();
71 int numMutedTracks ()
const;
72 Q_SIGNAL
void numMutedTracksChanged ();
73 int numListenedTracks ()
const;
74 Q_SIGNAL
void numListenedTracksChanged ();
103 return std::distance (
105 std::ranges::find (tracks_, track_id, &TrackUuidReference::id));
108 TrackUuidReference track_ref_at_id (
const Track::Uuid &track_id)
const
116 auto track_count ()
const {
return tracks_.size (); }
126 void add_track (
const TrackUuidReference &track_id);
131 void insert_track (
const TrackUuidReference &track_id,
int pos);
155 void reattach_track (
const TrackUuidReference &track_id,
int pos);
165 template <
typename Container>
167 { c.contains (uuid) } -> std::convertible_to<bool>;
172 for (
const auto &ref : tracks_)
174 if (uuids.contains (ref.id ()))
179 if (!rows.isEmpty ())
203 const std::vector<TrackUuidReference> &
tracks ()
const {
return tracks_; }
230 bool auto_reposition =
false);
235 std::optional<Track::Uuid>
247 bool auto_reposition =
false);
285 std::vector<Track::Uuid>
298 static constexpr auto kTracksKey =
"tracks"sv;
299 static constexpr auto kExpandedTracksKey =
"expandedTracks"sv;
300 static constexpr auto kFolderParentsKey =
"folderParents"sv;
301 friend void to_json (nlohmann::json &j,
const TrackCollection &collection);
302 friend void from_json (
const nlohmann::json &j, TrackCollection &collection);
305 TrackRegistry &track_registry_;
306 std::vector<TrackUuidReference> tracks_;
313 std::unordered_set<Track::Uuid> expanded_tracks_;
320 std::unordered_map<Track::Uuid, Track::Uuid> folder_parent_;
Q_SIGNAL void tracksMoved(const QList< int > &rows)
Emitted after tracks are moved within the collection.
void clear()
Clear all tracks from the collection.
auto get_track_index(const Track::Uuid &track_id) const
Get the index of the track with the given UUID.
auto track_count() const
Get the number of tracks in the collection.
void detach_track(const Track::Uuid &track_id)
Remove a track from the collection without clearing its folder metadata (expanded state and folder pa...
TrackRegistry & get_track_registry() const
Get the track registry.
void move_track(const Track::Uuid &track_id, int pos)
Move a track from one position to another.
void set_folder_parent(const Track::Uuid &child_id, const Track::Uuid &parent_id, bool auto_reposition=false)
Set the folder parent for a track.
void add_track(const TrackUuidReference &track_id)
Add a track to the collection.
bool get_track_expanded(const Track::Uuid &track_id) const
Get the expanded state of a foldable track.
auto get_track_span() const
Get a span view of all tracks.
std::optional< Track::Uuid > get_enclosing_folder(size_t index) const
Get the innermost enclosing folder at the given track index.
std::optional< Track::Uuid > get_folder_parent(const Track::Uuid &child_id) const
Get the folder parent for a track.
size_t get_last_child_index(const Track::Uuid &parent_id) const
Get the last child index for a foldable track.
TrackUuidReference get_track_ref_at_index(size_t index) const
Get the track reference at the given index.
bool is_track_foldable(const Track::Uuid &track_id) const
Check if a track is foldable.
bool contains(const Track::Uuid &track_id) const
Check if the collection contains a track with the given UUID.
size_t get_child_count(const Track::Uuid &parent_id) const
Get the number of children for a foldable track.
void set_track_expanded(const Track::Uuid &track_id, bool expanded)
Set the expanded state of a foldable track.
void notify_tracks_moved(const Container &uuids)
Notify that the given tracks have been moved.
void insert_track(const TrackUuidReference &track_id, int pos)
Insert a track at the given position.
void reattach_track(const TrackUuidReference &track_id, int pos)
Insert a track without initializing or modifying folder metadata.
bool is_ancestor_of(const Track::Uuid &possible_ancestor, const Track::Uuid &track_id) const
Check if possible_ancestor is an ancestor of track_id.
std::vector< Track::Uuid > get_all_descendants(const Track::Uuid &parent_id) const
Get all descendant track UUIDs of a folder, in list order.
void remove_track(const Track::Uuid &track_id)
Remove a track from the collection.
void remove_folder_parent(const Track::Uuid &child_id, bool auto_reposition=false)
Remove the folder parent for a track.
TrackPtrVariant get_track_at_index(size_t index) const
Get the track at the given index.
const std::vector< TrackUuidReference > & tracks() const
Get the underlying tracks vector.
Track span that offers helper methods on a range of tracks.
Represents a track in the project.