diff options
19 files changed, 242 insertions, 615 deletions
diff --git a/demos/declarative/flickr/common/ImageDetails.qml b/demos/declarative/flickr/common/ImageDetails.qml deleted file mode 100644 index 862eeb1..0000000 --- a/demos/declarative/flickr/common/ImageDetails.qml +++ /dev/null @@ -1,160 +0,0 @@ -import Qt 4.6 -import org.webkit 1.0 - -Flipable { - id: container - - property var frontContainer: containerFront - property string photoTitle: "" - property string photoDescription: "" - property string photoTags: "" - property int photoWidth - property int photoHeight - property string photoType - property string photoAuthor - property string photoDate - property string photoUrl - property int rating: 2 - property var prevScale: 1.0 - - signal closed - - transform: Rotation { - id: detailsRotation - origin.y: container.height / 2; - origin.x: container.width / 2; - axis.y: 1; axis.z: 0 - } - - front: Item { - id: containerFront; anchors.fill: container - - Rectangle { - anchors.fill: parent - color: "black"; opacity: 0.4 - border.color: "white"; border.width: 2 - } - - MediaButton { - id: backButton; x: 630; y: 370; text: "Back" - onClicked: { container.closed() } - } - - MediaButton { - id: moreButton; x: 530; y: 370; text: "View..." - onClicked: { container.state='Back' } - } - - Text { id: titleText; style: Text.Raised; styleColor: "black"; color: "white"; elide: Text.ElideRight - x: 220; y: 30; width: parent.width - 240; text: container.photoTitle; font.pointSize: 22 } - - LikeOMeter { x: 40; y: 250; rating: container.rating } - - Flickable { id: flickable; x: 220; width: 480; height: 210; y: 130; clip: true - contentWidth: 480; contentHeight: descriptionText.height - - WebView { id: descriptionText; width: parent.width - html: "<style TYPE=\"text/css\">body {color: white;} a:link {color: cyan; text-decoration: underline; }</style>" + container.photoDescription } - } - - Text { id: size; color: "white"; width: 300; x: 40; y: 300 - text: "<b>Size:</b> " + container.photoWidth + 'x' + container.photoHeight } - Text { id: type; color: "white"; width: 300; x: 40; anchors.top: size.bottom - text: "<b>Type:</b> " + container.photoType } - - Text { id: author; color: "white"; width: 300; x: 220; y: 80 - text: "<b>Author:</b> " + container.photoAuthor } - Text { id: date; color: "white"; width: 300; x: 220; anchors.top: author.bottom - text: "<b>Published:</b> " + container.photoDate } - Text { id: tagsLabel; color: "white"; x: 220; anchors.top: date.bottom; - text: container.photoTags == "" ? "" : "<b>Tags:</b> " } - Text { id: tags; color: "white"; width: parent.width-x-20; - anchors.left: tagsLabel.right; anchors.top: date.bottom; - elide: Text.ElideRight; text: container.photoTags } - - ScrollBar { id: scrollBar; x: 720; y: flickable.y; width: 7; height: flickable.height; opacity: 0; - flickableArea: flickable; clip: true } - } - - back: Item { - anchors.fill: container - - Rectangle { anchors.fill: parent; color: "black"; opacity: 0.4; border.color: "white"; border.width: 2 } - - Progress { anchors.centerIn: parent; width: 200; height: 18; progress: bigImage.progress; visible: bigImage.status!=1 } - Flickable { - id: flick; width: container.width - 10; height: container.height - 10 - x: 5; y: 5; clip: true; - contentWidth: imageContainer.width; contentHeight: imageContainer.height - - Item { - id: imageContainer - width: Math.max(bigImage.width * bigImage.scale, flick.width); - height: Math.max(bigImage.height * bigImage.scale, flick.height); - - Image { - id: bigImage; source: container.photoUrl; scale: slider.value - anchors.centerIn: parent; - smooth: !flick.moving - onStatusChanged : { - // Default scale shows the entire image. - if (status == 1 && width != 0) { - slider.minimum = Math.min(flick.width / width, flick.height / height); - prevScale = Math.min(slider.minimum, 1); - slider.value = prevScale; - } - } - } - } - } - - MediaButton { - id: backButton2; x: 630; y: 370; text: "Back"; onClicked: { container.state = '' } - } - Text { - text: "Image Unavailable" - visible: bigImage.status == 'Error' - anchors.centerIn: parent; color: "white"; font.bold: true - } - - Slider { - id: slider; x: 25; y: 374; visible: { bigImage.status == 1 && maximum > minimum } - onValueChanged: { - if (bigImage.width * value > flick.width) { - var xoff = (flick.width/2 + flick.contentX) * value / prevScale; - flick.contentX = xoff - flick.width/2; - } - if (bigImage.height * value > flick.height) { - var yoff = (flick.height/2 + flick.contentY) * value / prevScale; - flick.contentY = yoff - flick.height/2; - } - prevScale = value; - } - } - } - - states: [ - State { - name: "Back" - PropertyChanges { target: detailsRotation; angle: 180 } - } - ] - - transitions: [ - Transition { - SequentialAnimation { - PropertyAction { - target: bigImage - property: "smooth" - value: false - } - NumberAnimation { easing.type: "InOutQuad"; properties: "angle"; duration: 500 } - PropertyAction { - target: bigImage - property: "smooth" - value: !flick.moving - } - } - } - ] -} diff --git a/demos/declarative/flickr/common/MediaButton.qml b/demos/declarative/flickr/common/MediaButton.qml deleted file mode 100644 index 86ac948..0000000 --- a/demos/declarative/flickr/common/MediaButton.qml +++ /dev/null @@ -1,41 +0,0 @@ -import Qt 4.6 - -Item { - id: container - - signal clicked - - property string text - - Image { - id: buttonImage - source: "pics/button.png" - } - Image { - id: pressed - source: "pics/button-pressed.png" - opacity: 0 - } - MouseArea { - id: mouseRegion - anchors.fill: buttonImage - onClicked: { container.clicked(); } - } - Text { - font.bold: true - color: "white" - anchors.centerIn: buttonImage - text: container.text - } - width: buttonImage.width - states: [ - State { - name: "Pressed" - when: mouseRegion.pressed == true - PropertyChanges { - target: pressed - opacity: 1 - } - } - ] -} diff --git a/demos/declarative/flickr/common/MediaLineEdit.qml b/demos/declarative/flickr/common/MediaLineEdit.qml deleted file mode 100644 index 9559f6a..0000000 --- a/demos/declarative/flickr/common/MediaLineEdit.qml +++ /dev/null @@ -1,104 +0,0 @@ -import Qt 4.6 - -Item { - id: container - - property string label - property string text - - width: Math.max(94,labeltext.width + editor.width + 20) - height: buttonImage.height - - states: [ - State { - name: "Edit" - PropertyChanges { - target: labeltext - text: container.label + ": " - } - PropertyChanges { - target: labeltext - x: 10 - } - PropertyChanges { - target: editor - cursorVisible: true - width: 100 - } - PropertyChanges { - target: container - focus: true - } - StateChangeScript { - script:editor.selectAll() - } - }, - State { - // When returning to default state, typed text is propagated - StateChangeScript { - script: container.text = editor.text - } - } - ] - transitions: [ - Transition { - NumberAnimation { properties: "x,width"; duration: 500; easing.type: "InOutQuad" } - } - ] - - - BorderImage { - id: buttonImage - source: "pics/button.sci" - anchors.left: container.left - anchors.right: container.right - } - - BorderImage { - id: pressed - source: "pics/button-pressed.sci" - opacity: 0 - anchors.left: container.left - anchors.right: container.right - } - - MouseArea { - id: mouseRegion - anchors.fill: buttonImage - onClicked: { container.state = container.state=="Edit" ? "" : "Edit" } - states: [ - State { - when: mouseRegion.pressed == true - PropertyChanges { - target: pressed - opacity: 1 - } - } - ] - } - - Text { - id: labeltext - font.bold: true - color: "white" - anchors.verticalCenter: container.verticalCenter - x: (container.width - width)/2 - text: container.label + "..." - } - - TextInput { - id: editor - font.bold: true - color: "white" - selectionColor: "green" - width: 0 - clip: true - anchors.left: labeltext.right - anchors.verticalCenter: container.verticalCenter - } - Keys.forwardTo: [(returnKey), (editor)] - Item { - id: returnKey - Keys.onReturnPressed: "container.state = ''" - } -} diff --git a/demos/declarative/flickr/flickr-mobile-90.qml b/demos/declarative/flickr/flickr-90.qml index 9fec242..1d1ac40 100644 --- a/demos/declarative/flickr/flickr-mobile-90.qml +++ b/demos/declarative/flickr/flickr-90.qml @@ -6,6 +6,6 @@ Item { Loader { y: 320; rotation: -90 transformOrigin: Item.TopLeft - source: "flickr-mobile.qml" + source: "flickr.qml" } } diff --git a/demos/declarative/flickr/flickr-desktop.qml b/demos/declarative/flickr/flickr-desktop.qml deleted file mode 100644 index 63b6ea2..0000000 --- a/demos/declarative/flickr/flickr-desktop.qml +++ /dev/null @@ -1,194 +0,0 @@ -import Qt 4.6 - -import "common" - -Item { - id: mainWindow; width: 800; height: 450 - - property bool showPathView : false - - resources: [ - Component { - id: photoDelegate - Item { - id: wrapper; width: 85; height: 85 - scale: wrapper.PathView.scale ? wrapper.PathView.scale : 1 - z: wrapper.PathView.z ? wrapper.PathView.z : 0 - - transform: Rotation { - id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2 - axis.y: 1; axis.z: 0 - angle: wrapper.PathView.angle ? wrapper.PathView.angle : 0 - } - - Connections { - target: imageDetails - onClosed: { - if (wrapper.state == 'Details') { - wrapper.state = ''; - imageDetails.photoUrl = ""; - } - } - } - - function photoClicked() { - imageDetails.photoTitle = title; - imageDetails.photoDescription = description; - imageDetails.photoTags = tags; - imageDetails.photoWidth = photoWidth; - imageDetails.photoHeight = photoHeight; - imageDetails.photoType = photoType; - imageDetails.photoAuthor = photoAuthor; - imageDetails.photoDate = photoDate; - imageDetails.photoUrl = url; - imageDetails.rating = 0; - wrapper.state = "Details"; - } - - Rectangle { - id: whiteRect; anchors.fill: parent; color: "white"; radius: 5 - - Loading { x: 26; y: 26; visible: thumb.status!=1 } - Image { id: thumb; source: imagePath; x: 5; y: 5 } - - Item { - id: shadows - Image { source: "common/pics/shadow-right.png"; x: whiteRect.width; height: whiteRect.height } - Image { source: "common/pics/shadow-bottom.png"; y: whiteRect.height; width: whiteRect.width } - Image { id: corner; source: "common/pics/shadow-corner.png"; x: whiteRect.width; y: whiteRect.height } - } - } - - MouseArea { anchors.fill: wrapper; onClicked: { photoClicked() } } - - states: [ - State { - name: "Details" - PropertyChanges { target: imageDetails; z: 2 } - ParentChange { target: wrapper; parent: imageDetails.frontContainer } - PropertyChanges { target: wrapper; x: 45; y: 35; scale: 1; z: 1000 } - PropertyChanges { target: itemRotation; angle: 0 } - PropertyChanges { target: shadows; opacity: 0 } - PropertyChanges { target: imageDetails; y: 20 } - PropertyChanges { target: photoGridView; y: -480 } - PropertyChanges { target: photoPathView; y: -480 } - PropertyChanges { target: viewModeButton; opacity: 0 } - PropertyChanges { target: tagsEdit; opacity: 0 } - PropertyChanges { target: fetchButton; opacity: 0 } - PropertyChanges { target: categoryText; y: "-50" } - } - ] - - transitions: [ - Transition { - from: "*"; to: "Details" - SequentialAnimation { - ParentAnimation { - NumberAnimation { properties: "x,y,scale,opacity,angle"; duration: 500; easing.type: "InOutQuad" } - } - } - }, - Transition { - from: "Details"; to: "*" - SequentialAnimation { - ParentAnimation { - NumberAnimation { properties: "x,y,scale,opacity,angle"; duration: 500; easing.type: "InOutQuad" } - } - PropertyAction { targets: wrapper; properties: "z" } - } - } - ] - - } - } - ] - - Item { - id: background - - anchors.fill: parent - - Image { source: "common/pics/background.png"; anchors.fill: parent } - RssModel { id: rssModel; tags : tagsEdit.text } - Loading { anchors.centerIn: parent; visible: rssModel.status == 2 } - - GridView { - id: photoGridView; model: rssModel; delegate: photoDelegate; cacheBuffer: 100 - cellWidth: 105; cellHeight: 105; x:32; y: 80; width: 800; height: 330; z: 1 - } - - PathView { - id: photoPathView; model: rssModel; delegate: photoDelegate - y: -380; width: 800; height: 330; pathItemCount: 10; z: 1 - path: Path { - startX: -50; startY: 40; - - PathAttribute { name: "scale"; value: 1 } - PathAttribute { name: "angle"; value: -45 } - - PathCubic { - x: 400; y: 220 - control1X: 140; control1Y: 40 - control2X: 210; control2Y: 220 - } - - PathAttribute { name: "scale"; value: 1.2 } - PathAttribute { name: "z"; value: 1 } - PathAttribute { name: "angle"; value: 0 } - - PathCubic { - x: 850; y: 40 - control2X: 660; control2Y: 40 - control1X: 590; control1Y: 220 - } - - PathAttribute { name: "scale"; value: 1 } - PathAttribute { name: "angle"; value: 45 } - } - - } - - ImageDetails { id: imageDetails; width: 750; x: 25; y: 500; height: 410 } - - MediaButton { - id: viewModeButton; x: 680; y: 410; text: "View Mode" - onClicked: { if (mainWindow.showPathView == true) mainWindow.showPathView = false; else mainWindow.showPathView = true } - } - - MediaButton { - id: fetchButton - text: "Update" - anchors.right: viewModeButton.left; anchors.rightMargin: 5 - anchors.top: viewModeButton.top - onClicked: { rssModel.reload(); } - } - - MediaLineEdit { - id: tagsEdit; - label: "Tags" - anchors.right: fetchButton.left; anchors.rightMargin: 5 - anchors.top: viewModeButton.top - } - - states: State { - name: "PathView" - when: mainWindow.showPathView == true - PropertyChanges { target: photoPathView; y: 80 } - PropertyChanges { target: photoGridView; y: -380 } - } - - transitions: [ - Transition { - from: "*"; to: "*" - NumberAnimation { properties: "y"; duration: 1000; easing.type: "OutBounce"; easing.amplitude: 0.5 } - } - ] - } - - Text { - id: categoryText; anchors.horizontalCenter: parent.horizontalCenter; y: 15; - text: "Flickr - " + - (rssModel.tags=="" ? "Uploads from everyone" : "Recent Uploads tagged " + rssModel.tags) - font.pointSize: 20; font.bold: true; color: "white"; style: Text.Raised; styleColor: "black" - } -} diff --git a/demos/declarative/flickr/flickr-mobile.qml b/demos/declarative/flickr/flickr.qml index 21e4c49..21e4c49 100644 --- a/demos/declarative/flickr/flickr-mobile.qml +++ b/demos/declarative/flickr/flickr.qml diff --git a/examples/declarative/gestures/experimental-gestures.qml b/examples/declarative/gestures/experimental-gestures.qml index 914d403..5f904aa 100644 --- a/examples/declarative/gestures/experimental-gestures.qml +++ b/examples/declarative/gestures/experimental-gestures.qml @@ -8,6 +8,7 @@ Rectangle { GestureArea { anchors.fill: parent + focus: true // Only some of the many gesture properties are shown. See Gesture documentation. diff --git a/src/declarative/3rdparty/qlistmodelinterface.cpp b/src/declarative/3rdparty/qlistmodelinterface.cpp index 20501a0..98d6a5b 100644 --- a/src/declarative/3rdparty/qlistmodelinterface.cpp +++ b/src/declarative/3rdparty/qlistmodelinterface.cpp @@ -106,10 +106,4 @@ QT_BEGIN_NAMESPACE \a roles changed. */ -/*! \fn void QListModelInterface::modelReset() - Emit this signal when all of the model data has changed. - This is more efficient than forcing the receivier to handle multiple - inserted and removed signals etc. -*/ - QT_END_NAMESPACE diff --git a/src/declarative/3rdparty/qlistmodelinterface_p.h b/src/declarative/3rdparty/qlistmodelinterface_p.h index da91d12..07592ad 100644 --- a/src/declarative/3rdparty/qlistmodelinterface_p.h +++ b/src/declarative/3rdparty/qlistmodelinterface_p.h @@ -72,7 +72,6 @@ class Q_DECLARATIVE_EXPORT QListModelInterface : public QObject void itemsRemoved(int index, int count); void itemsMoved(int from, int to, int count); void itemsChanged(int index, int count, const QList<int> &roles); - void modelReset(); protected: QListModelInterface(QObjectPrivate &dd, QObject *parent) diff --git a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp index 174459b..dfd9c0c 100644 --- a/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp +++ b/src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp @@ -662,7 +662,6 @@ void QDeclarativeVisualDataModel::setModel(const QVariant &model) this, SLOT(_q_itemsRemoved(int,int))); QObject::disconnect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)), this, SLOT(_q_itemsMoved(int,int,int))); - QObject::disconnect(d->m_listModelInterface, SIGNAL(modelReset()), this, SLOT(_q_modelReset())); d->m_listModelInterface = 0; } else if (d->m_abstractItemModel) { QObject::disconnect(d->m_abstractItemModel, SIGNAL(rowsInserted(const QModelIndex &,int,int)), @@ -706,7 +705,6 @@ void QDeclarativeVisualDataModel::setModel(const QVariant &model) this, SLOT(_q_itemsRemoved(int,int))); QObject::connect(d->m_listModelInterface, SIGNAL(itemsMoved(int,int,int)), this, SLOT(_q_itemsMoved(int,int,int))); - QObject::connect(d->m_listModelInterface, SIGNAL(modelReset()), this, SLOT(_q_modelReset())); d->m_metaDataCacheable = true; if (d->m_delegate && d->m_listModelInterface->count()) emit itemsInserted(0, d->m_listModelInterface->count()); diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp index 53143d5..07b0798 100644 --- a/src/declarative/qml/qdeclarativecompiledbindings.cpp +++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp @@ -137,7 +137,7 @@ public: Subscription *subscriptions; QScriptDeclarativeClass::PersistentIdentifier *identifiers; - void run(Binding *); + void run(Binding *, QDeclarativePropertyPrivate::WriteFlags flags); const char *programData; Binding *m_bindings; @@ -147,7 +147,7 @@ public: void init(); void run(int instr, QDeclarativeContextData *context, - QDeclarativeDelayedError *error, QObject *scope, QObject *output); + QDeclarativeDelayedError *error, QObject *scope, QObject *output, QDeclarativePropertyPrivate::WriteFlags storeFlags); inline void unsubscribe(int subIndex); @@ -246,9 +246,9 @@ int QDeclarativeCompiledBindingsPrivate::Binding::propertyIndex() return property & 0xFFFF; } -void QDeclarativeCompiledBindingsPrivate::Binding::update(QDeclarativePropertyPrivate::WriteFlags) +void QDeclarativeCompiledBindingsPrivate::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags) { - parent->run(this); + parent->run(this, flags); } void QDeclarativeCompiledBindingsPrivate::Binding::destroy() @@ -270,13 +270,13 @@ int QDeclarativeCompiledBindings::qt_metacall(QMetaObject::Call c, int id, void quint32 count = *reeval; ++reeval; for (quint32 ii = 0; ii < count; ++ii) { - d->run(d->m_bindings + reeval[ii]); + d->run(d->m_bindings + reeval[ii], QDeclarativePropertyPrivate::DontRemoveBinding); } } return -1; } -void QDeclarativeCompiledBindingsPrivate::run(Binding *binding) +void QDeclarativeCompiledBindingsPrivate::run(Binding *binding, QDeclarativePropertyPrivate::WriteFlags flags) { Q_Q(QDeclarativeCompiledBindings); @@ -319,12 +319,11 @@ void QDeclarativeCompiledBindingsPrivate::run(Binding *binding) vt->read(binding->target, binding->property & 0xFFFF); QObject *target = vt; - run(binding->index, context, binding, binding->scope, target); + run(binding->index, context, binding, binding->scope, target, flags); - vt->write(binding->target, binding->property & 0xFFFF, - QDeclarativePropertyPrivate::DontRemoveBinding); + vt->write(binding->target, binding->property & 0xFFFF, flags); } else { - run(binding->index, context, binding, binding->scope, binding->target); + run(binding->index, context, binding, binding->scope, binding->target, flags); } binding->updating = false; } @@ -1085,14 +1084,13 @@ static void dumpInstruction(const Instr *instr) void QDeclarativeCompiledBindingsPrivate::run(int instrIndex, QDeclarativeContextData *context, QDeclarativeDelayedError *error, - QObject *scope, QObject *output) + QObject *scope, QObject *output, QDeclarativePropertyPrivate::WriteFlags storeFlags) { Q_Q(QDeclarativeCompiledBindings); error->removeError(); Register registers[32]; - int storeFlags = 0; QDeclarativeEnginePrivate *engine = QDeclarativeEnginePrivate::get(context->engine); Program *program = (Program *)programData; diff --git a/src/declarative/qml/qdeclarativecompositetypemanager.cpp b/src/declarative/qml/qdeclarativecompositetypemanager.cpp index 55723ea..61978a4 100644 --- a/src/declarative/qml/qdeclarativecompositetypemanager.cpp +++ b/src/declarative/qml/qdeclarativecompositetypemanager.cpp @@ -633,10 +633,12 @@ int QDeclarativeCompositeTypeManager::resolveTypes(QDeclarativeCompositeTypeData // - type with unknown namespace (UnknownNamespace.SomeType {}) QDeclarativeError error; error.setUrl(unit->imports.baseUrl()); + QString userTypeName = QString::fromUtf8(typeName); + userTypeName.replace('/','.'); if (typeNamespace) - error.setDescription(tr("Namespace %1 cannot be used as a type").arg(QString::fromUtf8(typeName))); + error.setDescription(tr("Namespace %1 cannot be used as a type").arg(userTypeName)); else - error.setDescription(tr("%1 is not a type").arg(QString::fromUtf8(typeName))); + error.setDescription(tr("%1 is not a type").arg(userTypeName)); if (!parserRef->refObjects.isEmpty()) { QDeclarativeParser::Object *obj = parserRef->refObjects.first(); error.setLine(obj->location.start.line); diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index e8b6913..f5fe140 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -1620,6 +1620,18 @@ public: url.chop(1); } + if (vmaj > -1 && vmin > -1 && !qmldircomponents.isEmpty()) { + QList<QDeclarativeDirParser::Component>::ConstIterator it = qmldircomponents.begin(); + for (; it != qmldircomponents.end(); ++it) { + if (it->majorVersion > vmaj || (it->majorVersion == vmaj && it->minorVersion >= vmin)) + break; + } + if (it == qmldircomponents.end()) { + *errorString = QDeclarativeEngine::tr("module \"%1\" version %2.%3 is not installed").arg(uri_arg).arg(vmaj).arg(vmin); + return false; + } + } + s->uris.prepend(uri); s->urls.prepend(url); s->majversions.prepend(vmaj); diff --git a/src/declarative/util/qdeclarativexmllistmodel.cpp b/src/declarative/util/qdeclarativexmllistmodel.cpp index 11c7305..b33af06 100644 --- a/src/declarative/util/qdeclarativexmllistmodel.cpp +++ b/src/declarative/util/qdeclarativexmllistmodel.cpp @@ -878,22 +878,21 @@ void QDeclarativeXmlListModel::queryCompleted(const QDeclarativeXmlQueryResult & } } if (!hasKeys) { - if (!(origCount == 0 && d->size == 0)) - emit modelReset(); + if (!(origCount == 0 && d->size == 0)) { + emit itemsRemoved(0, origCount); + emit itemsInserted(0, d->size); + emit countChanged(); + } } else { - if (result.removed.count() == 1 && result.removed[0].first == 0 - && result.removed[0].second == origCount) { - emit modelReset(); - } else { - for (int i=0; i<result.removed.count(); i++) - emit itemsRemoved(result.removed[i].first, result.removed[i].second); - for (int i=0; i<result.inserted.count(); i++) - emit itemsInserted(result.inserted[i].first, result.inserted[i].second); - if (sizeChanged) - emit countChanged(); - } + for (int i=0; i<result.removed.count(); i++) + emit itemsRemoved(result.removed[i].first, result.removed[i].second); + for (int i=0; i<result.inserted.count(); i++) + emit itemsInserted(result.inserted[i].first, result.inserted[i].second); + + if (sizeChanged) + emit countChanged(); } emit statusChanged(d->status); diff --git a/src/declarative/util/qdeclarativexmllistmodel_p.h b/src/declarative/util/qdeclarativexmllistmodel_p.h index fd410a7..7b85476 100644 --- a/src/declarative/util/qdeclarativexmllistmodel_p.h +++ b/src/declarative/util/qdeclarativexmllistmodel_p.h @@ -124,7 +124,6 @@ Q_SIGNALS: void xmlChanged(); void queryChanged(); void namespaceDeclarationsChanged(); - void modelReset(); public Q_SLOTS: // ### need to use/expose Expiry to guess when to call this? diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/startup.qml b/tests/auto/declarative/qdeclarativebehaviors/data/startup.qml new file mode 100644 index 0000000..f3ff620 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/startup.qml @@ -0,0 +1,17 @@ +import Qt 4.7 + +Rectangle { + width: 400 + height: 400 + + Rectangle { + objectName: "innerRect" + height: 100; width: 100; color: "green" + property real targetX: 100 + + x: targetX + Behavior on x { + NumberAnimation {} + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp index 26c8231..4c9c9ca 100644 --- a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp +++ b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp @@ -68,6 +68,7 @@ private slots: void reassignedAnimation(); void disabled(); void dontStart(); + void startup(); }; void tst_qdeclarativebehaviors::simpleBehavior() @@ -326,6 +327,21 @@ void tst_qdeclarativebehaviors::dontStart() delete rect; } +void tst_qdeclarativebehaviors::startup() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/startup.qml")); + QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *innerRect = rect->findChild<QDeclarativeRectangle*>("innerRect"); + QVERIFY(innerRect); + + QCOMPARE(innerRect->x(), qreal(100)); //should be set immediately + + delete rect; +} + QTEST_MAIN(tst_qdeclarativebehaviors) #include "tst_qdeclarativebehaviors.moc" diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp index 722e161..dcd72d2 100644 --- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp +++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp @@ -136,7 +136,7 @@ private slots: private: QDeclarativeEngine engine; - void testType(const QString& qml, const QString& type); + void testType(const QString& qml, const QString& type, const QString& error); }; #define VERIFY_ERRORS(errorfile) \ @@ -1069,7 +1069,7 @@ void tst_qdeclarativelanguage::declaredPropertyValues() } // Check that first child of qml is of given type. Empty type insists on error. -void tst_qdeclarativelanguage::testType(const QString& qml, const QString& type) +void tst_qdeclarativelanguage::testType(const QString& qml, const QString& type, const QString& expectederror) { QDeclarativeComponent component(&engine); component.setData(qml.toUtf8(), TEST_FILE("empty.qml")); // just a file for relative local imports @@ -1078,6 +1078,13 @@ void tst_qdeclarativelanguage::testType(const QString& qml, const QString& type) if (type.isEmpty()) { QVERIFY(component.isError()); + QString actualerror; + foreach (const QDeclarativeError e, component.errors()) { + if (!actualerror.isEmpty()) + actualerror.append("; "); + actualerror.append(e.description()); + } + QCOMPARE(actualerror,expectederror); } else { VERIFY_ERRORS(0); QObject *object = component.create(); @@ -1097,156 +1104,199 @@ void tst_qdeclarativelanguage::importsBuiltin_data() QTest::addColumn<QString>("qml"); QTest::addColumn<QString>("type"); + QTest::addColumn<QString>("error"); // import built-ins QTest::newRow("missing import") << "Test {}" - << ""; + << "" + << "Test is not a type"; QTest::newRow("not in version 0.0") << "import com.nokia.Test 0.0\n" "Test {}" - << ""; + << "" + << "Test is not a type"; + QTest::newRow("version not installed") + << "import com.nokia.Test 99.0\n" + "Test {}" + << "" + << "module \"com.nokia.Test\" version 99.0 is not installed"; QTest::newRow("in version 0.0") << "import com.nokia.Test 0.0\n" "TestTP {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("qualified in version 0.0") << "import com.nokia.Test 0.0 as T\n" "T.TestTP {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("in version 1.0") << "import com.nokia.Test 1.0\n" "Test {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("qualified wrong") << "import com.nokia.Test 1.0 as T\n" // QT-610 "Test {}" - << ""; + << "" + << "Test is not a type"; QTest::newRow("qualified right") << "import com.nokia.Test 1.0 as T\n" "T.Test {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("qualified right but not in version 0.0") << "import com.nokia.Test 0.0 as T\n" "T.Test {}" - << ""; + << "" + << "T.Test is not a type"; QTest::newRow("in version 1.1") << "import com.nokia.Test 1.1\n" "Test {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("in version 1.3") << "import com.nokia.Test 1.3\n" "Test {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("in version 1.5") << "import com.nokia.Test 1.5\n" "Test {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("changed in version 1.8") << "import com.nokia.Test 1.8\n" "Test {}" - << "TestType2"; + << "TestType2" + << ""; QTest::newRow("in version 1.12") << "import com.nokia.Test 1.12\n" "Test {}" - << "TestType2"; + << "TestType2" + << ""; QTest::newRow("old in version 1.9") << "import com.nokia.Test 1.9\n" "OldTest {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("old in version 1.11") << "import com.nokia.Test 1.11\n" "OldTest {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("multiversion 1") << "import com.nokia.Test 1.11\n" "import com.nokia.Test 1.12\n" "Test {}" - << "TestType2"; + << "TestType2" + << ""; QTest::newRow("multiversion 2") << "import com.nokia.Test 1.11\n" "import com.nokia.Test 1.12\n" "OldTest {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("qualified multiversion 3") << "import com.nokia.Test 1.0 as T0\n" "import com.nokia.Test 1.8 as T8\n" "T0.Test {}" - << "TestType"; + << "TestType" + << ""; QTest::newRow("qualified multiversion 4") << "import com.nokia.Test 1.0 as T0\n" "import com.nokia.Test 1.8 as T8\n" "T8.Test {}" - << "TestType2"; + << "TestType2" + << ""; } void tst_qdeclarativelanguage::importsBuiltin() { QFETCH(QString, qml); QFETCH(QString, type); - testType(qml,type); + QFETCH(QString, error); + testType(qml,type,error); } void tst_qdeclarativelanguage::importsLocal_data() { QTest::addColumn<QString>("qml"); QTest::addColumn<QString>("type"); + QTest::addColumn<QString>("error"); // import locals QTest::newRow("local import") << "import \"subdir\"\n" // QT-613 "Test {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("local import second") << "import Qt 4.6\nimport \"subdir\"\n" "Test {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("local import subsubdir") << "import Qt 4.6\nimport \"subdir/subsubdir\"\n" "SubTest {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("local import QTBUG-7721 A") << "subdir.Test {}" // no longer allowed (QTBUG-7721) - << ""; + << "" + << "subdir.Test is not a type"; QTest::newRow("local import QTBUG-7721 B") << "import \"subdir\" as X\n" "X.subsubdir.SubTest {}" // no longer allowed (QTBUG-7721) - << ""; + << "" + << "X.subsubdir.SubTest is not a type"; QTest::newRow("local import as") << "import \"subdir\" as T\n" "T.Test {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("wrong local import as") << "import \"subdir\" as T\n" "Test {}" - << ""; + << "" + << "Test is not a type"; QTest::newRow("library precedence over local import") << "import \"subdir\"\n" "import com.nokia.Test 1.0\n" "Test {}" - << "TestType"; + << "TestType" + << ""; } void tst_qdeclarativelanguage::importsLocal() { QFETCH(QString, qml); QFETCH(QString, type); - testType(qml,type); + QFETCH(QString, error); + testType(qml,type,error); } void tst_qdeclarativelanguage::importsRemote_data() { QTest::addColumn<QString>("qml"); QTest::addColumn<QString>("type"); + QTest::addColumn<QString>("error"); QString serverdir = "http://127.0.0.1:14445/qtest/declarative/qmllanguage"; - QTest::newRow("remote import") << "import \""+serverdir+"\"\nTest {}" << "QDeclarativeRectangle"; - QTest::newRow("remote import with subdir") << "import \""+serverdir+"\"\nTestSubDir {}" << "QDeclarativeText"; - QTest::newRow("remote import with local") << "import \""+serverdir+"\"\nTestLocal {}" << "QDeclarativeImage"; - QTest::newRow("wrong remote import with undeclared local") << "import \""+serverdir+"\"\nWrongTestLocal {}" << ""; - QTest::newRow("wrong remote import of internal local") << "import \""+serverdir+"\"\nLocalInternal {}" << ""; - QTest::newRow("wrong remote import of undeclared local") << "import \""+serverdir+"\"\nUndeclaredLocal {}" << ""; + QTest::newRow("remote import") << "import \""+serverdir+"\"\nTest {}" << "QDeclarativeRectangle" + << ""; + QTest::newRow("remote import with subdir") << "import \""+serverdir+"\"\nTestSubDir {}" << "QDeclarativeText" + << ""; + QTest::newRow("remote import with local") << "import \""+serverdir+"\"\nTestLocal {}" << "QDeclarativeImage" + << ""; + QTest::newRow("wrong remote import with undeclared local") << "import \""+serverdir+"\"\nWrongTestLocal {}" << "" + << "WrongTestLocal is not a type"; + QTest::newRow("wrong remote import of internal local") << "import \""+serverdir+"\"\nLocalInternal {}" << "" + << "LocalInternal is not a type"; + QTest::newRow("wrong remote import of undeclared local") << "import \""+serverdir+"\"\nUndeclaredLocal {}" << "" + << "UndeclaredLocal is not a type"; } #include "testhttpserver.h" @@ -1255,11 +1305,12 @@ void tst_qdeclarativelanguage::importsRemote() { QFETCH(QString, qml); QFETCH(QString, type); + QFETCH(QString, error); TestHTTPServer server(14445); server.serveDirectory(SRCDIR); - testType(qml,type); + testType(qml,type,error); } void tst_qdeclarativelanguage::importsInstalled_data() @@ -1268,43 +1319,57 @@ void tst_qdeclarativelanguage::importsInstalled_data() QTest::addColumn<QString>("qml"); QTest::addColumn<QString>("type"); + QTest::addColumn<QString>("error"); // import installed QTest::newRow("installed import 0") << "import com.nokia.installedtest 0.0\n" "InstalledTestTP {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import 0 as TP") << "import com.nokia.installedtest 0.0 as TP\n" "TP.InstalledTestTP {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import 1") << "import com.nokia.installedtest 1.0\n" "InstalledTest {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import 2") << "import com.nokia.installedtest 1.3\n" "InstalledTest {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import 3") << "import com.nokia.installedtest 1.4\n" "InstalledTest {}" - << "QDeclarativeText"; - QTest::newRow("installed import 4") + << "QDeclarativeText" + << ""; + QTest::newRow("installed import minor version not available") // QTBUG-9627 << "import com.nokia.installedtest 1.10\n" "InstalledTest {}" - << "QDeclarativeText"; + << "" + << "module \"com.nokia.installedtest\" version 1.10 is not installed"; + QTest::newRow("installed import major version not available") // QTBUG-9627 + << "import com.nokia.installedtest 9.0\n" + "InstalledTest {}" + << "" + << "module \"com.nokia.installedtest\" version 9.0 is not installed"; QTest::newRow("installed import visibility") // QT-614 << "import com.nokia.installedtest 1.4\n" "PrivateType {}" - << ""; + << "" + << "PrivateType is not a type"; } void tst_qdeclarativelanguage::importsInstalled() { QFETCH(QString, qml); QFETCH(QString, type); - testType(qml,type); + QFETCH(QString, error); + testType(qml,type,error); } @@ -1312,65 +1377,77 @@ void tst_qdeclarativelanguage::importsOrder_data() { QTest::addColumn<QString>("qml"); QTest::addColumn<QString>("type"); + QTest::addColumn<QString>("error"); QTest::newRow("installed import overrides 1") << "import com.nokia.installedtest 1.0\n" "import com.nokia.installedtest 1.4\n" "InstalledTest {}" - << "QDeclarativeText"; + << "QDeclarativeText" + << ""; QTest::newRow("installed import overrides 2") << "import com.nokia.installedtest 1.4\n" "import com.nokia.installedtest 1.0\n" "InstalledTest {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import re-overrides 1") << "import com.nokia.installedtest 1.4\n" "import com.nokia.installedtest 1.0\n" "import com.nokia.installedtest 1.4\n" "InstalledTest {}" - << "QDeclarativeText"; + << "QDeclarativeText" + << ""; QTest::newRow("installed import re-overrides 2") << "import com.nokia.installedtest 1.4\n" "import com.nokia.installedtest 1.0\n" "import com.nokia.installedtest 1.4\n" "import com.nokia.installedtest 1.0\n" "InstalledTest {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import versus builtin 1") << "import com.nokia.installedtest 1.5\n" "import Qt 4.6\n" "Rectangle {}" - << "QDeclarativeRectangle"; + << "QDeclarativeRectangle" + << ""; QTest::newRow("installed import versus builtin 2") << "import Qt 4.6\n" "import com.nokia.installedtest 1.5\n" "Rectangle {}" - << "QDeclarativeText"; + << "QDeclarativeText" + << ""; QTest::newRow("namespaces cannot be overridden by types 1") << "import Qt 4.6 as Rectangle\n" "import com.nokia.installedtest 1.5\n" "Rectangle {}" - << ""; + << "" + << "Namespace Rectangle cannot be used as a type"; QTest::newRow("namespaces cannot be overridden by types 2") << "import Qt 4.6 as Rectangle\n" "import com.nokia.installedtest 1.5\n" "Rectangle.Image {}" - << "QDeclarativeImage"; + << "QDeclarativeImage" + << ""; QTest::newRow("local last 1") << "LocalLast {}" - << "QDeclarativeText"; + << "QDeclarativeText" + << ""; QTest::newRow("local last 2") << "import com.nokia.installedtest 1.0\n" "LocalLast {}" - << "QDeclarativeRectangle"; // i.e. from com.nokia.installedtest, not data/LocalLast.qml + << "QDeclarativeRectangle" + << ""; // i.e. from com.nokia.installedtest, not data/LocalLast.qml } void tst_qdeclarativelanguage::importsOrder() { QFETCH(QString, qml); QFETCH(QString, type); - testType(qml,type); + QFETCH(QString, error); + testType(qml,type,error); } void tst_qdeclarativelanguage::qmlAttachedPropertiesObjectMethod() diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp index ba0f9a7..74da79e 100644 --- a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp +++ b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp @@ -378,16 +378,17 @@ void tst_qdeclarativexmllistmodel::reload() QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); QSignalSpy spyCount(model, SIGNAL(countChanged())); - QSignalSpy spyReset(model, SIGNAL(modelReset())); model->reload(); - QTRY_COMPARE(spyReset.count(), 1); - QCOMPARE(spyCount.count(), 0); - QCOMPARE(spyInsert.count(), 0); - QCOMPARE(spyRemove.count(), 0); + QTRY_COMPARE(spyCount.count(), 1); + QTRY_COMPARE(spyInsert.count(), 1); + QTRY_COMPARE(spyRemove.count(), 1); + + QCOMPARE(spyInsert[0][0].toInt(), 0); + QCOMPARE(spyInsert[0][1].toInt(), 9); - QCOMPARE(model->data(0, model->roles().first()).toString(), QString("Polly")); - QCOMPARE(model->data(model->count()-1, model->roles().first()).toString(), QString("Tiny")); + QCOMPARE(spyRemove[0][0].toInt(), 0); + QCOMPARE(spyRemove[0][1].toInt(), 9); delete model; } @@ -415,15 +416,15 @@ void tst_qdeclarativexmllistmodel::useKeys() QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); QSignalSpy spyCount(model, SIGNAL(countChanged())); - QSignalSpy spyReset(model, SIGNAL(modelReset())); model->setXml(newXml); - if (insertRanges.isEmpty() && removeRanges.isEmpty()) { - QTRY_COMPARE(spyReset.count(), 1); + if (oldCount != newData.count()) { + QTRY_COMPARE(model->count(), newData.count()); + QCOMPARE(spyCount.count(), 1); } else { QTRY_VERIFY(spyInsert.count() > 0 || spyRemove.count() > 0); - QCOMPARE(spyCount.count() == 0, oldCount == newData.count()); + QCOMPARE(spyCount.count(), 0); } QList<int> roles = model->roles(); @@ -512,14 +513,21 @@ void tst_qdeclarativexmllistmodel::useKeys_data() << makeItemXmlAndData("", &modelData) << modelData << QList<QDeclarativeXmlListRange>() - << QList<QDeclarativeXmlListRange>(); + << (QList<QDeclarativeXmlListRange>() << qMakePair(0, 3)); QTest::newRow("replace item") << makeItemXmlAndData("name=A,age=25,sport=Football") << 1 << makeItemXmlAndData("name=ZZZ,age=25,sport=Football", &modelData) << modelData - << QList<QDeclarativeXmlListRange>() - << QList<QDeclarativeXmlListRange>(); + << (QList<QDeclarativeXmlListRange>() << qMakePair(0, 1)) + << (QList<QDeclarativeXmlListRange>() << qMakePair(0, 1)); + + QTest::newRow("add and remove simultaneously, in different spots") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling;name=D,age=55,sport=Golf") << 4 + << makeItemXmlAndData("name=B,age=35,sport=Athletics;name=E,age=65,sport=Fencing", &modelData) + << modelData + << (QList<QDeclarativeXmlListRange>() << qMakePair(1, 1)) + << (QList<QDeclarativeXmlListRange>() << qMakePair(0, 1) << qMakePair(2,2)); QTest::newRow("insert at start, remove at end i.e. rss feed") << makeItemXmlAndData("name=C,age=45,sport=Curling;name=D,age=55,sport=Golf;name=E,age=65,sport=Fencing") << 3 @@ -539,8 +547,8 @@ void tst_qdeclarativexmllistmodel::useKeys_data() << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35") << 2 << makeItemXmlAndData("name=C,age=45,sport=Curling;name=D,age=55,sport=Golf", &modelData) << modelData - << QList<QDeclarativeXmlListRange>() - << QList<QDeclarativeXmlListRange>(); + << (QList<QDeclarativeXmlListRange>() << qMakePair(0, 2)) + << (QList<QDeclarativeXmlListRange>() << qMakePair(0, 2)); } void tst_qdeclarativexmllistmodel::noKeysValueChanges() @@ -600,14 +608,20 @@ void tst_qdeclarativexmllistmodel::keysChanged() QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); QSignalSpy spyCount(model, SIGNAL(countChanged())); - QSignalSpy spyReset(model, SIGNAL(modelReset())); QVERIFY(QMetaObject::invokeMethod(model, "disableNameKey")); model->setXml(xml); - QTRY_COMPARE(spyReset.count(), 1); - QCOMPARE(spyInsert.count(), 0); - QCOMPARE(spyRemove.count(), 0); + QTRY_VERIFY(spyInsert.count() > 0 && spyRemove.count() > 0); + + QCOMPARE(spyInsert.count(), 1); + QCOMPARE(spyInsert[0][0].toInt(), 0); + QCOMPARE(spyInsert[0][1].toInt(), 2); + + QCOMPARE(spyRemove.count(), 1); + QCOMPARE(spyRemove[0][0].toInt(), 0); + QCOMPARE(spyRemove[0][1].toInt(), 2); + QCOMPARE(spyCount.count(), 0); delete model; |