aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/quicktemplates2/qquickdrawer.cpp18
-rw-r--r--src/quicktemplates2/qquickdrawer_p_p.h6
-rw-r--r--src/quicktemplates2/qquickpopup.cpp74
-rw-r--r--src/quicktemplates2/qquickpopup_p_p.h16
4 files changed, 54 insertions, 60 deletions
diff --git a/src/quicktemplates2/qquickdrawer.cpp b/src/quicktemplates2/qquickdrawer.cpp
index 44fc8f50..15b53914 100644
--- a/src/quicktemplates2/qquickdrawer.cpp
+++ b/src/quicktemplates2/qquickdrawer.cpp
@@ -360,28 +360,18 @@ static QList<QQuickStateAction> prepareTransition(QQuickDrawer *drawer, QQuickTr
return actions;
}
-void QQuickDrawerPrivate::prepareEnterTransition(bool notify)
+bool QQuickDrawerPrivate::prepareEnterTransition()
{
Q_Q(QQuickDrawer);
enterActions = prepareTransition(q, enter, 1.0);
- QQuickPopupPrivate::prepareEnterTransition(notify);
+ return QQuickPopupPrivate::prepareEnterTransition();
}
-void QQuickDrawerPrivate::prepareExitTransition()
+bool QQuickDrawerPrivate::prepareExitTransition()
{
Q_Q(QQuickDrawer);
exitActions = prepareTransition(q, exit, 0.0);
- QQuickPopupPrivate::prepareExitTransition();
-}
-
-void QQuickDrawerPrivate::finalizeEnterTransition()
-{
- QQuickPopupPrivate::finalizeEnterTransition();
-}
-
-void QQuickDrawerPrivate::finalizeExitTransition(bool hide)
-{
- QQuickPopupPrivate::finalizeExitTransition(hide);
+ return QQuickPopupPrivate::prepareExitTransition();
}
QQuickDrawer::QQuickDrawer(QObject *parent) :
diff --git a/src/quicktemplates2/qquickdrawer_p_p.h b/src/quicktemplates2/qquickdrawer_p_p.h
index e8add86c..f14c36dd 100644
--- a/src/quicktemplates2/qquickdrawer_p_p.h
+++ b/src/quicktemplates2/qquickdrawer_p_p.h
@@ -77,10 +77,8 @@ public:
bool handleMouseMoveEvent(QQuickItem *item, QMouseEvent *event);
bool handleMouseReleaseEvent(QQuickItem *item, QMouseEvent *event);
- void prepareEnterTransition(bool notify = true) override;
- void prepareExitTransition() override;
- void finalizeEnterTransition() override;
- void finalizeExitTransition(bool hide = true) override;
+ bool prepareEnterTransition() override;
+ bool prepareExitTransition() override;
Qt::Edge edge;
qreal offset;
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)
diff --git a/src/quicktemplates2/qquickpopup_p_p.h b/src/quicktemplates2/qquickpopup_p_p.h
index 80cb8522..b828edc1 100644
--- a/src/quicktemplates2/qquickpopup_p_p.h
+++ b/src/quicktemplates2/qquickpopup_p_p.h
@@ -76,11 +76,6 @@ protected:
void finished() override;
private:
- enum TransitionState {
- Off, Enter, Exit
- };
-
- TransitionState state;
QQuickPopupPrivate *popup;
};
@@ -163,10 +158,10 @@ public:
bool tryClose(QQuickItem *item, QMouseEvent *event);
virtual void reposition();
- virtual void prepareEnterTransition(bool notify = true);
- virtual void prepareExitTransition();
+ virtual bool prepareEnterTransition();
+ virtual bool prepareExitTransition();
virtual void finalizeEnterTransition();
- virtual void finalizeExitTransition(bool hide = true);
+ virtual void finalizeExitTransition();
QMarginsF getMargins() const;
@@ -178,6 +173,10 @@ public:
void setWindow(QQuickWindow *window);
void itemDestroyed(QQuickItem *item) override;
+ enum TransitionState {
+ NoTransition, EnterTransition, ExitTransition
+ };
+
bool focus;
bool modal;
bool dim;
@@ -202,6 +201,7 @@ public:
qreal bottomMargin;
qreal contentWidth;
qreal contentHeight;
+ TransitionState transitionState;
QQuickPopup::ClosePolicy closePolicy;
QQuickItem *parentItem;
QQuickItem *dimmer;