From: Aaron Kennedy Date: Fri, 14 Oct 2011 01:45:09 +0000 (+1000) Subject: QDeclarativeIncubator wasn't calling statusChanged() for nested cases X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=5774a1c6c3e85290ed634427c9bef444c543190b;p=konrad%2Fqtdeclarative.git QDeclarativeIncubator wasn't calling statusChanged() for nested cases Change-Id: I1811951bdcdd69d4ad1643ed54a8ea097fa718b5 Reviewed-on: http://codereview.qt-project.org/6638 Reviewed-by: Martin Jones Reviewed-by: Aaron Kennedy --- diff --git a/src/declarative/qml/qdeclarativeincubator.cpp b/src/declarative/qml/qdeclarativeincubator.cpp index 9644d3a..c771a6d 100644 --- a/src/declarative/qml/qdeclarativeincubator.cpp +++ b/src/declarative/qml/qdeclarativeincubator.cpp @@ -81,8 +81,7 @@ void QDeclarativeEnginePrivate::incubate(QDeclarativeIncubator &i, QDeclarativeC inProgressCreations++; - Q_ASSERT(i.isLoading()); - i.statusChanged(i.status()); + p->changeStatus(QDeclarativeIncubator::Loading); if (mode == QDeclarativeIncubator::Synchronous) { QDeclarativeVME::Interrupt i; @@ -122,7 +121,8 @@ QDeclarativeIncubationController *QDeclarativeEngine::incubationController() con QDeclarativeIncubatorPrivate::QDeclarativeIncubatorPrivate(QDeclarativeIncubator *q, QDeclarativeIncubator::IncubationMode m) -: q(q), mode(m), progress(Execute), result(0), component(0), vme(this), waitingOnMe(0) +: q(q), status(QDeclarativeIncubator::Null), mode(m), progress(Execute), result(0), component(0), + vme(this), waitingOnMe(0) { } @@ -250,8 +250,6 @@ void QDeclarativeIncubatorPrivate::incubate(QDeclarativeVME::Interrupt &i) bool guardOk = vmeGuard.isOK(); vmeGuard.clear(); - QDeclarativeIncubator::Status oldStatus = q->status(); - if (!guardOk) { QDeclarativeError error; error.setUrl(component->url); @@ -290,12 +288,7 @@ void QDeclarativeIncubatorPrivate::incubate(QDeclarativeVME::Interrupt &i) else progress = QDeclarativeIncubatorPrivate::Completed; - QDeclarativeIncubator::Status newStatus = q->status(); - - if (oldStatus != newStatus) { - q->statusChanged(newStatus); - oldStatus = newStatus; - } + changeStatus(calculateStatus()); if (watcher.hasRecursed()) return; @@ -324,11 +317,7 @@ finishIncubate: enginePriv->inProgressCreations--; - QDeclarativeIncubator::Status newStatus = q->status(); - if (newStatus != oldStatus) { - q->statusChanged(newStatus); - oldStatus = newStatus; - } + changeStatus(calculateStatus()); if (0 == enginePriv->inProgressCreations) { while (enginePriv->erroredBindings) { @@ -548,6 +537,7 @@ void QDeclarativeIncubator::clear() } } + d->changeStatus(Null); } /*! @@ -619,11 +609,7 @@ Return the current status of the incubator. */ QDeclarativeIncubator::Status QDeclarativeIncubator::status() const { - if (!d->errors.isEmpty()) return Error; - else if (d->result && d->progress == QDeclarativeIncubatorPrivate::Completed && - d->waitingFor.isEmpty()) return Ready; - else if (d->component) return Loading; - else return Null; + return d->status; } /*! @@ -658,3 +644,26 @@ void QDeclarativeIncubator::setInitialState(QObject *object) { Q_UNUSED(object); } + +void QDeclarativeIncubatorPrivate::changeStatus(QDeclarativeIncubator::Status s) +{ + if (s == status) + return; + + status = s; + q->statusChanged(status); +} + +QDeclarativeIncubator::Status QDeclarativeIncubatorPrivate::calculateStatus() const +{ + if (!errors.isEmpty()) + return QDeclarativeIncubator::Error; + else if (result && progress == QDeclarativeIncubatorPrivate::Completed && + waitingFor.isEmpty()) + return QDeclarativeIncubator::Ready; + else if (component) + return QDeclarativeIncubator::Loading; + else + return QDeclarativeIncubator::Null; +} + diff --git a/src/declarative/qml/qdeclarativeincubator_p.h b/src/declarative/qml/qdeclarativeincubator_p.h index d45f6d1..b17dbe8 100644 --- a/src/declarative/qml/qdeclarativeincubator_p.h +++ b/src/declarative/qml/qdeclarativeincubator_p.h @@ -70,6 +70,10 @@ public: QDeclarativeIncubator *q; + QDeclarativeIncubator::Status calculateStatus() const; + void changeStatus(QDeclarativeIncubator::Status); + QDeclarativeIncubator::Status status; + QDeclarativeIncubator::IncubationMode mode; QList errors; diff --git a/tests/auto/declarative/qdeclarativeincubator/data/statusChanged.nested.qml b/tests/auto/declarative/qdeclarativeincubator/data/statusChanged.nested.qml new file mode 100644 index 0000000..3a496ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativeincubator/data/statusChanged.nested.qml @@ -0,0 +1,12 @@ +import QtQuick 2.0 + +QtObject { + id: root + + property bool test: false + + Component.onCompleted: { + var c = Qt.createComponent("statusChanged.qml"); + c.incubateObject(root, null, Qt.Synchronous); + } +} diff --git a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp index 224426e..672387e 100644 --- a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp @@ -488,10 +488,10 @@ void tst_qdeclarativeincubator::statusChanged() virtual void setInitialState(QObject *) { statuses << -1; } }; + { QDeclarativeComponent component(&engine, TEST_FILE("statusChanged.qml")); QVERIFY(component.isReady()); - { MyIncubator incubator(QDeclarativeIncubator::Synchronous); component.create(incubator); QVERIFY(incubator.isReady()); @@ -503,6 +503,9 @@ void tst_qdeclarativeincubator::statusChanged() } { + QDeclarativeComponent component(&engine, TEST_FILE("statusChanged.qml")); + QVERIFY(component.isReady()); + MyIncubator incubator(QDeclarativeIncubator::Asynchronous); component.create(incubator); QVERIFY(incubator.isLoading()); @@ -520,6 +523,29 @@ void tst_qdeclarativeincubator::statusChanged() QCOMPARE(incubator.statuses.at(2), int(QDeclarativeIncubator::Ready)); delete incubator.object(); } + + { + QDeclarativeComponent component2(&engine, TEST_FILE("statusChanged.nested.qml")); + QVERIFY(component2.isReady()); + + MyIncubator incubator(QDeclarativeIncubator::Asynchronous); + component2.create(incubator); + QVERIFY(incubator.isLoading()); + QCOMPARE(incubator.statuses.count(), 1); + QCOMPARE(incubator.statuses.at(0), int(QDeclarativeIncubator::Loading)); + + { + bool b = true; + controller.incubateWhile(&b); + } + + QVERIFY(incubator.isReady()); + QCOMPARE(incubator.statuses.count(), 3); + QCOMPARE(incubator.statuses.at(0), int(QDeclarativeIncubator::Loading)); + QCOMPARE(incubator.statuses.at(1), -1); + QCOMPARE(incubator.statuses.at(2), int(QDeclarativeIncubator::Ready)); + delete incubator.object(); + } } void tst_qdeclarativeincubator::asynchronousIfNested()