diff options
Diffstat (limited to 'src/quicktemplates2/qquickmenu.cpp')
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 99 |
1 files changed, 17 insertions, 82 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp index 42059e7f..f52405c9 100644 --- a/src/quicktemplates2/qquickmenu.cpp +++ b/src/quicktemplates2/qquickmenu.cpp @@ -43,7 +43,6 @@ #include "qquickpopuppositioner_p_p.h" #include "qquickaction_p.h" -#include <QtCore/qloggingcategory.h> #include <QtGui/qevent.h> #include <QtGui/qcursor.h> #include <QtGui/qpa/qplatformintegration.h> @@ -55,8 +54,6 @@ #include <QtQml/private/qv4variantobject_p.h> #include <QtQml/private/qv4qobjectwrapper_p.h> #include <QtQml/private/qqmlobjectmodel_p.h> -#include <QtQml/private/qqmlinstantiator_p.h> -#include <QtQml/private/qqmlinstantiator_p_p.h> #include <QtQuick/private/qquickitem_p.h> #include <QtQuick/private/qquickitemchangelistener_p.h> #include <QtQuick/private/qquickitemview_p.h> @@ -68,8 +65,6 @@ QT_BEGIN_NAMESPACE // copied from qfusionstyle.cpp static const int SUBMENU_DELAY = 225; -Q_LOGGING_CATEGORY(qlcQQuickMenu, "qt.quick.controls.menu") - /*! \qmltype Menu \inherits Popup @@ -256,67 +251,6 @@ 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; - - qCDebug(qlcQQuickMenu) << "removing items so that we can recreate them:"; - QSet<QObject*> instantiatedObjects; - for (int i = 0; i < contentModel->count(); ) { - QQuickItem *item = itemAt(i); - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(item->parent()); - if (instantiator) { - // Don't try to recreate items owned by an instantiator. - qCDebug(qlcQQuickMenu) << "- item" << item << "at index" << i << "with parent" - << item->parent() << "was instantiated by Instantiator; ignoring"; - instantiatedObjects.insert(item); - ++i; - } else { - qCDebug(qlcQQuickMenu) << "- removing item" << item << "at index" << i << "with parent" << item->parent(); - removeItem(0, item); - } - } - - qCDebug(qlcQQuickMenu) << "recreating items:"; - for (QObject *object : originalContentData) { - QQmlInstantiator *instantiator = qobject_cast<QQmlInstantiator*>(object); - // Instantiators are part of our contentData. If this particular object is an Instantiator, - // let it recreate its own items, otherwise strange things happen (the items are culled). - if (instantiator) { - qCDebug(qlcQQuickMenu) << "- contentData object" << object << "is an Instantiator;" - << "asking them to regenerate their own items"; - QQmlInstantiatorPrivate::get(instantiator)->regenerate(); - } else if (!instantiatedObjects.contains(object)) { - qCDebug(qlcQQuickMenu) << "- creating MenuItem for contentData object" << object; - createAndAppendItem(object); - } - } -} - QQuickItem *QQuickMenuPrivate::beginCreateItem() { Q_Q(QQuickMenu); @@ -389,7 +323,6 @@ void QQuickMenuPrivate::resizeItems() void QQuickMenuPrivate::itemChildAdded(QQuickItem *, QQuickItem *child) { // add dynamically reparented items (eg. by a Repeater) - qCDebug(qlcQQuickMenu) << "item child added" << child; if (!QQuickItemPrivate::get(child)->isTransparentForPositioner() && !contentData.contains(child)) insertItem(contentModel->count(), child); } @@ -397,7 +330,6 @@ void QQuickMenuPrivate::itemChildAdded(QQuickItem *, QQuickItem *child) void QQuickMenuPrivate::itemParentChanged(QQuickItem *item, QQuickItem *parent) { // remove dynamically unparented items (eg. by a Repeater) - qCDebug(qlcQQuickMenu) << "parent of item" << item << "changed to" << parent; if (!parent) removeItem(contentModel->indexOf(item, nullptr), item); } @@ -408,8 +340,6 @@ void QQuickMenuPrivate::itemSiblingOrderChanged(QQuickItem *) Q_Q(QQuickMenu); QList<QQuickItem *> siblings = contentItem->childItems(); - qCDebug(qlcQQuickMenu) << "item sibling order changed"; - int to = 0; for (int i = 0; i < siblings.count(); ++i) { QQuickItem* sibling = siblings.at(i); @@ -422,7 +352,6 @@ void QQuickMenuPrivate::itemSiblingOrderChanged(QQuickItem *) void QQuickMenuPrivate::itemDestroyed(QQuickItem *item) { - qCDebug(qlcQQuickMenu) << "item child destroyed" << item; QQuickPopupPrivate::itemDestroyed(item); int index = contentModel->indexOf(item, nullptr); if (index != -1) @@ -697,18 +626,24 @@ void QQuickMenuPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObj QQuickMenu *q = qobject_cast<QQuickMenu *>(prop->object); QQuickMenuPrivate *p = QQuickMenuPrivate::get(q); - if (!p->complete) { - qCDebug(qlcQQuickMenu) << "appending object" << obj - << "to contentData, but delaying MenuItem creation (if necessary) until we're completed"; - // 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; + 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); } - qCDebug(qlcQQuickMenu) << "appending object" << obj - << "to contentData and creating MenuItem for it if necessary"; - p->createAndAppendItem(obj); + 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 { + p->contentData.append(obj); + } } int QQuickMenuPrivate::contentData_count(QQmlListProperty<QObject> *prop) @@ -1421,7 +1356,7 @@ void QQuickMenu::componentComplete() { Q_D(QQuickMenu); QQuickPopup::componentComplete(); - d->recreateItems(); + d->resizeItems(); } void QQuickMenu::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) |