aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-26 13:49:59 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-02 13:49:30 +0000
commit86b0a55103076517f227589b1c18609ce6fc04f9 (patch)
tree1fafa20f9264f7a7ee3dfe2ecfa02d712393c0e7 /src
parent1e77bf8467cc3c5919019eb2a65a3da4a1229837 (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')
-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