aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>2015-06-24 17:50:09 +0200
committerGabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>2015-06-26 08:36:10 +0000
commit6ee9612bdcbe6c59cf9b3a0381f03943f5350b67 (patch)
tree41cf8833a573d95745549d50009c89cdbb626c4d
parentd88d9d63422c086417e8cc1935f8d3376043f845 (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.cpp6
-rw-r--r--src/controls/qquickstackview_p.cpp52
-rw-r--r--src/controls/qquickstackview_p.h1
-rw-r--r--src/controls/qquickstackview_p_p.h1
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;