diff options
135 files changed, 1037 insertions, 517 deletions
diff --git a/demos/declarative/contacts/FieldText.qml b/demos/declarative/contacts/FieldText.qml index 2e8b60d..1e89793 100644 --- a/demos/declarative/contacts/FieldText.qml +++ b/demos/declarative/contacts/FieldText.qml @@ -69,7 +69,7 @@ Rectangle { x: 5 width: parent.width-10 anchors.verticalCenter: parent.verticalCenter - horizontalAlignment: "AlignHCenter" + horizontalAlignment: Text.AlignHCenter color: contactDetails.state == "editing" ? "#505050" : "#AAAAAA" font.italic: true font.bold: true diff --git a/demos/declarative/contacts/RemoveButton.qml b/demos/declarative/contacts/RemoveButton.qml index 2c3cc9e..0cb013e 100644 --- a/demos/declarative/contacts/RemoveButton.qml +++ b/demos/declarative/contacts/RemoveButton.qml @@ -73,7 +73,7 @@ Rectangle { anchors.rightMargin: 4 font.bold: true color: "white" - horizontalAlignment: "AlignHCenter" + horizontalAlignment: Text.AlignHCenter text: "Remove" opacity: 0 } diff --git a/demos/declarative/flickr/common/ImageDetails.qml b/demos/declarative/flickr/common/ImageDetails.qml index cc00773..19cad06 100644 --- a/demos/declarative/flickr/common/ImageDetails.qml +++ b/demos/declarative/flickr/common/ImageDetails.qml @@ -44,7 +44,7 @@ Flipable { onClicked: { container.state='Back' } } - Text { id: titleText; style: "Raised"; styleColor: "black"; color: "white"; elide: "ElideRight" + 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 } @@ -69,7 +69,7 @@ Flipable { 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: "ElideRight"; text: container.photoTags } + 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 } diff --git a/demos/declarative/flickr/flickr-desktop.qml b/demos/declarative/flickr/flickr-desktop.qml index d1ad6e1..337f77c 100644 --- a/demos/declarative/flickr/flickr-desktop.qml +++ b/demos/declarative/flickr/flickr-desktop.qml @@ -187,6 +187,6 @@ Item { 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: "Raised"; styleColor: "black" + 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-mobile.qml index 48fe7df..0a89c4f 100644 --- a/demos/declarative/flickr/flickr-mobile.qml +++ b/demos/declarative/flickr/flickr-mobile.qml @@ -10,7 +10,7 @@ Item { id: background anchors.fill: parent; color: "#343434"; - Image { source: "mobile/images/stripes.png"; fillMode: "Tile"; anchors.fill: parent; opacity: 0.3 } + Image { source: "mobile/images/stripes.png"; fillMode: Image.Tile; anchors.fill: parent; opacity: 0.3 } Common.RssModel { id: rssModel } Common.Loading { anchors.centerIn: parent; visible: rssModel.status == 2 } diff --git a/demos/declarative/flickr/mobile/Button.qml b/demos/declarative/flickr/mobile/Button.qml index a4a96d4..770330c 100644 --- a/demos/declarative/flickr/mobile/Button.qml +++ b/demos/declarative/flickr/mobile/Button.qml @@ -26,7 +26,7 @@ Item { Text { color: "white" anchors.centerIn: buttonImage; font.bold: true - text: container.text; style: "Raised"; styleColor: "black" + text: container.text; style: Text.Raised; styleColor: "black" } states: [ State { diff --git a/demos/declarative/flickr/mobile/ImageDetails.qml b/demos/declarative/flickr/mobile/ImageDetails.qml index 26052b9..1963bf5 100644 --- a/demos/declarative/flickr/mobile/ImageDetails.qml +++ b/demos/declarative/flickr/mobile/ImageDetails.qml @@ -39,13 +39,13 @@ Flipable { right: parent.right; rightMargin: 20 top: parent.top; topMargin: 180 } - Text { font.bold: true; color: "white"; elide: "ElideRight"; text: container.photoTitle } - Text { color: "white"; elide: "ElideRight"; text: "<b>Size:</b> " + container.photoWidth + 'x' + container.photoHeight } - Text { color: "white"; elide: "ElideRight"; text: "<b>Type:</b> " + container.photoType } - Text { color: "white"; elide: "ElideRight"; text: "<b>Author:</b> " + container.photoAuthor } - Text { color: "white"; elide: "ElideRight"; text: "<b>Published:</b> " + container.photoDate } - Text { color: "white"; elide: "ElideRight"; text: container.photoTags == "" ? "" : "<b>Tags:</b> " } - Text { color: "white"; elide: "ElideRight"; elide: "ElideRight"; text: container.photoTags } + Text { font.bold: true; color: "white"; elide: Text.ElideRight; text: container.photoTitle } + Text { color: "white"; elide: Text.ElideRight; text: "<b>Size:</b> " + container.photoWidth + 'x' + container.photoHeight } + Text { color: "white"; elide: Text.ElideRight; text: "<b>Type:</b> " + container.photoType } + Text { color: "white"; elide: Text.ElideRight; text: "<b>Author:</b> " + container.photoAuthor } + Text { color: "white"; elide: Text.ElideRight; text: "<b>Published:</b> " + container.photoDate } + Text { color: "white"; elide: Text.ElideRight; text: container.photoTags == "" ? "" : "<b>Tags:</b> " } + Text { color: "white"; elide: Text.ElideRight; elide: Text.ElideRight; text: container.photoTags } } } diff --git a/demos/declarative/flickr/mobile/ListDelegate.qml b/demos/declarative/flickr/mobile/ListDelegate.qml index 090e91a..75c4572 100644 --- a/demos/declarative/flickr/mobile/ListDelegate.qml +++ b/demos/declarative/flickr/mobile/ListDelegate.qml @@ -14,9 +14,9 @@ Component { } Column { x: 92; width: wrapper.ListView.view.width - 95; y: 15; spacing: 2 - Text { text: title; color: "white"; width: parent.width; font.bold: true; elide: "ElideRight"; style: "Raised"; styleColor: "black" } - Text { text: photoAuthor; color: "white"; width: parent.width; elide: "ElideLeft"; color: "#cccccc"; style: "Raised"; styleColor: "black" } - Text { text: photoDate; color: "white"; width: parent.width; elide: "ElideRight"; color: "#cccccc"; style: "Raised"; styleColor: "black" } + Text { text: title; color: "white"; width: parent.width; font.bold: true; elide: Text.ElideRight; style: Text.Raised; styleColor: "black" } + Text { text: photoAuthor; color: "white"; width: parent.width; elide: Text.ElideLeft; color: "#cccccc"; style: Text.Raised; styleColor: "black" } + Text { text: photoDate; color: "white"; width: parent.width; elide: Text.ElideRight; color: "#cccccc"; style: Text.Raised; styleColor: "black" } } } } diff --git a/demos/declarative/flickr/mobile/TitleBar.qml b/demos/declarative/flickr/mobile/TitleBar.qml index 108faf7..07b9762 100644 --- a/demos/declarative/flickr/mobile/TitleBar.qml +++ b/demos/declarative/flickr/mobile/TitleBar.qml @@ -25,9 +25,9 @@ Item { left: parent.left; right: tagButton.left; leftMargin: 10; rightMargin: 10 verticalCenter: parent.verticalCenter } - elide: "ElideLeft" + elide: Text.ElideLeft text: (rssModel.tags=="" ? untaggedString : taggedString + rssModel.tags) - font.bold: true; color: "White"; style: "Raised"; styleColor: "Black" + font.bold: true; color: "White"; style: Text.Raised; styleColor: "Black" } Button { diff --git a/demos/declarative/minehunt/minehunt.qml b/demos/declarative/minehunt/minehunt.qml index 72431af..e71ce90 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;} } } } @@ -121,7 +121,7 @@ Item { ] Image { source: "pics/No-Ones-Laughing-3.jpg" - fillMode: "Tile" + fillMode: Image.Tile } Description { text: "Use the 'minehunt' executable to run this demo!" diff --git a/demos/declarative/samegame/samegame.qml b/demos/declarative/samegame/samegame.qml index ea7c14c..38a781a 100644 --- a/demos/declarative/samegame/samegame.qml +++ b/demos/declarative/samegame/samegame.qml @@ -13,7 +13,7 @@ Rectangle { Image { id: background anchors.fill: parent; source: "content/pics/background.png" - fillMode: "PreserveAspectCrop" + fillMode: Image.PreserveAspectCrop } Item { diff --git a/demos/declarative/twitter/content/AuthView.qml b/demos/declarative/twitter/content/AuthView.qml index 73ce308..320eef6 100644 --- a/demos/declarative/twitter/content/AuthView.qml +++ b/demos/declarative/twitter/content/AuthView.qml @@ -12,7 +12,7 @@ Item { Text { width: 100 text: "Screen name:" - font.pointSize: 10; font.bold: true; color: "white"; style: "Raised"; styleColor: "black" + font.pointSize: 10; font.bold: true; color: "white"; style: Text.Raised; styleColor: "black" anchors.verticalCenter: parent.verticalCenter horizontalAlignment: Qt.AlignRight } @@ -42,7 +42,7 @@ Item { Text { width: 100 text: "Password:" - font.pointSize: 10; font.bold: true; color: "white"; style: "Raised"; styleColor: "black" + font.pointSize: 10; font.bold: true; color: "white"; style: Text.Raised; styleColor: "black" anchors.verticalCenter: parent.verticalCenter horizontalAlignment: Qt.AlignRight } diff --git a/demos/declarative/twitter/content/FatDelegate.qml b/demos/declarative/twitter/content/FatDelegate.qml index 32a921e..194ffb3 100644 --- a/demos/declarative/twitter/content/FatDelegate.qml +++ b/demos/declarative/twitter/content/FatDelegate.qml @@ -38,7 +38,7 @@ Component { + '<a href="app://@'+userScreenName+'"><b>'+userScreenName + "</b></a> from " +source + "<br /><b>" + addTags(statusText) + "</b></html>"; textFormat: Qt.RichText - color: "white"; color: "#cccccc"; style: "Raised"; styleColor: "black"; wrap: true + color: "white"; color: "#cccccc"; style: Text.Raised; styleColor: "black"; wrap: true anchors.left: whiteRect.right; anchors.right: blackRect.right; anchors.leftMargin: 6; anchors.rightMargin: 6 onLinkActivated: handleLink(link) } diff --git a/demos/declarative/twitter/content/HomeTitleBar.qml b/demos/declarative/twitter/content/HomeTitleBar.qml index 3108a9b..b0995f3 100644 --- a/demos/declarative/twitter/content/HomeTitleBar.qml +++ b/demos/declarative/twitter/content/HomeTitleBar.qml @@ -52,9 +52,9 @@ Item { anchors.left: parent.left; anchors.right: tagButton.left anchors.leftMargin: 58; anchors.rightMargin: 10 anchors.verticalCenter: parent.verticalCenter - elide: "ElideLeft" + elide: Text.ElideLeft text: "Timeline for " + rssModel.authName - font.pointSize: 10; font.bold: true; color: "white"; style: "Raised"; styleColor: "black" + font.pointSize: 10; font.bold: true; color: "white"; style: Text.Raised; styleColor: "black" } Button { @@ -67,7 +67,7 @@ Item { id: charsLeftText; anchors.horizontalCenter: tagButton.horizontalCenter; anchors.top: tagButton.bottom; anchors.topMargin: 2 text: {140 - editor.text.length;} visible: titleBar.state == "Posting" - font.pointSize: 10; font.bold: true; color: "white"; style: "Raised"; styleColor: "black" + font.pointSize: 10; font.bold: true; color: "white"; style: Text.Raised; styleColor: "black" } Item { id: txtEdit; diff --git a/demos/declarative/twitter/twitter.qml b/demos/declarative/twitter/twitter.qml index e9752ff..fdeb839 100644 --- a/demos/declarative/twitter/twitter.qml +++ b/demos/declarative/twitter/twitter.qml @@ -29,14 +29,14 @@ Item { id: background anchors.fill: parent; color: "#343434"; - Image { source: "mobile/images/stripes.png"; fillMode: "Tile"; anchors.fill: parent; opacity: 0.3 } + Image { source: "mobile/images/stripes.png"; fillMode: Image.Tile; anchors.fill: parent; opacity: 0.3 } Twitter.RssModel { id: rssModel } Common.Loading { anchors.centerIn: parent; visible: rssModel.status==XmlListModel.Loading && state!='unauthed'} Text { width: 180 text: "Could not access twitter using this screen name and password pair."; - color: "white"; color: "#cccccc"; style: "Raised"; styleColor: "black"; wrap: true + color: "white"; color: "#cccccc"; style: Text.Raised; styleColor: "black"; wrap: true visible: rssModel.status==XmlListModel.Error; anchors.centerIn: parent } diff --git a/demos/declarative/webbrowser/fieldtext/FieldText.qml b/demos/declarative/webbrowser/fieldtext/FieldText.qml index 2adfbbf..b1c1938 100644 --- a/demos/declarative/webbrowser/fieldtext/FieldText.qml +++ b/demos/declarative/webbrowser/fieldtext/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/demos/declarative/webbrowser/webbrowser.qml b/demos/declarative/webbrowser/webbrowser.qml index 53ac214..3b1ea57 100644 --- a/demos/declarative/webbrowser/webbrowser.qml +++ b/demos/declarative/webbrowser/webbrowser.qml @@ -65,11 +65,11 @@ Item { id: headerText text: webView.title!='' || webView.progress == 1.0 ? webView.title : 'Loading...' - elide: "ElideRight" + elide: Text.ElideRight color: "white" styleColor: "black" - style: "Raised" + style: Text.Raised font.family: "Helvetica" font.pointSize: 10 @@ -81,7 +81,7 @@ Item { anchors.rightMargin: 4 anchors.top: header.top anchors.topMargin: 4 - horizontalAlignment: "AlignHCenter" + horizontalAlignment: Text.AlignHCenter } Item { width: parent.width diff --git a/doc/src/declarative/elements.qdoc b/doc/src/declarative/elements.qdoc index 4fa4ec5..3ea5989 100644 --- a/doc/src/declarative/elements.qdoc +++ b/doc/src/declarative/elements.qdoc @@ -85,7 +85,7 @@ The following table lists the QML elements provided by the Qt Declarative module \o \list \o \l Binding -\o \l ListModel +\o \l ListModel, \l ListElement \o \l VisualItemModel \o \l XmlListModel and XmlRole \o \l SqlQuery, \l SqlConnection, and \l SqlBind diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc index b872632..7a4e51c 100644 --- a/doc/src/declarative/extending.qdoc +++ b/doc/src/declarative/extending.qdoc @@ -604,7 +604,7 @@ public: \title Extending types from QML Many of the elements available for use in QML are implemented in -\l {QML for C++ Programmers}{C++}. These types are know as "core types". QML +\l {Extending QML}{C++}. These types are know as "core types". QML allows programmers to build new, fully functional elements without using C++. Existing core types can be extended, and new types defined entirely in the QML language. 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/doc/src/declarative/qmlmodels.qdoc b/doc/src/declarative/qmlmodels.qdoc index 45df29b..a14345b 100644 --- a/doc/src/declarative/qmlmodels.qdoc +++ b/doc/src/declarative/qmlmodels.qdoc @@ -51,7 +51,7 @@ have items modified, inserted, removed or moved dynamically. Data is provided to the delegate via named data roles which the delegate may bind to. The roles are exposed as properties of the -\model property, though this property is set as a default property +\e model property, though this property is set as a default property of the delegate so, unless there is a naming clash with a property in the delegate, the roles are usually accessed unqualified. diff --git a/doc/src/declarative/qmlreference.qdoc b/doc/src/declarative/qmlreference.qdoc index 6a874b6..a56813c 100644 --- a/doc/src/declarative/qmlreference.qdoc +++ b/doc/src/declarative/qmlreference.qdoc @@ -60,9 +60,8 @@ \list \o \l {Introduction to the QML language} \o \l {tutorial}{Tutorial: 'Hello World'} - \o \l {tutorials-declarative-contacts.html}{Tutorial: 'Introduction to QML'} \o \l {advtutorial.html}{Advanced Tutorial: 'Same Game'} - \o \l {qmlexamples}{Examples} + \o \l {QML Examples and Walkthroughs} \endlist \section1 Core QML Features: @@ -82,7 +81,11 @@ QML Reference: \list - \o \l {QML Format Reference} \o \l {elements}{QML Elements} \endlist + + \section1 Deprecated + \list + \o \l {tutorials-declarative-contacts.html}{Tutorial: 'Introduction to QML'} + \endlist */ diff --git a/doc/src/declarative/qmlstates.qdoc b/doc/src/declarative/qmlstates.qdoc index 078b718..261e3f5 100644 --- a/doc/src/declarative/qmlstates.qdoc +++ b/doc/src/declarative/qmlstates.qdoc @@ -55,5 +55,6 @@ Other things you can do in a state change: \o change an item's parent with ParentChange \o change an item's anchors with AnchorChanges \o run some script with StateChangeScript +\endlist */ diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc index 18685ac..61520f7 100644 --- a/doc/src/declarative/qtbinding.qdoc +++ b/doc/src/declarative/qtbinding.qdoc @@ -211,7 +211,6 @@ Rectangle { } } \endcode -\endtable To detect when a C++ property value - in this case the \c CustomPalette's \c text property - changes, the property must have a corresponding NOTIFY signal. The NOTIFY signal specifies a signal diff --git a/doc/src/declarative/qtprogrammers.qdoc b/doc/src/declarative/qtprogrammers.qdoc index ea27d7e..4c28255 100644 --- a/doc/src/declarative/qtprogrammers.qdoc +++ b/doc/src/declarative/qtprogrammers.qdoc @@ -109,7 +109,7 @@ just as QTextEdit, QWebView, and QListView are built upon those same UI-agnostic components. The encapsulation of the look and feel that QWidgets gives is important, and for this -the QML concept of \l components serves the same purpose. If you are building a complete +the QML concept of \l {qmldocuments.html}{components} serves the same purpose. If you are building a complete suite of applications which should have a consistent look and feel, you should build a set of reusable components with the look and feel you desire. 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 Binary files differindex 9623b1a..3d66d72 100644 --- a/examples/declarative/aspectratio/pics/face.png +++ b/examples/declarative/aspectratio/pics/face.png 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/dynamic/Button.qml b/examples/declarative/dynamic/Button.qml new file mode 100644 index 0000000..0b8b6db --- /dev/null +++ b/examples/declarative/dynamic/Button.qml @@ -0,0 +1,24 @@ +import Qt 4.6 + +Rectangle { + id: container + + property var text + signal clicked + + SystemPalette { id: activePalette; colorGroup: Qt.Active } + height: text.height + 10 + width: text.width + 20 + border.width: 1 + radius: 4 + gradient: Gradient { + GradientStop { position: 0.0; + color: if(!mr.pressed){activePalette.light;}else{activePalette.button;} + } + GradientStop { position: 1.0; + color: if(!mr.pressed){activePalette.button;}else{activePalette.dark;} + } + } + MouseRegion { id:mr; anchors.fill: parent; onClicked: container.clicked() } + Text { id: text; anchors.centerIn:parent; font.pointSize: 10; text: parent.text; color: activePalette.buttonText } +} diff --git a/examples/declarative/dynamic/GenericItem.qml b/examples/declarative/dynamic/GenericItem.qml new file mode 100644 index 0000000..10e3dba --- /dev/null +++ b/examples/declarative/dynamic/GenericItem.qml @@ -0,0 +1,13 @@ +import Qt 4.6 + +Item{ + property bool created: false + property string image + width: imageItem.width + height: imageItem.height + z: 2 + Image{ + id: imageItem + source: image; + } +} diff --git a/examples/declarative/dynamic/PaletteItem.qml b/examples/declarative/dynamic/PaletteItem.qml new file mode 100644 index 0000000..bb6036d --- /dev/null +++ b/examples/declarative/dynamic/PaletteItem.qml @@ -0,0 +1,13 @@ +import Qt 4.6 + +GenericItem { + id: itemButton + property string file + Script { source: "itemCreation.js" } + MouseRegion { + anchors.fill: parent; + onPressed: startDrag(mouse); + onPositionChanged: moveDrag(mouse); + onReleased: endDrag(mouse); + } +} diff --git a/examples/declarative/dynamic/Sun.qml b/examples/declarative/dynamic/Sun.qml index 16d9907..a9f5d40 100644 --- a/examples/declarative/dynamic/Sun.qml +++ b/examples/declarative/dynamic/Sun.qml @@ -3,9 +3,11 @@ import Qt 4.6 Image { id: sun property bool created: false + property string image: "images/sun.png" onCreatedChanged: if(created){window.activeSuns++;}else{window.activeSuns--;} - source: "images/sun.png"; + source: image; + z: 1 //x and y get set when instantiated //head offscreen diff --git a/examples/declarative/dynamic/dynamic.qml b/examples/declarative/dynamic/dynamic.qml index aea9b0f..885e037 100644 --- a/examples/declarative/dynamic/dynamic.qml +++ b/examples/declarative/dynamic/dynamic.qml @@ -2,8 +2,8 @@ import Qt 4.6 Item { id: window - //This is a desktop example - width: 1024; height: 480 + //This is a desktop-sized example + width: 1024; height: 512 property int activeSuns: 0 // sky @@ -33,6 +33,7 @@ Item { } } + //Day state, for when you place a sun states: State { name: "Day"; when: window.activeSuns > 0 PropertyChanges { target: stopA; color: "DeepSkyBlue"} PropertyChanges { target: stopB; color: "SkyBlue"} @@ -44,71 +45,70 @@ Item { ColorAnimation { duration: 3000 } } - //TODO: Below feature needs beautification to meet minimum standards + SystemPalette { id: activePalette; colorGroup: Qt.Active } + // toolbox Rectangle { id: toolbox z: 3 //Above ground - color: "white" + color: activePalette.window; width: 480 anchors { right: parent.right; top:parent.top; bottom: parent.bottom } + Rectangle { //Not a child of any positioner + color: "white"; border.color: "black"; + width: toolRow.width + 4 + height: toolRow.height + 4 + x: toolboxPositioner.x + toolRow.x - 2 + y: toolboxPositioner.y + toolRow.y - 2 + } Column{ id: toolboxPositioner anchors.centerIn: parent - spacing: 1 - Sun { - id: sunButton - Script { source: "sunCreation.js" } - MouseRegion { - anchors.fill: parent; - onPressed: startDrag(mouse); - onPositionChanged: moveDrag(mouse); - onReleased: endDrag(mouse); + spacing: 8 + Text{ text: "Drag an item into the scene." } + Row{ id: toolRow + spacing: 8; + PaletteItem{ + anchors.verticalCenter: parent.verticalCenter + file: "Sun.qml"; + image: "images/sun.png" } - } - Text{ text: "Active Suns: " + activeSuns } - Rectangle { width: 440; height: 1; color: "black" } - Text{ text: "Arbitrary Javascript: " } - TextEdit { - id: jsText - width: 460 - height: 80 - readOnly: false - focusOnPress: true - - text: "window.activeSuns++;" - } - Rectangle { - width: 80 - height: 20 - color: "lightsteelblue" - Text{ anchors.centerIn: parent; text: "Execute" } - MouseRegion { - anchors.fill: parent; - onClicked: eval(jsText.text.toString()); + PaletteItem{ + file: "GenericItem.qml" + image: "images/moon.png" + } + PaletteItem{ + anchors.verticalCenter: parent.verticalCenter + file: "GenericItem.qml" + image: "images/tree_s.png" + } + PaletteItem{ + anchors.verticalCenter: parent.verticalCenter + file: "GenericItem.qml" + image: "images/rabbit_brown.png" + } + PaletteItem{ + anchors.verticalCenter: parent.verticalCenter + file: "GenericItem.qml" + image: "images/rabbit_bw.png" } } - + Text{ text: "Active Suns: " + activeSuns } Rectangle { width: 440; height: 1; color: "black" } Text{ text: "Arbitrary QML: " } TextEdit { id: qmlText width: 460 - height: 180 + height: 220 readOnly: false focusOnPress: true + font.pixelSize: 16 - text: "import Qt 4.6\nImage { id: smile; x: 10; y: 10; \n source: 'images/face-smile.png';\n opacity: NumberAnimation{ \n running:true; to: 0; duration: 1500;\n }\n Component.onCompleted: smile.destroy(1500);\n}" + text: "import Qt 4.6\nImage { id: smile;\n x: 500*Math.random();\n y: 200*Math.random(); \n source: 'images/face-smile.png';\n opacity: NumberAnimation{ \n running:true; to: 0; duration: 1500;\n }\n Component.onCompleted: smile.destroy(1500);\n}" } - Rectangle { - width: 80 - height: 20 - color: "lightsteelblue" - Text{ anchors.centerIn: parent; text: "Create" } - MouseRegion { - anchors.fill: parent; - onClicked: {var obj=createQmlObject(qmlText.text, window, 'CustomObject'); obj.parent=window;} - } + Button { + text: "Create" + onClicked: {var obj=createQmlObject(qmlText.text, window, 'CustomObject'); obj.parent=window;} } } } diff --git a/examples/declarative/dynamic/images/NOTE b/examples/declarative/dynamic/images/NOTE new file mode 100644 index 0000000..fcd87f9 --- /dev/null +++ b/examples/declarative/dynamic/images/NOTE @@ -0,0 +1 @@ +Images (except star.png) are from the KDE project. diff --git a/examples/declarative/dynamic/images/moon.png b/examples/declarative/dynamic/images/moon.png Binary files differnew file mode 100644 index 0000000..1c0d606 --- /dev/null +++ b/examples/declarative/dynamic/images/moon.png diff --git a/examples/declarative/dynamic/images/rabbit_brown.png b/examples/declarative/dynamic/images/rabbit_brown.png Binary files differnew file mode 100644 index 0000000..ebfdeed --- /dev/null +++ b/examples/declarative/dynamic/images/rabbit_brown.png diff --git a/examples/declarative/dynamic/images/rabbit_bw.png b/examples/declarative/dynamic/images/rabbit_bw.png Binary files differnew file mode 100644 index 0000000..7bff9b9 --- /dev/null +++ b/examples/declarative/dynamic/images/rabbit_bw.png diff --git a/examples/declarative/dynamic/images/tree_s.png b/examples/declarative/dynamic/images/tree_s.png Binary files differnew file mode 100644 index 0000000..6eac35a --- /dev/null +++ b/examples/declarative/dynamic/images/tree_s.png diff --git a/examples/declarative/dynamic/itemCreation.js b/examples/declarative/dynamic/itemCreation.js new file mode 100644 index 0000000..06e67c5 --- /dev/null +++ b/examples/declarative/dynamic/itemCreation.js @@ -0,0 +1,81 @@ +var itemComponent = null; +var draggedItem = null; +var startingMouse; +var startingZ; +//Until QT-2385 is resolved we need to convert to scene coordinates manually +var xOffset; +var yOffset; +function setSceneOffset() +{ + xOffset = 0; + yOffset = 0; + var p = itemButton; + while(p != window){ + xOffset += p.x; + yOffset += p.y; + p = p.parent; + } +} + +function startDrag(mouse) +{ + setSceneOffset(); + startingMouse = { x: mouse.x, y: mouse.y } + loadComponent(); +} + +//Creation is split into two functions due to an asyncronous wait while +//possible external files are loaded. + +function loadComponent() { + if (itemComponent != null) //Already loaded the component + createItem(); + + itemComponent = createComponent(itemButton.file); + if(itemComponent.isLoading){ + component.statusChanged.connect(finishCreation); + }else{//Depending on the content, it can be ready or error immediately + createItem(); + } +} + +function createItem() { + if (itemComponent.isReady && draggedItem == null) { + draggedItem = itemComponent.createObject(); + draggedItem.parent = window; + draggedItem.image = itemButton.image; + draggedItem.x = xOffset; + draggedItem.y = yOffset; + startingZ = draggedItem.z; + draggedItem.z = 4;//On top + } else if (itemComponent.isError) { + draggedItem = null; + print("error creating component"); + print(component.errorsString()); + } +} + +function moveDrag(mouse) +{ + if(draggedItem == null) + return; + + draggedItem.x = mouse.x + xOffset - startingMouse.x; + draggedItem.y = mouse.y + yOffset - startingMouse.y; +} + +function endDrag(mouse) +{ + if(draggedItem == null) + return; + + if(draggedItem.x + draggedItem.width > toolbox.x){ //Don't drop it in the toolbox + draggedItem.destroy(); + draggedItem = null; + }else{ + draggedItem.z = startingZ; + draggedItem.created = true; + draggedItem = null; + } +} + diff --git a/examples/declarative/dynamic/sunCreation.js b/examples/declarative/dynamic/sunCreation.js deleted file mode 100644 index d9e5dce..0000000 --- a/examples/declarative/dynamic/sunCreation.js +++ /dev/null @@ -1,69 +0,0 @@ -var sunComponent = null; -var draggedItem = null; -var startingMouse; -//Until QT-2385 is resolved we need to convert to scene coordinates manually -var xOffset; -var yOffset; - -function startDrag(mouse) -{ - xOffset = toolbox.x + toolboxPositioner.x; - yOffset = toolbox.y + toolboxPositioner.y; - startingMouse = mouse; - loadComponent(); -} - -//Creation is split into two functions due to an asyncronous wait while -//possible external files are loaded. - -function loadComponent() { - if (sunComponent != null) //Already loaded the component - createSun(); - - sunComponent = createComponent("Sun.qml"); - if(sunComponent.isLoading){ - component.statusChanged.connect(finishCreation); - }else{//Depending on the content, it can be ready or error immediately - createSun(); - } -} - -function createSun() { - if (sunComponent.isReady && draggedItem == null) { - draggedItem = sunComponent.createObject(); - draggedItem.parent = window; - draggedItem.x = startingMouse.x + xOffset; - draggedItem.y = startingMouse.y + yOffset; - draggedItem.z = 4;//On top - } else if (sunComponent.isError) { - draggedItem = null; - print("error creating component"); - print(component.errorsString()); - } -} - -function moveDrag(mouse) -{ - if(draggedItem == null) - return; - - draggedItem.x = mouse.x + xOffset; - draggedItem.y = mouse.y + yOffset; -} - -function endDrag(mouse) -{ - if(draggedItem == null) - return; - - if(draggedItem.x + draggedItem.width > toolbox.x //Don't drop it in the toolbox - || draggedItem.y > ground.y){//Don't drop it on the ground - draggedItem.destroy(); - draggedItem = null; - }else{ - draggedItem.z = 1; - draggedItem.created = true; - draggedItem = null; - } -} - 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/listview/itemlist.qml b/examples/declarative/listview/itemlist.qml index 77f5c2d..6ce4287 100644 --- a/examples/declarative/listview/itemlist.qml +++ b/examples/declarative/listview/itemlist.qml @@ -32,7 +32,7 @@ Rectangle { preferredHighlightBegin: 0 preferredHighlightEnd: 0 highlightRangeMode: "StrictlyEnforceRange" - orientation: "Horizontal" + orientation: ListView.Horizontal } Rectangle { diff --git a/examples/declarative/listview/listview.qml b/examples/declarative/listview/listview.qml index b614904..92acce1 100644 --- a/examples/declarative/listview/listview.qml +++ b/examples/declarative/listview/listview.qml @@ -72,5 +72,6 @@ Rectangle { preferredHighlightBegin: 125 preferredHighlightEnd: 125 highlightRangeMode: "StrictlyEnforceRange" + flickDeceleration: 1000 } } 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/parallax/ParallaxView.qml b/examples/declarative/parallax/ParallaxView.qml index bad9b85..50ab72c 100644 --- a/examples/declarative/parallax/ParallaxView.qml +++ b/examples/declarative/parallax/ParallaxView.qml @@ -25,7 +25,8 @@ Item { anchors.fill: parent model: VisualItemModel { id: visualModel } - highlight: Item { height: 1; width: 1} + highlight: Rectangle { height: 1; width: 1 } + highlightMoveSpeed: 2000 preferredHighlightBegin: 0 preferredHighlightEnd: 0 highlightRangeMode: "StrictlyEnforceRange" 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/debugger/qmldebug.cpp b/src/declarative/debugger/qmldebug.cpp index 2537ec0..5a8cda0 100644 --- a/src/declarative/debugger/qmldebug.cpp +++ b/src/declarative/debugger/qmldebug.cpp @@ -67,26 +67,30 @@ int QmlEngineDebugPrivate::getId() void QmlEngineDebugPrivate::remove(QmlEngineDebug *c, QmlDebugEnginesQuery *q) { QmlEngineDebugPrivate *p = (QmlEngineDebugPrivate *)QObjectPrivate::get(c); - p->enginesQuery.remove(q->m_queryId); + if (p && q) + p->enginesQuery.remove(q->m_queryId); } void QmlEngineDebugPrivate::remove(QmlEngineDebug *c, QmlDebugRootContextQuery *q) { QmlEngineDebugPrivate *p = (QmlEngineDebugPrivate *)QObjectPrivate::get(c); - p->rootContextQuery.remove(q->m_queryId); + if (p && q) + p->rootContextQuery.remove(q->m_queryId); } void QmlEngineDebugPrivate::remove(QmlEngineDebug *c, QmlDebugObjectQuery *q) { QmlEngineDebugPrivate *p = (QmlEngineDebugPrivate *)QObjectPrivate::get(c); - p->objectQuery.remove(q->m_queryId); + if (p && q) + p->objectQuery.remove(q->m_queryId); } void QmlEngineDebugPrivate::remove(QmlEngineDebug *c, QmlDebugExpressionQuery *q) { QmlEngineDebugPrivate *p = (QmlEngineDebugPrivate *)QObjectPrivate::get(c); - p->expressionQuery.remove(q->m_queryId); + if (p && q) + p->expressionQuery.remove(q->m_queryId); } Q_DECLARE_METATYPE(QmlDebugObjectReference); @@ -118,9 +122,10 @@ void QmlEngineDebugPrivate::decode(QDataStream &ds, QmlDebugObjectReference &o, prop.m_binding = data.binding; prop.m_hasNotifySignal = data.hasNotifySignal; prop.m_valueTypeName = data.valueTypeName; - if (data.type == QmlEngineDebugServer::QmlObjectProperty::Basic) + if (data.type == QmlEngineDebugServer::QmlObjectProperty::Basic + || data.type == QmlEngineDebugServer::QmlObjectProperty::List) { prop.m_value = data.value; - else if (data.type == QmlEngineDebugServer::QmlObjectProperty::Object) { + } else if (data.type == QmlEngineDebugServer::QmlObjectProperty::Object) { QmlDebugObjectReference obj; obj.m_debugId = prop.m_value.toInt(); prop.m_value = qVariantFromValue(obj); diff --git a/src/declarative/extra/qmlxmllistmodel.cpp b/src/declarative/extra/qmlxmllistmodel.cpp index df89f56..a3c96fd 100644 --- a/src/declarative/extra/qmlxmllistmodel.cpp +++ b/src/declarative/extra/qmlxmllistmodel.cpp @@ -406,6 +406,11 @@ void QmlXmlRoleList::insert(int i, QmlXmlListModelRole *role) } /*! + \class QmlXmlListModel + \internal +*/ + +/*! \qmlclass XmlListModel \brief The XmlListModel element allows you to specify a model using XPath expressions. diff --git a/src/declarative/fx/qfxflickable.cpp b/src/declarative/fx/qfxflickable.cpp index 92e79dd..659193d 100644 --- a/src/declarative/fx/qfxflickable.cpp +++ b/src/declarative/fx/qfxflickable.cpp @@ -57,6 +57,8 @@ QT_BEGIN_NAMESPACE static const int DragThreshold = 8; static const int FlickThreshold = 20; +// Really slow flicks can be annoying. +static const int minimumFlickVelocity = 200; class QFxFlickableVisibleArea : public QObject { @@ -183,6 +185,8 @@ void QFxFlickablePrivate::flickX(qreal velocity) { Q_Q(QFxFlickable); qreal maxDistance = -1; + if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks. + velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity; // -ve velocity means list is moving up if (velocity > 0) { if (_moveX.value() < q->minXExtent()) @@ -686,8 +690,8 @@ void QFxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event) if (rejectX) velocityX = 0; if (moved) { - q->viewportMoved(); q->movementStarting(); + q->viewportMoved(); } lastPos = event->pos(); @@ -707,15 +711,23 @@ void QFxFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *even } vTime = timeline.time(); - if (qAbs(velocityY) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold) - flickY(velocityY); - else + if (qAbs(velocityY) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold) { + qreal velocity = velocityY; + if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks. + velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity; + flickY(velocity); + } else { fixupY(); + } - if (qAbs(velocityX) > 10 && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold) - flickX(velocityX); - else + if (qAbs(velocityX) > 10 && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold) { + qreal velocity = velocityX; + if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks. + velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity; + flickX(velocity); + } else { fixupX(); + } stealMouse = false; lastPosTime = QTime(); diff --git a/src/declarative/fx/qfximage.cpp b/src/declarative/fx/qfximage.cpp index 860af66..45a481c 100644 --- a/src/declarative/fx/qfximage.cpp +++ b/src/declarative/fx/qfximage.cpp @@ -82,7 +82,7 @@ QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,Image,QFxImage) \o fillMode: Tile \qml Image { - fillMode: "Tile" + fillMode: Image.Tile width: 160; height: 160 source: "pics/qtlogo.png" } @@ -92,7 +92,7 @@ QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,Image,QFxImage) \o fillMode: TileVertically \qml Image { - fillMode: "TileVertically" + fillMode: Image.TileVertically width: 160; height: 160 source: "pics/qtlogo.png" } @@ -102,7 +102,7 @@ QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,Image,QFxImage) \o fillMode: TileHorizontally \qml Image { - fillMode: "TileHorizontally" + fillMode: Image.TileHorizontally width: 160; height: 160 source: "pics/qtlogo.png" } @@ -161,7 +161,7 @@ void QFxImage::setPixmap(const QPixmap &pix) } /*! - \qmlproperty FillMode Image::fillMode + \qmlproperty enumeration Image::fillMode Set this property to define what happens when the image set for the item is smaller than the size of the item. diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index e714494..ed07696 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -79,6 +79,19 @@ QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,Rotation,QGraphicsRotation) #include "qfxeffects.cpp" /*! + \qmlclass Transform + \brief The Transform elements provide a way of building advanced transformations on Items. + + The Transform elements let you create and control advanced transformations that can be configured + independently using specialized properties. + + You can assign any number of Transform elements to an Item. Each Transform is applied in order, + one at a time, to the Item it's assigned to. + + \sa Rotation, Scale +*/ + +/*! \qmlclass Scale \brief The Scale object provides a way to scale an Item. @@ -1199,7 +1212,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 @@ -1295,7 +1308,7 @@ QFxKeysAttached *QFxKeysAttached::qmlAttachedProperties(QObject *obj) This signal is emitted when the \a state of the item changes. - \sa states-transitions + \sa {qmlstates}{States} */ /*! @@ -2315,14 +2328,14 @@ QmlList<QObject *> *QFxItem::resources() } \endqml - \sa {states-transitions}{States and Transitions} + \sa {qmlstate}{States} */ /*! \property QFxItem::states This property holds a list of states defined by the item. - \sa {states-transitions}{States and Transitions} + \sa {qmlstate}{States} */ QmlList<QmlState *>* QFxItem::states() { @@ -2344,14 +2357,14 @@ QmlList<QmlState *>* QFxItem::states() } \endqml - \sa {states-transitions}{States and Transitions} + \sa {state-transitions}{Transitions} */ /*! \property QFxItem::transitions This property holds a list of transitions defined by the item. - \sa {states-transitions}{States and Transitions} + \sa {state-transitions}{Transitions} */ QmlList<QmlTransition *>* QFxItem::transitions() { @@ -2423,7 +2436,7 @@ QmlList<QmlTransition *>* QFxItem::transitions() set), \c state will be a blank string. Likewise, you can return an item to its base state by setting its current state to \c ''. - \sa {states-transitions}{States and Transitions} + \sa {qmlstates}{States} */ /*! @@ -2449,7 +2462,7 @@ QmlList<QmlTransition *>* QFxItem::transitions() set), \c state will be a blank string. Likewise, you can return an item to its base state by setting its current state to \c ''. - \sa {states-transitions}{States and Transitions} + \sa {qmlstates}{States} */ QString QFxItem::state() const { diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp index fbb91b1..1f1b97b 100644 --- a/src/declarative/fx/qfxlistview.cpp +++ b/src/declarative/fx/qfxlistview.cpp @@ -141,15 +141,15 @@ public: } ~FxListItem() {} - qreal position() const { return (view->orientation() == Qt::Vertical ? item->y() : item->x()); } - int size() const { return (view->orientation() == Qt::Vertical ? item->height() : item->width()); } + qreal position() const { return (view->orientation() == QFxListView::Vertical ? item->y() : item->x()); } + int size() const { return (view->orientation() == QFxListView::Vertical ? item->height() : item->width()); } qreal endPosition() const { - return (view->orientation() == Qt::Vertical + return (view->orientation() == QFxListView::Vertical ? item->y() + (item->height() > 0 ? item->height() : 1) : item->x() + (item->width() > 0 ? item->width() : 1)) - 1; } void setPosition(qreal pos) { - if (view->orientation() == Qt::Vertical) { + if (view->orientation() == QFxListView::Vertical) { item->setY(pos); } else { item->setX(pos); @@ -170,7 +170,7 @@ class QFxListViewPrivate : public QFxFlickablePrivate public: QFxListViewPrivate() - : model(0), currentItem(0), orient(Qt::Vertical) + : model(0), currentItem(0), orient(QFxListView::Vertical) , visiblePos(0), visibleIndex(0) , averageSize(100.0), currentIndex(-1), requestedIndex(-1) , highlightRangeStart(0), highlightRangeEnd(0) @@ -199,18 +199,18 @@ public: qreal position() const { Q_Q(const QFxListView); - return orient == Qt::Vertical ? q->viewportY() : q->viewportX(); + return orient == QFxListView::Vertical ? q->viewportY() : q->viewportX(); } void setPosition(qreal pos) { Q_Q(QFxListView); - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) q->setViewportY(pos); else q->setViewportX(pos); } qreal size() const { Q_Q(const QFxListView); - return orient == Qt::Vertical ? q->height() : q->width(); + return orient == QFxListView::Vertical ? q->height() : q->width(); } qreal startPosition() const { @@ -378,7 +378,7 @@ public: QList<FxListItem*> visibleItems; QHash<QFxItem*,int> unrequestedItems; FxListItem *currentItem; - Qt::Orientation orient; + QFxListView::Orientation orient; int visiblePos; int visibleIndex; qreal averageSize; @@ -454,7 +454,7 @@ FxListItem *QFxListViewPrivate::createItem(int modelIndex) model->completeItem(); listItem->item->setZValue(1); listItem->item->setParent(q->viewport()); - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) QObject::connect(listItem->item, SIGNAL(heightChanged()), q, SLOT(itemResized())); else QObject::connect(listItem->item, SIGNAL(widthChanged()), q, SLOT(itemResized())); @@ -470,8 +470,8 @@ void QFxListViewPrivate::releaseItem(FxListItem *item) if (!item) return; if (trackedItem == item) { - const char *notifier1 = orient == Qt::Vertical ? SIGNAL(yChanged()) : SIGNAL(xChanged()); - const char *notifier2 = orient == Qt::Vertical ? SIGNAL(heightChanged()) : SIGNAL(widthChanged()); + const char *notifier1 = orient == QFxListView::Vertical ? SIGNAL(yChanged()) : SIGNAL(xChanged()); + const char *notifier2 = orient == QFxListView::Vertical ? SIGNAL(heightChanged()) : SIGNAL(widthChanged()); QObject::disconnect(trackedItem->item, notifier1, q, SLOT(trackedPositionChanged())); QObject::disconnect(trackedItem->item, notifier2, q, SLOT(trackedPositionChanged())); trackedItem = 0; @@ -479,7 +479,7 @@ void QFxListViewPrivate::releaseItem(FxListItem *item) if (model->release(item->item) == 0) { // item was not destroyed, and we no longer reference it. unrequestedItems.insert(item->item, model->indexOf(item->item, q)); - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) QObject::disconnect(item->item, SIGNAL(heightChanged()), q, SLOT(itemResized())); else QObject::disconnect(item->item, SIGNAL(widthChanged()), q, SLOT(itemResized())); @@ -553,7 +553,7 @@ void QFxListViewPrivate::refill(qreal from, qreal to) updateAverage(); if (!sectionExpression.isEmpty()) updateCurrentSection(); - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) q->setViewportHeight(endPosition() - startPosition()); else q->setViewportWidth(endPosition() - startPosition()); @@ -597,7 +597,7 @@ void QFxListViewPrivate::updateUnrequestedPositions() for (it = unrequestedItems.begin(); it != unrequestedItems.end(); ++it) { if (visibleItem(*it)) continue; - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) it.key()->setY(positionAt(*it)); else it.key()->setX(positionAt(*it)); @@ -613,8 +613,8 @@ void QFxListViewPrivate::updateTrackedItem() FxListItem *oldTracked = trackedItem; - const char *notifier1 = orient == Qt::Vertical ? SIGNAL(yChanged()) : SIGNAL(xChanged()); - const char *notifier2 = orient == Qt::Vertical ? SIGNAL(heightChanged()) : SIGNAL(widthChanged()); + const char *notifier1 = orient == QFxListView::Vertical ? SIGNAL(yChanged()) : SIGNAL(xChanged()); + const char *notifier2 = orient == QFxListView::Vertical ? SIGNAL(heightChanged()) : SIGNAL(widthChanged()); if (trackedItem && item != trackedItem) { QObject::disconnect(trackedItem->item, notifier1, q, SLOT(trackedPositionChanged())); @@ -669,16 +669,16 @@ void QFxListViewPrivate::createHighlight() if (item) { item->setZValue(0); highlight = new FxListItem(item, q); - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) highlight->item->setHeight(currentItem->item->height()); else highlight->item->setWidth(currentItem->item->width()); - const QLatin1String posProp(orient == Qt::Vertical ? "y" : "x"); + const QLatin1String posProp(orient == QFxListView::Vertical ? "y" : "x"); highlightPosAnimator = new QmlEaseFollow(q); highlightPosAnimator->setTarget(QmlMetaProperty(highlight->item, posProp)); highlightPosAnimator->setVelocity(highlightMoveSpeed); highlightPosAnimator->setEnabled(autoHighlight); - const QLatin1String sizeProp(orient == Qt::Vertical ? "height" : "width"); + const QLatin1String sizeProp(orient == QFxListView::Vertical ? "height" : "width"); highlightSizeAnimator = new QmlEaseFollow(q); highlightSizeAnimator->setVelocity(highlightResizeSpeed); highlightSizeAnimator->setTarget(QmlMetaProperty(highlight->item, sizeProp)); @@ -691,12 +691,11 @@ void QFxListViewPrivate::updateHighlight() { if ((!currentItem && highlight) || (currentItem && !highlight)) createHighlight(); - updateTrackedItem(); - if (currentItem && autoHighlight && highlight && !pressed && moveReason != QFxListViewPrivate::Mouse) { + if (currentItem && autoHighlight && highlight && !moving) { // auto-update highlight highlightPosAnimator->setSourceValue(currentItem->position()); highlightSizeAnimator->setSourceValue(currentItem->size()); - if (orient == Qt::Vertical) { + if (orient == QFxListView::Vertical) { if (highlight->item->width() == 0) highlight->item->setWidth(currentItem->item->width()); } else { @@ -704,6 +703,7 @@ void QFxListViewPrivate::updateHighlight() highlight->item->setHeight(currentItem->item->height()); } } + updateTrackedItem(); } void QFxListViewPrivate::updateSections() @@ -792,7 +792,7 @@ void QFxListViewPrivate::updateAverage() void QFxListViewPrivate::fixupPosition() { - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) fixupY(); else fixupX(); @@ -801,7 +801,7 @@ void QFxListViewPrivate::fixupPosition() void QFxListViewPrivate::fixupY() { QFxFlickablePrivate::fixupY(); - if (orient == Qt::Horizontal) + if (orient == QFxListView::Horizontal) return; if (haveHighlightRange && highlightRange == QFxListView::StrictlyEnforceRange) { @@ -816,7 +816,7 @@ void QFxListViewPrivate::fixupY() void QFxListViewPrivate::fixupX() { QFxFlickablePrivate::fixupX(); - if (orient == Qt::Vertical) + if (orient == QFxListView::Vertical) return; if (haveHighlightRange && highlightRange == QFxListView::StrictlyEnforceRange) { @@ -832,8 +832,10 @@ void QFxListViewPrivate::flickX(qreal velocity) { Q_Q(QFxListView); - if (!haveHighlightRange || highlightRange != QFxListView::StrictlyEnforceRange) + if (!haveHighlightRange || highlightRange != QFxListView::StrictlyEnforceRange) { QFxFlickablePrivate::flickX(velocity); + return; + } qreal maxDistance = -1; // -ve velocity means list is moving up @@ -855,19 +857,20 @@ void QFxListViewPrivate::flickX(qreal velocity) v = maxVelocity; } qreal accel = deceleration; - qreal maxAccel = (v * v) / (2.0f * maxDistance); + qreal v2 = v * v; + qreal maxAccel = v2 / (2.0f * maxDistance); if (maxAccel < accel) { // If we are not flicking to the end then attempt to stop exactly on an item boundary - qreal dist = (v * v) / accel / 2.0; + qreal dist = v2 / accel / 2.0; if (v > 0) dist = -dist; - dist = -_moveX.value() - snapPosAt(-_moveX.value() + dist + highlightRangeStart); + dist = -_moveX.value() - snapPosAt(-(_moveX.value() - highlightRangeStart) + dist) + highlightRangeStart; if (v < 0 && dist >= 0 || v > 0 && dist <= 0) { timeline.reset(_moveX); fixupX(); return; } - accel = (v * v) / (2.0f * qAbs(dist)); + accel = v2 / (2.0f * qAbs(dist)); } timeline.reset(_moveX); timeline.accel(_moveX, v, accel, maxDistance); @@ -885,7 +888,60 @@ void QFxListViewPrivate::flickX(qreal velocity) void QFxListViewPrivate::flickY(qreal velocity) { - QFxFlickablePrivate::flickY(velocity); + Q_Q(QFxListView); + + if (!haveHighlightRange || highlightRange != QFxListView::StrictlyEnforceRange) { + QFxFlickablePrivate::flickY(velocity); + return; + } + + qreal maxDistance = -1; + // -ve velocity means list is moving up + if (velocity > 0) { + if (_moveY.value() < q->minYExtent()) + maxDistance = qAbs(q->minYExtent() -_moveY.value() + (overShoot?30:0)); + flickTargetY = q->minYExtent(); + } else { + if (_moveY.value() > q->maxYExtent()) + maxDistance = qAbs(q->maxYExtent() - _moveY.value()) + (overShoot?30:0); + flickTargetY = q->maxYExtent(); + } + if (maxDistance > 0) { + qreal v = velocity; + if (maxVelocity != -1 && maxVelocity < qAbs(v)) { + if (v < 0) + v = -maxVelocity; + else + v = maxVelocity; + } + qreal accel = deceleration; + qreal v2 = v * v; + qreal maxAccel = v2 / (2.0f * maxDistance); + if (maxAccel < accel) { + // If we are not flicking to the end then attempt to stop exactly on an item boundary + qreal dist = v2 / accel / 2.0; + if (v > 0) + dist = -dist; + dist = -_moveY.value() - snapPosAt(-(_moveY.value() - highlightRangeStart) + dist) + highlightRangeStart; + if (v < 0 && dist >= 0 || v > 0 && dist <= 0) { + timeline.reset(_moveY); + fixupY(); + return; + } + accel = v2 / (2.0f * qAbs(dist)); + } + timeline.reset(_moveY); + timeline.accel(_moveY, v, accel, maxDistance); + timeline.execute(fixupYEvent); + if (!flicked) { + flicked = true; + emit q->flickingChanged(); + emit q->flickStarted(); + } + } else { + timeline.reset(_moveY); + fixupY(); + } } //---------------------------------------------------------------------------- @@ -1185,6 +1241,10 @@ void QFxListView::setHighlight(QmlComponent *highlight) \snippet doc/src/snippets/declarative/listview/highlight.qml 1 + Note that the highlight animation also affects the way that the view + is scrolled. This is because the view moves to maintain the + highlight within the preferred highlight range (or visible viewport). + \sa highlight */ bool QFxListView::highlightFollowsCurrentItem() const @@ -1298,18 +1358,18 @@ void QFxListView::setSpacing(qreal spacing) Horizontal Example: \image ListViewHorizontal.png */ -Qt::Orientation QFxListView::orientation() const +QFxListView::Orientation QFxListView::orientation() const { Q_D(const QFxListView); return d->orient; } -void QFxListView::setOrientation(Qt::Orientation orientation) +void QFxListView::setOrientation(QFxListView::Orientation orientation) { Q_D(QFxListView); if (d->orient != orientation) { d->orient = orientation; - if (d->orient == Qt::Vertical) + if (d->orient == QFxListView::Vertical) setViewportWidth(-1); else setViewportHeight(-1); @@ -1445,7 +1505,7 @@ void QFxListView::viewportMoved() Q_D(QFxListView); QFxFlickable::viewportMoved(); refill(); - if (isFlicking() || d->pressed) + if (isFlicking() || d->moving) d->moveReason = QFxListViewPrivate::Mouse; if (d->moveReason == QFxListViewPrivate::Mouse) { if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange && d->highlight) { @@ -1466,7 +1526,7 @@ void QFxListView::viewportMoved() qreal QFxListView::minYExtent() const { Q_D(const QFxListView); - if (d->orient == Qt::Horizontal) + if (d->orient == QFxListView::Horizontal) return QFxFlickable::minYExtent(); qreal extent = -d->startPosition(); if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) @@ -1478,7 +1538,7 @@ qreal QFxListView::minYExtent() const qreal QFxListView::maxYExtent() const { Q_D(const QFxListView); - if (d->orient == Qt::Horizontal) + if (d->orient == QFxListView::Horizontal) return QFxFlickable::maxYExtent(); qreal extent; if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) @@ -1494,7 +1554,7 @@ qreal QFxListView::maxYExtent() const qreal QFxListView::minXExtent() const { Q_D(const QFxListView); - if (d->orient == Qt::Vertical) + if (d->orient == QFxListView::Vertical) return QFxFlickable::minXExtent(); qreal extent = -d->startPosition(); if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) @@ -1506,7 +1566,7 @@ qreal QFxListView::minXExtent() const qreal QFxListView::maxXExtent() const { Q_D(const QFxListView); - if (d->orient == Qt::Vertical) + if (d->orient == QFxListView::Vertical) return QFxFlickable::maxXExtent(); qreal extent; if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) @@ -1527,8 +1587,8 @@ void QFxListView::keyPressEvent(QKeyEvent *event) return; if (d->model && d->model->count() && d->interactive) { - if ((d->orient == Qt::Horizontal && event->key() == Qt::Key_Left) - || (d->orient == Qt::Vertical && event->key() == Qt::Key_Up)) { + if ((d->orient == QFxListView::Horizontal && event->key() == Qt::Key_Left) + || (d->orient == QFxListView::Vertical && event->key() == Qt::Key_Up)) { if (currentIndex() > 0 || (d->wrap && !event->isAutoRepeat())) { d->moveReason = QFxListViewPrivate::Key; decrementCurrentIndex(); @@ -1538,8 +1598,8 @@ void QFxListView::keyPressEvent(QKeyEvent *event) event->accept(); return; } - } else if ((d->orient == Qt::Horizontal && event->key() == Qt::Key_Right) - || (d->orient == Qt::Vertical && event->key() == Qt::Key_Down)) { + } else if ((d->orient == QFxListView::Horizontal && event->key() == Qt::Key_Right) + || (d->orient == QFxListView::Vertical && event->key() == Qt::Key_Down)) { if (currentIndex() < d->model->count() - 1 || (d->wrap && !event->isAutoRepeat())) { d->moveReason = QFxListViewPrivate::Key; incrementCurrentIndex(); @@ -1606,7 +1666,7 @@ void QFxListView::trackedPositionChanged() Q_D(QFxListView); if (!d->trackedItem) return; - if (!isFlicking() && !d->pressed && d->moveReason != QFxListViewPrivate::Mouse) { + if (!isFlicking() && !d->moving && d->moveReason != QFxListViewPrivate::Mouse) { const qreal trackedPos = d->trackedItem->position(); if (d->haveHighlightRange) { if (d->highlightRange == StrictlyEnforceRange) { @@ -1930,7 +1990,7 @@ void QFxListView::createdItem(int index, QFxItem *item) if (d->requestedIndex != index) { item->setParentItem(viewport()); d->unrequestedItems.insert(item, index); - if (d->orient == Qt::Vertical) + if (d->orient == QFxListView::Vertical) item->setY(d->positionAt(index)); else item->setX(d->positionAt(index)); diff --git a/src/declarative/fx/qfxlistview.h b/src/declarative/fx/qfxlistview.h index 0fa0fa0..b31b951 100644 --- a/src/declarative/fx/qfxlistview.h +++ b/src/declarative/fx/qfxlistview.h @@ -72,7 +72,7 @@ class Q_DECLARATIVE_EXPORT QFxListView : public QFxFlickable Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode) Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged) - Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) + Q_PROPERTY(Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled) Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer) Q_PROPERTY(QString sectionExpression READ sectionExpression WRITE setSectionExpression NOTIFY sectionExpressionChanged) @@ -81,6 +81,7 @@ class Q_DECLARATIVE_EXPORT QFxListView : public QFxFlickable Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged) Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged) Q_ENUMS(HighlightRangeMode) + Q_ENUMS(Orientation) Q_CLASSINFO("DefaultProperty", "data") public: @@ -118,8 +119,9 @@ public: qreal spacing() const; void setSpacing(qreal spacing); - Qt::Orientation orientation() const; - void setOrientation(Qt::Orientation); + enum Orientation { Horizontal = Qt::Horizontal, Vertical = Qt::Vertical }; + Orientation orientation() const; + void setOrientation(Orientation); bool isWrapEnabled() const; void setWrapEnabled(bool); diff --git a/src/declarative/fx/qfxmouseregion.cpp b/src/declarative/fx/qfxmouseregion.cpp index 4b31fd4..315a273 100644 --- a/src/declarative/fx/qfxmouseregion.cpp +++ b/src/declarative/fx/qfxmouseregion.cpp @@ -319,8 +319,8 @@ void QFxMouseRegion::setEnabled(bool a) \code Text { text: mr.pressedButtons & Qt.RightButton ? "right" : "" - horizontalAlignment: "AlignHCenter" - verticalAlignment: "AlignVCenter" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter MouseRegion { id: mr acceptedButtons: Qt.LeftButton | Qt.RightButton diff --git a/src/declarative/fx/qfxpositioners.cpp b/src/declarative/fx/qfxpositioners.cpp index f8e7213..86a069d 100644 --- a/src/declarative/fx/qfxpositioners.cpp +++ b/src/declarative/fx/qfxpositioners.cpp @@ -375,6 +375,10 @@ Column { \endqml \endtable + Note that the positioner assumes that the x and y positions of its children + will not change. If you manually change the x or y properties in script, bind + the x or y properties, or use anchors on a child of a positioner, then the + positioner may exhibit strange behaviour. */ /*! @@ -539,6 +543,11 @@ Row { \endqml \image horizontalpositioner_example.png + Note that the positioner assumes that the x and y positions of its children + will not change. If you manually change the x or y properties in script, bind + the x or y properties, or use anchors on a child of a positioner, then the + positioner may exhibit strange behaviour. + */ /*! \qmlproperty Transition Row::remove @@ -659,8 +668,10 @@ void QFxRow::doPositioning() child->setX(hoffset); setMovingItem(0); } - hoffset += child->width(); - hoffset += spacing(); + if(child->width() && child->height()){//don't advance for invisible children + hoffset += child->width(); + hoffset += spacing(); + } } } @@ -705,6 +716,11 @@ Grid { } \endqml \endtable + + Note that the positioner assumes that the x and y positions of its children + will not change. If you manually change the x or y properties in script, bind + the x or y properties, or use anchors on a child of a positioner, then the + positioner may exhibit strange behaviour. */ /*! \qmlproperty Transition Grid::remove diff --git a/src/declarative/fx/qfxtext.cpp b/src/declarative/fx/qfxtext.cpp index 4d02f0d..4a01cbd 100644 --- a/src/declarative/fx/qfxtext.cpp +++ b/src/declarative/fx/qfxtext.cpp @@ -231,9 +231,9 @@ QColor QFxText::color() const \qml Row { Text { font.pointSize: 24; text: "Normal" } - Text { font.pointSize: 24; text: "Raised"; style: "Raised"; styleColor: "#AAAAAA" } - Text { font.pointSize: 24; text: "Outline"; style: "Outline"; styleColor: "red" } - Text { font.pointSize: 24; text: "Sunken"; style: "Sunken"; styleColor: "#AAAAAA" } + Text { font.pointSize: 24; text: "Raised"; style: Text.Raised; styleColor: "#AAAAAA" } + Text { font.pointSize: 24; text: "Outline"; style: Text.Outline; styleColor: "red" } + Text { font.pointSize: 24; text: "Sunken"; style: Text.Sunken; styleColor: "#AAAAAA" } } \endqml @@ -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/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index ad74446..7a417bb 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -150,6 +150,8 @@ bool QmlCompiler::isSignalPropertyName(const QByteArray &name) } /*! + \macro COMPILE_EXCEPTION + \internal Inserts an error into the QmlCompiler error list, and returns false (failure). @@ -175,6 +177,8 @@ bool QmlCompiler::isSignalPropertyName(const QByteArray &name) } /*! + \macro COMPILE_CHECK + \internal Returns false if \a is false, otherwise does nothing. */ #define COMPILE_CHECK(a) \ diff --git a/src/declarative/qml/qmlcomponent.cpp b/src/declarative/qml/qmlcomponent.cpp index 02c9b10..6181f41 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" @@ -74,7 +75,7 @@ int statusId = qRegisterMetaType<QmlComponent::Status>("QmlComponent::Status"); \brief The Component element encapsulates a QML component description. Components are reusable, encapsulated Qml element with a well-defined interface. - They are often defined in \l {components}{Component Files}. + They are often defined in \l {qmldocuments.html}{Component Files}. The \e Component element allows defining components within a QML file. This can be useful for reusing a small component within a single QML @@ -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(); @@ -267,6 +274,10 @@ bool QmlComponent::isLoading() const return status() == Loading; } +/*! + Returns he progress of loading the component, from 0.0 (nothing loaded) + to 1.0 (finished). +*/ qreal QmlComponent::progress() const { Q_D(const QmlComponent); @@ -274,6 +285,13 @@ qreal QmlComponent::progress() const } /*! + \fn void QmlComponent::progressChanged(qreal progress) + + Emitted whenever the component's loading progress changes. \a progress will be the + current progress between 0.0 (nothing loaded) and 1.0 (finished). +*/ + +/*! \fn void QmlComponent::statusChanged(QmlComponent::Status status) Emitted whenever the component's status changes. \a status will be the @@ -577,8 +595,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 { @@ -646,6 +666,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(); + } + } } } @@ -662,6 +690,9 @@ QmlComponentAttached::~QmlComponentAttached() next = 0; } +/*! + \internal +*/ QmlComponentAttached *QmlComponent::qmlAttachedProperties(QObject *obj) { QmlComponentAttached *a = new QmlComponentAttached(obj); 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/qmlenginedebug.cpp b/src/declarative/qml/qmlenginedebug.cpp index 664ca3f..63be6b0 100644 --- a/src/declarative/qml/qmlenginedebug.cpp +++ b/src/declarative/qml/qmlenginedebug.cpp @@ -57,8 +57,8 @@ QmlEngineDebugServer::QmlEngineDebugServer(QObject *parent) : QmlDebugService(QLatin1String("QmlEngine"), parent), m_watch(new QmlWatcher(this)) { - QObject::connect(m_watch, SIGNAL(propertyChanged(int,int,QByteArray,QVariant)), - this, SLOT(propertyChanged(int,int,QByteArray,QVariant))); + QObject::connect(m_watch, SIGNAL(propertyChanged(int,int,QMetaProperty,QVariant)), + this, SLOT(propertyChanged(int,int,QMetaProperty,QVariant))); } QDataStream &operator<<(QDataStream &ds, @@ -110,9 +110,11 @@ QmlEngineDebugServer::propertyData(QObject *obj, int propIdx) if (binding) rv.binding = binding->expression(); + QVariant value = prop.read(obj); + rv.value = valueContents(value); + if (prop.type() < QVariant::UserType) { rv.type = QmlObjectProperty::Basic; - rv.value = prop.read(obj); } else if (QmlMetaType::isObject(prop.userType())) { rv.type = QmlObjectProperty::Object; } else if (QmlMetaType::isList(prop.userType()) || @@ -123,6 +125,32 @@ QmlEngineDebugServer::propertyData(QObject *obj, int propIdx) return rv; } +QVariant QmlEngineDebugServer::valueContents(const QVariant &value) const +{ + if (value.type() < QVariant::UserType) + return value; + + int userType = value.userType(); + + if (QmlMetaType::isList(userType) || QmlMetaType::isQmlList(userType)) { + int count = QmlMetaType::listCount(value); + QVariantList contents; + for (int i=0; i<count; i++) + contents << valueContents(QmlMetaType::listAt(value, i)); + return contents; + } else if (QmlMetaType::isObject(userType)) { + QObject *o = QmlMetaType::toQObject(value); + if (o) { + QString name = o->objectName(); + if (name.isEmpty()) + name = QLatin1String("<unnamed>"); + return name; + } + } + + return QLatin1String("<unknown value>"); +} + void QmlEngineDebugServer::buildObjectDump(QDataStream &message, QObject *object, bool recur) { @@ -188,32 +216,6 @@ void QmlEngineDebugServer::buildObjectList(QDataStream &message, } } -QVariant QmlEngineDebugServer::serializableVariant(const QVariant &value) -{ - if (value.type() < QVariant::UserType) - return value; - - if (!value.toString().isEmpty()) - return value.toString(); - - QVariant v; - if (value.type() == QVariant::UserType || QmlMetaType::isObject(value.userType())) { - QObject *o = QmlMetaType::toQObject(value); - if (o) { - QString objectName = o->objectName(); - if (objectName.isEmpty()) - objectName = QLatin1String("<unnamed>"); - v = QString::fromUtf8(o->metaObject()->className()) + - QLatin1String(": ") + objectName; - } - } - - if (v.isNull()) - v = QString::fromUtf8(value.typeName()); - - return v; -} - QmlEngineDebugServer::QmlObjectData QmlEngineDebugServer::objectData(QObject *object) { @@ -357,7 +359,7 @@ void QmlEngineDebugServer::messageReceived(const QByteArray &message) if (undefined) result = QLatin1String("<undefined>"); else - result = serializableVariant(value); + result = valueContents(value); delete exprObj; } else { result = QLatin1String("<unknown context>"); @@ -371,13 +373,12 @@ void QmlEngineDebugServer::messageReceived(const QByteArray &message) } } -void QmlEngineDebugServer::propertyChanged(int id, int objectId, const QByteArray &property, const QVariant &value) +void QmlEngineDebugServer::propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value) { QByteArray reply; - QVariant v = serializableVariant(value); QDataStream rs(&reply, QIODevice::WriteOnly); - rs << QByteArray("UPDATE_WATCH") << id << objectId << property << v; + rs << QByteArray("UPDATE_WATCH") << id << objectId << QString::fromUtf8(property.name()) << valueContents(value); sendMessage(reply); } diff --git a/src/declarative/qml/qmlenginedebug_p.h b/src/declarative/qml/qmlenginedebug_p.h index 075a711..a8572eb 100644 --- a/src/declarative/qml/qmlenginedebug_p.h +++ b/src/declarative/qml/qmlenginedebug_p.h @@ -97,14 +97,14 @@ protected: virtual void messageReceived(const QByteArray &); private Q_SLOTS: - void propertyChanged(int id, int objectId, const QByteArray &property, const QVariant &value); + void propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value); private: void buildObjectList(QDataStream &, QmlContext *); void buildObjectDump(QDataStream &, QObject *, bool); QmlObjectData objectData(QObject *); QmlObjectProperty propertyData(QObject *, int); - QVariant serializableVariant(const QVariant &value); + QVariant valueContents(const QVariant &defaultValue) const; static QList<QmlEngine *> m_engines; QmlWatcher *m_watch; 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/src/declarative/qml/qmlwatcher.cpp b/src/declarative/qml/qmlwatcher.cpp index ca99472..8cd51e0 100644 --- a/src/declarative/qml/qmlwatcher.cpp +++ b/src/declarative/qml/qmlwatcher.cpp @@ -112,7 +112,7 @@ void QmlWatchProxy::notifyValueChanged() else v = m_property.read(m_object); - emit m_watch->propertyChanged(m_id, m_debugId, QByteArray(m_property.name()), v); + emit m_watch->propertyChanged(m_id, m_debugId, m_property, v); } diff --git a/src/declarative/qml/qmlwatcher_p.h b/src/declarative/qml/qmlwatcher_p.h index 99cae88..0bfcd71 100644 --- a/src/declarative/qml/qmlwatcher_p.h +++ b/src/declarative/qml/qmlwatcher_p.h @@ -65,6 +65,7 @@ QT_BEGIN_NAMESPACE class QmlWatchProxy; class QmlExpression; class QmlContext; +class QMetaProperty; class QmlWatcher : public QObject { @@ -79,7 +80,7 @@ public: void removeWatch(int id); Q_SIGNALS: - void propertyChanged(int id, int objectId, const QByteArray &property, const QVariant &value); + void propertyChanged(int id, int objectId, const QMetaProperty &property, const QVariant &value); private: friend class QmlWatchProxy; diff --git a/src/declarative/util/qmleasefollow.cpp b/src/declarative/util/qmleasefollow.cpp index 99720f8..9d17d25 100644 --- a/src/declarative/util/qmleasefollow.cpp +++ b/src/declarative/util/qmleasefollow.cpp @@ -210,7 +210,6 @@ void QmlEaseFollowPrivate::tick(int t) qreal value = 0.5 * a * time_seconds * time_seconds + vi * time_seconds; value = (invert?-1.0:1.0) * value; target.write(initialValue + value); - out = initialValue + value; } else if (time_seconds < td) { @@ -397,7 +396,7 @@ void QmlEaseFollow::setSourceValue(qreal s) { Q_D(QmlEaseFollow); - if (d->source == s) + if (d->clock.state() == QAbstractAnimation::Running && d->source == s) return; d->source = s; diff --git a/src/declarative/util/qmllistmodel.cpp b/src/declarative/util/qmllistmodel.cpp index 7ccccec..9c9fa6a 100644 --- a/src/declarative/util/qmllistmodel.cpp +++ b/src/declarative/util/qmllistmodel.cpp @@ -809,6 +809,12 @@ void QmlListModelParser::setCustomData(QObject *obj, const QByteArray &d) QML_DEFINE_CUSTOM_TYPE(Qt, 4,6, (QT_VERSION&0x00ff00)>>8, ListModel, QmlListModel, QmlListModelParser) +/*! + \qmlclass ListElement + \brief The ListElement element defines a data item in a ListModel. + + \sa ListModel +*/ // ### FIXME class QmlListElement : public QObject { diff --git a/src/declarative/util/qmlspringfollow.cpp b/src/declarative/util/qmlspringfollow.cpp index 34ec976..569cc48 100644 --- a/src/declarative/util/qmlspringfollow.cpp +++ b/src/declarative/util/qmlspringfollow.cpp @@ -272,10 +272,11 @@ qreal QmlSpringFollow::sourceValue() const void QmlSpringFollow::setSourceValue(qreal value) { Q_D(QmlSpringFollow); - if (d->sourceValue != value) { - d->sourceValue = value; - d->start(); - } + if (d->clock.state() == QAbstractAnimation::Running && d->sourceValue == value) + return; + + d->sourceValue = value; + d->start(); } /*! diff --git a/src/declarative/util/qmlstate.cpp b/src/declarative/util/qmlstate.cpp index 7e4e992..425480c 100644 --- a/src/declarative/util/qmlstate.cpp +++ b/src/declarative/util/qmlstate.cpp @@ -134,7 +134,7 @@ QmlStateOperation::QmlStateOperation(QObjectPrivate &dd, QObject *parent) inadvisible. Not only would this have the same effect as going directly to the second state it may cause the program to crash. - \sa {states-transitions}{States and Transitions} + \sa {qmlstates}{States}, {state-transitions}{Transitions} */ /*! diff --git a/src/declarative/util/qmltransition.cpp b/src/declarative/util/qmltransition.cpp index 66275d9..97a3b74 100644 --- a/src/declarative/util/qmltransition.cpp +++ b/src/declarative/util/qmltransition.cpp @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE \qmlclass Transition QmlTransition \brief The Transition element defines animated transitions that occur on state changes. - \sa {states-transitions}{States and Transitions} + \sa {qmlstates}{States}, {state-transitions}{Transitions} */ /*! diff --git a/src/declarative/util/qmlview.cpp b/src/declarative/util/qmlview.cpp index f91d0db..329a9b2 100644 --- a/src/declarative/util/qmlview.cpp +++ b/src/declarative/util/qmlview.cpp @@ -386,7 +386,7 @@ void QmlView::continueExecute() */ /*! \fn void QmlView::initialSize(QSize size) - This signal is emitted when the initial size of the root item is known. + This signal is emitted when the initial \a size of the root item is known. */ /*! \fn void QmlView::errors(const QList<QmlError> &errors) diff --git a/tests/auto/declarative/anchors/anchors.pro b/tests/auto/declarative/anchors/anchors.pro index 7b22cfb..1e25a90 100644 --- a/tests/auto/declarative/anchors/anchors.pro +++ b/tests/auto/declarative/anchors/anchors.pro @@ -1,5 +1,6 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative SOURCES += tst_anchors.cpp +macx:CONFIG -= app_bundle DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/animatedimage/animatedimage.pro b/tests/auto/declarative/animatedimage/animatedimage.pro index 8a92863..4ff9db4 100644 --- a/tests/auto/declarative/animatedimage/animatedimage.pro +++ b/tests/auto/declarative/animatedimage/animatedimage.pro @@ -1,5 +1,6 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative SOURCES += tst_animatedimage.cpp +macx:CONFIG -= app_bundle DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/animations/animations.pro b/tests/auto/declarative/animations/animations.pro index 419da4e..e13ecb9 100644 --- a/tests/auto/declarative/animations/animations.pro +++ b/tests/auto/declarative/animations/animations.pro @@ -1,5 +1,6 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative SOURCES += tst_animations.cpp +macx:CONFIG -= app_bundle DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/behaviors/behaviors.pro b/tests/auto/declarative/behaviors/behaviors.pro index c96d2c0..8886b0c 100644 --- a/tests/auto/declarative/behaviors/behaviors.pro +++ b/tests/auto/declarative/behaviors/behaviors.pro @@ -1,5 +1,6 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative SOURCES += tst_behaviors.cpp +macx:CONFIG -= app_bundle DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/datetimeformatter/datetimeformatter.pro b/tests/auto/declarative/datetimeformatter/datetimeformatter.pro index e3d6cd0..62eb303 100644 --- a/tests/auto/declarative/datetimeformatter/datetimeformatter.pro +++ b/tests/auto/declarative/datetimeformatter/datetimeformatter.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_datetimeformatter.cpp diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro index b51e285..b9ab3ca 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 \ @@ -19,6 +21,7 @@ SUBDIRS += anchors \ qmllist \ qmllistaccessor \ qmlmetaproperty \ + qmlpropertymap \ qmltimer \ repeater \ sql \ diff --git a/tests/auto/declarative/examples/examples.pro b/tests/auto/declarative/examples/examples.pro index c50018e..b9bcd28 100644 --- a/tests/auto/declarative/examples/examples.pro +++ b/tests/auto/declarative/examples/examples.pro @@ -1,4 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative -SOURCES += tst_examples.cpp macx:CONFIG -= app_bundle + +SOURCES += tst_examples.cpp diff --git a/tests/auto/declarative/layouts/layouts.pro b/tests/auto/declarative/layouts/layouts.pro index f7e7622..f38e155 100644 --- a/tests/auto/declarative/layouts/layouts.pro +++ b/tests/auto/declarative/layouts/layouts.pro @@ -1,6 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative SOURCES += tst_layouts.cpp +macx:CONFIG -= app_bundle # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/listview/listview.pro b/tests/auto/declarative/listview/listview.pro index bf68268..23b0706 100644 --- a/tests/auto/declarative/listview/listview.pro +++ b/tests/auto/declarative/listview/listview.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_listview.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/numberformatter/numberformatter.pro b/tests/auto/declarative/numberformatter/numberformatter.pro index ba391ed..ed7ef22 100644 --- a/tests/auto/declarative/numberformatter/numberformatter.pro +++ b/tests/auto/declarative/numberformatter/numberformatter.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_numberformatter.cpp diff --git a/tests/auto/declarative/pathview/pathview.pro b/tests/auto/declarative/pathview/pathview.pro index 28bbe49..bddd1e6 100644 --- a/tests/auto/declarative/pathview/pathview.pro +++ b/tests/auto/declarative/pathview/pathview.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_pathview.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/qfxloader/qfxloader.pro b/tests/auto/declarative/qfxloader/qfxloader.pro index 643c18c..aee52cc 100644 --- a/tests/auto/declarative/qfxloader/qfxloader.pro +++ b/tests/auto/declarative/qfxloader/qfxloader.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + SOURCES += tst_qfxloader.cpp DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qfxpixmapcache/qfxpixmapcache.pro b/tests/auto/declarative/qfxpixmapcache/qfxpixmapcache.pro index e9b0417..218eeff 100644 --- a/tests/auto/declarative/qfxpixmapcache/qfxpixmapcache.pro +++ b/tests/auto/declarative/qfxpixmapcache/qfxpixmapcache.pro @@ -1,9 +1,9 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative QT += network -SOURCES += tst_qfxpixmapcache.cpp -HEADERS = macx:CONFIG -= app_bundle +SOURCES += tst_qfxpixmapcache.cpp + # QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage # LIBS += -lgcov diff --git a/tests/auto/declarative/qfxtext/qfxtext.pro b/tests/auto/declarative/qfxtext/qfxtext.pro index f705334..1f3fe37 100644 --- a/tests/auto/declarative/qfxtext/qfxtext.pro +++ b/tests/auto/declarative/qfxtext/qfxtext.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + SOURCES += tst_qfxtext.cpp diff --git a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro b/tests/auto/declarative/qfxtextedit/qfxtextedit.pro index 90546a4..b5e0464 100644 --- a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro +++ b/tests/auto/declarative/qfxtextedit/qfxtextedit.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + SOURCES += tst_qfxtextedit.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/qfxtextinput/qfxtextinput.pro b/tests/auto/declarative/qfxtextinput/qfxtextinput.pro index 396e66d..fe2e3e3 100644 --- a/tests/auto/declarative/qfxtextinput/qfxtextinput.pro +++ b/tests/auto/declarative/qfxtextinput/qfxtextinput.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + SOURCES += tst_qfxtextinput.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/qfxwebview/qfxwebview.pro b/tests/auto/declarative/qfxwebview/qfxwebview.pro index ee78950..b75e057 100644 --- a/tests/auto/declarative/qfxwebview/qfxwebview.pro +++ b/tests/auto/declarative/qfxwebview/qfxwebview.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qfxwebview.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/qmldom/qmldom.pro b/tests/auto/declarative/qmldom/qmldom.pro index d566354..7ff317d 100644 --- a/tests/auto/declarative/qmldom/qmldom.pro +++ b/tests/auto/declarative/qmldom/qmldom.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qmldom.cpp DEFINES += SRCDIR=\\\"$$PWD\\\" 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/qmlecmascript.pro b/tests/auto/declarative/qmlecmascript/qmlecmascript.pro index ff4d20f..46ae045 100644 --- a/tests/auto/declarative/qmlecmascript/qmlecmascript.pro +++ b/tests/auto/declarative/qmlecmascript/qmlecmascript.pro @@ -1,6 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative macx:CONFIG -= app_bundle + SOURCES += tst_qmlecmascript.cpp \ testtypes.cpp HEADERS += testtypes.h 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" diff --git a/tests/auto/declarative/qmllanguage/qmllanguage.pro b/tests/auto/declarative/qmllanguage/qmllanguage.pro index 4e4be9c..80228a9 100644 --- a/tests/auto/declarative/qmllanguage/qmllanguage.pro +++ b/tests/auto/declarative/qmllanguage/qmllanguage.pro @@ -1,9 +1,10 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qmllanguage.cpp \ testtypes.cpp HEADERS += testtypes.h -macx:CONFIG -= app_bundle # QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage # LIBS += -lgcov diff --git a/tests/auto/declarative/qmllist/qmllist.pro b/tests/auto/declarative/qmllist/qmllist.pro index e5558f1..b2145ed 100644 --- a/tests/auto/declarative/qmllist/qmllist.pro +++ b/tests/auto/declarative/qmllist/qmllist.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qmllist.cpp diff --git a/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro b/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro index 4aa0450..ce2915e 100644 --- a/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro +++ b/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qmllistaccessor.cpp diff --git a/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro b/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro index af67373..542c14e 100644 --- a/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro +++ b/tests/auto/declarative/qmlmetaproperty/qmlmetaproperty.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qmlmetaproperty.cpp diff --git a/tests/auto/declarative/qmlpropertymap/qmlpropertymap.pro b/tests/auto/declarative/qmlpropertymap/qmlpropertymap.pro index 94f138f..967ab76 100644 --- a/tests/auto/declarative/qmlpropertymap/qmlpropertymap.pro +++ b/tests/auto/declarative/qmlpropertymap/qmlpropertymap.pro @@ -1,3 +1,5 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_qmlpropertymap.cpp diff --git a/tests/auto/declarative/qmltimer/qmltimer.pro b/tests/auto/declarative/qmltimer/qmltimer.pro index e7edd96..2b244ed 100644 --- a/tests/auto/declarative/qmltimer/qmltimer.pro +++ b/tests/auto/declarative/qmltimer/qmltimer.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + SOURCES += tst_qmltimer.cpp DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/repeater/repeater.pro b/tests/auto/declarative/repeater/repeater.pro index 1d30b7b..968904b 100644 --- a/tests/auto/declarative/repeater/repeater.pro +++ b/tests/auto/declarative/repeater/repeater.pro @@ -1,7 +1,8 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative -SOURCES += tst_repeater.cpp macx:CONFIG -= app_bundle +SOURCES += tst_repeater.cpp + # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/sql/sql.pro b/tests/auto/declarative/sql/sql.pro index 36a867f..48e06a2 100644 --- a/tests/auto/declarative/sql/sql.pro +++ b/tests/auto/declarative/sql/sql.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_sql.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/states/states.pro b/tests/auto/declarative/states/states.pro index 0474ea5..a1f3b02 100644 --- a/tests/auto/declarative/states/states.pro +++ b/tests/auto/declarative/states/states.pro @@ -1,5 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + SOURCES += tst_states.cpp # Define SRCDIR equal to test's source directory diff --git a/tests/auto/declarative/visual/visual.pro b/tests/auto/declarative/visual/visual.pro index a06fa21..7ae2bed 100644 --- a/tests/auto/declarative/visual/visual.pro +++ b/tests/auto/declarative/visual/visual.pro @@ -1,6 +1,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative -SOURCES += tst_visual.cpp macx:CONFIG -= app_bundle +SOURCES += tst_visual.cpp + DEFINES += QT_TEST_SOURCE_DIR=\"\\\"$$PWD\\\"\" diff --git a/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp b/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp index aec661c..a90ca2c 100644 --- a/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp +++ b/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp @@ -168,10 +168,17 @@ void QmlInspectorMode::connectionStateChanged() switch (m_conn->state()) { default: case QAbstractSocket::UnconnectedState: + { emit statusMessage(tr("[Inspector] disconnected.\n\n")); m_addressEdit->setEnabled(true); m_portSpinBox->setEnabled(true); + + delete m_engineQuery; + m_engineQuery = 0; + delete m_contextQuery; + m_contextQuery = 0; break; + } case QAbstractSocket::HostLookupState: emit statusMessage(tr("[Inspector] resolving host...")); break; @@ -378,7 +385,7 @@ void QmlInspectorMode::initWidgets() m_propertiesWidget = new ObjectPropertiesView; m_watchTableView = new WatchTableView(m_watchTableModel); m_frameRateWidget = new CanvasFrameRate; - m_expressionWidget = new ExpressionQueryWidget; + m_expressionWidget = new ExpressionQueryWidget(ExpressionQueryWidget::SeparateEntryMode); // FancyMainWindow uses widgets' window titles for tab labels m_objectTreeWidget->setWindowTitle(tr("Object Tree")); diff --git a/tools/qmldebugger/standalone/engine.cpp b/tools/qmldebugger/standalone/engine.cpp index a1fd009..f1eada8 100644 --- a/tools/qmldebugger/standalone/engine.cpp +++ b/tools/qmldebugger/standalone/engine.cpp @@ -86,7 +86,7 @@ EnginePane::EnginePane(QmlDebugConnection *conn, QWidget *parent) connect(m_watchTableView, SIGNAL(objectActivated(int)), m_objTree, SLOT(setCurrentObject(int))); - m_exprQueryWidget = new ExpressionQueryWidget(m_client); + m_exprQueryWidget = new ExpressionQueryWidget(ExpressionQueryWidget::SeparateEntryMode, m_client); connect(m_objTree, SIGNAL(currentObjectChanged(QmlDebugObjectReference)), m_exprQueryWidget, SLOT(setCurrentObject(QmlDebugObjectReference))); diff --git a/tools/qmldebugger/standalone/expressionquerywidget.cpp b/tools/qmldebugger/standalone/expressionquerywidget.cpp index f8f5aef..3c4296d 100644 --- a/tools/qmldebugger/standalone/expressionquerywidget.cpp +++ b/tools/qmldebugger/standalone/expressionquerywidget.cpp @@ -11,9 +11,9 @@ #include "expressionquerywidget.h" -ExpressionQueryWidget::ExpressionQueryWidget(QmlEngineDebug *client, QWidget *parent) +ExpressionQueryWidget::ExpressionQueryWidget(Mode mode, QmlEngineDebug *client, QWidget *parent) : QWidget(parent), - m_style(Compact), + m_mode(mode), m_client(client), m_query(0), m_textEdit(new QTextEdit), @@ -28,7 +28,7 @@ ExpressionQueryWidget::ExpressionQueryWidget(QmlEngineDebug *client, QWidget *pa updateTitle(); - if (m_style == Compact) { + if (m_mode == SeparateEntryMode) { m_lineEdit = new QLineEdit; connect(m_lineEdit, SIGNAL(returnPressed()), SLOT(executeExpression())); QHBoxLayout *hbox = new QHBoxLayout; @@ -53,7 +53,8 @@ void ExpressionQueryWidget::setEngineDebug(QmlEngineDebug *client) void ExpressionQueryWidget::clear() { m_textEdit->clear(); - m_lineEdit->clear(); + if (m_lineEdit) + m_lineEdit->clear(); } void ExpressionQueryWidget::updateTitle() @@ -73,7 +74,7 @@ void ExpressionQueryWidget::appendPrompt() { m_textEdit->moveCursor(QTextCursor::End); - if (m_style == Compact) { + if (m_mode == SeparateEntryMode) { m_textEdit->insertPlainText("\n"); } else { m_textEdit->setTextColor(Qt::gray); @@ -111,7 +112,7 @@ void ExpressionQueryWidget::executeExpression() if (!m_client) return; - if (m_style == Compact) + if (m_mode == SeparateEntryMode) m_expr = m_lineEdit->text().trimmed(); else m_expr = m_expr.trimmed(); @@ -136,20 +137,31 @@ void ExpressionQueryWidget::showResult() { if (m_query) { m_textEdit->moveCursor(QTextCursor::End); + QVariant value = m_query->result(); QString result; - if (m_query->result().isNull()) + + if (value.isNull()) { result = QLatin1String("<no value>"); - else - result = m_query->result().toString(); + } else { + if (value.canConvert(QVariant::String)) { + result = value.toString(); + } else { + QDebug debug(&result); + debug << value; + } + } - if (m_style == Compact) { + if (m_mode == SeparateEntryMode) { m_textEdit->setTextColor(Qt::black); m_textEdit->setFontWeight(QFont::Bold); m_textEdit->insertPlainText(m_expr + " : "); m_textEdit->setFontWeight(QFont::Normal); m_textEdit->insertPlainText(result); } else { - m_textEdit->append(result); + m_textEdit->setTextColor(Qt::darkGreen); + m_textEdit->insertPlainText(" => "); + m_textEdit->setTextColor(Qt::black); + m_textEdit->insertPlainText(result); } appendPrompt(); m_expr.clear(); diff --git a/tools/qmldebugger/standalone/expressionquerywidget.h b/tools/qmldebugger/standalone/expressionquerywidget.h index 6fab059..3fe0295 100644 --- a/tools/qmldebugger/standalone/expressionquerywidget.h +++ b/tools/qmldebugger/standalone/expressionquerywidget.h @@ -16,12 +16,12 @@ class ExpressionQueryWidget : public QWidget { Q_OBJECT public: - enum Style { - Compact, - Shell + enum Mode { + SeparateEntryMode, + ShellMode }; - ExpressionQueryWidget(QmlEngineDebug *client = 0, QWidget *parent = 0); + ExpressionQueryWidget(Mode mode = SeparateEntryMode, QmlEngineDebug *client = 0, QWidget *parent = 0); void setEngineDebug(QmlEngineDebug *client); void clear(); @@ -42,7 +42,7 @@ private: void showCurrentContext(); void updateTitle(); - Style m_style; + Mode m_mode; QmlEngineDebug *m_client; QmlDebugExpressionQuery *m_query; diff --git a/tools/qmldebugger/standalone/objectpropertiesview.cpp b/tools/qmldebugger/standalone/objectpropertiesview.cpp index f86a69e..d6fefa0 100644 --- a/tools/qmldebugger/standalone/objectpropertiesview.cpp +++ b/tools/qmldebugger/standalone/objectpropertiesview.cpp @@ -16,19 +16,25 @@ class PropertiesViewItem : public QObject, public QTreeWidgetItem { Q_OBJECT public: - PropertiesViewItem(QTreeWidget *widget); - PropertiesViewItem(QTreeWidgetItem *parent); + enum Type { + BindingType, + OtherType + }; + + PropertiesViewItem(QTreeWidget *widget, Type type = OtherType); + PropertiesViewItem(QTreeWidgetItem *parent, Type type = OtherType); QmlDebugPropertyReference property; + Type type; }; -PropertiesViewItem::PropertiesViewItem(QTreeWidget *widget) - : QTreeWidgetItem(widget) +PropertiesViewItem::PropertiesViewItem(QTreeWidget *widget, Type type) + : QTreeWidgetItem(widget), type(type) { } -PropertiesViewItem::PropertiesViewItem(QTreeWidgetItem *parent) - : QTreeWidgetItem(parent) +PropertiesViewItem::PropertiesViewItem(QTreeWidgetItem *parent, Type type) + : QTreeWidgetItem(parent), type(type) { } @@ -109,6 +115,42 @@ void ObjectPropertiesView::queryFinished() setObject(obj); } +void ObjectPropertiesView::setPropertyValue(PropertiesViewItem *item, const QVariant &value, bool makeGray) +{ + if (value.type() == QVariant::List || value.type() == QVariant::StringList) { + PropertiesViewItem *bindingItem = static_cast<PropertiesViewItem*>(item->takeChild(item->childCount() - 1)); + if (bindingItem && bindingItem->type != PropertiesViewItem::BindingType) { + delete bindingItem; + bindingItem = 0; + } + + qDeleteAll(item->takeChildren()); + + QVariantList variants = value.toList(); + item->setText(1, tr("<%1 items>", "%1 = number of items").arg(variants.count())); + item->setText(2, QString::fromUtf8(value.typeName())); + + PropertiesViewItem *child; + for (int i=0; i<variants.count(); i++) { + child = new PropertiesViewItem(item); + setPropertyValue(child, variants[i], makeGray); + } + + if (bindingItem) + item->addChild(bindingItem); + + item->setExpanded(false); + } else { + item->setText(1, (value.isNull() ? QLatin1String("<null>") : value.toString())); + item->setExpanded(true); + } + + if (makeGray) { + for (int i=0; i<m_tree->columnCount(); i++) + item->setForeground(i, Qt::gray); + } +} + void ObjectPropertiesView::setObject(const QmlDebugObjectReference &object) { m_object = object; @@ -123,20 +165,17 @@ void ObjectPropertiesView::setObject(const QmlDebugObjectReference &object) item->setText(0, p.name()); item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - if (!p.hasNotifySignal()) { - item->setForeground(0, Qt::gray); - item->setForeground(1, Qt::gray); - } + + setPropertyValue(item, p.value(), !p.hasNotifySignal()); + item->setText(2, p.valueTypeName()); + // binding is set after property value to ensure it is added to the end of the + // list, if the value is a list if (!p.binding().isEmpty()) { - PropertiesViewItem *binding = new PropertiesViewItem(item); + PropertiesViewItem *binding = new PropertiesViewItem(item, PropertiesViewItem::BindingType); binding->setText(1, p.binding()); binding->setForeground(1, Qt::darkGreen); } - - item->setText(2, p.valueTypeName()); - - item->setExpanded(true); } } @@ -177,11 +216,8 @@ void ObjectPropertiesView::valueChanged(const QByteArray &name, const QVariant & for (int i=0; i<m_tree->topLevelItemCount(); i++) { PropertiesViewItem *item = static_cast<PropertiesViewItem *>(m_tree->topLevelItem(i)); if (item->property.name() == name) { - if (value.isNull()) { - item->setText(1, QLatin1String("<null>")); - } else { - item->setText(1, value.toString()); - } + setPropertyValue(item, value, !item->property.hasNotifySignal()); + return; } } } diff --git a/tools/qmldebugger/standalone/objectpropertiesview.h b/tools/qmldebugger/standalone/objectpropertiesview.h index 6a1fc03..306e5b9 100644 --- a/tools/qmldebugger/standalone/objectpropertiesview.h +++ b/tools/qmldebugger/standalone/objectpropertiesview.h @@ -10,6 +10,7 @@ QT_BEGIN_NAMESPACE class QTreeWidget; class QTreeWidgetItem; class QmlDebugConnection; +class PropertiesViewItem; class ObjectPropertiesView : public QWidget { @@ -36,6 +37,7 @@ private slots: private: void setObject(const QmlDebugObjectReference &object); void setWatched(const QString &property, bool watched); + void setPropertyValue(PropertiesViewItem *item, const QVariant &value, bool makeGray); QmlEngineDebug *m_client; QmlDebugObjectQuery *m_query; diff --git a/tools/qmldebugger/standalone/objecttree.cpp b/tools/qmldebugger/standalone/objecttree.cpp index 4059e77..6c132b6 100644 --- a/tools/qmldebugger/standalone/objecttree.cpp +++ b/tools/qmldebugger/standalone/objecttree.cpp @@ -61,6 +61,7 @@ void ObjectTree::objectFetched() { dump(m_query->object(), 0); buildTree(m_query->object(), 0); + setCurrentItem(topLevelItem(0)); delete m_query; m_query = 0; diff --git a/tools/qmldebugger/standalone/objecttree.h b/tools/qmldebugger/standalone/objecttree.h index 95820f3..ba2e78f 100644 --- a/tools/qmldebugger/standalone/objecttree.h +++ b/tools/qmldebugger/standalone/objecttree.h @@ -27,8 +27,8 @@ signals: void expressionWatchRequested(const QmlDebugObjectReference &, const QString &); public slots: - void reload(int objectDebugId); - void setCurrentObject(int debugId); + void reload(int objectDebugId); // set the root object + void setCurrentObject(int debugId); // select an object in the tree protected: virtual void mousePressEvent(QMouseEvent *); diff --git a/tools/qmldebugger/standalone/watchtable.cpp b/tools/qmldebugger/standalone/watchtable.cpp index a7fd052..19f034e 100644 --- a/tools/qmldebugger/standalone/watchtable.cpp +++ b/tools/qmldebugger/standalone/watchtable.cpp @@ -265,7 +265,8 @@ void WatchTableModel::removeAllWatches() for (int i=0; i<m_columns.count(); i++) { if (m_client) m_client->removeWatch(m_columns[i].watch); - delete m_columns[i].watch; + else + delete m_columns[i].watch; } m_columns.clear(); m_values.clear(); |