24class ObjectTreeModelPrivate
33 QList<QObject *> m_rootObjects;
35 QList<QObject *> children(QObject *parent)
const;
37 [[nodiscard]] QObject *mapModelIndex2QObject(
const QModelIndex &index)
const;
38 QModelIndex indexForObject(QObject *
object)
const;
43QList<QObject *> ObjectTreeModelPrivate::children(QObject *parent)
const
48 return parent->children();
51QObject *ObjectTreeModelPrivate::mapModelIndex2QObject(
const QModelIndex &index)
const
53 if (!index.isValid()) {
57 auto *parent =
reinterpret_cast<QObject *
>(index.internalPointer());
59 return m_rootObjects[index.row()];
61 QObjectList c = children(parent);
62 return c[index.row()];
65QModelIndex ObjectTreeModelPrivate::indexForObject(QObject *
object)
const
72 int row =
static_cast<int>(m_rootObjects.indexOf(
object));
74 return q->index(row, 0, QModelIndex());
77 row =
static_cast<int>(children(object->parent()).indexOf(
object));
81 return q->index(row, 0, indexForObject(object->parent()));
89 Q_ASSERT(parentIndex.isValid());
91 const int last = first + count - 1;
92 Q_ASSERT(first >= 0 && last >= 0);
93 Q_ASSERT(first <= last);
95 m_model->beginInsertRows(parentIndex, first, last);
100 m_model->endInsertRows();
108 Q_ASSERT(object->parent());
109 Q_ASSERT(!m_model->
rootObjects().contains(
object));
111 const QModelIndex parentIndex = m_model->
indexForObject(object->parent());
112 m_model->beginRemoveRows(parentIndex, indexObj.row(), indexObj.row());
117 m_model->endRemoveRows();
124 m_model->beginResetModel();
131 m_model->endResetModel();
139 if (!
object || (object->parent() == newParent) || (
object == newParent)) {
145 QObject *parentObj =
object->parent();
146 const QModelIndex parentIndex = m_model->
indexForObject(parentObj);
147 const QModelIndex destinationParentIndex = m_model->
indexForObject(newParent);
148 Q_ASSERT(destinationParentIndex.isValid());
149 const bool success = m_model->beginMoveRows(parentIndex, indexObj.row(), indexObj.row(), destinationParentIndex, m_model->
rowCount(destinationParentIndex));
158 m_model->endMoveRows();
163 : QAbstractItemModel(
parent)
164 ,
d_ptr(new ObjectTreeModelPrivate(this))
175 QHash<int, QByteArray>
roleNames = QAbstractItemModel::roleNames();
184 if (!
object || d->m_rootObjects.contains(
object)) {
188 const int row =
static_cast<int>(d->m_rootObjects.count());
189 beginInsertRows({}, row, row);
190 d->m_rootObjects << object;
197 return d->m_rootObjects;
209 d->m_rootObjects.clear();
212 d->m_rootObjects << object;
221 d->m_rootObjects.clear();
227 if (!
index.isValid()) {
232 QObject *obj = d->mapModelIndex2QObject(
index);
235 case Qt::DisplayRole:
236 return QString { u
"0x" + QString::number(
reinterpret_cast<quint64
>(obj), 16) };
238 return QVariant::fromValue(obj);
240 return reinterpret_cast<quint64
>(obj);
255 return static_cast<int>(d->children(d->mapModelIndex2QObject(
parent)).count());
262 return QModelIndex();
266 return createIndex(row, column,
nullptr);
269 QObject *parentObject = d->mapModelIndex2QObject(
parent);
271 return QModelIndex();
272 const QObjectList c = d->children(parentObject);
273 if (row >= c.size()) {
274 return QModelIndex();
277 return createIndex(row, column, parentObject);
283 return d->indexForObject(
object);
289 if (!
index.isValid()) {
290 return QModelIndex();
293 QObject *
object = d->mapModelIndex2QObject(
index);
294 QObject *
parent =
object->parent();
296 return QModelIndex();
299 QObject *grandParent =
parent->parent();
300 const int row =
static_cast<int>(d->children(grandParent).indexOf(
parent));
301 return createIndex(row, 0, grandParent);
AppendOperation(ObjectTreeModel *model, QObject *parent, int count=1, int index=-1)
RemoveOperation(ObjectTreeModel *model, QObject *object)
ReparentOperation(ObjectTreeModel *model, QObject *object, QObject *newParent)
ResetOperation(ObjectTreeModel *model)
ObjectTreeModelPrivate *const d_ptr
QModelIndex indexForObject(QObject *object) const
void appendRootObject(QObject *object)
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void setRootObject(QObject *rootObject)
ObjectTreeModel(QObject *parent=nullptr)
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
QList< QObject * > rootObjects() const
QModelIndex index(int row, int column, const QModelIndex &parent={}) const override
QModelIndex parent(const QModelIndex &index) const override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QHash< int, QByteArray > roleNames() const override
void setRootObjects(const QList< QObject * > &rootObjects)
@ ObjectIdRole
return quint64
@ ObjectRole
return QObject*