diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-02-24 12:58:56 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-02-24 12:14:21 +0000 |
commit | 398691d74e9a2bc944a4816ebc78d0beef780fec (patch) | |
tree | bcf9f989cec3084b0cbe005a835e4039597c4c96 /src/quicktemplates2 | |
parent | ec1f70c4c58b923ff50eb4adc36c88e5a6611281 (diff) |
QQuickStackView: fix pop/replace exit leak
QQuickStackView did not keep track of the element that was exiting
the view during a pop/replace exit transition, but it was expecting
viewItemTransitionFinished() to be called and cleaned up the element
there. If a pop/replace exit transition was running at the destruction
time, QQuickStackView did not clean up the element at all (because it
had been already removed from the internal stack of elements) and thus
the transition was left running.
Task-number: QTBUG-59034
Change-Id: I3cd7c761fab79574b9a7cc849788f36765def45b
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r-- | src/quicktemplates2/qquickstackview.cpp | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview_p.cpp | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview_p_p.h | 4 |
3 files changed, 14 insertions, 6 deletions
diff --git a/src/quicktemplates2/qquickstackview.cpp b/src/quicktemplates2/qquickstackview.cpp index cf2b5a66..83a26e4f 100644 --- a/src/quicktemplates2/qquickstackview.cpp +++ b/src/quicktemplates2/qquickstackview.cpp @@ -310,7 +310,8 @@ QQuickStackView::~QQuickStackView() d->transitioner->setChangeListener(nullptr); delete d->transitioner; } - qDeleteAll(d->removals); + qDeleteAll(d->removing); + qDeleteAll(d->removed); qDeleteAll(d->elements); } @@ -599,6 +600,7 @@ void QQuickStackView::pop(QQmlV4Function *args) if (d->popElements(enter)) { if (exit) { exit->removal = true; + d->removing.insert(exit); previousItem = exit->item; } emit depthChanged(); @@ -742,8 +744,10 @@ void QQuickStackView::replace(QQmlV4Function *args) if (exit != target ? d->replaceElements(target, elements) : d->pushElements(elements)) { if (depth != d->elements.count()) emit depthChanged(); - if (exit) + if (exit) { exit->removal = true; + d->removing.insert(exit); + } QQuickStackElement *enter = d->elements.top(); d->startTransition(QQuickStackTransition::replaceExit(operation, exit, this), QQuickStackTransition::replaceEnter(operation, enter, this), diff --git a/src/quicktemplates2/qquickstackview_p.cpp b/src/quicktemplates2/qquickstackview_p.cpp index 34301c2d..fd367f08 100644 --- a/src/quicktemplates2/qquickstackview_p.cpp +++ b/src/quicktemplates2/qquickstackview_p.cpp @@ -249,14 +249,16 @@ void QQuickStackViewPrivate::viewItemTransitionFinished(QQuickItemViewTransition element->setStatus(QQuickStackView::Inactive); element->setVisible(false); if (element->removal || element->isPendingRemoval()) - removals += element; + removed += element; } if (transitioner->runningJobs.isEmpty()) { - qDeleteAll(removals); - removals.clear(); + qDeleteAll(removed); + removed.clear(); setBusy(false); } + + removing.remove(element); } void QQuickStackViewPrivate::setBusy(bool b) diff --git a/src/quicktemplates2/qquickstackview_p_p.h b/src/quicktemplates2/qquickstackview_p_p.h index 39a9ba9b..ca610153 100644 --- a/src/quicktemplates2/qquickstackview_p_p.h +++ b/src/quicktemplates2/qquickstackview_p_p.h @@ -53,6 +53,7 @@ #include <QtQuick/private/qquickitemviewtransition_p.h> #include <QtQuick/private/qquickitemchangelistener_p.h> #include <QtQml/private/qv4value_p.h> +#include <QtCore/qset.h> QT_BEGIN_NAMESPACE @@ -92,7 +93,8 @@ public: bool busy; QVariant initialItem; QQuickItem *currentItem; - QList<QQuickStackElement*> removals; + QSet<QQuickStackElement*> removing; + QList<QQuickStackElement*> removed; QStack<QQuickStackElement *> elements; QQuickItemViewTransitioner *transitioner; }; |