diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-26 13:49:59 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-02 13:49:30 +0000 |
commit | 86b0a55103076517f227589b1c18609ce6fc04f9 (patch) | |
tree | 1fafa20f9264f7a7ee3dfe2ecfa02d712393c0e7 /src/templates/qquickpopup.cpp | |
parent | 1e77bf8467cc3c5919019eb2a65a3da4a1229837 (diff) |
QQuickPopup: allow subclasses to prepare/finalize transitions
This allows QQuickDrawer prepare the transitions so that "position" is
is set as the default target property, and finalize the transtitions so
that the drawer remains visible on the window edge, and will be able to
handle overlay events.
Change-Id: I0afedb3d10c37c68a19df926c0224dacf39dd8ce
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/templates/qquickpopup.cpp')
-rw-r--r-- | src/templates/qquickpopup.cpp | 101 |
1 files changed, 62 insertions, 39 deletions
diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index b4683cff..35185cef 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -105,6 +105,7 @@ QQuickPopupPrivate::QQuickPopupPrivate() : QObjectPrivate() , focus(false) , modal(false) + , visible(false) , complete(false) , hasTopMargin(false) , hasLeftMargin(false) @@ -160,17 +161,60 @@ bool QQuickPopupPrivate::tryClose(QQuickItem *item, QMouseEvent *event) return false; } +void QQuickPopupPrivate::prepareEnterTransition(bool notify) +{ + Q_Q(QQuickPopup); + QQuickWindow *quickWindow = q->window(); + if (!quickWindow) { + qmlInfo(q) << "cannot find any window to open popup in."; + return; + } + + QQuickApplicationWindow *applicationWindow = qobject_cast<QQuickApplicationWindow*>(quickWindow); + if (!applicationWindow) { + quickWindow->installEventFilter(q); + popupItem->setZ(10001); // DefaultWindowDecoration+1 + popupItem->setParentItem(quickWindow->contentItem()); + } else { + popupItem->setParentItem(applicationWindow->overlay()); + } + + if (notify) + emit q->aboutToShow(); + visible = true; + popupItem->setVisible(true); + positioner.setParentItem(parentItem); + emit q->visibleChanged(); +} + +void QQuickPopupPrivate::prepareExitTransition() +{ + Q_Q(QQuickPopup); + QQuickWindow *quickWindow = q->window(); + if (quickWindow && !qobject_cast<QQuickApplicationWindow *>(quickWindow)) + quickWindow->removeEventFilter(q); + if (focus) + popupItem->setFocus(false); + emit q->aboutToHide(); +} + void QQuickPopupPrivate::finalizeEnterTransition() { if (focus) popupItem->setFocus(true); } -void QQuickPopupPrivate::finalizeExitTransition() +void QQuickPopupPrivate::finalizeExitTransition(bool hide) { + Q_Q(QQuickPopup); positioner.setParentItem(nullptr); - popupItem->setParentItem(nullptr); - popupItem->setVisible(false); + if (hide) { + popupItem->setParentItem(nullptr); + popupItem->setVisible(false); + } + + visible = false; + emit q->visibleChanged(); } QMarginsF QQuickPopupPrivate::getMargins() const @@ -355,9 +399,6 @@ void QQuickPopupItem::itemChange(ItemChange change, const ItemChangeData &data) Q_D(QQuickPopupItem); QQuickControl::itemChange(change, data); switch (change) { - case ItemVisibleHasChanged: - emit d->popup->visibleChanged(); - break; case ItemActiveFocusHasChanged: emit d->popup->activeFocusChanged(); break; @@ -547,18 +588,20 @@ void QQuickPopupTransitionManager::transitionEnter() { if (state == Enter && isRunning()) return; - QList<QQuickStateAction> actions; + state = Enter; - transition(actions, popup->enter, popup->popupItem); + popup->prepareEnterTransition(); + transition(popup->enterActions, popup->enter, popup->q_func()); } void QQuickPopupTransitionManager::transitionExit() { if (state == Exit && isRunning()) return; - QList<QQuickStateAction> actions; + state = Exit; - transition(actions, popup->exit, popup->popupItem); + popup->prepareExitTransition(); + transition(popup->exitActions, popup->exit, popup->q_func()); } void QQuickPopupTransitionManager::finished() @@ -600,28 +643,11 @@ QQuickPopup::~QQuickPopup() void QQuickPopup::open() { Q_D(QQuickPopup); - if (d->popupItem->isVisible()) - return; - - QQuickWindow *quickWindow = window(); - if (!quickWindow) { - qmlInfo(this) << "cannot find any window to open popup in."; + if (d->visible) return; - } - QQuickApplicationWindow *applicationWindow = qobject_cast<QQuickApplicationWindow*>(quickWindow); - if (!applicationWindow) { - quickWindow->installEventFilter(this); - d->popupItem->setZ(10001); // DefaultWindowDecoration+1 - d->popupItem->setParentItem(quickWindow->contentItem()); - } else { - d->popupItem->setParentItem(applicationWindow->overlay()); - } - - emit aboutToShow(); - d->popupItem->setVisible(true); - d->positioner.setParentItem(d->parentItem); - d->transitionManager.transitionEnter(); + if (d->complete) + d->transitionManager.transitionEnter(); } /*! @@ -632,16 +658,11 @@ void QQuickPopup::open() void QQuickPopup::close() { Q_D(QQuickPopup); - if (!d->popupItem->isVisible()) + if (!d->visible) return; - QQuickWindow *quickWindow = window(); - if (quickWindow && !qobject_cast<QQuickApplicationWindow *>(quickWindow)) - quickWindow->removeEventFilter(this); - - d->popupItem->setFocus(false); - emit aboutToHide(); - d->transitionManager.transitionExit(); + if (d->complete) + d->transitionManager.transitionExit(); } /*! @@ -1344,7 +1365,7 @@ void QQuickPopup::setModal(bool modal) bool QQuickPopup::isVisible() const { Q_D(const QQuickPopup); - return d->popupItem->isVisible(); + return d->visible && d->popupItem->isVisible(); } void QQuickPopup::setVisible(bool visible) @@ -1512,6 +1533,8 @@ void QQuickPopup::componentComplete() d->complete = true; if (!parentItem()) setParentItem(qobject_cast<QQuickItem *>(parent())); + if (d->visible) + d->transitionManager.transitionEnter(); } bool QQuickPopup::isComponentComplete() const |