Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
arranger_object_list_model.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <unordered_map>
7
8#include "structure/arrangement/arranger_object.h"
9#include "utils/expandable_tick_range.h"
10#include "utils/units.h"
11
12#include <boost/multi_index/global_fun.hpp>
13#include <boost/multi_index/hashed_index.hpp>
14#include <boost/multi_index/mem_fun.hpp>
15#include <boost/multi_index/ordered_index.hpp>
16#include <boost/multi_index/random_access_index.hpp>
17#include <boost/multi_index/ranked_index.hpp>
18#include <boost/multi_index/sequenced_index.hpp>
19#include <boost/multi_index_container.hpp>
20
21namespace zrythm::structure::arrangement
22{
23
24// Vector-like index for fast iteration
26{
27};
28
29// Random-access index for fast lookups by index
31{
32};
33
34// HashTable-like index for fast lookups by ID
36{
37};
38
39// Sorted by position
41{
42};
43
44inline double
45get_ticks_from_arranger_object_uuid_ref (const ArrangerObjectUuidReference &ref)
46{
47 return ref.get_object_base ()->position ()->ticks ();
48}
49
50// Multi-index container for both quick iteration and quick lookups
51using ArrangerObjectRefMultiIndexContainer = boost::multi_index_container<
52 ArrangerObjectUuidReference,
53 boost::multi_index::indexed_by<
54 boost::multi_index::hashed_unique<
55 boost::multi_index::tag<uuid_hash_index>,
56 boost::multi_index::const_mem_fun<
57 ArrangerObjectUuidReference,
58 ArrangerObject::Uuid,
59 &ArrangerObjectUuidReference::id>>,
60 boost::multi_index::random_access<boost::multi_index::tag<random_access_index>>,
61 boost::multi_index::ranked_non_unique<
62 boost::multi_index::tag<sorted_index>,
63 boost::multi_index::global_fun<
64 const ArrangerObjectUuidReference &,
65 double,
66 &get_ticks_from_arranger_object_uuid_ref>>,
67 boost::multi_index::sequenced<boost::multi_index::tag<sequenced_index>>>>;
68
75class ArrangerObjectListModel : public QAbstractListModel
76{
77 Q_OBJECT
78 QML_ELEMENT
79 QML_UNCREATABLE ("")
80
81public:
82 enum ArrangerObjectListModelRoles
83 {
84 ArrangerObjectPtrRole = Qt::UserRole + 1,
85 ArrangerObjectUuidReferenceRole
86 };
87 Q_ENUM (ArrangerObjectListModelRoles)
88
89 ArrangerObjectListModel (
90 ArrangerObjectRefMultiIndexContainer &objects,
91 QObject * parent = nullptr);
92
100 ArrangerObjectRefMultiIndexContainer &objects,
101 ArrangerObject &parent_arranger_object);
102
103 QHash<int, QByteArray> roleNames () const override;
104
105 int rowCount (const QModelIndex &parent = QModelIndex ()) const override
106 {
107 if (parent.isValid ())
108 return 0;
109 return static_cast<int> (objects_.size ());
110 }
111
112 QVariant
113 data (const QModelIndex &index, int role = Qt::DisplayRole) const override;
114
115 void clear ();
116
117 bool insertObject (const ArrangerObjectUuidReference &object, int index);
118
119 bool
120 removeRows (int row, int count, const QModelIndex &parent = QModelIndex ())
121 override;
122
123 Q_SIGNAL void contentChanged (utils::ExpandableTickRange affectedRange);
124
125private:
134 void connect_object_signals (int index);
135
143 void disconnect_object_signals (int index);
144
153 void setup_signals (bool is_parent_arranger_object);
154
164 void handle_object_change (const ArrangerObject * object);
165
175 std::pair<units::precise_tick_t, units::precise_tick_t>
176 get_and_update_previous_range (const ArrangerObject * object);
177
178private:
179 ArrangerObjectRefMultiIndexContainer &objects_;
180
183 std::unordered_map<
185 std::pair<units::precise_tick_t, units::precise_tick_t>>
186 previous_object_ranges_;
187};
188}
ArrangerObjectListModel(ArrangerObjectRefMultiIndexContainer &objects, ArrangerObject &parent_arranger_object)
To be used when the parent is also an arranger object.
Base class for all objects in the arranger.