aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickpopup.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-09-06 09:21:15 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-09-06 15:20:10 +0000
commit9ae57848671419b2622e254af8642fef7b1b7c33 (patch)
treed25df980ee418ecd2fe09312873b42ab8691f677 /src/quicktemplates2/qquickpopup.cpp
parentbc0fdae8fad4e199792b3f00ebcb74bd80473227 (diff)
QQuickDrawer: fix the internal transition state
When QQuickDrawer was visible all the time, it did not emit the visibility related signals at all. Now the signals are emitted, but aboutToShow() and visibleChanged() were emitted twice when a drawer was manually dragged open. First time when the dragging begins (the drawer becomes effectively visible), and second time when the open transition begins after mouse/touch release. This change ensures that the signals won't be emitted again when the transition begins, in case they were already emitted. Change-Id: I2a175c9e86a480d5cd23e306f41f0d85e2416f75 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickpopup.cpp')
-rw-r--r--src/quicktemplates2/qquickpopup.cpp74
1 files changed, 40 insertions, 34 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp
index 6d06708b..0eab6ad5 100644
--- a/src/quicktemplates2/qquickpopup.cpp
+++ b/src/quicktemplates2/qquickpopup.cpp
@@ -143,6 +143,7 @@ QQuickPopupPrivate::QQuickPopupPrivate()
, bottomMargin(0)
, contentWidth(0)
, contentHeight(0)
+ , transitionState(QQuickPopupPrivate::NoTransition)
, closePolicy(QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside)
, parentItem(nullptr)
, dimmer(nullptr)
@@ -180,33 +181,46 @@ bool QQuickPopupPrivate::tryClose(QQuickItem *item, QMouseEvent *event)
return false;
}
-void QQuickPopupPrivate::prepareEnterTransition(bool notify)
+bool QQuickPopupPrivate::prepareEnterTransition()
{
Q_Q(QQuickPopup);
if (!window) {
qmlInfo(q) << "cannot find any window to open popup in.";
- return;
+ return false;
}
- popupItem->setParentItem(QQuickOverlay::overlay(window));
- if (notify)
+ if (transitionState == EnterTransition && transitionManager.isRunning())
+ return false;
+
+ if (transitionState != EnterTransition) {
+ popupItem->setParentItem(QQuickOverlay::overlay(window));
emit q->aboutToShow();
- visible = notify;
- popupItem->setVisible(true);
- positioner.setParentItem(parentItem);
- emit q->visibleChanged();
+ visible = true;
+ transitionState = EnterTransition;
+ popupItem->setVisible(true);
+ positioner.setParentItem(parentItem);
+ emit q->visibleChanged();
+ }
+ return true;
}
-void QQuickPopupPrivate::prepareExitTransition()
+bool QQuickPopupPrivate::prepareExitTransition()
{
Q_Q(QQuickPopup);
- if (focus) {
- // The setFocus(false) call below removes any active focus before we're
- // able to check it in finalizeExitTransition.
- hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus();
- popupItem->setFocus(false);
+ if (transitionState == ExitTransition && transitionManager.isRunning())
+ return false;
+
+ if (transitionState != ExitTransition) {
+ if (focus) {
+ // The setFocus(false) call below removes any active focus before we're
+ // able to check it in finalizeExitTransition.
+ hadActiveFocusBeforeExitTransition = popupItem->hasActiveFocus();
+ popupItem->setFocus(false);
+ }
+ transitionState = ExitTransition;
+ emit q->aboutToHide();
}
- emit q->aboutToHide();
+ return true;
}
void QQuickPopupPrivate::finalizeEnterTransition()
@@ -214,17 +228,16 @@ void QQuickPopupPrivate::finalizeEnterTransition()
Q_Q(QQuickPopup);
if (focus)
popupItem->setFocus(true);
+ transitionState = NoTransition;
emit q->opened();
}
-void QQuickPopupPrivate::finalizeExitTransition(bool hide)
+void QQuickPopupPrivate::finalizeExitTransition()
{
Q_Q(QQuickPopup);
- if (hide) {
- positioner.setParentItem(nullptr);
- popupItem->setParentItem(nullptr);
- popupItem->setVisible(false);
- }
+ positioner.setParentItem(nullptr);
+ popupItem->setParentItem(nullptr);
+ popupItem->setVisible(false);
if (hadActiveFocusBeforeExitTransition) {
QQuickApplicationWindow *applicationWindow = qobject_cast<QQuickApplicationWindow*>(window);
@@ -235,6 +248,7 @@ void QQuickPopupPrivate::finalizeExitTransition(bool hide)
}
visible = false;
+ transitionState = NoTransition;
hadActiveFocusBeforeExitTransition = false;
emit q->visibleChanged();
emit q->closed();
@@ -713,19 +727,15 @@ bool QQuickPopupPositioner::isAncestor(QQuickItem *item) const
}
QQuickPopupTransitionManager::QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
- : QQuickTransitionManager()
- , state(Off)
- , popup(popup)
+ : QQuickTransitionManager(), popup(popup)
{
}
void QQuickPopupTransitionManager::transitionEnter()
{
- if (state == Enter && isRunning())
+ if (!popup->prepareEnterTransition())
return;
- state = Enter;
- popup->prepareEnterTransition();
if (popup->window)
transition(popup->enterActions, popup->enter, popup->q_func());
else
@@ -734,11 +744,9 @@ void QQuickPopupTransitionManager::transitionEnter()
void QQuickPopupTransitionManager::transitionExit()
{
- if (state == Exit && isRunning())
+ if (!popup->prepareExitTransition())
return;
- state = Exit;
- popup->prepareExitTransition();
if (popup->window)
transition(popup->exitActions, popup->exit, popup->q_func());
else
@@ -747,12 +755,10 @@ void QQuickPopupTransitionManager::transitionExit()
void QQuickPopupTransitionManager::finished()
{
- if (state == Enter)
+ if (popup->transitionState == QQuickPopupPrivate::EnterTransition)
popup->finalizeEnterTransition();
- else if (state == Exit)
+ else if (popup->transitionState == QQuickPopupPrivate::ExitTransition)
popup->finalizeExitTransition();
-
- state = Off;
}
QQuickPopup::QQuickPopup(QObject *parent)