aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates2/qquickmenu.cpp')
-rw-r--r--src/quicktemplates2/qquickmenu.cpp59
1 files changed, 42 insertions, 17 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp
index ecdd2825..e321b4c9 100644
--- a/src/quicktemplates2/qquickmenu.cpp
+++ b/src/quicktemplates2/qquickmenu.cpp
@@ -242,6 +242,41 @@ void QQuickMenuPrivate::removeItem(int index, QQuickItem *item)
}
}
+void QQuickMenuPrivate::createAndAppendItem(QObject *object)
+{
+ Q_Q(QQuickMenu);
+ QQuickItem *item = qobject_cast<QQuickItem *>(object);
+ if (!item) {
+ if (QQuickAction *action = qobject_cast<QQuickAction *>(object))
+ item = createItem(action);
+ else if (QQuickMenu *menu = qobject_cast<QQuickMenu *>(object))
+ item = createItem(menu);
+ }
+
+ if (item) {
+ if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) {
+ QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::SiblingOrder);
+ item->setParentItem(contentItem);
+ } else if (contentModel->indexOf(item, nullptr) == -1) {
+ q->addItem(item);
+ }
+ } else {
+ contentData.append(object);
+ }
+}
+
+void QQuickMenuPrivate::recreateItems()
+{
+ // removeItem() will remove stuff from contentData, so we have to make a copy of it.
+ const auto originalContentData = contentData;
+
+ while (contentModel->count() > 0)
+ removeItem(0, itemAt(0));
+
+ for (QObject *object : originalContentData)
+ createAndAppendItem(object);
+}
+
QQuickItem *QQuickMenuPrivate::beginCreateItem()
{
Q_Q(QQuickMenu);
@@ -608,24 +643,14 @@ void QQuickMenuPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObj
QQuickMenu *q = qobject_cast<QQuickMenu *>(prop->object);
QQuickMenuPrivate *p = QQuickMenuPrivate::get(q);
- QQuickItem *item = qobject_cast<QQuickItem *>(obj);
- if (!item) {
- if (QQuickAction *action = qobject_cast<QQuickAction *>(obj))
- item = p->createItem(action);
- else if (QQuickMenu *menu = qobject_cast<QQuickMenu *>(obj))
- item = p->createItem(menu);
- }
-
- if (item) {
- if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) {
- QQuickItemPrivate::get(item)->addItemChangeListener(p, QQuickItemPrivate::SiblingOrder);
- item->setParentItem(p->contentItem);
- } else if (p->contentModel->indexOf(item, nullptr) == -1) {
- q->addItem(item);
- }
- } else {
+ if (!p->complete) {
+ // Don't add items until we're complete, as the delegate could change in the meantime.
+ // We'll add it to contentData and create it when we're complete.
p->contentData.append(obj);
+ return;
}
+
+ p->createAndAppendItem(obj);
}
int QQuickMenuPrivate::contentData_count(QQmlListProperty<QObject> *prop)
@@ -1338,7 +1363,7 @@ void QQuickMenu::componentComplete()
{
Q_D(QQuickMenu);
QQuickPopup::componentComplete();
- d->resizeItems();
+ d->recreateItems();
}
void QQuickMenu::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)