summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2010-04-08 03:05:13 (GMT)
committerMartin Jones <martin.jones@nokia.com>2010-04-08 03:05:13 (GMT)
commit238ccf72409b3668bf6f7df6bd7d7057ac7d2443 (patch)
tree198dad1d874e5f359779447b4ae535c329207d16
parent71f9283df3caabadcfb04e2ab6f57305cd73c0d1 (diff)
parentdcce90c4d9c8d010d7fc45c33048ff00e468b89c (diff)
downloadQt-238ccf72409b3668bf6f7df6bd7d7057ac7d2443.zip
Qt-238ccf72409b3668bf6f7df6bd7d7057ac7d2443.tar.gz
Qt-238ccf72409b3668bf6f7df6bd7d7057ac7d2443.tar.bz2
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/qt-qml into 4.7
-rw-r--r--demos/declarative/flickr/common/ImageDetails.qml160
-rw-r--r--demos/declarative/flickr/common/MediaButton.qml41
-rw-r--r--demos/declarative/flickr/common/MediaLineEdit.qml104
-rw-r--r--demos/declarative/flickr/flickr-90.qml (renamed from demos/declarative/flickr/flickr-mobile-90.qml)2
-rw-r--r--demos/declarative/flickr/flickr-desktop.qml194
-rw-r--r--demos/declarative/flickr/flickr.qml (renamed from demos/declarative/flickr/flickr-mobile.qml)0
-rw-r--r--examples/declarative/gestures/experimental-gestures.qml1
-rw-r--r--src/declarative/3rdparty/qlistmodelinterface.cpp6
-rw-r--r--src/declarative/3rdparty/qlistmodelinterface_p.h1
-rw-r--r--src/declarative/graphicsitems/qdeclarativevisualitemmodel.cpp2
-rw-r--r--src/declarative/qml/qdeclarativecompiledbindings.cpp22
-rw-r--r--src/declarative/qml/qdeclarativecompositetypemanager.cpp6
-rw-r--r--src/declarative/qml/qdeclarativeengine.cpp12
-rw-r--r--src/declarative/util/qdeclarativexmllistmodel.cpp25
-rw-r--r--src/declarative/util/qdeclarativexmllistmodel_p.h1
-rw-r--r--tests/auto/declarative/qdeclarativebehaviors/data/startup.qml17
-rw-r--r--tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp16
-rw-r--r--tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp193
-rw-r--r--tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp54
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;