diff options
20 files changed, 389 insertions, 8 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsitem.cpp b/src/declarative/graphicsitems/qmlgraphicsitem.cpp index fb6afb1..263aea5 100644 --- a/src/declarative/graphicsitems/qmlgraphicsitem.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsitem.cpp @@ -2307,7 +2307,7 @@ void QmlGraphicsItem::setBaselineOffset(qreal offset) Opacity is an \e inherited attribute. That is, the opacity is also applied individually to child items. In almost all cases this is what you want. If you can spot the issue in the following - example, you might need to use an opacity filter (not yet available) instead. + example, you might need to use an \l Opacity effect instead. \table \row diff --git a/src/declarative/util/qmlstate_p_p.h b/src/declarative/util/qmlstate_p_p.h index 095a7d2..75eb3fd 100644 --- a/src/declarative/util/qmlstate_p_p.h +++ b/src/declarative/util/qmlstate_p_p.h @@ -102,7 +102,30 @@ public: QString name; QmlBinding *when; - QmlConcreteList<QmlStateOperation *> operations; + + class OperationList; + struct OperationGuard : public QGuard<QmlStateOperation> + { + OperationGuard(QObject *obj, OperationList *l) : list(l) { (QGuard<QObject>&)*this = obj; } + OperationList *list; + void objectDestroyed(QmlStateOperation *) { + // we assume priv will always be destroyed after objectDestroyed calls + list->removeOne(*this); + } + }; + + typedef QList<OperationGuard> GuardedOpList; + class OperationList : public GuardedOpList, public QmlList<QmlStateOperation*> + { + public: + virtual void append(QmlStateOperation* v) { GuardedOpList::append(OperationGuard(v, this)); } + virtual void insert(int i, QmlStateOperation* v) { GuardedOpList::insert(i, OperationGuard(v, this)); } + virtual void clear() { GuardedOpList::clear(); } + virtual QmlStateOperation* at(int i) const { return GuardedOpList::at(i); } + virtual void removeAt(int i) { GuardedOpList::removeAt(i); } + virtual int count() const { return GuardedOpList::count(); } + }; + OperationList operations; QmlTransitionManager transitionManager; diff --git a/tests/auto/declarative/states/data/deleting.qml b/tests/auto/declarative/states/data/deleting.qml new file mode 100644 index 0000000..0c512dd --- /dev/null +++ b/tests/auto/declarative/states/data/deleting.qml @@ -0,0 +1,11 @@ +import Qt 4.6 +Rectangle { + id: MyRectangle + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { target: MyRectangle; color: "blue"; objectName: "pc1" } + PropertyChanges { target: MyRectangle; radius: 5; objectName: "pc2" } + } +} diff --git a/tests/auto/declarative/states/data/deletingState.qml b/tests/auto/declarative/states/data/deletingState.qml new file mode 100644 index 0000000..9dc46a6 --- /dev/null +++ b/tests/auto/declarative/states/data/deletingState.qml @@ -0,0 +1,13 @@ +import Qt 4.6 +Rectangle { + id: MyRectangle + width: 100; height: 100 + color: "red" + StateGroup { + id: stateGroup + states: State { + name: "blue" + PropertyChanges { target: MyRectangle; color: "blue" } + } + } +} diff --git a/tests/auto/declarative/states/tst_states.cpp b/tests/auto/declarative/states/tst_states.cpp index a4da1f1..4847535 100644 --- a/tests/auto/declarative/states/tst_states.cpp +++ b/tests/auto/declarative/states/tst_states.cpp @@ -44,6 +44,7 @@ #include <private/qmlgraphicsanchors_p_p.h> #include <private/qmlgraphicsrectangle_p.h> #include <private/qmlpropertychanges_p.h> +#include <private/qmlstategroup_p.h> class tst_states : public QObject { @@ -69,6 +70,8 @@ private slots: void explicitChanges(); void propertyErrors(); void incorrectRestoreBug(); + void deletingChange(); + void deletingState(); }; void tst_states::basicChanges() @@ -738,6 +741,68 @@ void tst_states::incorrectRestoreBug() QCOMPARE(rect->color(),QColor("green")); } +void tst_states::deletingChange() +{ + QmlEngine engine; + + QmlComponent rectComponent(&engine, SRCDIR "/data/deleting.qml"); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(rectComponent.create()); + QVERIFY(rect != 0); + + rect->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->radius(),qreal(5)); + + rect->setState(""); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->radius(),qreal(0)); + + QmlPropertyChanges *pc = rect->findChild<QmlPropertyChanges*>("pc1"); + QVERIFY(pc != 0); + delete pc; + + QmlState *state = rect->findChild<QmlState*>(); + QVERIFY(state != 0); + QCOMPARE(state->changes()->count(), 1); + + rect->setState("blue"); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->radius(),qreal(5)); + + delete rect; +} + +void tst_states::deletingState() +{ + QmlEngine engine; + + QmlComponent rectComponent(&engine, SRCDIR "/data/deletingState.qml"); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(rectComponent.create()); + QVERIFY(rect != 0); + + QmlStateGroup *sg = rect->findChild<QmlStateGroup*>(); + QVERIFY(sg != 0); + QVERIFY(sg->findState("blue") != 0); + + sg->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + sg->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + QmlState *state = rect->findChild<QmlState*>(); + QVERIFY(state != 0); + delete state; + + QVERIFY(sg->findState("blue") == 0); + + //### should we warn that state doesn't exist + sg->setState("blue"); + QCOMPARE(rect->color(),QColor("red")); + + delete rect; +} + QTEST_MAIN(tst_states) #include "tst_states.moc" diff --git a/tests/benchmarks/declarative/binding/binding.pro b/tests/benchmarks/declarative/binding/binding.pro index 26ee4fa..e25f186 100644 --- a/tests/benchmarks/declarative/binding/binding.pro +++ b/tests/benchmarks/declarative/binding/binding.pro @@ -2,6 +2,7 @@ load(qttest_p4) TEMPLATE = app TARGET = tst_binding QT += declarative +macx:CONFIG -= app_bundle SOURCES += tst_binding.cpp testtypes.cpp HEADERS += testtypes.h diff --git a/tests/benchmarks/declarative/binding/idproperty.txt b/tests/benchmarks/declarative/binding/idproperty.txt index 0a98e0d..71e3c4e 100644 --- a/tests/benchmarks/declarative/binding/idproperty.txt +++ b/tests/benchmarks/declarative/binding/idproperty.txt @@ -1,3 +1,5 @@ +import Test 1.0 + MyQmlObject { id: MyObject diff --git a/tests/benchmarks/declarative/binding/localproperty.txt b/tests/benchmarks/declarative/binding/localproperty.txt index 4694d99..c7ca0ef 100644 --- a/tests/benchmarks/declarative/binding/localproperty.txt +++ b/tests/benchmarks/declarative/binding/localproperty.txt @@ -1,3 +1,5 @@ +import Test 1.0 + MyQmlObject { result: ### } diff --git a/tests/benchmarks/declarative/binding/testtypes.cpp b/tests/benchmarks/declarative/binding/testtypes.cpp index 9dad523..892738c 100644 --- a/tests/benchmarks/declarative/binding/testtypes.cpp +++ b/tests/benchmarks/declarative/binding/testtypes.cpp @@ -40,4 +40,4 @@ ****************************************************************************/ #include "testtypes.h" -QML_DEFINE_TYPE(MyQmlObject, MyQmlObject); +QML_DEFINE_TYPE(Test, 1, 0, MyQmlObject, MyQmlObject); diff --git a/tests/benchmarks/declarative/creation/creation.pro b/tests/benchmarks/declarative/creation/creation.pro new file mode 100644 index 0000000..fcc2987 --- /dev/null +++ b/tests/benchmarks/declarative/creation/creation.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_creation +QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_creation.cpp + +DEFINES += SRCDIR=\\\"$$PWD\\\" + diff --git a/tests/benchmarks/declarative/creation/data/qobject.qml b/tests/benchmarks/declarative/creation/data/qobject.qml new file mode 100644 index 0000000..99d010f --- /dev/null +++ b/tests/benchmarks/declarative/creation/data/qobject.qml @@ -0,0 +1,4 @@ +import Qt 4.6 + +QtObject { +} diff --git a/tests/benchmarks/declarative/creation/tst_creation.cpp b/tests/benchmarks/declarative/creation/tst_creation.cpp new file mode 100644 index 0000000..99411d4 --- /dev/null +++ b/tests/benchmarks/declarative/creation/tst_creation.cpp @@ -0,0 +1,247 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QmlEngine> +#include <QmlComponent> +#include <QmlMetaType> +#include <QDebug> +#include <QGraphicsItem> +#include <private/qobject_p.h> + +class tst_creation : public QObject +{ + Q_OBJECT +public: + tst_creation() {} + +private slots: + void qobject_cpp(); + void qobject_qml(); + void qobject_qmltype(); + void qobject_alloc(); + + void objects_qmltype_data(); + void objects_qmltype(); + + void qgraphicsitem(); + void qgraphicsitem_tree(); + +private: + QmlEngine engine; +}; + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +void tst_creation::qobject_cpp() +{ + QBENCHMARK { + QObject *obj = new QObject; + delete obj; + } +} + +void tst_creation::qobject_qml() +{ + QmlComponent component(&engine, TEST_FILE("qobject.qml")); + QObject *obj = component.create(); + delete obj; + + QBENCHMARK { + QObject *obj = component.create(); + delete obj; + } +} + +void tst_creation::qobject_qmltype() +{ + QmlType *t = QmlMetaType::qmlType("Qt/QtObject", 4, 6); + + QBENCHMARK { + QObject *obj = t->create(); + delete obj; + } +} + +struct QObjectFakeData { + char data[sizeof(QObjectPrivate)]; +}; + +struct QObjectFake { + QObjectFake(); + virtual ~QObjectFake(); +private: + QObjectFakeData *d; +}; + +QObjectFake::QObjectFake() +{ + d = new QObjectFakeData; +} + +QObjectFake::~QObjectFake() +{ + delete d; +} + +void tst_creation::qobject_alloc() +{ + QBENCHMARK { + QObjectFake *obj = new QObjectFake; + delete obj; + } +} + +void tst_creation::objects_qmltype_data() +{ + QTest::addColumn<QByteArray>("type"); + + QList<QByteArray> types = QmlMetaType::qmlTypeNames(); + foreach (QByteArray type, types) + QTest::newRow(type.constData()) << type; +} + +void tst_creation::objects_qmltype() +{ + QFETCH(QByteArray, type); + QmlType *t = QmlMetaType::qmlType(type, 4, 6); + + QBENCHMARK { + QObject *obj = t->create(); + delete obj; + } +} + +class QGraphicsItemDummy : public QGraphicsItem +{ +public: + virtual QRectF boundingRect() const { return QRectF(); } + virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) {} +}; + +void tst_creation::qgraphicsitem() +{ + QBENCHMARK { + QGraphicsItemDummy *i1 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i2 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i3 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i4 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i5 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i6 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i7 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i8 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i9 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i10 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i11 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i12 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i13 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i14 = new QGraphicsItemDummy(); + + delete i1; + delete i2; + delete i3; + delete i4; + delete i5; + delete i6; + delete i7; + delete i8; + delete i9; + delete i10; + delete i11; + delete i12; + delete i13; + delete i14; + } +} + +void tst_creation::qgraphicsitem_tree() +{ + QBENCHMARK { + // i1 + // +-------------------------+ + // i2 i3 + // +-----------+ +-----+-----+ + // i4 i5 i6 i7 + // +----+ +--+ +--+--+ +----+ + // i8 i9 i10 i11 i12 i13 i14 + + QGraphicsItemDummy *i1 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i2 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i3 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i4 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i5 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i6 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i7 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i8 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i9 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i10 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i11 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i12 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i13 = new QGraphicsItemDummy(); + QGraphicsItemDummy *i14 = new QGraphicsItemDummy(); + + i14->setParentItem(i7); + i13->setParentItem(i7); + i12->setParentItem(i6); + i11->setParentItem(i6); + i10->setParentItem(i5); + i9->setParentItem(i4); + i8->setParentItem(i4); + + i7->setParentItem(i3); + i6->setParentItem(i3); + i5->setParentItem(i2); + i4->setParentItem(i2); + + i3->setParentItem(i1); + i2->setParentItem(i1); + + delete i1; + } +} + + +QTEST_MAIN(tst_creation) + +#include "tst_creation.moc" diff --git a/tests/benchmarks/declarative/pointers/pointers.pro b/tests/benchmarks/declarative/pointers/pointers.pro index fafdcd6..6de6e31 100644 --- a/tests/benchmarks/declarative/pointers/pointers.pro +++ b/tests/benchmarks/declarative/pointers/pointers.pro @@ -1,6 +1,7 @@ load(qttest_p4) TEMPLATE = app TARGET = tst_pointers +macx:CONFIG -= app_bundle SOURCES += tst_pointers.cpp diff --git a/tests/benchmarks/declarative/qmlcomponent/object.txt b/tests/benchmarks/declarative/qmlcomponent/object.txt index 85e74b9..0d2d49b 100644 --- a/tests/benchmarks/declarative/qmlcomponent/object.txt +++ b/tests/benchmarks/declarative/qmlcomponent/object.txt @@ -1,3 +1,3 @@ import Qt 4.6 -Object {} +QtObject {} diff --git a/tests/benchmarks/declarative/qmlcomponent/object_id.txt b/tests/benchmarks/declarative/qmlcomponent/object_id.txt index 526b6ad..69114af 100644 --- a/tests/benchmarks/declarative/qmlcomponent/object_id.txt +++ b/tests/benchmarks/declarative/qmlcomponent/object_id.txt @@ -1,6 +1,6 @@ import Qt 4.6 -Object { +QtObject { id: Blah } diff --git a/tests/benchmarks/declarative/qmlcomponent/qmlcomponent.pro b/tests/benchmarks/declarative/qmlcomponent/qmlcomponent.pro index 5f0cbe6..6a86f58 100644 --- a/tests/benchmarks/declarative/qmlcomponent/qmlcomponent.pro +++ b/tests/benchmarks/declarative/qmlcomponent/qmlcomponent.pro @@ -2,6 +2,7 @@ load(qttest_p4) TEMPLATE = app TARGET = tst_qmlcomponent QT += declarative +macx:CONFIG -= app_bundle SOURCES += tst_qmlcomponent.cpp testtypes.cpp HEADERS += testtypes.h diff --git a/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.2.txt b/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.2.txt index 90db37c..27c5646 100644 --- a/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.2.txt +++ b/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.2.txt @@ -1,6 +1,6 @@ import Qt 4.6 -Object { +QtObject { property int a property bool b property double c diff --git a/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.txt b/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.txt index bb5469a..d08f35b 100644 --- a/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.txt +++ b/tests/benchmarks/declarative/qmlcomponent/synthesized_properties.txt @@ -1,5 +1,5 @@ import Qt 4.6 -Object { +QtObject { property int a } diff --git a/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp b/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp index 8350211..56d20c6 100644 --- a/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp +++ b/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp @@ -40,4 +40,4 @@ ****************************************************************************/ #include "testtypes.h" -QML_DEFINE_TYPE(Qt/test, 4, 6, 6, MyQmlObject, MyQmlObject); +QML_DEFINE_TYPE(Qt.test, 4, 6, MyQmlObject, MyQmlObject); diff --git a/tests/benchmarks/declarative/qmlmetaproperty/qmlmetaproperty.pro b/tests/benchmarks/declarative/qmlmetaproperty/qmlmetaproperty.pro index b4e83d7..c18a56b 100644 --- a/tests/benchmarks/declarative/qmlmetaproperty/qmlmetaproperty.pro +++ b/tests/benchmarks/declarative/qmlmetaproperty/qmlmetaproperty.pro @@ -2,6 +2,7 @@ load(qttest_p4) TEMPLATE = app TARGET = tst_qmlmetaproperty QT += declarative +macx:CONFIG -= app_bundle SOURCES += tst_qmlmetaproperty.cpp |