20#include <QAbstractItemModel>
22#include <QQmlComponent>
48 if (m_model ==
model) {
52 disconnect(m_model, &QAbstractItemModel::modelReset,
this, &QuickRecursiveInstantiator::modelReset);
53 disconnect(m_model, &QAbstractItemModel::rowsInserted,
this, &QuickRecursiveInstantiator::rowsInserted);
54 disconnect(m_model, &QAbstractItemModel::rowsRemoved,
this, &QuickRecursiveInstantiator::rowsAboutToBeRemoved);
55 disconnect(m_model, &QAbstractItemModel::destroyed,
this, &QuickRecursiveInstantiator::modelDestroyed);
59 connect(m_model, &QAbstractItemModel::modelReset,
this, &QuickRecursiveInstantiator::modelReset);
60 connect(m_model, &QAbstractItemModel::rowsInserted,
this, &QuickRecursiveInstantiator::rowsInserted);
61 connect(m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
this, &QuickRecursiveInstantiator::rowsAboutToBeRemoved);
62 connect(m_model, &QAbstractItemModel::destroyed,
this, &QuickRecursiveInstantiator::modelDestroyed);
84 return m_createdItems.value(index);
87void QuickRecursiveInstantiator::modelReset()
91 std::for_each(m_rootItems.begin(), m_rootItems.end(), [](QObject *obj) { obj->deleteLater(); });
94 for (
int i = 0; i < m_model->rowCount(); ++i) {
95 auto rootIndex = m_model->index(0, 0);
96 m_rootItems << createItems(rootIndex,
this);
100void QuickRecursiveInstantiator::modelDestroyed()
103 m_createdItems.clear();
104 qDeleteAll(m_rootItems);
110QObject *QuickRecursiveInstantiator::createItems(
const QModelIndex &index, QObject *parent)
112 Q_ASSERT(m_delegate);
114 Q_ASSERT(index.isValid());
118 auto creationContext = m_delegate->creationContext();
119 auto context =
new QQmlContext(creationContext ? creationContext : qmlContext(this));
120 context->setContextProperty(QStringLiteral(
"object"),
object);
122 auto createdObject = m_delegate->create(context);
123 createdObject->setParent(parent);
124 context->setParent(createdObject);
125 if (
auto quickItem = qobject_cast<QQuickItem *>(createdObject)) {
126 if (
auto quickParentItem = qobject_cast<QQuickItem *>(parent)) {
127 quickItem->setParentItem(quickParentItem);
129 quickItem->setParentItem(
this);
134 m_createdItems[QPersistentModelIndex(index)] = createdObject;
137 for (
int i = 0; i < m_model->rowCount(index); ++i) {
138 auto childIndex = m_model->index(i, 0, index);
139 createItems(childIndex, createdObject);
142 return createdObject;
145void QuickRecursiveInstantiator::removeItems(
const QModelIndex &index, QObject *parent)
148 Q_ASSERT(m_createdItems.contains(index));
149 auto createdObject = m_createdItems.take(index);
150 Q_ASSERT(createdObject);
151 qDebug() << createdObject << index;
153 createdObject->deleteLater();
156void QuickRecursiveInstantiator::rowsInserted(
const QModelIndex &parent,
int first,
int last)
159 Q_ASSERT(parentItem);
160 for (
int i = first; i <= last; ++i) {
161 const auto currentIndex = m_model->index(i, 0, parent);
162 createItems(currentIndex, parentItem);
166void QuickRecursiveInstantiator::rowsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
169 Q_ASSERT(parentItem);
170 for (
int i = first; i <= last; ++i) {
171 const auto currentIndex = m_model->index(i, 0, parent);
172 removeItems(currentIndex, parentItem);
@ ObjectRole
return QObject*
virtual void setModel(QAbstractItemModel *model)
QAbstractItemModel * model
void modelChanged(QAbstractItemModel *model)
QuickRecursiveInstantiator(QQuickItem *parent=nullptr)
QObject * itemForIndex(const QModelIndex &index) const override
void setDelegate(QQmlComponent *delegate)
void delegateChanged(QQmlComponent *delegate)
QList< QObject * > rootItems() const