diff options
author | Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> | 2015-06-24 17:50:09 +0200 |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com> | 2015-06-26 08:36:10 +0000 |
commit | 6ee9612bdcbe6c59cf9b3a0381f03943f5350b67 (patch) | |
tree | 41cf8833a573d95745549d50009c89cdbb626c4d | |
parent | d88d9d63422c086417e8cc1935f8d3376043f845 (diff) |
StackView: Allow empty or null transitions
We also swallow mouse events while the transitions are running.
Change-Id: Iee0344877e3c56fbe464abcd9d3234178de36e3d
Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
-rw-r--r-- | src/controls/qquickstackview.cpp | 6 | ||||
-rw-r--r-- | src/controls/qquickstackview_p.cpp | 52 | ||||
-rw-r--r-- | src/controls/qquickstackview_p.h | 1 | ||||
-rw-r--r-- | src/controls/qquickstackview_p_p.h | 1 |
4 files changed, 37 insertions, 23 deletions
diff --git a/src/controls/qquickstackview.cpp b/src/controls/qquickstackview.cpp index 71d02c59..663253a4 100644 --- a/src/controls/qquickstackview.cpp +++ b/src/controls/qquickstackview.cpp @@ -497,6 +497,12 @@ void QQuickStackView::geometryChanged(const QRectF &newGeometry, const QRectF &o } } +bool QQuickStackView::childMouseEventFilter(QQuickItem *, QEvent *) +{ + // busy should be true if this function gets called + return true; +} + void QQuickStackAttachedPrivate::init() { QQuickItem *item = qobject_cast<QQuickItem *>(parent); diff --git a/src/controls/qquickstackview_p.cpp b/src/controls/qquickstackview_p.cpp index fc152a36..8e5be7e4 100644 --- a/src/controls/qquickstackview_p.cpp +++ b/src/controls/qquickstackview_p.cpp @@ -377,7 +377,6 @@ void QQuickStackViewPrivate::ensureTransitioner() void QQuickStackViewPrivate::popTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, bool immediate) { - Q_Q(QQuickStackView); if (exit) { exit->setStatus(QQuickStackView::Deactivating); exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, true); @@ -387,21 +386,21 @@ void QQuickStackViewPrivate::popTransition(QQuickStackElement *enter, QQuickStac enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); } - if (exit && exit->prepareTransition(transitioner, viewBounds)) { - if (immediate) + if (exit) { + if (immediate || !exit->prepareTransition(transitioner, viewBounds)) completeTransition(exit, transitioner->removeTransition); else exit->startTransition(transitioner); } - if (enter && enter->prepareTransition(transitioner, viewBounds)) { - if (immediate) + if (enter) { + if (immediate || !enter->prepareTransition(transitioner, viewBounds)) completeTransition(enter, transitioner->removeDisplacedTransition); else enter->startTransition(transitioner); } if (!immediate) - emit q->busyChanged(); + setBusy(true); if (transitioner) transitioner->resetTargetLists(); @@ -409,7 +408,6 @@ void QQuickStackViewPrivate::popTransition(QQuickStackElement *enter, QQuickStac void QQuickStackViewPrivate::pushTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, bool immediate) { - Q_Q(QQuickStackView); if (enter) { enter->setStatus(QQuickStackView::Activating); enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); @@ -419,21 +417,21 @@ void QQuickStackViewPrivate::pushTransition(QQuickStackElement *enter, QQuickSta exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); } - if (enter && enter->prepareTransition(transitioner, viewBounds)) { - if (immediate) + if (enter) { + if (immediate || !enter->prepareTransition(transitioner, viewBounds)) completeTransition(enter, transitioner->addTransition); else enter->startTransition(transitioner); } - if (exit && exit->prepareTransition(transitioner, viewBounds)) { - if (immediate) + if (exit) { + if (immediate || !exit->prepareTransition(transitioner, viewBounds)) completeTransition(exit, transitioner->addDisplacedTransition); else exit->startTransition(transitioner); } if (!immediate) - emit q->busyChanged(); + setBusy(true); if (transitioner) transitioner->resetTargetLists(); @@ -441,7 +439,6 @@ void QQuickStackViewPrivate::pushTransition(QQuickStackElement *enter, QQuickSta void QQuickStackViewPrivate::replaceTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, bool immediate) { - Q_Q(QQuickStackView); if (enter) { enter->setStatus(QQuickStackView::Activating); enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); @@ -452,21 +449,21 @@ void QQuickStackViewPrivate::replaceTransition(QQuickStackElement *enter, QQuick exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); } - if (enter && enter->prepareTransition(transitioner, viewBounds)) { - if (immediate) + if (enter) { + if (immediate || !enter->prepareTransition(transitioner, viewBounds)) completeTransition(enter, transitioner->addTransition); else enter->startTransition(transitioner); } - if (exit && exit->prepareTransition(transitioner, viewBounds)) { - if (immediate) + if (exit) { + if (immediate || !exit->prepareTransition(transitioner, viewBounds)) completeTransition(exit, transitioner->addDisplacedTransition); else exit->startTransition(transitioner); } if (!immediate) - emit q->busyChanged(); + setBusy(true); if (transitioner) transitioner->resetTargetLists(); @@ -488,20 +485,29 @@ void QQuickStackViewPrivate::completeTransition(QQuickStackElement *element, QQu void QQuickStackViewPrivate::viewItemTransitionFinished(QQuickItemViewTransitionableItem *transitionable) { - Q_Q(QQuickStackView); - QQuickStackElement *element = static_cast<QQuickStackElement *>(transitionable); if (element->status == QQuickStackView::Activating) { element->setStatus(QQuickStackView::Active); } else if (element->status == QQuickStackView::Deactivating) { element->setStatus(QQuickStackView::Inactive); - element->item->setVisible(false); if (element->removal || element->isPendingRemoval()) delete element; } - if (transitioner->runningJobs.isEmpty()) - emit q->busyChanged(); + if (transitioner->runningJobs.isEmpty()) { + int i = elements.count() - 1; + while (--i > 0) + if (QQuickItem *item = elements[i]->item) + item->setVisible(false); + setBusy(false); + } +} + +void QQuickStackViewPrivate::setBusy(bool busy) +{ + Q_Q(QQuickStackView); + q->setFiltersChildMouseEvents(busy); + emit q->busyChanged(); } QT_END_NAMESPACE diff --git a/src/controls/qquickstackview_p.h b/src/controls/qquickstackview_p.h index 19ffd28c..a4e719c2 100644 --- a/src/controls/qquickstackview_p.h +++ b/src/controls/qquickstackview_p.h @@ -137,6 +137,7 @@ Q_SIGNALS: protected: void componentComplete() Q_DECL_OVERRIDE; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + bool childMouseEventFilter(QQuickItem *, QEvent *) Q_DECL_OVERRIDE; private: Q_DISABLE_COPY(QQuickStackView) diff --git a/src/controls/qquickstackview_p_p.h b/src/controls/qquickstackview_p_p.h index 46046519..753950e6 100644 --- a/src/controls/qquickstackview_p_p.h +++ b/src/controls/qquickstackview_p_p.h @@ -127,6 +127,7 @@ public: void completeTransition(QQuickStackElement *element, QQuickTransition *transition); void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item) Q_DECL_OVERRIDE; + void setBusy(bool busy); QVariant initialItem; QQuickItem *currentItem; |