From 27a7cb2b36a2e23845f3b91c55b6254681f40545 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sat, 19 Dec 2015 11:20:15 +0100 Subject: Just tidy up QQuickPopup a bit Change-Id: Ibc8097299f0796f943682f0c1de628a8da87e430 Reviewed-by: J-P Nurmi --- src/templates/qquickoverlay.cpp | 13 +++++----- src/templates/qquickpopup.cpp | 56 +++++++++++++++++++---------------------- src/templates/qquickpopup_p.h | 10 +++----- src/templates/qquickpopup_p_p.h | 10 ++++---- 4 files changed, 41 insertions(+), 48 deletions(-) (limited to 'src/templates') diff --git a/src/templates/qquickoverlay.cpp b/src/templates/qquickoverlay.cpp index a3f9b573..949715c4 100644 --- a/src/templates/qquickoverlay.cpp +++ b/src/templates/qquickoverlay.cpp @@ -138,7 +138,6 @@ void QQuickOverlay::itemChange(ItemChange change, const ItemChangeData &data) Q_D(QQuickOverlay); QQuickItem::itemChange(change, data); - QQuickItem *contentItem = const_cast(data.item); QQuickPopup *popup = Q_NULLPTR; if (change == ItemChildAddedChange || change == ItemChildRemovedChange) { QQuickDrawer *drawer = qobject_cast(data.item); @@ -152,7 +151,7 @@ void QQuickOverlay::itemChange(ItemChange change, const ItemChangeData &data) } d->updateBackground(); } else { - popup = qobject_cast(contentItem->parent()); + popup = qobject_cast(data.item->parent()); } setVisible(!childItems().isEmpty()); } @@ -160,27 +159,27 @@ void QQuickOverlay::itemChange(ItemChange change, const ItemChangeData &data) return; if (change == ItemChildAddedChange) { - if (QQuickPopup *prevPopup = d->popups.value(contentItem)) { - qmlInfo(popup).nospace() << "Popup is sharing item " << contentItem << " with " << prevPopup + if (QQuickPopup *prevPopup = d->popups.value(data.item)) { + qmlInfo(popup).nospace() << "Popup is sharing item " << data.item << " with " << prevPopup << ". This is not supported and strange things are about to happen."; return; } - d->popups.insert(contentItem, popup); + d->popups.insert(data.item, popup); if (popup->isModal()) ++d->modalPopups; connect(this, &QQuickOverlay::pressed, popup, &QQuickPopup::pressedOutside); connect(this, &QQuickOverlay::released, popup, &QQuickPopup::releasedOutside); } else if (change == ItemChildRemovedChange) { - Q_ASSERT(popup == d->popups.value(contentItem)); + Q_ASSERT(popup == d->popups.value(data.item)); disconnect(this, &QQuickOverlay::pressed, popup, &QQuickPopup::pressedOutside); disconnect(this, &QQuickOverlay::released, popup, &QQuickPopup::releasedOutside); if (popup->isModal()) --d->modalPopups; - d->popups.remove(contentItem); + d->popups.remove(data.item); } d->updateBackground(); diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index f3c87846..2da468d0 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -38,6 +38,7 @@ #include "qquickpopup_p_p.h" #include "qquickapplicationwindow_p.h" #include "qquickoverlay_p.h" + #include #include #include @@ -58,17 +59,15 @@ QT_BEGIN_NAMESPACE QQuickPopupPrivate::QQuickPopupPrivate() : QObjectPrivate() - , contentItem(Q_NULLPTR) - , overlay(Q_NULLPTR) , focus(false) , modal(false) + , contentItem(Q_NULLPTR) + , overlay(Q_NULLPTR) , enter(Q_NULLPTR) , exit(Q_NULLPTR) , transitionManager(this) -{ } - -QQuickPopupPrivate::~QQuickPopupPrivate() -{ } +{ +} void QQuickPopupPrivate::finalizeEnterTransition() { @@ -78,16 +77,18 @@ void QQuickPopupPrivate::finalizeEnterTransition() void QQuickPopupPrivate::finalizeExitTransition() { + Q_Q(QQuickPopup); overlay = Q_NULLPTR; contentItem->setParentItem(Q_NULLPTR); - emit q_func()->visibleChanged(); + emit q->visibleChanged(); } -QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *priv) +QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup) : QQuickTransitionManager() , state(Off) - , pp(priv) -{ } + , popup(popup) +{ +} void QQuickPopupTransitionManager::transitionEnter() { @@ -95,7 +96,7 @@ void QQuickPopupTransitionManager::transitionEnter() return; QList actions; state = Enter; - transition(actions, pp->enter, pp->contentItem); + transition(actions, popup->enter, popup->contentItem); } void QQuickPopupTransitionManager::transitionExit() @@ -104,15 +105,15 @@ void QQuickPopupTransitionManager::transitionExit() return; QList actions; state = Exit; - transition(actions, pp->exit, pp->contentItem); + transition(actions, popup->exit, popup->contentItem); } void QQuickPopupTransitionManager::finished() { if (state == Enter) - pp->finalizeEnterTransition(); + popup->finalizeEnterTransition(); else if (state == Exit) - pp->finalizeExitTransition(); + popup->finalizeExitTransition(); state = Off; } @@ -127,10 +128,6 @@ QQuickPopup::QQuickPopup(QQuickPopupPrivate &dd, QObject *parent) { } -QQuickPopup::~QQuickPopup() -{ -} - /*! \qmlmethod void Qt.labs.controls::Popup::open() @@ -149,33 +146,33 @@ void QQuickPopup::open() return; } - QQuickWindow *win = Q_NULLPTR; + QQuickWindow *window = Q_NULLPTR; QObject *p = parent(); - while (p && !win) { + while (p && !window) { if (QQuickItem *item = qobject_cast(p)) { - win = item->window(); - if (!win) + window = item->window(); + if (!window) p = item->parentItem(); } else { - win = qobject_cast(p); - if (!win) + window = qobject_cast(p); + if (!window) p = p->parent(); } } - if (!win) { + if (!window) { qmlInfo(this) << "cannot find any window to open popup in."; return; } - if (QQuickApplicationWindow *appWin = qobject_cast(win)) { - d->overlay = static_cast(appWin->overlay()); - d->contentItem->setParentItem(d->overlay); - } else { + QQuickApplicationWindow *applicationWindow = qobject_cast(window); + if (!applicationWindow) { // FIXME Maybe try to open it in that window somehow qmlInfo(this) << "is not in an ApplicationWindow."; return; } + d->overlay = static_cast(applicationWindow->overlay()); + d->contentItem->setParentItem(d->overlay); emit aboutToShow(); d->transitionManager.transitionEnter(); emit visibleChanged(); @@ -189,7 +186,6 @@ void QQuickPopup::open() void QQuickPopup::close() { Q_D(QQuickPopup); - if (!d->overlay) { // TODO This could mean we opened the popup item in a plain QQuickWindow qmlInfo(this) << "trying to close non-visible Popup."; diff --git a/src/templates/qquickpopup_p.h b/src/templates/qquickpopup_p.h index c8095609..d2c04316 100644 --- a/src/templates/qquickpopup_p.h +++ b/src/templates/qquickpopup_p.h @@ -69,7 +69,6 @@ class Q_LABSTEMPLATES_EXPORT QQuickPopup : public QObject public: explicit QQuickPopup(QObject *parent = Q_NULLPTR); - ~QQuickPopup(); QQuickItem *contentItem() const; void setContentItem(QQuickItem *item); @@ -88,6 +87,10 @@ public: QQuickTransition *exit() const; void setExit(QQuickTransition *transition); +public Q_SLOTS: + void open(); + void close(); + Q_SIGNALS: void contentItemChanged(); void focusChanged(); @@ -103,11 +106,6 @@ Q_SIGNALS: void aboutToShow(); void aboutToHide(); - -public Q_SLOTS: - void open(); - void close(); - protected: QQuickPopup(QQuickPopupPrivate &dd, QObject *parent); diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h index 900ced9b..b0c6d709 100644 --- a/src/templates/qquickpopup_p_p.h +++ b/src/templates/qquickpopup_p_p.h @@ -63,7 +63,8 @@ class QQuickOverlay; class QQuickPopupTransitionManager : public QQuickTransitionManager { public: - QQuickPopupTransitionManager(QQuickPopupPrivate *); + QQuickPopupTransitionManager(QQuickPopupPrivate *popup); + void transitionEnter(); void transitionExit(); @@ -76,7 +77,7 @@ private: }; TransitionState state; - QQuickPopupPrivate *pp; + QQuickPopupPrivate *popup; }; class QQuickPopupPrivate : public QObjectPrivate @@ -85,15 +86,14 @@ class QQuickPopupPrivate : public QObjectPrivate public: QQuickPopupPrivate(); - ~QQuickPopupPrivate(); void finalizeEnterTransition(); void finalizeExitTransition(); - QQuickItem *contentItem; - QQuickOverlay *overlay; bool focus; bool modal; + QQuickItem *contentItem; + QQuickOverlay *overlay; QQuickTransition *enter; QQuickTransition *exit; QQuickPopupTransitionManager transitionManager; -- cgit v1.2.3