diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquickcontainer.cpp | 25 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontainer_p_p.h | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenu.cpp | 99 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenu_p_p.h | 3 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenubar.cpp | 49 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenubar_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenubar_p_p.h | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpopuppositioner.cpp | 2 |
8 files changed, 35 insertions, 150 deletions
diff --git a/src/quicktemplates2/qquickcontainer.cpp b/src/quicktemplates2/qquickcontainer.cpp index 8217a3ff..c4af6151 100644 --- a/src/quicktemplates2/qquickcontainer.cpp +++ b/src/quicktemplates2/qquickcontainer.cpp @@ -336,21 +336,6 @@ void QQuickContainerPrivate::reorderItems() } } -// Helper function needed for derived classes such as QQuickMenuBarPrivate. -void QQuickContainerPrivate::addObject(QObject *obj) -{ - Q_Q(QQuickContainer); - QQuickItem *item = qobject_cast<QQuickItem *>(obj); - if (item) { - if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) - item->setParentItem(effectiveContentItem(contentItem)); - else if (contentModel->indexOf(item, nullptr) == -1) - q->addItem(item); - } else { - contentData.append(obj); - } -} - void QQuickContainerPrivate::_q_currentIndexChanged() { Q_Q(QQuickContainer); @@ -394,7 +379,15 @@ void QQuickContainerPrivate::contentData_append(QQmlListProperty<QObject> *prop, { QQuickContainer *q = static_cast<QQuickContainer *>(prop->object); QQuickContainerPrivate *p = QQuickContainerPrivate::get(q); - p->addObject(obj); + QQuickItem *item = qobject_cast<QQuickItem *>(obj); + if (item) { + if (QQuickItemPrivate::get(item)->isTransparentForPositioner()) + item->setParentItem(effectiveContentItem(p->contentItem)); + else if (p->contentModel->indexOf(item, nullptr) == -1) + q->addItem(item); + } else { + p->contentData.append(obj); + } } int QQuickContainerPrivate::contentData_count(QQmlListProperty<QObject> *prop) diff --git a/src/quicktemplates2/qquickcontainer_p_p.h b/src/quicktemplates2/qquickcontainer_p_p.h index 5ddf298a..16e9c9f6 100644 --- a/src/quicktemplates2/qquickcontainer_p_p.h +++ b/src/quicktemplates2/qquickcontainer_p_p.h @@ -73,8 +73,6 @@ public: void removeItem(int index, QQuickItem *item); void reorderItems(); - void addObject(QObject *obj); - void _q_currentIndexChanged(); void itemChildAdded(QQuickItem *item, QQuickItem *child) override; 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) diff --git a/src/quicktemplates2/qquickmenu_p_p.h b/src/quicktemplates2/qquickmenu_p_p.h index c0bb2702..6146b960 100644 --- a/src/quicktemplates2/qquickmenu_p_p.h +++ b/src/quicktemplates2/qquickmenu_p_p.h @@ -78,9 +78,6 @@ public: void moveItem(int from, int to); void removeItem(int index, QQuickItem *item); - void createAndAppendItem(QObject *object); - void recreateItems(); - QQuickItem *beginCreateItem(); void completeCreateItem(); diff --git a/src/quicktemplates2/qquickmenubar.cpp b/src/quicktemplates2/qquickmenubar.cpp index 9be9ee09..6016e70d 100644 --- a/src/quicktemplates2/qquickmenubar.cpp +++ b/src/quicktemplates2/qquickmenubar.cpp @@ -76,26 +76,7 @@ QT_BEGIN_NAMESPACE {Focus Management in Qt Quick Controls 2} */ -void QQuickMenuBarPrivate::createItems() -{ - // removeItem() will remove stuff from contentData, so we have to make a copy of it. - const auto originalContentData = QQuickContainerPrivate::contentData; - // Sanity check that there aren't any items we don't know about. - Q_ASSERT(contentModel->count() == 0); - - for (QObject *object : originalContentData) { - if (QQuickMenu *menu = qobject_cast<QQuickMenu *>(object)) { - // It's a QQuickMenu; create a QQuickMenuBarItem for it. - QQuickItem *menuItem = createItem(menu); - addObject(menuItem); - } else if (qobject_cast<QQuickMenuBarItem *>(object)) { - addObject(object); - } - // If it's neither, skip it because we don't care about it. - } -} - -QQuickItem *QQuickMenuBarPrivate::beginCreateItem(QQuickMenu *menu) +QQuickItem *QQuickMenuBarPrivate::beginCreateItem() { Q_Q(QQuickMenuBar); if (!delegate) @@ -115,8 +96,6 @@ QQuickItem *QQuickMenuBarPrivate::beginCreateItem(QQuickMenu *menu) return nullptr; } - if (QQuickMenuBarItem *menuBarItem = qobject_cast<QQuickMenuBarItem *>(item)) - menuBarItem->setMenu(menu); item->setParentItem(q); QQml_setParent_noEvent(item, q); @@ -133,7 +112,9 @@ void QQuickMenuBarPrivate::completeCreateItem() QQuickItem *QQuickMenuBarPrivate::createItem(QQuickMenu *menu) { - QQuickItem *item = beginCreateItem(menu); + QQuickItem *item = beginCreateItem(); + if (QQuickMenuBarItem *menuBarItem = qobject_cast<QQuickMenuBarItem *>(item)) + menuBarItem->setMenu(menu); completeCreateItem(); return item; } @@ -273,18 +254,9 @@ void QQuickMenuBarPrivate::itemImplicitHeightChanged(QQuickItem *item) void QQuickMenuBarPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj) { QQuickMenuBar *menuBar = static_cast<QQuickMenuBar *>(prop->object); - QQuickMenuBarPrivate *menuBarPrivate = QQuickMenuBarPrivate::get(menuBar); - if (!menuBarPrivate->componentComplete) { - // 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. - menuBarPrivate->QQuickContainerPrivate::contentData.append(obj); - return; - } - - if (QQuickMenu *menu = qobject_cast<QQuickMenu *>(obj)) { - QQuickItem *menuItem = menuBarPrivate->createItem(menu); - menuBarPrivate->addObject(menuItem); - } + if (QQuickMenu *menu = qobject_cast<QQuickMenu *>(obj)) + obj = QQuickMenuBarPrivate::get(menuBar)->createItem(menu); + QQuickContainerPrivate::contentData_append(prop, obj); } void QQuickMenuBarPrivate::menus_append(QQmlListProperty<QQuickMenu> *prop, QQuickMenu *obj) @@ -482,13 +454,6 @@ QQmlListProperty<QObject> QQuickMenuBarPrivate::contentData() QQuickContainerPrivate::contentData_clear); } -void QQuickMenuBar::componentComplete() -{ - Q_D(QQuickMenuBar); - QQuickContainer::componentComplete(); - d->createItems(); -} - bool QQuickMenuBar::eventFilter(QObject *object, QEvent *event) { return QObject::eventFilter(object, event); diff --git a/src/quicktemplates2/qquickmenubar_p.h b/src/quicktemplates2/qquickmenubar_p.h index 983bb578..af37d0f2 100644 --- a/src/quicktemplates2/qquickmenubar_p.h +++ b/src/quicktemplates2/qquickmenubar_p.h @@ -81,7 +81,6 @@ Q_SIGNALS: void menusChanged(); protected: - void componentComplete() override; bool eventFilter(QObject *object, QEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; diff --git a/src/quicktemplates2/qquickmenubar_p_p.h b/src/quicktemplates2/qquickmenubar_p_p.h index 8623ef43..75fbed73 100644 --- a/src/quicktemplates2/qquickmenubar_p_p.h +++ b/src/quicktemplates2/qquickmenubar_p_p.h @@ -69,9 +69,7 @@ public: QQmlListProperty<QQuickMenu> menus(); QQmlListProperty<QObject> contentData(); - void createItems(); - - QQuickItem *beginCreateItem(QQuickMenu *menu); + QQuickItem *beginCreateItem(); void completeCreateItem(); QQuickItem *createItem(QQuickMenu *menu); diff --git a/src/quicktemplates2/qquickpopuppositioner.cpp b/src/quicktemplates2/qquickpopuppositioner.cpp index ebd8ff29..69a57674 100644 --- a/src/quicktemplates2/qquickpopuppositioner.cpp +++ b/src/quicktemplates2/qquickpopuppositioner.cpp @@ -300,7 +300,7 @@ void QQuickPopupPositioner::addAncestorListeners(QQuickItem *item) QQuickItem *p = item; while (p) { - QQuickItemPrivate::get(p)->updateOrAddItemChangeListener(this, AncestorChangeTypes); + QQuickItemPrivate::get(p)->addItemChangeListener(this, AncestorChangeTypes); p = p->parentItem(); } } |