aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickstackview.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-02-24 12:58:56 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-02-24 12:14:21 +0000
commit398691d74e9a2bc944a4816ebc78d0beef780fec (patch)
treebcf9f989cec3084b0cbe005a835e4039597c4c96 /src/quicktemplates2/qquickstackview.cpp
parentec1f70c4c58b923ff50eb4adc36c88e5a6611281 (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/qquickstackview.cpp')
-rw-r--r--src/quicktemplates2/qquickstackview.cpp8
1 files changed, 6 insertions, 2 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),