6#include <unordered_map>
8#include "structure/arrangement/arranger_object.h"
9#include "utils/expandable_tick_range.h"
10#include "utils/units.h"
12#include <QAbstractListModel>
14#include <boost/multi_index/global_fun.hpp>
15#include <boost/multi_index/hashed_index.hpp>
16#include <boost/multi_index/mem_fun.hpp>
17#include <boost/multi_index/ordered_index.hpp>
18#include <boost/multi_index/random_access_index.hpp>
19#include <boost/multi_index/ranked_index.hpp>
20#include <boost/multi_index/sequenced_index.hpp>
21#include <boost/multi_index_container.hpp>
23namespace zrythm::structure::arrangement
47get_ticks_from_arranger_object_uuid_ref (
const ArrangerObjectUuidReference &ref)
49 return ref.get_object_base ()->position ()->ticks ();
53using ArrangerObjectRefMultiIndexContainer = boost::multi_index_container<
54 ArrangerObjectUuidReference,
55 boost::multi_index::indexed_by<
56 boost::multi_index::hashed_unique<
57 boost::multi_index::tag<uuid_hash_index>,
58 boost::multi_index::const_mem_fun<
59 ArrangerObjectUuidReference,
61 &ArrangerObjectUuidReference::id>>,
62 boost::multi_index::random_access<boost::multi_index::tag<random_access_index>>,
63 boost::multi_index::ranked_non_unique<
64 boost::multi_index::tag<sorted_index>,
65 boost::multi_index::global_fun<
66 const ArrangerObjectUuidReference &,
68 &get_ticks_from_arranger_object_uuid_ref>>,
69 boost::multi_index::sequenced<boost::multi_index::tag<sequenced_index>>>>;
77class ArrangerObjectListModel :
public QAbstractListModel
84 enum ArrangerObjectListModelRoles
86 ArrangerObjectPtrRole = Qt::UserRole + 1,
87 ArrangerObjectUuidReferenceRole
89 Q_ENUM (ArrangerObjectListModelRoles)
91 ArrangerObjectListModel (
92 ArrangerObjectRefMultiIndexContainer &objects,
93 QObject * parent =
nullptr)
94 : QAbstractListModel (parent), objects_ (objects)
96 setup_signals (
false);
106 ArrangerObjectRefMultiIndexContainer &objects,
108 : QAbstractListModel (&parent_arranger_object), objects_ (objects)
110 setup_signals (
true);
113 QHash<int, QByteArray> roleNames ()
const override;
115 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override
117 if (parent.isValid ())
119 return static_cast<int> (objects_.size ());
123 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
127 bool insertObject (
const ArrangerObjectUuidReference &
object,
int index);
130 removeRows (
int row,
int count,
const QModelIndex &parent = QModelIndex ())
144 void connect_object_signals (
int index);
153 void disconnect_object_signals (
int index);
163 void setup_signals (
bool is_parent_arranger_object);
174 void handle_object_change (
const ArrangerObject *
object);
185 std::pair<units::precise_tick_t, units::precise_tick_t>
186 get_and_update_previous_range (
const ArrangerObject *
object);
189 ArrangerObjectRefMultiIndexContainer &objects_;
194 ArrangerObject::Uuid,
195 std::pair<units::precise_tick_t, units::precise_tick_t>>
196 previous_object_ranges_;
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.