aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/templates/qquickpopup.cpp101
-rw-r--r--src/templates/qquickpopup_p_p.h11
2 files changed, 71 insertions, 41 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
diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h
index 0f8f4d7c..efb95bff 100644
--- a/src/templates/qquickpopup_p_p.h
+++ b/src/templates/qquickpopup_p_p.h
@@ -158,8 +158,10 @@ public:
bool tryClose(QQuickItem *item, QMouseEvent *event);
virtual void reposition();
- void finalizeEnterTransition();
- void finalizeExitTransition();
+ virtual void prepareEnterTransition(bool notify = true);
+ virtual void prepareExitTransition();
+ virtual void finalizeEnterTransition();
+ virtual void finalizeExitTransition(bool hide = true);
QMarginsF getMargins() const;
@@ -170,6 +172,7 @@ public:
bool focus;
bool modal;
+ bool visible;
bool complete;
bool hasTopMargin;
bool hasLeftMargin;
@@ -190,7 +193,11 @@ public:
QQuickTransition *exit;
QQuickPopupItem *popupItem;
QQuickPopupPositioner positioner;
+ QList<QQuickStateAction> enterActions;
+ QList<QQuickStateAction> exitActions;
QQuickPopupTransitionManager transitionManager;
+
+ friend class QQuickPopupTransitionManager;
};
QT_END_NAMESPACE