summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2009-10-28 05:45:05 (GMT)
committerAlan Alpert <alan.alpert@nokia.com>2009-10-28 05:45:05 (GMT)
commit44be8cc3bb1aebd47f75dcf9cae54884322e1955 (patch)
tree548c76a8a6144955a1ba1ccc85e2c9f997fafa10
parentdbba440da0677b8174d087d498d3d0dbd465548a (diff)
parente78a0d8f7449b81c971284310e6fb255d4a9d4eb (diff)
downloadQt-44be8cc3bb1aebd47f75dcf9cae54884322e1955.zip
Qt-44be8cc3bb1aebd47f75dcf9cae54884322e1955.tar.gz
Qt-44be8cc3bb1aebd47f75dcf9cae54884322e1955.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
-rw-r--r--demos/declarative/minehunt/minehunt.qml2
-rw-r--r--doc/src/declarative/globalobject.qdoc26
-rw-r--r--examples/declarative/aspectratio/face_fit.qml1
-rw-r--r--examples/declarative/aspectratio/face_fit_animated.qml1
-rw-r--r--examples/declarative/aspectratio/pics/face.pngbin905 -> 15408 bytes
-rw-r--r--examples/declarative/aspectratio/scale_and_crop.qml1
-rw-r--r--examples/declarative/aspectratio/scale_and_crop_simple.qml3
-rw-r--r--examples/declarative/aspectratio/scale_and_sidecrop.qml1
-rw-r--r--examples/declarative/aspectratio/scale_to_fit.qml1
-rw-r--r--examples/declarative/aspectratio/scale_to_fit_simple.qml3
-rw-r--r--examples/declarative/fillmode/fillmode.qml14
-rw-r--r--examples/declarative/fonts/fonts.qml10
-rw-r--r--examples/declarative/loader/Browser.qml4
-rw-r--r--examples/declarative/snow/ImageBatch.qml2
-rw-r--r--examples/declarative/tutorials/samegame/samegame1/samegame.qml2
-rw-r--r--examples/declarative/tutorials/samegame/samegame2/samegame.qml2
-rw-r--r--examples/declarative/tutorials/samegame/samegame3/samegame.qml2
-rw-r--r--examples/declarative/tutorials/samegame/samegame4/samegame.qml2
-rw-r--r--examples/declarative/velocity/Day.qml108
-rw-r--r--examples/declarative/velocity/velocity.qml77
-rw-r--r--examples/declarative/webview/content/FieldText.qml2
-rw-r--r--src/declarative/fx/qfxitem.cpp2
-rw-r--r--src/declarative/fx/qfxtext.cpp22
-rw-r--r--src/declarative/fx/qfxtext.h15
-rw-r--r--src/declarative/fx/qfxtext_p.h4
-rw-r--r--src/declarative/qml/qmlbinding.cpp64
-rw-r--r--src/declarative/qml/qmlbinding_p.h6
-rw-r--r--src/declarative/qml/qmlboundsignal.cpp5
-rw-r--r--src/declarative/qml/qmlcomponent.cpp17
-rw-r--r--src/declarative/qml/qmlcontext.cpp7
-rw-r--r--src/declarative/qml/qmlengine.cpp5
-rw-r--r--src/declarative/qml/qmlengine_p.h5
-rw-r--r--src/declarative/qml/qmlerror.cpp42
-rw-r--r--src/declarative/qml/qmlerror.h2
-rw-r--r--src/declarative/qml/qmlexpression.cpp56
-rw-r--r--src/declarative/qml/qmlexpression.h5
-rw-r--r--src/declarative/qml/qmlexpression_p.h6
-rw-r--r--tests/auto/declarative/declarative.pro4
-rw-r--r--tests/auto/declarative/qmlecmascript/data/NestedTypeTransientErrors.qml11
-rw-r--r--tests/auto/declarative/qmlecmascript/data/transientErrors.qml10
-rw-r--r--tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp23
41 files changed, 391 insertions, 184 deletions
diff --git a/demos/declarative/minehunt/minehunt.qml b/demos/declarative/minehunt/minehunt.qml
index 72431af..67d2813 100644
--- a/demos/declarative/minehunt/minehunt.qml
+++ b/demos/declarative/minehunt/minehunt.qml
@@ -96,7 +96,7 @@ Item {
properties: "angle"
}
ScriptAction{
- script: "if(modelData.hasMine && modelData.flipped){expl.explode = true;}"
+ script: if(modelData.hasMine && modelData.flipped){expl.explode = true;}
}
}
}
diff --git a/doc/src/declarative/globalobject.qdoc b/doc/src/declarative/globalobject.qdoc
index 2328c8a..afbe3db 100644
--- a/doc/src/declarative/globalobject.qdoc
+++ b/doc/src/declarative/globalobject.qdoc
@@ -56,6 +56,32 @@ Contains all the properties of the ECMAScript global object, plus:
\section1 Qt Object
+The Qt object contains functions for
+
+creating types:
+\list
+\o hsla
+\o rgba
+\o rect
+\o point
+\o size
+\o vector3d
+\endlist
+
+manipulating color:
+\list
+\o lighter
+\o darker
+\o tint
+\endlist
+
+and playing sound:
+\list
+\o playSound
+\endlist
+
+It also contains enum values used by some items.
+
\section1 Asynchronous JavaScript and XML
\section1 Offline Storage API
diff --git a/examples/declarative/aspectratio/face_fit.qml b/examples/declarative/aspectratio/face_fit.qml
index 3d1451c..482d1b7 100644
--- a/examples/declarative/aspectratio/face_fit.qml
+++ b/examples/declarative/aspectratio/face_fit.qml
@@ -15,6 +15,7 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
x: (parent.width-width*scale)/2
y: (parent.height-height*scale)/2
diff --git a/examples/declarative/aspectratio/face_fit_animated.qml b/examples/declarative/aspectratio/face_fit_animated.qml
index f004a6c..80a762b 100644
--- a/examples/declarative/aspectratio/face_fit_animated.qml
+++ b/examples/declarative/aspectratio/face_fit_animated.qml
@@ -13,6 +13,7 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
x: (parent.width-width*scale)/2
y: (parent.height-height*scale)/2
diff --git a/examples/declarative/aspectratio/pics/face.png b/examples/declarative/aspectratio/pics/face.png
index 9623b1a..3d66d72 100644
--- a/examples/declarative/aspectratio/pics/face.png
+++ b/examples/declarative/aspectratio/pics/face.png
Binary files differ
diff --git a/examples/declarative/aspectratio/scale_and_crop.qml b/examples/declarative/aspectratio/scale_and_crop.qml
index 2c9477e..283e24b 100644
--- a/examples/declarative/aspectratio/scale_and_crop.qml
+++ b/examples/declarative/aspectratio/scale_and_crop.qml
@@ -11,6 +11,7 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
x: (parent.width-width*scale)/2
y: (parent.height-height*scale)/2
diff --git a/examples/declarative/aspectratio/scale_and_crop_simple.qml b/examples/declarative/aspectratio/scale_and_crop_simple.qml
index 9cc9c19..e720ce7 100644
--- a/examples/declarative/aspectratio/scale_and_crop_simple.qml
+++ b/examples/declarative/aspectratio/scale_and_crop_simple.qml
@@ -12,8 +12,9 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
- fillMode: "PreserveAspectCrop"
+ fillMode: Image.PreserveAspectCrop
anchors.fill: parent
}
}
diff --git a/examples/declarative/aspectratio/scale_and_sidecrop.qml b/examples/declarative/aspectratio/scale_and_sidecrop.qml
index 67c7e29..c3ef859 100644
--- a/examples/declarative/aspectratio/scale_and_sidecrop.qml
+++ b/examples/declarative/aspectratio/scale_and_sidecrop.qml
@@ -12,6 +12,7 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
x: (parent.width-width*scale)/2
y: (parent.height-height*scale)/2
diff --git a/examples/declarative/aspectratio/scale_to_fit.qml b/examples/declarative/aspectratio/scale_to_fit.qml
index c4efc29..961ac04 100644
--- a/examples/declarative/aspectratio/scale_to_fit.qml
+++ b/examples/declarative/aspectratio/scale_to_fit.qml
@@ -12,6 +12,7 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
x: (parent.width-width*scale)/2
y: (parent.height-height*scale)/2
diff --git a/examples/declarative/aspectratio/scale_to_fit_simple.qml b/examples/declarative/aspectratio/scale_to_fit_simple.qml
index f7fcd8b..7389581 100644
--- a/examples/declarative/aspectratio/scale_to_fit_simple.qml
+++ b/examples/declarative/aspectratio/scale_to_fit_simple.qml
@@ -12,8 +12,9 @@ Rectangle {
Image {
id: face
+ smooth: true
source: "pics/face.png"
- fillMode: "PreserveAspectFit"
+ fillMode: Image.PreserveAspectFit
anchors.fill: parent
}
}
diff --git a/examples/declarative/fillmode/fillmode.qml b/examples/declarative/fillmode/fillmode.qml
index 0fdacbf..d3a28e2 100644
--- a/examples/declarative/fillmode/fillmode.qml
+++ b/examples/declarative/fillmode/fillmode.qml
@@ -7,22 +7,22 @@ Image {
fillMode: SequentialAnimation {
running: true
repeat: true
- PropertyAction { value: "Stretch" }
+ PropertyAction { value: Image.Stretch }
PropertyAction { target: label; property: "text"; value: "Stretch" }
PauseAnimation { duration: 1000 }
- PropertyAction { value: "PreserveAspectFit" }
+ PropertyAction { value: Image.PreserveAspectFit }
PropertyAction { target: label; property: "text"; value: "PreserveAspectFit" }
PauseAnimation { duration: 1000 }
- PropertyAction { value: "PreserveAspectCrop" }
+ PropertyAction { value: Image.PreserveAspectCrop }
PropertyAction { target: label; property: "text"; value: "PreserveAspectCrop" }
PauseAnimation { duration: 1000 }
- PropertyAction { value: "Tile" }
+ PropertyAction { value: Image.Tile }
PropertyAction { target: label; property: "text"; value: "Tile" }
PauseAnimation { duration: 1000 }
- PropertyAction { value: "TileHorizontally" }
+ PropertyAction { value: Image.TileHorizontally }
PropertyAction { target: label; property: "text"; value: "TileHorizontally" }
PauseAnimation { duration: 1000 }
- PropertyAction { value: "TileVertically" }
+ PropertyAction { value: Image.TileVertically }
PropertyAction { target: label; property: "text"; value: "TileVertically" }
PauseAnimation { duration: 1000 }
}
@@ -30,7 +30,7 @@ Image {
id: label
font.pointSize: 24
color: "blue"
- style: "Outline"
+ style: Text.Outline
styleColor: "white"
anchors { centerIn: parent }
}
diff --git a/examples/declarative/fonts/fonts.qml b/examples/declarative/fonts/fonts.qml
index 4029f8b..e68bdb6 100644
--- a/examples/declarative/fonts/fonts.qml
+++ b/examples/declarative/fonts/fonts.qml
@@ -22,21 +22,21 @@ Rectangle {
Text {
text: myText
color: palette.windowText
- width: parent.width; elide: "ElideRight"
+ width: parent.width; elide: Text.ElideRight
font.family: "Times"
font.pointSize: 32
}
Text {
text: myText
color: palette.windowText
- width: parent.width; elide: "ElideRight"
+ width: parent.width; elide: Text.ElideRight
font.family: fixedFont.name
font.pointSize: 32
}
Text {
text: myText
color: palette.windowText
- width: parent.width; elide: "ElideRight"
+ width: parent.width; elide: Text.ElideRight
font.family: localFont.name
font.pointSize: 32
}
@@ -47,7 +47,7 @@ Rectangle {
else if (webFont.status == 3) "Error loading font"
}
color: palette.windowText
- width: parent.width; elide: "ElideRight"
+ width: parent.width; elide: Text.ElideRight
font.family: webFont.name
font.pointSize: 32
}
@@ -58,7 +58,7 @@ Rectangle {
else if (webFont2.status == 3) "Error loading font"
}
color: palette.windowText
- width: parent.width; elide: "ElideRight"
+ width: parent.width; elide: Text.ElideRight
font.family: webFont2.name
font.pointSize: 32
}
diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml
index 9e54758..f2cbd3d 100644
--- a/examples/declarative/loader/Browser.qml
+++ b/examples/declarative/loader/Browser.qml
@@ -81,7 +81,7 @@ Rectangle {
}
Text {
id: nameText
- anchors.fill: parent; verticalAlignment: "AlignVCenter"
+ anchors.fill: parent; verticalAlignment: Text.AlignVCenter
text: fileName; anchors.leftMargin: 48
font.pixelSize: 32
color: wrapper.isCurrentItem ? palette.highlightedText : palette.text
@@ -225,7 +225,7 @@ Rectangle {
anchors.left: upButton.right; anchors.right: parent.right; height: parent.height
anchors.leftMargin: 4; anchors.rightMargin: 4
text: folders.folder; color: "white"
- elide: "ElideLeft"; horizontalAlignment: "AlignRight"; verticalAlignment: "AlignVCenter"
+ elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
font.pixelSize: 32
}
}
diff --git a/examples/declarative/snow/ImageBatch.qml b/examples/declarative/snow/ImageBatch.qml
index dfe2a46..95b9b97 100644
--- a/examples/declarative/snow/ImageBatch.qml
+++ b/examples/declarative/snow/ImageBatch.qml
@@ -41,7 +41,7 @@ GridView {
transformOrigin: Item.Center
width: grid.imageWidth; height: grid.imageHeight;
- Image { id: flickrImage; source: url; fillMode: "PreserveAspectFit"; smooth: true; anchors.fill: parent;
+ Image { id: flickrImage; source: url; fillMode: Image.PreserveAspectFit; smooth: true; anchors.fill: parent;
opacity: (status == Image.Ready)?1:0; opacity: Behavior { NumberAnimation { properties: "opacity" } } }
Loading { anchors.centerIn: parent; visible: flickrImage.status!=1 }
diff --git a/examples/declarative/tutorials/samegame/samegame1/samegame.qml b/examples/declarative/tutorials/samegame/samegame1/samegame.qml
index 8b32cae..b5546d0 100644
--- a/examples/declarative/tutorials/samegame/samegame1/samegame.qml
+++ b/examples/declarative/tutorials/samegame/samegame1/samegame.qml
@@ -13,7 +13,7 @@ Rectangle {
Image {
id: background
anchors.fill: parent; source: "pics/background.png"
- fillMode: "PreserveAspectCrop"
+ fillMode: Image.PreserveAspectCrop
}
}
diff --git a/examples/declarative/tutorials/samegame/samegame2/samegame.qml b/examples/declarative/tutorials/samegame/samegame2/samegame.qml
index 63431b1..257e0de 100644
--- a/examples/declarative/tutorials/samegame/samegame2/samegame.qml
+++ b/examples/declarative/tutorials/samegame/samegame2/samegame.qml
@@ -15,7 +15,7 @@ Rectangle {
Image {
id: background
anchors.fill: parent; source: "pics/background.png"
- fillMode: "PreserveAspectCrop"
+ fillMode: Image.PreserveAspectCrop
}
}
diff --git a/examples/declarative/tutorials/samegame/samegame3/samegame.qml b/examples/declarative/tutorials/samegame/samegame3/samegame.qml
index 5b98f48..0a7ec0f 100644
--- a/examples/declarative/tutorials/samegame/samegame3/samegame.qml
+++ b/examples/declarative/tutorials/samegame/samegame3/samegame.qml
@@ -14,7 +14,7 @@ Rectangle {
Image {
id: background
anchors.fill: parent; source: "pics/background.png"
- fillMode: "PreserveAspectCrop"
+ fillMode: Image.PreserveAspectCrop
}
//![1]
diff --git a/examples/declarative/tutorials/samegame/samegame4/samegame.qml b/examples/declarative/tutorials/samegame/samegame4/samegame.qml
index ede4362..e519912 100644
--- a/examples/declarative/tutorials/samegame/samegame4/samegame.qml
+++ b/examples/declarative/tutorials/samegame/samegame4/samegame.qml
@@ -15,7 +15,7 @@ Rectangle {
Image {
id: background
anchors.fill: parent; source: "content/pics/background.png"
- fillMode: "PreserveAspectCrop"
+ fillMode: Image.PreserveAspectCrop
}
Item {
diff --git a/examples/declarative/velocity/Day.qml b/examples/declarative/velocity/Day.qml
index b0d4dd9..030fa13 100644
--- a/examples/declarative/velocity/Day.qml
+++ b/examples/declarative/velocity/Day.qml
@@ -1,65 +1,48 @@
import Qt 4.6
Rectangle {
- property string day
+ property alias day: dayText.text
property var stickies
- width: 400
- height: 500
- radius: 7
- border.color: "black"
id: page
- Image {
- x: 10
- y: 10
- source: "cork.jpg"
- }
+ width: 400; height: 500; radius: 7
+ border.color: "black"
+
+ Image { x: 10; y: 10; source: "cork.jpg" }
+
Text {
- x: 20
- y: 20
- height: 40
- font.pointSize: 14
- font.bold: true
- width: 370
- text: day
- style: "Outline"
- styleColor: "#dedede"
+ id: dayText; x: 20; y: 20
+ height: 40; width: 370
+ font.pointSize: 14; font.bold: true
+ style: Text.Outline; styleColor: "#dedede"
}
+
Repeater {
model: page.stickies
+
Item {
+ id: stickyPage
x: Math.random() * 200 + 100
y: Math.random() * 300 + 50
- id: stickyPage
rotation: SpringFollow {
source: -flickable.horizontalVelocity / 100
- spring: 2.0
- damping: 0.1
+ spring: 2.0; damping: 0.1
}
+
Item {
id: sticky
scale: 0.5
Image {
- id: stickyImage
- source: "sticky.png"
- smooth: true
- y: -20
- x: 8 + -width * 0.6 / 2
- scale: 0.6
+ id: stickyImage; source: "sticky.png"
+ smooth: true; y: -20; x: 8 + -width * 0.6 / 2; scale: 0.6
}
+
TextEdit {
- id: myText
- smooth: true
- font.pointSize: 28
- readOnly: false
- x: -104
- y: 36
- wrap: true
- rotation: -8
- text: noteText
- width: 195
- height: 172
+ id: myText; smooth: true; font.pointSize: 28
+ readOnly: false; x: -104; y: 36; wrap: true
+ rotation: -8; text: noteText; width: 195; height: 172
}
+
Item {
y: -20
x: stickyImage.x
@@ -69,44 +52,27 @@ Rectangle {
id: mouse
onClicked: { myText.focus = true }
anchors.fill: parent
- drag.target: stickyPage
- drag.axis: "XandYAxis"
- drag.minimumY: 0
- drag.maximumY: 500
- drag.minimumX: 0
- drag.maximumX: 400
+ drag.target: stickyPage; drag.axis: "XandYAxis"; drag.minimumY: 0; drag.maximumY: 500
+ drag.minimumX: 0; drag.maximumX: 400
}
}
}
+
Image {
source: "tack.png"
- x: -width / 2
- y: -height * 0.7 / 2
- scale: 0.7
+ x: -width / 2; y: -height * 0.7 / 2; scale: 0.7
+ }
+
+ states: State {
+ name: "pressed"
+ when: mouse.pressed
+ PropertyChanges { target: sticky; rotation: 8; scale: 1 }
+ PropertyChanges { target: page; z: 8 }
+ }
+
+ transitions: Transition {
+ NumberAnimation { properties: "rotation,scale"; duration: 200 }
}
- states: [
- State {
- name: "pressed"
- when: mouse.pressed
- PropertyChanges {
- target: sticky
- rotation: 8
- scale: 1
- }
- PropertyChanges {
- target: page
- z: 8
- }
- }
- ]
- transitions: [
- Transition {
- NumberAnimation {
- properties: "rotation,scale"
- duration: 200
- }
- }
- ]
}
}
}
diff --git a/examples/declarative/velocity/velocity.qml b/examples/declarative/velocity/velocity.qml
index b132965..50d69d8 100644
--- a/examples/declarative/velocity/velocity.qml
+++ b/examples/declarative/velocity/velocity.qml
@@ -2,8 +2,8 @@ import Qt 4.6
Rectangle {
color: "lightSteelBlue"
- width: 800
- height: 600
+ width: 800; height: 600
+
ListModel {
id: list
ListElement {
@@ -12,10 +12,10 @@ Rectangle {
notes: [
ListElement {
noteText: "Lunch"
- },
- ListElement {
- noteText: "Party"
- }
+ },
+ ListElement {
+ noteText: "Party"
+ }
]
}
ListElement {
@@ -24,13 +24,13 @@ Rectangle {
notes: [
ListElement {
noteText: "Pickup kids"
- },
- ListElement {
- noteText: "Checkout kinetic"
- },
- ListElement {
- noteText: "Read email"
- }
+ },
+ ListElement {
+ noteText: "Checkout kinetic"
+ },
+ ListElement {
+ noteText: "Read email"
+ }
]
}
ListElement {
@@ -39,10 +39,10 @@ Rectangle {
notes: [
ListElement {
noteText: "Walk dog"
- },
- ListElement {
- noteText: "Buy newspaper"
- }
+ },
+ ListElement {
+ noteText: "Buy newspaper"
+ }
]
}
ListElement {
@@ -51,10 +51,10 @@ Rectangle {
notes: [
ListElement {
noteText: "Cook dinner"
- },
- ListElement {
- noteText: "Eat dinner"
- }
+ },
+ ListElement {
+ noteText: "Eat dinner"
+ }
]
}
ListElement {
@@ -63,10 +63,10 @@ Rectangle {
notes: [
ListElement {
noteText: "5:30pm Meeting"
- },
- ListElement {
- noteText: "Weed garden"
- }
+ },
+ ListElement {
+ noteText: "Weed garden"
+ }
]
}
ListElement {
@@ -75,10 +75,10 @@ Rectangle {
notes: [
ListElement {
noteText: "Still work"
- },
- ListElement {
- noteText: "Drink"
- }
+ },
+ ListElement {
+ noteText: "Drink"
+ }
]
}
ListElement {
@@ -87,28 +87,21 @@ Rectangle {
notes: [
ListElement {
noteText: "Drink"
- },
- ListElement {
- noteText: "Drink"
- }
+ },
+ ListElement {
+ noteText: "Drink"
+ }
]
}
}
Flickable {
id: flickable
- anchors.fill: parent
- viewportWidth: lay.width
+ anchors.fill: parent; viewportWidth: lay.width
Row {
id: lay
Repeater {
model: list
- Component {
- Day {
- day: name
- color: dayColor
- stickies: notes
- }
- }
+ Component { Day { day: name; color: dayColor; stickies: notes } }
}
}
}
diff --git a/examples/declarative/webview/content/FieldText.qml b/examples/declarative/webview/content/FieldText.qml
index 2adfbbf..b1c1938 100644
--- a/examples/declarative/webview/content/FieldText.qml
+++ b/examples/declarative/webview/content/FieldText.qml
@@ -79,7 +79,7 @@ Item {
x: 5
width: parent.width-10
anchors.verticalCenter: parent.verticalCenter
- horizontalAlignment: "AlignHCenter"
+ horizontalAlignment: Text.AlignHCenter
color: fieldText.state == "editing" ? "#505050" : "#AAAAAA"
font.italic: true
font.bold: true
diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp
index e714494..7d60336 100644
--- a/src/declarative/fx/qfxitem.cpp
+++ b/src/declarative/fx/qfxitem.cpp
@@ -1199,7 +1199,7 @@ QFxKeysAttached *QFxKeysAttached::qmlAttachedProperties(QObject *obj)
/*!
\class QFxItem
- \brief QFxItem is the most basic of all visual items in QML.
+ \brief The QFxItem class provides the most basic of all visual items in QML.
All visual items in Qt Declarative inherit from QFxItem. Although QFxItem
has no visual appearance, it defines all the properties that are
diff --git a/src/declarative/fx/qfxtext.cpp b/src/declarative/fx/qfxtext.cpp
index 4d02f0d..763256b 100644
--- a/src/declarative/fx/qfxtext.cpp
+++ b/src/declarative/fx/qfxtext.cpp
@@ -420,28 +420,28 @@ void QFxText::setTextFormat(TextFormat format)
}
/*!
- \qmlproperty Qt::TextElideMode Text::elide
+ \qmlproperty enumeration Text::elide
Set this property to elide parts of the text fit to the Text item's width.
The text will only elide if an explicit width has been set.
This property cannot be used with wrap enabled or with rich text.
- Eliding can be ElideNone (the default), ElideLeft, ElideMiddle, or ElideRight.
+ Eliding can be \c ElideNone (the default), \c ElideLeft, \c ElideMiddle, or \c ElideRight.
- If the text is a multi-length string, and the mode is not ElideNone,
+ If the text is a multi-length string, and the mode is not \c ElideNone,
the first string that fits will be used, otherwise the last will be elided.
Multi-length strings are ordered from longest to shortest, separated by the
- Unicode "String Terminator" character U009C (write this in QML with "\\x9C").
+ Unicode "String Terminator" character \c U009C (write this in QML with \c{"\\x9C"}).
*/
-Qt::TextElideMode QFxText::elideMode() const
+QFxText::TextElideMode QFxText::elideMode() const
{
Q_D(const QFxText);
return d->elideMode;
}
-void QFxText::setElideMode(Qt::TextElideMode mode)
+void QFxText::setElideMode(QFxText::TextElideMode mode)
{
Q_D(QFxText);
if (mode == d->elideMode)
@@ -458,7 +458,7 @@ void QFxText::geometryChanged(const QRectF &newGeometry,
{
Q_D(QFxText);
if (newGeometry.width() != oldGeometry.width()) {
- if (d->wrap || d->elideMode != Qt::ElideNone) {
+ if (d->wrap || d->elideMode != QFxText::ElideNone) {
d->imgDirty = true;
d->updateSize();
}
@@ -486,8 +486,8 @@ void QFxTextPrivate::updateSize()
tmp = text;
tmp.replace(QLatin1Char('\n'), QChar::LineSeparator);
singleline = !tmp.contains(QChar::LineSeparator);
- if (singleline && elideMode != Qt::ElideNone && q->widthValid())
- tmp = fm.elidedText(tmp,elideMode,q->width()); // XXX still worth layout...?
+ if (singleline && elideMode != QFxText::ElideNone && q->widthValid())
+ tmp = fm.elidedText(tmp,(Qt::TextElideMode)elideMode,q->width()); // XXX still worth layout...?
layout.clearLayout();
layout.setFont(font);
layout.setText(tmp);
@@ -586,7 +586,7 @@ QSize QFxTextPrivate::setupTextLayout(QTextLayout *layout)
qreal lineWidth = 0;
//set manual width
- if ((wrap || elideMode != Qt::ElideNone) && q->widthValid())
+ if ((wrap || elideMode != QFxText::ElideNone) && q->widthValid())
lineWidth = q->width();
layout->beginLayout();
@@ -596,7 +596,7 @@ QSize QFxTextPrivate::setupTextLayout(QTextLayout *layout)
if (!line.isValid())
break;
- if ((wrap || elideMode != Qt::ElideNone) && q->widthValid())
+ if ((wrap || elideMode != QFxText::ElideNone) && q->widthValid())
line.setLineWidth(lineWidth);
}
layout->endLayout();
diff --git a/src/declarative/fx/qfxtext.h b/src/declarative/fx/qfxtext.h
index 763e2aa..cdb8025 100644
--- a/src/declarative/fx/qfxtext.h
+++ b/src/declarative/fx/qfxtext.h
@@ -57,6 +57,7 @@ class Q_DECLARATIVE_EXPORT QFxText : public QFxItem
Q_ENUMS(VAlignment)
Q_ENUMS(TextStyle)
Q_ENUMS(TextFormat)
+ Q_ENUMS(TextElideMode)
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QFont font READ font WRITE setFont)
@@ -67,7 +68,7 @@ class Q_DECLARATIVE_EXPORT QFxText : public QFxItem
Q_PROPERTY(VAlignment verticalAlignment READ vAlign WRITE setVAlign)
Q_PROPERTY(bool wrap READ wrap WRITE setWrap) //### there are several wrap modes in Qt
Q_PROPERTY(TextFormat textFormat READ textFormat WRITE setTextFormat)
- Q_PROPERTY(Qt::TextElideMode elide READ elideMode WRITE setElideMode) //### elideMode?
+ Q_PROPERTY(TextElideMode elide READ elideMode WRITE setElideMode) //### elideMode?
public:
QFxText(QFxItem *parent=0);
@@ -84,8 +85,12 @@ public:
Raised,
Sunken };
enum TextFormat { PlainText = Qt::PlainText,
- RichText = Qt::RichText,
- AutoText = Qt::AutoText };
+ RichText = Qt::RichText,
+ AutoText = Qt::AutoText };
+ enum TextElideMode { ElideLeft = Qt::ElideLeft,
+ ElideRight = Qt::ElideRight,
+ ElideMiddle = Qt::ElideMiddle,
+ ElideNone = Qt::ElideNone };
QString text() const;
void setText(const QString &);
@@ -114,8 +119,8 @@ public:
TextFormat textFormat() const;
void setTextFormat(TextFormat format);
- Qt::TextElideMode elideMode() const;
- void setElideMode(Qt::TextElideMode);
+ TextElideMode elideMode() const;
+ void setElideMode(TextElideMode);
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
diff --git a/src/declarative/fx/qfxtext_p.h b/src/declarative/fx/qfxtext_p.h
index 8b24c66..a10cdfa 100644
--- a/src/declarative/fx/qfxtext_p.h
+++ b/src/declarative/fx/qfxtext_p.h
@@ -70,7 +70,7 @@ class QFxTextPrivate : public QFxItemPrivate
public:
QFxTextPrivate()
: color((QRgb)0), style(QFxText::Normal), imgDirty(true),
- hAlign(QFxText::AlignLeft), vAlign(QFxText::AlignTop), elideMode(Qt::ElideNone),
+ hAlign(QFxText::AlignLeft), vAlign(QFxText::AlignTop), elideMode(QFxText::ElideNone),
dirty(true), wrap(false), richText(false), singleline(false), control(0), doc(0),
format(QFxText::AutoText)
{
@@ -97,7 +97,7 @@ public:
QPixmap imgStyleCache;
QFxText::HAlignment hAlign;
QFxText::VAlignment vAlign;
- Qt::TextElideMode elideMode;
+ QFxText::TextElideMode elideMode;
bool dirty;
bool wrap;
bool richText;
diff --git a/src/declarative/qml/qmlbinding.cpp b/src/declarative/qml/qmlbinding.cpp
index 65ff789..317a4b3 100644
--- a/src/declarative/qml/qmlbinding.cpp
+++ b/src/declarative/qml/qmlbinding.cpp
@@ -58,10 +58,46 @@ QT_BEGIN_NAMESPACE
QML_DEFINE_NOCREATE_TYPE(QmlBinding);
QmlBindingData::QmlBindingData()
-: updating(false), enabled(false)
+: updating(false), enabled(false), nextError(0), prevError(0)
{
}
+QmlBindingData::~QmlBindingData()
+{
+ removeError();
+}
+
+void QmlBindingData::removeError()
+{
+ if (!prevError) return;
+
+ if (nextError) nextError->prevError = prevError;
+ *prevError = nextError;
+ nextError = 0;
+ prevError = 0;
+}
+
+bool QmlBindingData::addError()
+{
+ if (prevError) return false;
+
+ QmlContext *c = context();
+ if (!c) return false;
+ QmlEngine *e = c->engine();
+ if (!e) return false;
+
+ QmlEnginePrivate *p = QmlEnginePrivate::get(e);
+
+ if (p->inProgressCreations == 0) return false; // Not in construction
+
+ prevError = &p->erroredBindings;
+ nextError = p->erroredBindings;
+ p->erroredBindings = this;
+ if (nextError) nextError->prevError = &nextError;
+
+ return true;
+}
+
QmlBindingPrivate::QmlBindingPrivate()
: QmlExpressionPrivate(new QmlBindingData)
{
@@ -128,10 +164,12 @@ void QmlBinding::update(QmlMetaProperty::WriteFlags flags)
idx, a);
} else {
- bool undefined = false;
- QVariant value = this->value(&undefined);
+ bool isUndefined = false;
+ QVariant value = this->value(&isUndefined);
+
+ if (!isUndefined && data->property.object() &&
+ !data->property.write(value, flags)) {
- if (!undefined && data->property.object() && !data->property.write(value, flags)) {
QString fileName = data->fileName;
int line = data->line;
if (fileName.isEmpty()) fileName = QLatin1String("<Unknown File>");
@@ -139,9 +177,21 @@ void QmlBinding::update(QmlMetaProperty::WriteFlags flags)
const char *valueType = 0;
if (value.userType() == QVariant::Invalid) valueType = "null";
else valueType = QMetaType::typeName(value.userType());
- qWarning().nospace() << qPrintable(fileName) << ":" << line
- << " Unable to assign " << valueType << " to "
- << QMetaType::typeName(data->property.propertyType());
+
+ data->error.setUrl(fileName);
+ data->error.setLine(line);
+ data->error.setColumn(-1);
+ data->error.setDescription(QLatin1String("Unable to assign ") +
+ QLatin1String(valueType) +
+ QLatin1String(" to ") +
+ QLatin1String(QMetaType::typeName(data->property.propertyType())));
+ }
+
+ if (data->error.isValid()) {
+ if (!data->addError())
+ qWarning().nospace() << qPrintable(this->error().toString());
+ } else {
+ data->removeError();
}
}
diff --git a/src/declarative/qml/qmlbinding_p.h b/src/declarative/qml/qmlbinding_p.h
index 2c0c6b9..c9378cb 100644
--- a/src/declarative/qml/qmlbinding_p.h
+++ b/src/declarative/qml/qmlbinding_p.h
@@ -63,11 +63,17 @@ class QmlBindingData : public QmlExpressionData
{
public:
QmlBindingData();
+ virtual ~QmlBindingData();
bool updating:1;
bool enabled:1;
QmlMetaProperty property;
+
+ void removeError();
+ bool addError();
+ QmlBindingData *nextError;
+ QmlBindingData **prevError;
};
class QmlBindingPrivate : public QmlExpressionPrivate
diff --git a/src/declarative/qml/qmlboundsignal.cpp b/src/declarative/qml/qmlboundsignal.cpp
index ce591e8..d715309 100644
--- a/src/declarative/qml/qmlboundsignal.cpp
+++ b/src/declarative/qml/qmlboundsignal.cpp
@@ -175,8 +175,11 @@ int QmlBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
{
if (c == QMetaObject::InvokeMetaMethod && id == evaluateIdx) {
if (m_params) m_params->setValues(a);
- if (m_expression)
+ if (m_expression) {
QmlExpressionPrivate::get(m_expression)->value(m_params);
+ if (m_expression->hasError())
+ qWarning().nospace() << qPrintable(m_expression->error().toString());
+ }
if (m_params) m_params->clearValues();
return -1;
} else {
diff --git a/src/declarative/qml/qmlcomponent.cpp b/src/declarative/qml/qmlcomponent.cpp
index 0894758..3767695 100644
--- a/src/declarative/qml/qmlcomponent.cpp
+++ b/src/declarative/qml/qmlcomponent.cpp
@@ -55,6 +55,7 @@
#include "qmlbinding.h"
#include <QtCore/qdebug.h>
#include <QApplication>
+#include <private/qmlbinding_p.h>
#include "qmlscriptparser_p.h"
@@ -197,6 +198,12 @@ QmlComponent::QmlComponent(QObject *parent)
QmlComponent::~QmlComponent()
{
Q_D(QmlComponent);
+
+ if (d->completePending) {
+ qWarning("QmlComponent: Component destroyed while completion pending");
+ d->completeCreate();
+ }
+
if (d->typeData) {
d->typeData->remWaiter(d);
d->typeData->release();
@@ -574,8 +581,10 @@ QmlComponentPrivate::beginCreate(QmlContext *context, const QBitField &bindings)
ep->bindValues.clear();
ep->parserStatus.clear();
completePending = true;
+ QmlEnginePrivate::get(engine)->inProgressCreations++;
}
+
if (rv) {
QFx_setParent_noEvent(ctxt, rv);
} else {
@@ -643,6 +652,14 @@ void QmlComponentPrivate::completeCreate()
bindValues.clear();
parserStatus.clear();
completePending = false;
+ QmlEnginePrivate *p = QmlEnginePrivate::get(engine);
+ p->inProgressCreations--;
+ if (0 == p->inProgressCreations) {
+ while (p->erroredBindings) {
+ qWarning().nospace() << qPrintable(p->erroredBindings->error.toString());
+ p->erroredBindings->removeError();
+ }
+ }
}
}
diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp
index 2ebdf10..5032ff4 100644
--- a/src/declarative/qml/qmlcontext.cpp
+++ b/src/declarative/qml/qmlcontext.cpp
@@ -77,8 +77,11 @@ void QmlContextPrivate::addScript(const QString &script, QObject *scopeObject,
QScriptValue val = scriptEngine->evaluate(script, fileName, lineNumber);
- if (scriptEngine->hasUncaughtException())
- QmlExpressionPrivate::printException(scriptEngine);
+ if (scriptEngine->hasUncaughtException()) {
+ QmlError error;
+ QmlExpressionPrivate::exceptionToError(scriptEngine, error);
+ qWarning().nospace() << qPrintable(error.toString());
+ }
scriptEngine->popContext();
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index 0e239ce..3da8aa9 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -126,8 +126,9 @@ static QString userLocalDataPath(const QString& app)
QmlEnginePrivate::QmlEnginePrivate(QmlEngine *e)
: rootContext(0), currentExpression(0),
isDebugging(false), contextClass(0), objectClass(0), valueTypeClass(0), globalClass(0),
- nodeListClass(0), namedNodeMapClass(0), sqlQueryClass(0), cleanup(0), scriptEngine(this),
- componentAttacheds(0), rootComponent(0), networkAccessManager(0), typeManager(e), uniqueId(1)
+ nodeListClass(0), namedNodeMapClass(0), sqlQueryClass(0), cleanup(0), erroredBindings(0),
+ inProgressCreations(0), scriptEngine(this), componentAttacheds(0), rootComponent(0),
+ networkAccessManager(0), typeManager(e), uniqueId(1)
{
QScriptValue qtObject =
scriptEngine.newQMetaObject(StaticQtMetaObject::get());
diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h
index 69b121e..efd26bf 100644
--- a/src/declarative/qml/qmlengine_p.h
+++ b/src/declarative/qml/qmlengine_p.h
@@ -98,6 +98,7 @@ class QmlTypeNameCache;
class QmlComponentAttached;
class QmlListScriptClass;
class QmlCleanup;
+class QmlBindingData;
class QmlEnginePrivate : public QObjectPrivate
{
@@ -143,6 +144,10 @@ public:
// Registered cleanup handlers
QmlCleanup *cleanup;
+ // Bindings that have had errors during startup
+ QmlBindingData *erroredBindings;
+ int inProgressCreations;
+
struct QmlScriptEngine : public QScriptEngine
{
QmlScriptEngine(QmlEnginePrivate *priv)
diff --git a/src/declarative/qml/qmlerror.cpp b/src/declarative/qml/qmlerror.cpp
index 514fe44..f4c9580 100644
--- a/src/declarative/qml/qmlerror.cpp
+++ b/src/declarative/qml/qmlerror.cpp
@@ -70,7 +70,7 @@ QmlErrorPrivate::QmlErrorPrivate()
Create an empty error object.
*/
QmlError::QmlError()
-: d(new QmlErrorPrivate)
+: d(0)
{
}
@@ -78,7 +78,7 @@ QmlError::QmlError()
Create a copy of \a other.
*/
QmlError::QmlError(const QmlError &other)
-: d(new QmlErrorPrivate)
+: d(0)
{
*this = other;
}
@@ -88,10 +88,16 @@ QmlError::QmlError(const QmlError &other)
*/
QmlError &QmlError::operator=(const QmlError &other)
{
- d->url = other.d->url;
- d->description = other.d->description;
- d->line = other.d->line;
- d->column = other.d->column;
+ if (!other.d) {
+ delete d;
+ d = 0;
+ } else {
+ if (!d) d = new QmlErrorPrivate;
+ d->url = other.d->url;
+ d->description = other.d->description;
+ d->line = other.d->line;
+ d->column = other.d->column;
+ }
return *this;
}
@@ -104,11 +110,20 @@ QmlError::~QmlError()
}
/*!
+ Return true if this error is valid, otherwise false.
+*/
+bool QmlError::isValid() const
+{
+ return d != 0;
+}
+
+/*!
Return the url for the file that caused this error.
*/
QUrl QmlError::url() const
{
- return d->url;
+ if (d) return d->url;
+ else return QUrl();
}
/*!
@@ -116,6 +131,7 @@ QUrl QmlError::url() const
*/
void QmlError::setUrl(const QUrl &url)
{
+ if (!d) d = new QmlErrorPrivate;
d->url = url;
}
@@ -124,7 +140,8 @@ void QmlError::setUrl(const QUrl &url)
*/
QString QmlError::description() const
{
- return d->description;
+ if (d) return d->description;
+ else return QString();
}
/*!
@@ -132,6 +149,7 @@ QString QmlError::description() const
*/
void QmlError::setDescription(const QString &description)
{
+ if (!d) d = new QmlErrorPrivate;
d->description = description;
}
@@ -140,7 +158,8 @@ void QmlError::setDescription(const QString &description)
*/
int QmlError::line() const
{
- return d->line;
+ if (d) return d->line;
+ else return -1;
}
/*!
@@ -148,6 +167,7 @@ int QmlError::line() const
*/
void QmlError::setLine(int line)
{
+ if (!d) d = new QmlErrorPrivate;
d->line = line;
}
@@ -156,7 +176,8 @@ void QmlError::setLine(int line)
*/
int QmlError::column() const
{
- return d->column;
+ if (d) return d->column;
+ else return -1;
}
/*!
@@ -164,6 +185,7 @@ int QmlError::column() const
*/
void QmlError::setColumn(int column)
{
+ if (!d) d = new QmlErrorPrivate;
d->column = column;
}
diff --git a/src/declarative/qml/qmlerror.h b/src/declarative/qml/qmlerror.h
index c1a8720..ee3d7b4 100644
--- a/src/declarative/qml/qmlerror.h
+++ b/src/declarative/qml/qmlerror.h
@@ -61,6 +61,8 @@ public:
QmlError &operator=(const QmlError &);
~QmlError();
+ bool isValid() const;
+
QUrl url() const;
void setUrl(const QUrl &);
QString description() const;
diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp
index c62756b..e5e5cf9 100644
--- a/src/declarative/qml/qmlexpression.cpp
+++ b/src/declarative/qml/qmlexpression.cpp
@@ -260,7 +260,8 @@ QVariant QmlExpressionPrivate::evalSSE()
return rv;
}
-void QmlExpressionPrivate::printException(QScriptEngine *scriptEngine)
+void QmlExpressionPrivate::exceptionToError(QScriptEngine *scriptEngine,
+ QmlError &error)
{
if (scriptEngine->hasUncaughtException() &&
scriptEngine->uncaughtException().isError()) {
@@ -277,8 +278,12 @@ void QmlExpressionPrivate::printException(QScriptEngine *scriptEngine)
fileName = QLatin1String("<Unknown File>");
}
- qWarning().nospace() << qPrintable(fileName) << ":" << lineNumber << ": "
- << qPrintable(exception.toString());
+ error.setUrl(QUrl(fileName));
+ error.setLine(lineNumber);
+ error.setColumn(-1);
+ error.setDescription(exception.toString());
+ } else {
+ error = QmlError();
}
}
@@ -288,6 +293,7 @@ QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope, bool *isUnd
QFxPerfTimer<QFxPerf::BindValueQt> perfqt;
#endif
+ QmlExpressionData *data = this->data;
QmlContextPrivate *ctxtPriv = data->context()->d_func();
QmlEngine *engine = data->context()->engine();
QmlEnginePrivate *ep = QmlEnginePrivate::get(engine);
@@ -321,10 +327,13 @@ QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope, bool *isUnd
if (isUndefined)
*isUndefined = svalue.isUndefined() || scriptEngine->hasUncaughtException();
+ // Handle exception
if (scriptEngine->hasUncaughtException()) {
- printException(scriptEngine);
+ exceptionToError(scriptEngine, data->error);
scriptEngine->clearExceptions();
return QVariant();
+ } else {
+ data->error = QmlError();
}
if (secondaryScope) {
@@ -418,6 +427,8 @@ QVariant QmlExpressionPrivate::value(QObject *secondaryScope, bool *isUndefined)
\a isUndefined is set to true if the expression resulted in an
undefined value.
+
+ \sa hasError(), error()
*/
QVariant QmlExpression::value(bool *isUndefined)
{
@@ -509,6 +520,43 @@ QObject *QmlExpression::scopeObject() const
return d->data->me;
}
+/*!
+ Returns true if the last call to value() resulted in an error,
+ otherwise false.
+
+ \sa error(), clearError()
+*/
+bool QmlExpression::hasError() const
+{
+ Q_D(const QmlExpression);
+ return d->data->error.isValid();
+}
+
+/*!
+ Clear any expression errors. Calls to hasError() following this will
+ return false.
+
+ \sa hasError(), error()
+*/
+void QmlExpression::clearError()
+{
+ Q_D(QmlExpression);
+ d->data->error = QmlError();
+}
+
+/*!
+ Return any error from the last call to value(). If there was no error,
+ this returns an invalid QmlError instance.
+
+ \sa hasError(), clearError()
+*/
+
+QmlError QmlExpression::error() const
+{
+ Q_D(const QmlExpression);
+ return d->data->error;
+}
+
/*! \internal */
void QmlExpression::__q_notify()
{
diff --git a/src/declarative/qml/qmlexpression.h b/src/declarative/qml/qmlexpression.h
index 96694d6..127d3f3 100644
--- a/src/declarative/qml/qmlexpression.h
+++ b/src/declarative/qml/qmlexpression.h
@@ -44,6 +44,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qvariant.h>
+#include <QtDeclarative/qmlerror.h>
QT_BEGIN_HEADER
@@ -82,6 +83,10 @@ public:
QObject *scopeObject() const;
+ bool hasError() const;
+ void clearError();
+ QmlError error() const;
+
public Q_SLOTS:
QVariant value(bool *isUndefined = 0);
diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h
index 3ec8d1c..4e13de3 100644
--- a/src/declarative/qml/qmlexpression_p.h
+++ b/src/declarative/qml/qmlexpression_p.h
@@ -83,7 +83,7 @@ class QmlExpressionData : public QmlAbstractExpression, public QmlRefCount
{
public:
QmlExpressionData();
- ~QmlExpressionData();
+ virtual ~QmlExpressionData();
QmlExpressionPrivate *q;
@@ -92,6 +92,8 @@ public:
bool expressionRewritten:1;
QScriptValue expressionFunction;
+ QmlError error;
+
QmlBasicScript sse;
QObject *me;
bool trackChange;
@@ -151,7 +153,7 @@ public:
return static_cast<QmlExpressionPrivate *>(QObjectPrivate::get(expr));
}
- static void printException(QScriptEngine *);
+ static void exceptionToError(QScriptEngine *, QmlError &);
};
QT_END_NAMESPACE
diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro
index b51e285..8b1c9cd 100644
--- a/tests/auto/declarative/declarative.pro
+++ b/tests/auto/declarative/declarative.pro
@@ -1,12 +1,14 @@
TEMPLATE = subdirs
SUBDIRS += anchors \
+ animatedimage \
animations \
+ behaviors \
datetimeformatter \
+ examples \
layouts \
listview \
numberformatter \
pathview \
- qbindablemap \
qfxloader \
qfxpixmapcache \
qfxtext \
diff --git a/tests/auto/declarative/qmlecmascript/data/NestedTypeTransientErrors.qml b/tests/auto/declarative/qmlecmascript/data/NestedTypeTransientErrors.qml
new file mode 100644
index 0000000..e19bf24
--- /dev/null
+++ b/tests/auto/declarative/qmlecmascript/data/NestedTypeTransientErrors.qml
@@ -0,0 +1,11 @@
+import Qt 4.6
+
+Object {
+ property int b: obj.prop.a
+
+ property var prop;
+ prop: Object {
+ property int a: 10
+ }
+}
+
diff --git a/tests/auto/declarative/qmlecmascript/data/transientErrors.qml b/tests/auto/declarative/qmlecmascript/data/transientErrors.qml
new file mode 100644
index 0000000..4e123c6
--- /dev/null
+++ b/tests/auto/declarative/qmlecmascript/data/transientErrors.qml
@@ -0,0 +1,10 @@
+import Qt 4.6
+
+Object {
+ property var obj: nested
+
+ property var obj2
+ obj2: NestedTypeTransientErrors {
+ id: nested
+ }
+}
diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
index 67a98b1..48c2249 100644
--- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
+++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp
@@ -66,6 +66,7 @@ private slots:
void signalTriggeredBindings();
void listProperties();
void exceptionClearsOnReeval();
+ void transientErrors();
private:
QmlEngine engine;
@@ -847,6 +848,28 @@ void tst_qmlecmascript::exceptionClearsOnReeval()
QCOMPARE(object->property("test").toBool(), true);
}
+static int transientErrorsMsgCount = 0;
+static void transientErrorsMsgHandler(QtMsgType, const char *)
+{
+ ++transientErrorsMsgCount;
+}
+
+// Check that transient binding errors are not displayed
+void tst_qmlecmascript::transientErrors()
+{
+ QmlComponent component(&engine, TEST_FILE("transientErrors.qml"));
+
+ transientErrorsMsgCount = 0;
+ QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler);
+
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ qInstallMsgHandler(old);
+
+ QCOMPARE(transientErrorsMsgCount, 0);
+}
+
QTEST_MAIN(tst_qmlecmascript)
#include "tst_qmlecmascript.moc"