inProgressCreations++;
- Q_ASSERT(i.isLoading());
- i.statusChanged(i.status());
+ p->changeStatus(QDeclarativeIncubator::Loading);
if (mode == QDeclarativeIncubator::Synchronous) {
QDeclarativeVME::Interrupt i;
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)
{
}
bool guardOk = vmeGuard.isOK();
vmeGuard.clear();
- QDeclarativeIncubator::Status oldStatus = q->status();
-
if (!guardOk) {
QDeclarativeError error;
error.setUrl(component->url);
else
progress = QDeclarativeIncubatorPrivate::Completed;
- QDeclarativeIncubator::Status newStatus = q->status();
-
- if (oldStatus != newStatus) {
- q->statusChanged(newStatus);
- oldStatus = newStatus;
- }
+ changeStatus(calculateStatus());
if (watcher.hasRecursed())
return;
enginePriv->inProgressCreations--;
- QDeclarativeIncubator::Status newStatus = q->status();
- if (newStatus != oldStatus) {
- q->statusChanged(newStatus);
- oldStatus = newStatus;
- }
+ changeStatus(calculateStatus());
if (0 == enginePriv->inProgressCreations) {
while (enginePriv->erroredBindings) {
}
}
+ d->changeStatus(Null);
}
/*!
*/
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;
}
/*!
{
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;
+}
+
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());
}
{
+ QDeclarativeComponent component(&engine, TEST_FILE("statusChanged.qml"));
+ QVERIFY(component.isReady());
+
MyIncubator incubator(QDeclarativeIncubator::Asynchronous);
component.create(incubator);
QVERIFY(incubator.isLoading());
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()