diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-09-11 03:02:28 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-09-11 03:02:28 +0200 |
commit | b9e7d9aadc8f70644c24469d802e9366a2a422bf (patch) | |
tree | 4445aff3e662916b5f5e5729da8e9dcbcc736430 /src/quicktemplates2/qquickmenu.cpp | |
parent | 7e38097fb03b1b304a90630b475fe1f771a44d4e (diff) | |
parent | b41a32bc8ed42001c59af22345af4b733398aa34 (diff) |
Merge remote-tracking branch 'origin/5.11' into 5.12
Change-Id: I3fa0011d8b69db2a004feb177a7f89ccb75a724d
Diffstat (limited to 'src/quicktemplates2/qquickmenu.cpp')
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index f52405c9..7086db91 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -251,6 +251,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); @@ -626,24 +661,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) @@ -1356,7 +1381,7 @@ void QQuickMenu::componentComplete() { Q_D(QQuickMenu); QQuickPopup::componentComplete(); - d->resizeItems(); + d->recreateItems(); } void QQuickMenu::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) |