summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-10-26 05:58:37 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-10-26 05:58:37 (GMT)
commitdb09dc27d32cbc3be51773c86f189418c12ac971 (patch)
treed2680e94b62cffc765271de9aa0fa73780b152c2
parent5cb74c426a4d3da018dd00a494e4953c162a47da (diff)
parente92099415537bd28525c7ddef338d5fd89bb7cf6 (diff)
downloadQt-db09dc27d32cbc3be51773c86f189418c12ac971.zip
Qt-db09dc27d32cbc3be51773c86f189418c12ac971.tar.gz
Qt-db09dc27d32cbc3be51773c86f189418c12ac971.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
-rw-r--r--demos/declarative/flickr/common/qmldir10
-rw-r--r--doc/src/declarative/extending.qdoc15
-rw-r--r--doc/src/declarative/qtdeclarative.qdoc1
-rw-r--r--examples/declarative/animation/color-animation.qml6
-rw-r--r--examples/declarative/animation/easing.qml2
-rw-r--r--examples/declarative/animation/property-animation.qml2
-rw-r--r--examples/declarative/connections/Button.qml12
-rw-r--r--examples/declarative/connections/bg1.jpgbin0 -> 23771 bytes
-rw-r--r--examples/declarative/connections/connections.qml42
-rw-r--r--examples/declarative/connections/rotate-left.pngbin0 -> 3061 bytes
-rw-r--r--examples/declarative/connections/rotate-right.pngbin0 -> 3115 bytes
-rw-r--r--examples/declarative/extending/attached/birthdayparty.h8
-rw-r--r--examples/declarative/extending/binding/birthdayparty.h8
-rw-r--r--examples/declarative/extending/signal/birthdayparty.h8
-rw-r--r--examples/declarative/extending/valuesource/birthdayparty.h8
-rw-r--r--examples/declarative/progressbar/ProgressBar.qml2
-rw-r--r--examples/declarative/snow/ImageBatch.qml2
-rw-r--r--examples/declarative/snow/Loading.qml2
-rw-r--r--examples/declarative/states/states.qml54
-rw-r--r--examples/declarative/states/transitions.qml54
-rw-r--r--examples/declarative/states/user.pngbin0 -> 4886 bytes
-rw-r--r--examples/declarative/tutorials/helloworld/tutorial3.qml2
-rw-r--r--src/declarative/extra/qmlbehavior.h1
-rw-r--r--src/declarative/fx/qfxanchors.cpp1
-rw-r--r--src/declarative/fx/qfxgridview.cpp5
-rw-r--r--src/declarative/fx/qfxitem.cpp15
-rw-r--r--src/declarative/fx/qfxlistview.cpp5
-rw-r--r--src/declarative/fx/qfxpainteditem.cpp2
-rw-r--r--src/declarative/fx/qfxvisualitemmodel.cpp15
-rw-r--r--src/declarative/qml/qbitfield_p.h4
-rw-r--r--src/declarative/qml/qmlcomponent.cpp2
-rw-r--r--src/declarative/qml/qmlcomponent_p.h2
-rw-r--r--src/declarative/qml/qmlcompositetypedata_p.h3
-rw-r--r--src/declarative/qml/qmlcompositetypemanager.cpp139
-rw-r--r--src/declarative/qml/qmlcompositetypemanager_p.h1
-rw-r--r--src/declarative/qml/qmlcontext.cpp4
-rw-r--r--src/declarative/qml/qmlcontext_p.h2
-rw-r--r--src/declarative/qml/qmldom.cpp96
-rw-r--r--src/declarative/qml/qmldom.h20
-rw-r--r--src/declarative/qml/qmlengine.cpp65
-rw-r--r--src/declarative/qml/qmlengine_p.h2
-rw-r--r--src/declarative/qml/qmlenginedebug.cpp4
-rw-r--r--src/declarative/qml/qmlglobalscriptclass.cpp9
-rw-r--r--src/declarative/qml/qmlmetaproperty.cpp1
-rw-r--r--src/declarative/qml/qmlobjectscriptclass.cpp1
-rw-r--r--src/declarative/qml/qmlpropertycache.cpp2
-rw-r--r--src/declarative/qml/qmlpropertyvalueinterceptor.cpp1
-rw-r--r--src/declarative/qml/qmlpropertyvaluesource.cpp1
-rw-r--r--src/declarative/qml/qmlrewrite.cpp12
-rw-r--r--src/declarative/qml/qmlvme.cpp2
-rw-r--r--src/declarative/qml/qmlvmemetaobject.cpp2
-rw-r--r--src/declarative/qml/qmlxmlhttprequest.cpp9
-rw-r--r--src/declarative/util/qmlanimation.h1
-rw-r--r--src/declarative/util/qmllistaccessor.cpp4
-rw-r--r--src/declarative/util/qmlpropertychanges.cpp3
-rw-r--r--src/declarative/util/qmlview.cpp12
-rw-r--r--src/declarative/util/qmlview.h1
-rw-r--r--src/gui/graphicsview/qgraphicstransform.cpp4
-rw-r--r--src/gui/math3d/qmatrix4x4.cpp110
-rw-r--r--src/gui/math3d/qmatrix4x4.h4
-rw-r--r--src/gui/text/qfontdatabase_x11.cpp2
-rw-r--r--src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp1
-rw-r--r--src/opengl/qglshaderprogram.cpp347
-rw-r--r--src/opengl/qglshaderprogram.h8
-rw-r--r--src/opengl/qwindowsurface_gl.cpp2
-rw-r--r--src/opengl/qwindowsurface_x11gl.cpp3
-rw-r--r--tests/auto/declarative/qmldom/tst_qmldom.cpp30
-rw-r--r--tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp69
-rw-r--r--tools/qmldebugger/canvasframerate.cpp18
-rw-r--r--tools/qmldebugger/canvasframerate.h4
-rw-r--r--tools/qmldebugger/engine.cpp21
-rw-r--r--tools/qmldebugger/engine.h5
-rw-r--r--tools/qmldebugger/expressionquerywidget.cpp27
-rw-r--r--tools/qmldebugger/expressionquerywidget.h7
-rw-r--r--tools/qmldebugger/objectpropertiesview.cpp9
-rw-r--r--tools/qmldebugger/objectpropertiesview.h5
-rw-r--r--tools/qmldebugger/objecttree.cpp9
-rw-r--r--tools/qmldebugger/objecttree.h5
-rw-r--r--tools/qmldebugger/qmldebugger.cpp1
-rw-r--r--tools/qmldebugger/watchtable.cpp13
-rw-r--r--tools/qmldebugger/watchtable.h5
-rw-r--r--tools/qmlviewer/qmlviewer.cpp93
-rw-r--r--tools/qmlviewer/qmlviewer.h4
83 files changed, 1121 insertions, 372 deletions
diff --git a/demos/declarative/flickr/common/qmldir b/demos/declarative/flickr/common/qmldir
new file mode 100644
index 0000000..0c94f60
--- /dev/null
+++ b/demos/declarative/flickr/common/qmldir
@@ -0,0 +1,10 @@
+ImageDetails 0.0 ImageDetails.qml
+LikeOMeter 0.0 LikeOMeter.qml
+Loading 0.0 Loading.qml
+MediaButton 0.0 MediaButton.qml
+MediaLineEdit 0.0 MediaLineEdit.qml
+Progress 0.0 Progress.qml
+RssModel 0.0 RssModel.qml
+ScrollBar 0.0 ScrollBar.qml
+Slider 0.0 Slider.qml
+Star 0.0 Star.qml
diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc
index db35961..b872632 100644
--- a/doc/src/declarative/extending.qdoc
+++ b/doc/src/declarative/extending.qdoc
@@ -300,11 +300,22 @@ attachment object are those that become available for use as the attached
property block.
Any QML type can become an attaching type by declaring the
-\c qmlAttachedProperties() public function:
+\c qmlAttachedProperties() public function and declaring that the class has
+QML_HAS_ATTACHED_PROPERTIES:
\quotation
\code
-static AttachedPropertiesType *qmlAttachedProperties(QObject *object)
+class MyType : public QObject {
+ Q_OBJECT
+public:
+
+ ...
+
+ static AttachedPropertiesType *qmlAttachedProperties(QObject *object);
+};
+
+QML_DECLARE_TYPEINFO(MyType, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(MyType)
\endcode
Return an attachment object, of type \a AttachedPropertiesType, for the
attachee \a object instance. It is customary, though not strictly required, for
diff --git a/doc/src/declarative/qtdeclarative.qdoc b/doc/src/declarative/qtdeclarative.qdoc
index ab952e7..5d8623b 100644
--- a/doc/src/declarative/qtdeclarative.qdoc
+++ b/doc/src/declarative/qtdeclarative.qdoc
@@ -84,6 +84,7 @@ completely new applications. QML is fully \l {Extending QML}{extensible from C+
\o \l {QML Documents}
\o \l {Property Binding}
\o \l {ECMAScript Blocks}
+\o \l {QML Scope}
\o \l {Network Transparency}
\o \l {qmlmodels}{Data Models}
\o \l {anchor-layout}{Anchor-based Layout}
diff --git a/examples/declarative/animation/color-animation.qml b/examples/declarative/animation/color-animation.qml
index 0cf8a44..edb0659 100644
--- a/examples/declarative/animation/color-animation.qml
+++ b/examples/declarative/animation/color-animation.qml
@@ -30,18 +30,18 @@ Item {
// the sun, moon, and stars
Item {
width: parent.width; height: 2 * parent.height
- transformOrigin: "Center"
+ transformOrigin: Item.Center
rotation: SequentialAnimation {
running: true; repeat: true
NumberAnimation { from: 0; to: 360; duration: 10000 }
}
Image {
source: "images/sun.png"; y: 10; anchors.horizontalCenter: parent.horizontalCenter
- transformOrigin: "Center"; rotation: -3 * parent.rotation
+ transformOrigin: Item.Center; rotation: -3 * parent.rotation
}
Image {
source: "images/moon.png"; y: parent.height - 74; anchors.horizontalCenter: parent.horizontalCenter
- transformOrigin: "Center"; rotation: -parent.rotation
+ transformOrigin: Item.Center; rotation: -parent.rotation
}
Particles {
x: 0; y: parent.height/2; width: parent.width; height: parent.height/2
diff --git a/examples/declarative/animation/easing.qml b/examples/declarative/animation/easing.qml
index 9e0a0d6..59e9b17 100644
--- a/examples/declarative/animation/easing.qml
+++ b/examples/declarative/animation/easing.qml
@@ -92,7 +92,7 @@ Rectangle {
anchors.fill: parent; viewportHeight: layout.height
Column {
id: layout
- anchors.left: window.left; anchors.right: window.right
+ anchors.left: parent.left; anchors.right: parent.right
Repeater { model: easingTypes; delegate: delegate }
}
}
diff --git a/examples/declarative/animation/property-animation.qml b/examples/declarative/animation/property-animation.qml
index 4e0f6f4..0256137 100644
--- a/examples/declarative/animation/property-animation.qml
+++ b/examples/declarative/animation/property-animation.qml
@@ -26,7 +26,7 @@ Item {
Image {
anchors.horizontalCenter: parent.horizontalCenter
source: "images/shadow.png"; y: smiley.minHeight + 58
- transformOrigin: "Center"
+ transformOrigin: Item.Center
// The scale property depends on the y position of the smiley face.
scale: smiley.y * 0.5 / (smiley.minHeight - smiley.maxHeight)
diff --git a/examples/declarative/connections/Button.qml b/examples/declarative/connections/Button.qml
new file mode 100644
index 0000000..1d46acc
--- /dev/null
+++ b/examples/declarative/connections/Button.qml
@@ -0,0 +1,12 @@
+import Qt 4.6
+
+Item {
+ id: button
+ width: 48; height: 48
+
+ property alias image: icon.source
+ signal clicked
+
+ Image { id: icon }
+ MouseRegion { anchors.fill: icon; onClicked: button.clicked() }
+}
diff --git a/examples/declarative/connections/bg1.jpg b/examples/declarative/connections/bg1.jpg
new file mode 100644
index 0000000..dfc7cee
--- /dev/null
+++ b/examples/declarative/connections/bg1.jpg
Binary files differ
diff --git a/examples/declarative/connections/connections.qml b/examples/declarative/connections/connections.qml
index b693b7e..5dc211e 100644
--- a/examples/declarative/connections/connections.qml
+++ b/examples/declarative/connections/connections.qml
@@ -1,32 +1,30 @@
import Qt 4.6
Rectangle {
- id: rect
- color: "blue"
- width: 40
- height: 30
+ id: window; color: "#343434"
+ width: 640; height: 480
- Rectangle {
- id: dot
- color: "red"
- width: 3
- height: 3
- x: rect.width/2
- y: rect.height/2
+ function turnLeft() {
+ image.rotation -= 90
+ }
+ function turnRight() {
+ image.rotation += 90
}
- MouseRegion {
- id: mr
- anchors.fill: rect
+ Image {
+ id: image; source: "bg1.jpg"; anchors.centerIn: parent; transformOrigin: Item.Center
+ rotation: Behavior { NumberAnimation { easing: "easeOutCubic"; duration: 300 } }
}
- Connection {
- sender: mr
- signal: "clicked(mouse)"
- script: {
- color = "green";
- dot.x = mouse.x-1;
- dot.y = mouse.y-1;
- }
+ Button {
+ id: leftButton; image: "rotate-left.png"
+ anchors { left: parent.left; bottom: parent.bottom; leftMargin: 10; bottomMargin: 10 }
+ }
+ Button {
+ id: rightButton; image: "rotate-right.png"
+ anchors { right: parent.right; bottom: parent.bottom; rightMargin: 10; bottomMargin: 10 }
}
+
+ Connection { sender: leftButton; signal: "clicked()"; script: window.turnLeft() }
+ Connection { sender: rightButton; signal: "clicked()"; script: window.turnRight() }
}
diff --git a/examples/declarative/connections/rotate-left.png b/examples/declarative/connections/rotate-left.png
new file mode 100644
index 0000000..c30387e
--- /dev/null
+++ b/examples/declarative/connections/rotate-left.png
Binary files differ
diff --git a/examples/declarative/connections/rotate-right.png b/examples/declarative/connections/rotate-right.png
new file mode 100644
index 0000000..1b05674
--- /dev/null
+++ b/examples/declarative/connections/rotate-right.png
Binary files differ
diff --git a/examples/declarative/extending/attached/birthdayparty.h b/examples/declarative/extending/attached/birthdayparty.h
index 8249af5..2ea065c 100644
--- a/examples/declarative/extending/attached/birthdayparty.h
+++ b/examples/declarative/extending/attached/birthdayparty.h
@@ -9,7 +9,7 @@
class BirthdayPartyAttached : public QObject
{
Q_OBJECT
-Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp);
+Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp)
public:
BirthdayPartyAttached(QObject *object);
@@ -19,7 +19,7 @@ public:
private:
QDate m_rsvp;
};
-QML_DECLARE_TYPE(BirthdayPartyAttached);
+QML_DECLARE_TYPE(BirthdayPartyAttached)
class BirthdayParty : public QObject
{
@@ -40,6 +40,8 @@ private:
Person *m_celebrant;
QmlConcreteList<Person *> m_guests;
};
-QML_DECLARE_TYPE(BirthdayParty);
+
+QML_DECLARE_TYPEINFO(BirthdayParty, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(BirthdayParty)
#endif // BIRTHDAYPARTY_H
diff --git a/examples/declarative/extending/binding/birthdayparty.h b/examples/declarative/extending/binding/birthdayparty.h
index 6905746..2757561 100644
--- a/examples/declarative/extending/binding/birthdayparty.h
+++ b/examples/declarative/extending/binding/birthdayparty.h
@@ -10,7 +10,7 @@
class BirthdayPartyAttached : public QObject
{
Q_OBJECT
-Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp NOTIFY rsvpChanged);
+Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp NOTIFY rsvpChanged)
public:
BirthdayPartyAttached(QObject *object);
@@ -23,7 +23,7 @@ signals:
private:
QDate m_rsvp;
};
-QML_DECLARE_TYPE(BirthdayPartyAttached);
+QML_DECLARE_TYPE(BirthdayPartyAttached)
class BirthdayParty : public QObject
{
@@ -56,6 +56,8 @@ private:
Person *m_celebrant;
QmlConcreteList<Person *> m_guests;
};
-QML_DECLARE_TYPE(BirthdayParty);
+
+QML_DECLARE_TYPEINFO(BirthdayParty, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(BirthdayParty)
#endif // BIRTHDAYPARTY_H
diff --git a/examples/declarative/extending/signal/birthdayparty.h b/examples/declarative/extending/signal/birthdayparty.h
index 14d7c29..5dea2e8 100644
--- a/examples/declarative/extending/signal/birthdayparty.h
+++ b/examples/declarative/extending/signal/birthdayparty.h
@@ -9,7 +9,7 @@
class BirthdayPartyAttached : public QObject
{
Q_OBJECT
-Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp);
+Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp)
public:
BirthdayPartyAttached(QObject *object);
@@ -19,7 +19,7 @@ public:
private:
QDate m_rsvp;
};
-QML_DECLARE_TYPE(BirthdayPartyAttached);
+QML_DECLARE_TYPE(BirthdayPartyAttached)
class BirthdayParty : public QObject
{
@@ -47,6 +47,8 @@ private:
Person *m_celebrant;
QmlConcreteList<Person *> m_guests;
};
-QML_DECLARE_TYPE(BirthdayParty);
+
+QML_DECLARE_TYPEINFO(BirthdayParty, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(BirthdayParty)
#endif // BIRTHDAYPARTY_H
diff --git a/examples/declarative/extending/valuesource/birthdayparty.h b/examples/declarative/extending/valuesource/birthdayparty.h
index fd25f28..75a2477 100644
--- a/examples/declarative/extending/valuesource/birthdayparty.h
+++ b/examples/declarative/extending/valuesource/birthdayparty.h
@@ -10,7 +10,7 @@
class BirthdayPartyAttached : public QObject
{
Q_OBJECT
-Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp);
+Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp)
public:
BirthdayPartyAttached(QObject *object);
@@ -20,7 +20,7 @@ public:
private:
QDate m_rsvp;
};
-QML_DECLARE_TYPE(BirthdayPartyAttached);
+QML_DECLARE_TYPE(BirthdayPartyAttached)
class BirthdayParty : public QObject
{
@@ -52,6 +52,8 @@ private:
Person *m_celebrant;
QmlConcreteList<Person *> m_guests;
};
-QML_DECLARE_TYPE(BirthdayParty);
+
+QML_DECLARE_TYPEINFO(BirthdayParty, QML_HAS_ATTACHED_PROPERTIES)
+QML_DECLARE_TYPE(BirthdayParty)
#endif // BIRTHDAYPARTY_H
diff --git a/examples/declarative/progressbar/ProgressBar.qml b/examples/declarative/progressbar/ProgressBar.qml
index 48346ac..302caa9 100644
--- a/examples/declarative/progressbar/ProgressBar.qml
+++ b/examples/declarative/progressbar/ProgressBar.qml
@@ -21,7 +21,7 @@ Item {
id: highlight; radius: 2
anchors.left: parent.left; anchors.top: parent.top; anchors.bottom: parent.bottom
anchors.leftMargin: 3; anchors.topMargin: 3; anchors.bottomMargin: 3
- width: EaseFollow { source: highlight.widthDest; duration: 100 }
+ width: EaseFollow { source: highlight.widthDest; duration: 1000 }
gradient: Gradient {
GradientStop { id: g1; position: 0.0 }
GradientStop { id: g2; position: 1.0 }
diff --git a/examples/declarative/snow/ImageBatch.qml b/examples/declarative/snow/ImageBatch.qml
index 3945087..dfe2a46 100644
--- a/examples/declarative/snow/ImageBatch.qml
+++ b/examples/declarative/snow/ImageBatch.qml
@@ -38,7 +38,7 @@ GridView {
delegate: Item {
id: root
property bool isSelected: GridView.isCurrentItem && grid.isSelected
- transformOrigin: "Center"
+ transformOrigin: Item.Center
width: grid.imageWidth; height: grid.imageHeight;
Image { id: flickrImage; source: url; fillMode: "PreserveAspectFit"; smooth: true; anchors.fill: parent;
diff --git a/examples/declarative/snow/Loading.qml b/examples/declarative/snow/Loading.qml
index 054656a..238d9c7 100644
--- a/examples/declarative/snow/Loading.qml
+++ b/examples/declarative/snow/Loading.qml
@@ -1,7 +1,7 @@
import Qt 4.6
Image {
- id: loading; source: "pics/loading.png"; transformOrigin: "Center"
+ id: loading; source: "pics/loading.png"; transformOrigin: Item.Center
rotation: NumberAnimation {
id: rotationAnimation; from: 0; to: 360; running: loading.visible == true; repeat: true; duration: 900
}
diff --git a/examples/declarative/states/states.qml b/examples/declarative/states/states.qml
index acab2f0..6f6b40f 100644
--- a/examples/declarative/states/states.qml
+++ b/examples/declarative/states/states.qml
@@ -2,47 +2,49 @@ import Qt 4.6
Rectangle {
id: page
- width: 300; height: 300; color: "white"
- // A target region. Clicking in here sets the state to '' - the default state
+ width: 640; height: 480; color: "#343434"
+
+ // A target region. Clicking in here sets the state to the default state
Rectangle {
- x: 0; y: 0; width: 50; height: 50
- color: "transparent"; border.color: "black"
- MouseRegion { anchors.fill: parent; onClicked: { page.state='' } }
+ id: initialPosition
+ anchors { left: parent.left; top: parent.top; leftMargin: 10; topMargin: 20 }
+ width: 64; height: 64; radius: 6
+ color: "Transparent"; border.color: "Gray"
+ MouseRegion { anchors.fill: parent; onClicked: page.state = '' }
}
+
// Another target region. Clicking in here sets the state to 'Position1'
Rectangle {
- x: 150; y: 50; width: 50; height: 50
- color: "transparent"; border.color: "black"
- MouseRegion { anchors.fill: parent; onClicked: { page.state='Position1' } }
+ id: position1
+ anchors { right: parent.right; verticalCenter: parent.verticalCenter; rightMargin: 20 }
+ width: 64; height: 64; radius: 6
+ color: "Transparent"; border.color: "Gray"
+ MouseRegion { anchors.fill: parent; onClicked: page.state = 'Position1' }
}
+
// Another target region. Clicking in here sets the state to 'Position2'
Rectangle {
- x: 0; y: 200; width: 50; height: 50
- color: "transparent"; border.color: "black"
- MouseRegion { anchors.fill: parent; onClicked: { page.state='Position2' } }
+ id: position2
+ anchors { left: parent.left; bottom: parent.bottom; leftMargin: 10; bottomMargin: 20 }
+ width: 64; height: 64; radius: 6
+ color: "Transparent"; border.color: "Gray"
+ MouseRegion { anchors.fill: parent; onClicked: page.state = 'Position2' }
}
- // Rect which will be moved when my state changes
- Rectangle { id: myrect; width: 50; height: 50; color: "red" }
+
+ // The image which will be moved when my state changes
+ Image { id: user; source: "user.png"; x: initialPosition.x; y: initialPosition.y }
states: [
- // In state 'Position1', change the 'myrect' item x, y to 150, 50.
+ // In state 'Position1', change the 'user' item position to rect2's position.
State {
name: "Position1"
- PropertyChanges {
- target: myrect
- x: 150
- y: 50
- }
+ PropertyChanges { target: user; x: position1.x; y: position1.y }
},
- // In state 'Position2', change y to 100. We do not specify 'x' here -
- // it will therefore be restored to its default value of 0, if it
- // had been changed.
+
+ // In state 'Position2', change the 'user' item position to rect3's position.
State {
name: "Position2"
- PropertyChanges {
- target: myrect
- y: 200
- }
+ PropertyChanges { target: user; x: position2.x; y: position2.y }
}
]
}
diff --git a/examples/declarative/states/transitions.qml b/examples/declarative/states/transitions.qml
index cc6894d..ba97d9be 100644
--- a/examples/declarative/states/transitions.qml
+++ b/examples/declarative/states/transitions.qml
@@ -2,47 +2,49 @@ import Qt 4.6
Rectangle {
id: page
- width: 300; height: 300; color: "white"
- // A target region. Clicking in here sets the state to '' - the default state
+ width: 640; height: 480; color: "#343434"
+
+ // A target region. Clicking in here sets the state to the default state
Rectangle {
- x: 0; y: 0; width: 50; height: 50
- color: "transparent"; border.color: "black"
- MouseRegion { anchors.fill: parent; onClicked: { page.state='' } }
+ id: initialPosition
+ anchors { left: parent.left; top: parent.top; leftMargin: 10; topMargin: 20 }
+ width: 64; height: 64; radius: 6
+ color: "Transparent"; border.color: "Gray"
+ MouseRegion { anchors.fill: parent; onClicked: page.state = '' }
}
+
// Another target region. Clicking in here sets the state to 'Position1'
Rectangle {
- x: 150; y: 50; width: 50; height: 50
- color: "transparent"; border.color: "black"
- MouseRegion { anchors.fill: parent; onClicked: { page.state='Position1' } }
+ id: position1
+ anchors { right: parent.right; verticalCenter: parent.verticalCenter; rightMargin: 20 }
+ width: 64; height: 64; radius: 6
+ color: "Transparent"; border.color: "Gray"
+ MouseRegion { anchors.fill: parent; onClicked: page.state = 'Position1' }
}
+
// Another target region. Clicking in here sets the state to 'Position2'
Rectangle {
- x: 0; y: 200; width: 50; height: 50
- color: "transparent"; border.color: "black"
- MouseRegion { anchors.fill: parent; onClicked: { page.state='Position2' } }
+ id: position2
+ anchors { left: parent.left; bottom: parent.bottom; leftMargin: 10; bottomMargin: 20 }
+ width: 64; height: 64; radius: 6
+ color: "Transparent"; border.color: "Gray"
+ MouseRegion { anchors.fill: parent; onClicked: page.state = 'Position2' }
}
- // Rect which will be moved when my state changes
- Rectangle { id: myrect; width: 50; height: 50; color: "red" }
+
+ // The image which will be moved when my state changes
+ Image { id: user; source: "user.png"; x: initialPosition.x; y: initialPosition.y }
states: [
- // In state 'Position1', change the 'myrect' item x, y to 150, 50.
+ // In state 'Position1', change the 'user' item position to rect2's position.
State {
name: "Position1"
- PropertyChanges {
- target: myrect
- x: 150
- y: 50
- }
+ PropertyChanges { target: user; x: position1.x; y: position1.y }
},
- // In state 'Position2', change y to 100. We do not specify 'x' here -
- // it will therefore be restored to its default value of 0, if it
- // had been changed.
+
+ // In state 'Position2', change the 'user' item position to rect3's position.
State {
name: "Position2"
- PropertyChanges {
- target: myrect
- y: 200
- }
+ PropertyChanges { target: user; x: position2.x; y: position2.y }
}
]
diff --git a/examples/declarative/states/user.png b/examples/declarative/states/user.png
new file mode 100644
index 0000000..dd7d7a2
--- /dev/null
+++ b/examples/declarative/states/user.png
Binary files differ
diff --git a/examples/declarative/tutorials/helloworld/tutorial3.qml b/examples/declarative/tutorials/helloworld/tutorial3.qml
index d641eba..534d663 100644
--- a/examples/declarative/tutorials/helloworld/tutorial3.qml
+++ b/examples/declarative/tutorials/helloworld/tutorial3.qml
@@ -11,7 +11,7 @@ Rectangle {
text: "Hello world!"
font.pointSize: 24; font.bold: true
y: 30; anchors.horizontalCenter: page.horizontalCenter
- transformOrigin: "Center"
+ transformOrigin: Item.Center
//![1]
MouseRegion { id: mouseRegion; anchors.fill: parent }
diff --git a/src/declarative/extra/qmlbehavior.h b/src/declarative/extra/qmlbehavior.h
index 994d85c..6508455 100644
--- a/src/declarative/extra/qmlbehavior.h
+++ b/src/declarative/extra/qmlbehavior.h
@@ -60,6 +60,7 @@ class Q_DECLARATIVE_EXPORT QmlBehavior : public QObject, public QmlPropertyValue
Q_OBJECT
Q_DECLARE_PRIVATE(QmlBehavior)
+ Q_INTERFACES(QmlPropertyValueInterceptor)
Q_CLASSINFO("DefaultProperty", "animation")
Q_PROPERTY(QmlAbstractAnimation *animation READ animation WRITE setAnimation)
diff --git a/src/declarative/fx/qfxanchors.cpp b/src/declarative/fx/qfxanchors.cpp
index 737aa63..8d4a8b8 100644
--- a/src/declarative/fx/qfxanchors.cpp
+++ b/src/declarative/fx/qfxanchors.cpp
@@ -181,7 +181,6 @@ void QFxAnchorsPrivate::centerInChanged()
void QFxAnchorsPrivate::clearItem(QFxItem *item)
{
- Q_Q(QFxAnchors);
if (!item)
return;
if (fill == item)
diff --git a/src/declarative/fx/qfxgridview.cpp b/src/declarative/fx/qfxgridview.cpp
index 36c06a4..0b2a935 100644
--- a/src/declarative/fx/qfxgridview.cpp
+++ b/src/declarative/fx/qfxgridview.cpp
@@ -736,14 +736,13 @@ QFxGridView::~QFxGridView()
\endcode
*/
-//XXX change to \qmlattachedsignal when it exists.
/*!
- \qmlattachedproperty void GridView::onAdd
+ \qmlattachedsignal GridView::onAdd()
This attached handler is called immediately after an item is added to the view.
*/
/*!
- \qmlattachedproperty void GridView::onRemove
+ \qmlattachedsignal GridView::onRemove()
This attached handler is called immediately before an item is removed from the view.
*/
diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp
index b82a38d..9c668ac 100644
--- a/src/declarative/fx/qfxitem.cpp
+++ b/src/declarative/fx/qfxitem.cpp
@@ -1198,6 +1198,19 @@ QFxKeysAttached *QFxKeysAttached::qmlAttachedProperties(QObject *obj)
}
/*!
+ \class QFxItem
+ \brief QFxItem is 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
+ common across visual items - such as the x and y position, the
+ width and height, \l {anchor-layout}{anchoring} and key handling.
+
+ You can subclass QFxItem to provide your own custom visual item that inherits
+ these features.
+*/
+
+/*!
\qmlclass Item QFxItem
\brief The Item is the most basic of all visual items in QML.
@@ -1364,7 +1377,7 @@ QFxItem::~QFxItem()
\qml
Image {
source: "myimage.png"
- transformOrigin: "Center"
+ transformOrigin: Item.Center
scale: 4
}
\endqml
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index 23bf573..1a4a60c 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -926,14 +926,13 @@ QFxListView::~QFxListView()
\endcode
*/
-//XXX change to \qmlattachedsignal when it exists.
/*!
- \qmlattachedproperty void ListView::onAdd
+ \qmlattachedsignal ListView::onAdd()
This attached handler is called immediately after an item is added to the view.
*/
/*!
- \qmlattachedproperty void ListView::onRemove
+ \qmlattachedsignal ListView::onRemove()
This attached handler is called immediately before an item is removed from the view.
*/
diff --git a/src/declarative/fx/qfxpainteditem.cpp b/src/declarative/fx/qfxpainteditem.cpp
index 05fcc93..e0ef99f 100644
--- a/src/declarative/fx/qfxpainteditem.cpp
+++ b/src/declarative/fx/qfxpainteditem.cpp
@@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QFxPaintedItem
\brief The QFxPaintedItem class is an abstract base class for QmlView items that want cached painting.
- \ingroup group_coreitems
+ \internal
This is a convenience class for implementing items that paint their contents
using a QPainter. The contents of the item are cached behind the scenes.
diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp
index a078da6..e1ac246 100644
--- a/src/declarative/fx/qfxvisualitemmodel.cpp
+++ b/src/declarative/fx/qfxvisualitemmodel.cpp
@@ -102,7 +102,7 @@ QHash<QObject*, QFxVisualItemModelAttached*> QFxVisualItemModelAttached::attache
class QFxVisualItemModelPrivate : public QObjectPrivate
{
- Q_DECLARE_PUBLIC(QFxVisualItemModel);
+ Q_DECLARE_PUBLIC(QFxVisualItemModel)
public:
QFxVisualItemModelPrivate() : QObjectPrivate(), children(this) {}
@@ -143,7 +143,7 @@ public:
\code
Item {
VisualItemModel {
- id: ItemModel
+ id: itemModel
Rectangle { height: 30; width: 80; color: "red" }
Rectangle { height: 30; width: 80; color: "green" }
Rectangle { height: 30; width: 80; color: "blue" }
@@ -151,7 +151,7 @@ public:
ListView {
anchors.fill: parent
- model: ItemModel
+ model: itemModel
}
}
\endcode
@@ -416,8 +416,13 @@ int QFxVisualDataModelDataMetaObject::createProperty(const char *name, const cha
if ((!model->m_listModelInterface || !model->m_abstractItemModel) && model->m_listAccessor) {
model->ensureRoles();
- if (model->m_roleNames.contains(QString::fromUtf8(name)))
+ if (model->m_roleNames.contains(QString::fromUtf8(name))) {
return QmlOpenMetaObject::createProperty(name, type);
+ } else if (model->m_listAccessor->type() == QmlListAccessor::QmlList) {
+ QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
+ if (object && object->property(name).isValid())
+ return QmlOpenMetaObject::createProperty(name, type);
+ }
} else {
model->ensureRoles();
QString sname = QString::fromUtf8(name);
@@ -448,7 +453,7 @@ QFxVisualDataModelDataMetaObject::propertyCreated(int, QMetaPropertyBuilder &pro
return model->m_listAccessor->at(data->m_index);
} else {
// return any property of a single object instance.
- QObject *object = model->m_listAccessor->at(0).value<QObject*>();
+ QObject *object = model->m_listAccessor->at(data->m_index).value<QObject*>();
return object->property(prop.name());
}
} else if (model->m_listModelInterface) {
diff --git a/src/declarative/qml/qbitfield_p.h b/src/declarative/qml/qbitfield_p.h
index 70d5041..a8cc9dc 100644
--- a/src/declarative/qml/qbitfield_p.h
+++ b/src/declarative/qml/qbitfield_p.h
@@ -139,11 +139,11 @@ QBitField QBitField::united(const QBitField &o)
rv.data = rv.ownData + 1;
if (bits > o.bits) {
::memcpy((quint32 *)rv.data, data, length * sizeof(quint32));
- for (quint32 ii = 0; ii < (o.bits + 31) / 32; ++ii)
+ for (quint32 ii = 0; ii < (o.bits + quint32(31)) / 32; ++ii)
((quint32 *)rv.data)[ii] |= o.data[ii];
} else {
::memcpy((quint32 *)rv.data, o.data, length * sizeof(quint32));
- for (quint32 ii = 0; ii < (bits + 31) / 32; ++ii)
+ for (quint32 ii = 0; ii < (bits + quint32(31)) / 32; ++ii)
((quint32 *)rv.data)[ii] |= data[ii];
}
return rv;
diff --git a/src/declarative/qml/qmlcomponent.cpp b/src/declarative/qml/qmlcomponent.cpp
index 12fb120..0894758 100644
--- a/src/declarative/qml/qmlcomponent.cpp
+++ b/src/declarative/qml/qmlcomponent.cpp
@@ -390,8 +390,6 @@ valid for components created directly from QML.
*/
QmlContext *QmlComponent::creationContext() const
{
- Q_D(const QmlComponent);
-
QmlDeclarativeData *ddata = QmlDeclarativeData::get(this);
if (ddata)
return ddata->context;
diff --git a/src/declarative/qml/qmlcomponent_p.h b/src/declarative/qml/qmlcomponent_p.h
index 7eedfbd..f90502f 100644
--- a/src/declarative/qml/qmlcomponent_p.h
+++ b/src/declarative/qml/qmlcomponent_p.h
@@ -76,7 +76,7 @@ class QmlComponentPrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QmlComponent)
public:
- QmlComponentPrivate() : typeData(0), progress(0.), start(-1), count(-1), cc(0), completePending(false), componentAttacheds(0), engine(0) {}
+ QmlComponentPrivate() : typeData(0), progress(0.), start(-1), count(-1), cc(0), componentAttacheds(0), completePending(false), engine(0) {}
QObject *create(QmlContext *context, const QBitField &);
diff --git a/src/declarative/qml/qmlcompositetypedata_p.h b/src/declarative/qml/qmlcompositetypedata_p.h
index fa11137..ffcef4c 100644
--- a/src/declarative/qml/qmlcompositetypedata_p.h
+++ b/src/declarative/qml/qmlcompositetypedata_p.h
@@ -69,7 +69,8 @@ public:
Invalid,
Complete,
Error,
- Waiting
+ Waiting,
+ WaitingResources
};
Status status;
enum ErrorType {
diff --git a/src/declarative/qml/qmlcompositetypemanager.cpp b/src/declarative/qml/qmlcompositetypemanager.cpp
index 3c76344..b335d31 100644
--- a/src/declarative/qml/qmlcompositetypemanager.cpp
+++ b/src/declarative/qml/qmlcompositetypemanager.cpp
@@ -352,18 +352,6 @@ void QmlCompositeTypeManager::setData(QmlCompositeTypeData *unit,
if (!unit->data.parse(data, url)) {
ok = false;
unit->errors << unit->data.errors();
- } else {
- foreach (QmlScriptParser::Import imp, unit->data.imports()) {
- int dot = imp.version.indexOf(QLatin1Char('.'));
- if (dot < 0) dot = imp.version.length();
- if (!QmlEnginePrivate::get(engine)->addToImport(&unit->imports, imp.uri, imp.qualifier, imp.version.left(dot).toInt(), imp.version.mid(dot+1).toInt(), imp.type)) {
- QmlError error;
- error.setUrl(url);
- error.setDescription(tr("Import %1 unavailable").arg(imp.uri));
- unit->errors << error;
- ok = false;
- }
- }
}
if (ok) {
@@ -400,25 +388,11 @@ void QmlCompositeTypeManager::doComplete(QmlCompositeTypeResource *resource)
void QmlCompositeTypeManager::checkComplete(QmlCompositeTypeData *unit)
{
- if (unit->status != QmlCompositeTypeData::Waiting)
+ if (unit->status != QmlCompositeTypeData::Waiting
+ && unit->status != QmlCompositeTypeData::WaitingResources)
return;
int waiting = 0;
- for (int ii = 0; ii < unit->types.count(); ++ii) {
- QmlCompositeTypeData *u = unit->types.at(ii).unit;
-
- if (!u)
- continue;
-
- if (u->status == QmlCompositeTypeData::Error) {
- unit->status = QmlCompositeTypeData::Error;
- unit->errors = u->errors;
- doComplete(unit);
- return;
- } else if (u->status == QmlCompositeTypeData::Waiting) {
- waiting++;
- }
- }
for (int ii = 0; ii < unit->resources.count(); ++ii) {
QmlCompositeTypeResource *r = unit->resources.at(ii);
@@ -429,28 +403,84 @@ void QmlCompositeTypeManager::checkComplete(QmlCompositeTypeData *unit)
unit->status = QmlCompositeTypeData::Error;
QmlError error;
error.setUrl(unit->imports.baseUrl());
- error.setDescription(QLatin1String("Resource ") + r->url +
- QLatin1String(" unavailable"));
+ error.setDescription(tr("Resource %1 unavailable").arg(r->url));
unit->errors << error;
doComplete(unit);
return;
- } else if (r->status == QmlCompositeTypeData::Waiting) {
+ } else if (r->status == QmlCompositeTypeResource::Waiting) {
waiting++;
}
}
+ if (waiting == 0) {
+ if (unit->status == QmlCompositeTypeData::WaitingResources) {
+ waiting += resolveTypes(unit);
+ if (unit->status != QmlCompositeTypeData::Error) {
+ if (waiting)
+ unit->status = QmlCompositeTypeData::Waiting;
+ } else {
+ return;
+ }
+ } else {
+ for (int ii = 0; ii < unit->types.count(); ++ii) {
+ QmlCompositeTypeData *u = unit->types.at(ii).unit;
+
+ if (!u)
+ continue;
+
+ if (u->status == QmlCompositeTypeData::Error) {
+ unit->status = QmlCompositeTypeData::Error;
+ unit->errors = u->errors;
+ doComplete(unit);
+ return;
+ } else if (u->status == QmlCompositeTypeData::Waiting) {
+ waiting++;
+ }
+ }
+ }
+ }
+
if (!waiting) {
unit->status = QmlCompositeTypeData::Complete;
doComplete(unit);
}
}
-// ### Check ref counting in here
-void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
+int QmlCompositeTypeManager::resolveTypes(QmlCompositeTypeData *unit)
{
- QList<QmlScriptParser::TypeReference*> types = unit->data.referencedTypes();
+ // not called until all resources are loaded (they include import URLs)
int waiting = 0;
+
+ foreach (QmlScriptParser::Import imp, unit->data.imports()) {
+ int dot = imp.version.indexOf(QLatin1Char('.'));
+ if (dot < 0) dot = imp.version.length();
+ QString qmldir;
+ if (imp.type == QmlScriptParser::Import::File && imp.qualifier.isEmpty()) {
+ QUrl importUrl = unit->imports.baseUrl().resolved(QUrl(imp.uri + QLatin1String("/qmldir")));
+ for (int ii = 0; ii < unit->resources.count(); ++ii) {
+ if (unit->resources.at(ii)->url == importUrl) {
+ qmldir = QString::fromUtf8(unit->resources.at(ii)->data);
+ break;
+ }
+ }
+ }
+ if (!QmlEnginePrivate::get(engine)->addToImport(
+ &unit->imports, qmldir, imp.uri, imp.qualifier, imp.version.left(dot).toInt(), imp.version.mid(dot+1).toInt(), imp.type))
+ {
+ QmlError error;
+ error.setUrl(unit->imports.baseUrl());
+ error.setDescription(tr("Import %1 unavailable").arg(imp.uri));
+ unit->status = QmlCompositeTypeData::Error;
+ unit->errorType = QmlCompositeTypeData::GeneralError;
+ unit->errors << error;
+ doComplete(unit);
+ return 0;
+ }
+ }
+
+ QList<QmlScriptParser::TypeReference*> types = unit->data.referencedTypes();
+
for (int ii = 0; ii < types.count(); ++ii) {
QmlScriptParser::TypeReference *parserRef = types.at(ii);
QByteArray typeName = parserRef->name.toUtf8();
@@ -478,7 +508,7 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
unit->errorType = QmlCompositeTypeData::GeneralError;
unit->errors << error;
doComplete(unit);
- return;
+ return 0;
}
if (ref.type) {
@@ -521,12 +551,13 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
if (urlUnit->errorType != QmlCompositeTypeData::AccessError)
unit->errors << urlUnit->errors;
doComplete(unit);
- return;
+ return 0;
case QmlCompositeTypeData::Complete:
break;
case QmlCompositeTypeData::Waiting:
+ case QmlCompositeTypeData::WaitingResources:
unit->addref();
ref.unit->dependants << unit;
waiting++;
@@ -535,8 +566,26 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
unit->types << ref;
}
+ return waiting;
+}
+
+// ### Check ref counting in here
+void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
+{
+ int waiting = 0;
QList<QUrl> resourceList = unit->data.referencedResources();
+
+ foreach (QmlScriptParser::Import imp, unit->data.imports()) {
+ if (imp.type == QmlScriptParser::Import::File && imp.qualifier.isEmpty()) {
+ QUrl importUrl = unit->imports.baseUrl().resolved(QUrl(imp.uri + QLatin1String("/qmldir")));
+ if (toLocalFileOrQrc(importUrl).isEmpty()) {
+ // Import requires remote qmldir
+ resourceList.prepend(importUrl);
+ }
+ }
+ }
+
for (int ii = 0; ii < resourceList.count(); ++ii) {
QUrl url = unit->imports.baseUrl().resolved(resourceList.at(ii));
@@ -558,8 +607,7 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
{
QmlError error;
error.setUrl(unit->imports.baseUrl());
- error.setDescription(QLatin1String("Resource ") + resource->url +
- QLatin1String(" unavailable"));
+ error.setDescription(tr("Resource %1 unavailable").arg(resource->url));
unit->errors << error;
}
doComplete(unit);
@@ -579,11 +627,18 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
unit->resources << resource;
}
- if (waiting) {
- unit->status = QmlCompositeTypeData::Waiting;
+ if (waiting == 0) {
+ waiting += resolveTypes(unit);
+ if (unit->status != QmlCompositeTypeData::Error) {
+ if (!waiting) {
+ unit->status = QmlCompositeTypeData::Complete;
+ doComplete(unit);
+ } else {
+ unit->status = QmlCompositeTypeData::Waiting;
+ }
+ }
} else {
- unit->status = QmlCompositeTypeData::Complete;
- doComplete(unit);
+ unit->status = QmlCompositeTypeData::WaitingResources;
}
}
diff --git a/src/declarative/qml/qmlcompositetypemanager_p.h b/src/declarative/qml/qmlcompositetypemanager_p.h
index 843a9cf..b6f84db 100644
--- a/src/declarative/qml/qmlcompositetypemanager_p.h
+++ b/src/declarative/qml/qmlcompositetypemanager_p.h
@@ -101,6 +101,7 @@ private:
void doComplete(QmlCompositeTypeData *);
void doComplete(QmlCompositeTypeResource *);
void checkComplete(QmlCompositeTypeData *);
+ int resolveTypes(QmlCompositeTypeData *);
QmlEngine *engine;
typedef QHash<QString, QmlCompositeTypeData *> Components;
diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp
index 31d4e1f..7ba3544 100644
--- a/src/declarative/qml/qmlcontext.cpp
+++ b/src/declarative/qml/qmlcontext.cpp
@@ -396,8 +396,7 @@ void QmlContext::setContextProperty(const QString &name, const QVariant &value)
}
}
-void QmlContextPrivate::setIdProperty(const QString &name, int idx,
- QObject *obj)
+void QmlContextPrivate::setIdProperty(int idx, QObject *obj)
{
if (notifyIndex == -1) {
Q_Q(QmlContext);
@@ -487,7 +486,6 @@ void QmlContext::setBaseUrl(const QUrl &baseUrl)
*/
QUrl QmlContext::baseUrl() const
{
- Q_D(const QmlContext);
const QmlContext* p = this;
while (p && p->d_func()->url.isEmpty()) {
p = p->parentContext();
diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h
index 9a77e94..be7bf1d 100644
--- a/src/declarative/qml/qmlcontext_p.h
+++ b/src/declarative/qml/qmlcontext_p.h
@@ -129,7 +129,7 @@ public:
};
ContextGuard *idValues;
int idValueCount;
- void setIdProperty(const QString &, int, QObject *);
+ void setIdProperty(int, QObject *);
void setIdPropertyData(QmlIntegerCache *);
void destroyed(ContextGuard *);
diff --git a/src/declarative/qml/qmldom.cpp b/src/declarative/qml/qmldom.cpp
index a0601d7..21eeb7c 100644
--- a/src/declarative/qml/qmldom.cpp
+++ b/src/declarative/qml/qmldom.cpp
@@ -1181,6 +1181,75 @@ QmlDomObject QmlDomValueValueSource::object() const
return rv;
}
+/*!
+ \class QmlDomValueValueInterceptor
+ \internal
+ \brief The QmlDomValueValueInterceptor class represents a value interceptor assignment value.
+
+ In QML, value interceptor are special write-intercepting types that may be
+ assigned to properties. Value interceptor inherit the QmlPropertyValueInterceptor
+ class. In the example below, the "x" property is being assigned the
+ Behavior value interceptor.
+
+ \qml
+Rectangle {
+ x: Behavior { NumberAnimation { duration: 500 } }
+}
+ \endqml
+*/
+
+/*!
+ Construct an empty QmlDomValueValueInterceptor.
+*/
+QmlDomValueValueInterceptor::QmlDomValueValueInterceptor():
+ d(new QmlDomBasicValuePrivate)
+{
+}
+
+/*!
+ Create a copy of \a other QmlDomValueValueInterceptor.
+*/
+QmlDomValueValueInterceptor::QmlDomValueValueInterceptor(const QmlDomValueValueInterceptor &other)
+: d(other.d)
+{
+}
+
+/*!
+ Destroy the QmlDomValueValueInterceptor.
+*/
+QmlDomValueValueInterceptor::~QmlDomValueValueInterceptor()
+{
+}
+
+/*!
+ Assign \a other to this QmlDomValueValueInterceptor.
+*/
+QmlDomValueValueInterceptor &QmlDomValueValueInterceptor::operator=(const QmlDomValueValueInterceptor &other)
+{
+ d = other.d;
+ return *this;
+}
+
+/*!
+ Return the value interceptor object.
+
+ In the example below, an object representing the Behavior will be
+ returned.
+ \qml
+Rectangle {
+ x: Behavior { NumberAnimation { duration: 500 } }
+}
+ \endqml
+*/
+QmlDomObject QmlDomValueValueInterceptor::object() const
+{
+ QmlDomObject rv;
+ if (d->value) {
+ rv.d->object = d->value->object;
+ rv.d->object->addref();
+ }
+ return rv;
+}
QmlDomValuePrivate::QmlDomValuePrivate()
: property(0), value(0)
@@ -1286,6 +1355,7 @@ QmlDomValue &QmlDomValue::operator=(const QmlDomValue &other)
\value Literal The QmlDomValue is a literal value assignment. Use QmlDomValue::toLiteral() to access the type instance.
\value PropertyBinding The QmlDomValue is a property binding. Use QmlDomValue::toBinding() to access the type instance.
\value ValueSource The QmlDomValue is a property value source. Use QmlDomValue::toValueSource() to access the type instance.
+ \value ValueInterceptor The QmlDomValue is a property value interceptor. Use QmlDomValue::toValueInterceptor() to access the type instance.
\value Object The QmlDomValue is an object assignment. Use QmlDomValue::toObject() to access the type instnace.
\value List The QmlDomValue is a list of other values. Use QmlDomValue::toList() to access the type instance.
*/
@@ -1314,6 +1384,8 @@ QmlDomValue::Type QmlDomValue::type() const
return PropertyBinding;
case QmlParser::Value::ValueSource:
return ValueSource;
+ case QmlParser::Value::ValueInterceptor:
+ return ValueInterceptor;
case QmlParser::Value::CreatedObject:
return Object;
case QmlParser::Value::SignalObject:
@@ -1359,6 +1431,14 @@ bool QmlDomValue::isValueSource() const
}
/*!
+ Returns true if this is a value interceptor value, otherwise false.
+*/
+bool QmlDomValue::isValueInterceptor() const
+{
+ return type() == ValueInterceptor;
+}
+
+/*!
Returns true if this is an object value, otherwise false.
*/
bool QmlDomValue::isObject() const
@@ -1423,6 +1503,22 @@ QmlDomValueValueSource QmlDomValue::toValueSource() const
}
/*!
+ Returns a QmlDomValueValueInterceptor if this value is a property value interceptor
+ type, otherwise returns an invalid QmlDomValueValueInterceptor.
+
+ \sa QmlDomValue::type()
+*/
+QmlDomValueValueInterceptor QmlDomValue::toValueInterceptor() const
+{
+ QmlDomValueValueInterceptor rv;
+ if (type() == ValueInterceptor) {
+ rv.d->value = d->value;
+ rv.d->value->addref();
+ }
+ return rv;
+}
+
+/*!
Returns a QmlDomObject if this value is an object assignment type, otherwise
returns an invalid QmlDomObject.
diff --git a/src/declarative/qml/qmldom.h b/src/declarative/qml/qmldom.h
index f344bb2..5816780 100644
--- a/src/declarative/qml/qmldom.h
+++ b/src/declarative/qml/qmldom.h
@@ -175,6 +175,7 @@ private:
friend class QmlDomComponent;
friend class QmlDomValue;
friend class QmlDomValueValueSource;
+ friend class QmlDomValueValueInterceptor;
QSharedDataPointer<QmlDomObjectPrivate> d;
};
@@ -225,6 +226,22 @@ private:
QSharedDataPointer<QmlDomBasicValuePrivate> d;
};
+class Q_DECLARATIVE_EXPORT QmlDomValueValueInterceptor
+{
+public:
+ QmlDomValueValueInterceptor();
+ QmlDomValueValueInterceptor(const QmlDomValueValueInterceptor &);
+ ~QmlDomValueValueInterceptor();
+ QmlDomValueValueInterceptor &operator=(const QmlDomValueValueInterceptor &);
+
+ QmlDomObject object() const;
+
+private:
+ friend class QmlDomValue;
+ QSharedDataPointer<QmlDomBasicValuePrivate> d;
+};
+
+
class Q_DECLARATIVE_EXPORT QmlDomComponent : public QmlDomObject
{
public:
@@ -244,6 +261,7 @@ public:
Literal,
PropertyBinding,
ValueSource,
+ ValueInterceptor,
Object,
List
};
@@ -259,12 +277,14 @@ public:
bool isLiteral() const;
bool isBinding() const;
bool isValueSource() const;
+ bool isValueInterceptor() const;
bool isObject() const;
bool isList() const;
QmlDomValueLiteral toLiteral() const;
QmlDomValueBinding toBinding() const;
QmlDomValueValueSource toValueSource() const;
+ QmlDomValueValueInterceptor toValueInterceptor() const;
QmlDomObject toObject() const;
QmlDomList toList() const;
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index 4f3b2ba..df865f1 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -1036,6 +1036,7 @@ struct QmlEnginePrivate::ImportedNamespace {
QList<int> minversions;
QList<bool> isLibrary;
QList<bool> isBuiltin;
+ QList<QString> qmlDirContent;
bool find(const QByteArray& type, int *vmajor, int *vminor, QmlType** type_return, QUrl* url_return) const
{
@@ -1057,36 +1058,39 @@ struct QmlEnginePrivate::ImportedNamespace {
}
} else {
QUrl url = QUrl(urls.at(i) + QLatin1String("/") + QString::fromUtf8(type) + QLatin1String(".qml"));
- if (vmaj || vmin) {
+ QString qmldircontent = qmlDirContent.at(i);
+ if (vmaj || vmin || !qmldircontent.isEmpty()) {
// Check version file - XXX cache these in QmlEngine!
- QFile qmldir(toLocalFileOrQrc(QUrl(urls.at(i)+QLatin1String("/qmldir"))));
- if (qmldir.open(QIODevice::ReadOnly)) {
- do {
- QByteArray lineba = qmldir.readLine();
- if (lineba.at(0) == '#')
- continue;
- int space1 = lineba.indexOf(' ');
- if (qstrncmp(lineba,type,space1)==0) {
- // eg. 1.2-5
- QString line = QString::fromUtf8(lineba);
- space1 = line.indexOf(QLatin1Char(' ')); // refind in Unicode
- int space2 = space1 >=0 ? line.indexOf(QLatin1Char(' '),space1+1) : -1;
- QString mapversions = line.mid(space1+1,space2<0?line.length()-space1-2:space2-space1-1);
- int dot = mapversions.indexOf(QLatin1Char('.'));
- int dash = mapversions.indexOf(QLatin1Char('-'));
- int mapvmaj = mapversions.left(dot).toInt();
- if (mapvmaj==vmaj) {
- int mapvmin_from = (dash <= 0 ? mapversions.mid(dot+1) : mapversions.mid(dot+1,dash-dot-1)).toInt();
- int mapvmin_to = dash <= 0 ? mapvmin_from : mapversions.mid(dash+1).toInt();
- if (vmin >= mapvmin_from && vmin <= mapvmin_to) {
- QStringRef mapfile = space2<0 ? QStringRef() : line.midRef(space2+1,line.length()-space2-2);
- if (url_return)
- *url_return = url.resolved(mapfile.toString());
- return true;
- }
+ if (qmldircontent.isEmpty()) {
+ QFile qmldir(toLocalFileOrQrc(QUrl(urls.at(i)+QLatin1String("/qmldir"))));
+ if (qmldir.open(QIODevice::ReadOnly)) {
+ qmldircontent = QString::fromUtf8(qmldir.readAll());
+ }
+ }
+ QString typespace = QString::fromUtf8(type)+QLatin1Char(' ');
+ QStringList lines = qmldircontent.split(QLatin1Char('\n'));
+ foreach (QString line, lines) {
+ if (line.isEmpty() || line.at(0) == QLatin1Char('#'))
+ continue;
+ if (line.startsWith(typespace)) {
+ // eg. 1.2-5
+ int space1 = line.indexOf(QLatin1Char(' '));
+ int space2 = space1 >=0 ? line.indexOf(QLatin1Char(' '),space1+1) : -1;
+ QString mapversions = line.mid(space1+1,space2<0?line.length()-space1-1:space2-space1-1);
+ int dot = mapversions.indexOf(QLatin1Char('.'));
+ int dash = mapversions.indexOf(QLatin1Char('-'));
+ int mapvmaj = mapversions.left(dot).toInt();
+ if (mapvmaj==vmaj) {
+ int mapvmin_from = (dash <= 0 ? mapversions.mid(dot+1) : mapversions.mid(dot+1,dash-dot-1)).toInt();
+ int mapvmin_to = dash <= 0 ? mapvmin_from : mapversions.mid(dash+1).toInt();
+ if (vmin >= mapvmin_from && vmin <= mapvmin_to) {
+ QStringRef mapfile = space2<0 ? QStringRef() : line.midRef(space2+1,line.length()-space2-1);
+ if (url_return)
+ *url_return = url.resolved(mapfile.toString());
+ return true;
}
}
- } while (!qmldir.atEnd());
+ }
}
} else {
// XXX search non-files too! (eg. zip files, see QT-524)
@@ -1115,7 +1119,7 @@ public:
delete s;
}
- bool add(const QUrl& base, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType, const QStringList& importPath)
+ bool add(const QUrl& base, const QString& qmldircontent, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType, const QStringList& importPath)
{
QmlEnginePrivate::ImportedNamespace *s;
if (prefix.isEmpty()) {
@@ -1151,6 +1155,7 @@ public:
s->minversions.prepend(vmin);
s->isLibrary.prepend(importType == QmlScriptParser::Import::Library);
s->isBuiltin.prepend(isbuiltin);
+ s->qmlDirContent.prepend(qmldircontent);
return true;
}
@@ -1375,9 +1380,9 @@ QString QmlEngine::offlineStoragePath() const
The base URL must already have been set with Import::setBaseUrl().
*/
-bool QmlEnginePrivate::addToImport(Imports* imports, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType) const
+bool QmlEnginePrivate::addToImport(Imports* imports, const QString& qmldircontent, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType) const
{
- bool ok = imports->d->add(imports->d->base,uri,prefix,vmaj,vmin,importType,fileImportPath);
+ bool ok = imports->d->add(imports->d->base,qmldircontent,uri,prefix,vmaj,vmin,importType,fileImportPath);
if (qmlImportTrace())
qDebug() << "QmlEngine::addToImport(" << imports << uri << prefix << vmaj << "." << vmin << (importType==QmlScriptParser::Import::Library? "Library" : "File") << ": " << ok;
return ok;
diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h
index 29621c0..69b121e 100644
--- a/src/declarative/qml/qmlengine_p.h
+++ b/src/declarative/qml/qmlengine_p.h
@@ -227,7 +227,7 @@ public:
QmlImportsPrivate *d;
};
- bool addToImport(Imports*, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType) const;
+ bool addToImport(Imports*, const QString& qmlDirContent,const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType) const;
bool resolveType(const Imports&, const QByteArray& type,
QmlType** type_return, QUrl* url_return,
int *version_major, int *version_minor,
diff --git a/src/declarative/qml/qmlenginedebug.cpp b/src/declarative/qml/qmlenginedebug.cpp
index 7178e6c..664ca3f 100644
--- a/src/declarative/qml/qmlenginedebug.cpp
+++ b/src/declarative/qml/qmlenginedebug.cpp
@@ -104,7 +104,7 @@ QmlEngineDebugServer::propertyData(QObject *obj, int propIdx)
rv.type = QmlObjectProperty::Unknown;
rv.valueTypeName = QString::fromUtf8(prop.typeName());
- rv.name = prop.name();
+ rv.name = QString::fromUtf8(prop.name());
rv.hasNotifySignal = prop.hasNotifySignal();
QmlAbstractBinding *binding = QmlMetaProperty(obj, rv.name).binding();
if (binding)
@@ -229,7 +229,7 @@ QmlEngineDebugServer::objectData(QObject *object)
}
rv.objectName = object->objectName();
- rv.objectType = object->metaObject()->className();
+ rv.objectType = QString::fromUtf8(object->metaObject()->className());
rv.objectId = QmlDebugService::idForObject(object);
rv.contextId = QmlDebugService::idForObject(qmlContext(object));
diff --git a/src/declarative/qml/qmlglobalscriptclass.cpp b/src/declarative/qml/qmlglobalscriptclass.cpp
index 0ade5ee..91187c7 100644
--- a/src/declarative/qml/qmlglobalscriptclass.cpp
+++ b/src/declarative/qml/qmlglobalscriptclass.cpp
@@ -70,6 +70,10 @@ QmlGlobalScriptClass::queryProperty(const QScriptValue &object,
const QScriptString &name,
QueryFlags flags, uint *id)
{
+ Q_UNUSED(object)
+ Q_UNUSED(name)
+ Q_UNUSED(flags)
+ Q_UNUSED(id)
return HandlesReadAccess | HandlesWriteAccess;
}
@@ -78,6 +82,9 @@ QmlGlobalScriptClass::property(const QScriptValue &object,
const QScriptString &name,
uint id)
{
+ Q_UNUSED(object)
+ Q_UNUSED(name)
+ Q_UNUSED(id)
return engine()->undefinedValue();
}
@@ -85,6 +92,8 @@ void QmlGlobalScriptClass::setProperty(QScriptValue &object,
const QScriptString &name,
uint id, const QScriptValue &value)
{
+ Q_UNUSED(object)
+ Q_UNUSED(value)
QString error = QLatin1String("Invalid write to global property \"") +
name.toString() + QLatin1String("\"");
engine()->currentContext()->throwError(error);
diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp
index baef71f..edec988 100644
--- a/src/declarative/qml/qmlmetaproperty.cpp
+++ b/src/declarative/qml/qmlmetaproperty.cpp
@@ -61,6 +61,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QmlMetaProperty
\brief The QmlMetaProperty class abstracts accessing QML properties.
+ \internal
*/
/*!
diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp
index a6edd3b..eac354d 100644
--- a/src/declarative/qml/qmlobjectscriptclass.cpp
+++ b/src/declarative/qml/qmlobjectscriptclass.cpp
@@ -134,7 +134,6 @@ QmlObjectScriptClass::queryProperty(QObject *obj, const Identifier &name,
return 0;
QmlEnginePrivate *enginePrivate = QmlEnginePrivate::get(engine);
- QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine);
QmlPropertyCache *cache = 0;
QmlDeclarativeData *ddata = QmlDeclarativeData::get(obj);
diff --git a/src/declarative/qml/qmlpropertycache.cpp b/src/declarative/qml/qmlpropertycache.cpp
index 3ede341..4c24cdd 100644
--- a/src/declarative/qml/qmlpropertycache.cpp
+++ b/src/declarative/qml/qmlpropertycache.cpp
@@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE
void QmlPropertyCache::Data::load(const QMetaProperty &p)
{
propType = p.userType();
- if (propType == QVariant::LastType)
+ if (QVariant::Type(propType) == QVariant::LastType)
propType = qMetaTypeId<QVariant>();
coreIndex = p.propertyIndex();
notifyIndex = p.notifySignalIndex();
diff --git a/src/declarative/qml/qmlpropertyvalueinterceptor.cpp b/src/declarative/qml/qmlpropertyvalueinterceptor.cpp
index 86905e6..9a9aba8 100644
--- a/src/declarative/qml/qmlpropertyvalueinterceptor.cpp
+++ b/src/declarative/qml/qmlpropertyvalueinterceptor.cpp
@@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QmlPropertyValueInterceptor
\brief The QmlPropertyValueInterceptor class is inherited by property interceptors such as Behavior.
+ \internal
This class intercepts property writes, allowing for custom handling. For example, Behavior uses this
interception to provide a default animation for all changes to a property's value.
diff --git a/src/declarative/qml/qmlpropertyvaluesource.cpp b/src/declarative/qml/qmlpropertyvaluesource.cpp
index 529ce37..3317289 100644
--- a/src/declarative/qml/qmlpropertyvaluesource.cpp
+++ b/src/declarative/qml/qmlpropertyvaluesource.cpp
@@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QmlPropertyValueSource
\brief The QmlPropertyValueSource class is inherited by property value sources such as animations and bindings.
+ \internal
*/
/*!
diff --git a/src/declarative/qml/qmlrewrite.cpp b/src/declarative/qml/qmlrewrite.cpp
index 43b2529..7cf8888 100644
--- a/src/declarative/qml/qmlrewrite.cpp
+++ b/src/declarative/qml/qmlrewrite.cpp
@@ -120,7 +120,7 @@ bool RewriteBinding::visit(AST::ExpressionStatement *ast)
return false;
}
-bool RewriteBinding::visit(AST::DoWhileStatement *ast)
+bool RewriteBinding::visit(AST::DoWhileStatement *)
{
++_inLoop;
return true;
@@ -131,7 +131,7 @@ void RewriteBinding::endVisit(AST::DoWhileStatement *)
--_inLoop;
}
-bool RewriteBinding::visit(AST::WhileStatement *ast)
+bool RewriteBinding::visit(AST::WhileStatement *)
{
++_inLoop;
return true;
@@ -142,7 +142,7 @@ void RewriteBinding::endVisit(AST::WhileStatement *)
--_inLoop;
}
-bool RewriteBinding::visit(AST::ForStatement *ast)
+bool RewriteBinding::visit(AST::ForStatement *)
{
++_inLoop;
return true;
@@ -153,7 +153,7 @@ void RewriteBinding::endVisit(AST::ForStatement *)
--_inLoop;
}
-bool RewriteBinding::visit(AST::LocalForStatement *ast)
+bool RewriteBinding::visit(AST::LocalForStatement *)
{
++_inLoop;
return true;
@@ -164,7 +164,7 @@ void RewriteBinding::endVisit(AST::LocalForStatement *)
--_inLoop;
}
-bool RewriteBinding::visit(AST::ForEachStatement *ast)
+bool RewriteBinding::visit(AST::ForEachStatement *)
{
++_inLoop;
return true;
@@ -175,7 +175,7 @@ void RewriteBinding::endVisit(AST::ForEachStatement *)
--_inLoop;
}
-bool RewriteBinding::visit(AST::LocalForEachStatement *ast)
+bool RewriteBinding::visit(AST::LocalForEachStatement *)
{
++_inLoop;
return true;
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp
index 802a78f..b986b60 100644
--- a/src/declarative/qml/qmlvme.cpp
+++ b/src/declarative/qml/qmlvme.cpp
@@ -225,7 +225,7 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt,
{
QObject *target = stack.top();
// ctxt->setContextProperty(primitives.at(instr.setId.value), target);
- cp->setIdProperty(primitives.at(instr.setId.value), instr.setId.index, target);
+ cp->setIdProperty(instr.setId.index, target);
}
break;
diff --git a/src/declarative/qml/qmlvmemetaobject.cpp b/src/declarative/qml/qmlvmemetaobject.cpp
index a627bf9..3e1d931 100644
--- a/src/declarative/qml/qmlvmemetaobject.cpp
+++ b/src/declarative/qml/qmlvmemetaobject.cpp
@@ -278,7 +278,7 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
QMetaMethod m = method(_id);
QList<QByteArray> names = m.parameterNames();
for (int ii = 0; ii < names.count(); ++ii)
- newCtxt.setContextProperty(names.at(ii), *(QVariant *)a[ii + 1]);
+ newCtxt.setContextProperty(QString::fromLatin1(names.at(ii)), *(QVariant *)a[ii + 1]);
QmlExpression expr(&newCtxt, code, object);
expr.setTrackChange(false);
expr.value();
diff --git a/src/declarative/qml/qmlxmlhttprequest.cpp b/src/declarative/qml/qmlxmlhttprequest.cpp
index 5117a00..eb7235b 100644
--- a/src/declarative/qml/qmlxmlhttprequest.cpp
+++ b/src/declarative/qml/qmlxmlhttprequest.cpp
@@ -1102,6 +1102,7 @@ void QmlXMLHttpRequest::abort()
void QmlXMLHttpRequest::downloadProgress(qint64 bytes)
{
+ Q_UNUSED(bytes)
m_status =
m_network->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
m_statusText =
@@ -1124,6 +1125,7 @@ void QmlXMLHttpRequest::downloadProgress(qint64 bytes)
void QmlXMLHttpRequest::error(QNetworkReply::NetworkError error)
{
+ Q_UNUSED(error)
m_status =
m_network->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
m_statusText =
@@ -1315,6 +1317,7 @@ static QScriptValue qmlxmlhttprequest_abort(QScriptContext *context, QScriptEngi
static QScriptValue qmlxmlhttprequest_getResponseHeader(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
@@ -1333,6 +1336,7 @@ static QScriptValue qmlxmlhttprequest_getResponseHeader(QScriptContext *context,
static QScriptValue qmlxmlhttprequest_getAllResponseHeaders(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
@@ -1350,6 +1354,7 @@ static QScriptValue qmlxmlhttprequest_getAllResponseHeaders(QScriptContext *cont
// XMLHttpRequest properties
static QScriptValue qmlxmlhttprequest_readyState(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
@@ -1358,6 +1363,7 @@ static QScriptValue qmlxmlhttprequest_readyState(QScriptContext *context, QScrip
static QScriptValue qmlxmlhttprequest_status(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
@@ -1373,6 +1379,7 @@ static QScriptValue qmlxmlhttprequest_status(QScriptContext *context, QScriptEng
static QScriptValue qmlxmlhttprequest_statusText(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
@@ -1388,6 +1395,7 @@ static QScriptValue qmlxmlhttprequest_statusText(QScriptContext *context, QScrip
static QScriptValue qmlxmlhttprequest_responseText(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
@@ -1412,6 +1420,7 @@ static QScriptValue qmlxmlhttprequest_responseXML(QScriptContext *context, QScri
static QScriptValue qmlxmlhttprequest_onreadystatechange(QScriptContext *context, QScriptEngine *engine)
{
+ Q_UNUSED(engine)
QmlXMLHttpRequest *request = qobject_cast<QmlXMLHttpRequest *>(context->thisObject().data().toQObject());
if (!request) return context->throwError(QScriptContext::ReferenceError, QLatin1String("Not an XMLHttpRequest object"));
diff --git a/src/declarative/util/qmlanimation.h b/src/declarative/util/qmlanimation.h
index 7898980..f4f9f38 100644
--- a/src/declarative/util/qmlanimation.h
+++ b/src/declarative/util/qmlanimation.h
@@ -65,6 +65,7 @@ class Q_AUTOTEST_EXPORT QmlAbstractAnimation : public QObject, public QmlPropert
Q_DECLARE_PRIVATE(QmlAbstractAnimation)
Q_INTERFACES(QmlParserStatus)
+ Q_INTERFACES(QmlPropertyValueSource)
Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged)
Q_PROPERTY(bool alwaysRunToEnd READ alwaysRunToEnd WRITE setAlwaysRunToEnd NOTIFY alwaysRunToEndChanged())
diff --git a/src/declarative/util/qmllistaccessor.cpp b/src/declarative/util/qmllistaccessor.cpp
index 578646b..3e4cb64 100644
--- a/src/declarative/util/qmllistaccessor.cpp
+++ b/src/declarative/util/qmllistaccessor.cpp
@@ -73,7 +73,7 @@ void QmlListAccessor::setList(const QVariant &v, QmlEngine *engine)
m_type = Invalid;
} else if (d.type() == QVariant::StringList) {
m_type = StringList;
- } else if (d.type() == QMetaType::QVariantList) {
+ } else if (d.type() == (QVariant::Type)QMetaType::QVariantList) {
m_type = VariantList;
} else if (d.canConvert(QVariant::Int)) {
m_type = Integer;
@@ -136,7 +136,7 @@ QVariant QmlListAccessor::at(int idx) const
QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData();
void *ptr[1];
li->at(idx, ptr);
- return QmlMetaType::fromObject((QObject*)ptr[0], li->type()); //XXX only handles QObject-derived types
+ return QVariant::fromValue((QObject*)ptr[0]);
}
case QList:
return QmlMetaType::listAt(d, idx);
diff --git a/src/declarative/util/qmlpropertychanges.cpp b/src/declarative/util/qmlpropertychanges.cpp
index a112245..7e1f15c 100644
--- a/src/declarative/util/qmlpropertychanges.cpp
+++ b/src/declarative/util/qmlpropertychanges.cpp
@@ -93,7 +93,7 @@ public:
QmlMetaProperty property;
QmlExpression *expression;
QmlExpression *reverseExpression;
- QmlExpression *ownedExpression;
+ QGuard<QmlExpression> ownedExpression;
virtual void execute() {
ownedExpression = property.setSignalExpression(expression);
@@ -272,7 +272,6 @@ QmlPropertyChanges::~QmlPropertyChanges()
delete d->expressions.at(ii).second;
for(int ii = 0; ii < d->signalReplacements.count(); ++ii)
delete d->signalReplacements.at(ii);
-
}
QObject *QmlPropertyChanges::object() const
diff --git a/src/declarative/util/qmlview.cpp b/src/declarative/util/qmlview.cpp
index 14f8279..f91d0db 100644
--- a/src/declarative/util/qmlview.cpp
+++ b/src/declarative/util/qmlview.cpp
@@ -360,6 +360,8 @@ void QmlView::continueExecute()
emit sceneResized(sz);
resize(sz);
}
+ updateGeometry();
+ emit initialSize(d->initialSize);
} else if (QWidget *wid = qobject_cast<QWidget *>(obj)) {
window()->setAttribute(Qt::WA_OpaquePaintEvent, false);
window()->setAttribute(Qt::WA_NoSystemBackground, false);
@@ -374,6 +376,7 @@ void QmlView::continueExecute()
}
layout()->addWidget(wid);
emit sceneResized(wid->size());
+ emit initialSize(wid->size());
}
}
}
@@ -382,6 +385,10 @@ void QmlView::continueExecute()
This signal is emitted when the view is resized to \a size.
*/
+/*! \fn void QmlView::initialSize(QSize size)
+ This signal is emitted when the initial size of the root item is known.
+ */
+
/*! \fn void QmlView::errors(const QList<QmlError> &errors)
This signal is emitted when the qml loaded contains \a errors.
*/
@@ -425,7 +432,10 @@ void QmlView::timerEvent(QTimerEvent* e)
automatically resize the root item.
Regardless of this property, the sizeHint of the view
- is the initial size of the root item.
+ is the initial size of the root item. Note though that
+ since QML may load dynamically, that size may change.
+
+ \sa initialSize()
*/
void QmlView::setContentResizable(bool on)
diff --git a/src/declarative/util/qmlview.h b/src/declarative/util/qmlview.h
index faf2564..822827a 100644
--- a/src/declarative/util/qmlview.h
+++ b/src/declarative/util/qmlview.h
@@ -88,6 +88,7 @@ public:
QSize sizeHint() const;
Q_SIGNALS:
+ void initialSize(QSize size);
void sceneResized(QSize size);
void errors(const QList<QmlError> &error);
diff --git a/src/gui/graphicsview/qgraphicstransform.cpp b/src/gui/graphicsview/qgraphicstransform.cpp
index a0b5493..93dc196 100644
--- a/src/gui/graphicsview/qgraphicstransform.cpp
+++ b/src/gui/graphicsview/qgraphicstransform.cpp
@@ -547,9 +547,7 @@ void QGraphicsRotation::applyTo(QMatrix4x4 *matrix) const
return;
matrix->translate(d->origin);
- QMatrix4x4 m;
- m.rotate(d->angle, d->axis.x(), d->axis.y(), d->axis.z());
- *matrix *= m.toTransform(1024.0f); // Project back to 2D.
+ matrix->projectedRotate(d->angle, d->axis.x(), d->axis.y(), d->axis.z());
matrix->translate(-d->origin);
}
diff --git a/src/gui/math3d/qmatrix4x4.cpp b/src/gui/math3d/qmatrix4x4.cpp
index 00e8f15..5d624d8 100644
--- a/src/gui/math3d/qmatrix4x4.cpp
+++ b/src/gui/math3d/qmatrix4x4.cpp
@@ -58,6 +58,8 @@ QT_BEGIN_NAMESPACE
\sa QVector3D, QGenericMatrix
*/
+static const qreal inv_dist_to_plane = 1. / 1024.;
+
/*!
\fn QMatrix4x4::QMatrix4x4()
@@ -1103,7 +1105,111 @@ QMatrix4x4& QMatrix4x4::rotate(qreal angle, qreal x, qreal y, qreal z)
return *this;
}
-#ifndef QT_NO_VECTOR4D
+/*!
+ \internal
+*/
+QMatrix4x4& QMatrix4x4::projectedRotate(qreal angle, qreal x, qreal y, qreal z)
+{
+ // Used by QGraphicsRotation::applyTo() to perform a rotation
+ // and projection back to 2D in a single step.
+ if (angle == 0.0f)
+ return *this;
+ QMatrix4x4 m(1); // The "1" says to not load the identity.
+ qreal c, s, ic;
+ if (angle == 90.0f || angle == -270.0f) {
+ s = 1.0f;
+ c = 0.0f;
+ } else if (angle == -90.0f || angle == 270.0f) {
+ s = -1.0f;
+ c = 0.0f;
+ } else if (angle == 180.0f || angle == -180.0f) {
+ s = 0.0f;
+ c = -1.0f;
+ } else {
+ qreal a = angle * M_PI / 180.0f;
+ c = qCos(a);
+ s = qSin(a);
+ }
+ bool quick = false;
+ if (x == 0.0f) {
+ if (y == 0.0f) {
+ if (z != 0.0f) {
+ // Rotate around the Z axis.
+ m.setIdentity();
+ m.m[0][0] = c;
+ m.m[1][1] = c;
+ if (z < 0.0f) {
+ m.m[1][0] = s;
+ m.m[0][1] = -s;
+ } else {
+ m.m[1][0] = -s;
+ m.m[0][1] = s;
+ }
+ m.flagBits = General;
+ quick = true;
+ }
+ } else if (z == 0.0f) {
+ // Rotate around the Y axis.
+ m.setIdentity();
+ m.m[0][0] = c;
+ m.m[2][2] = 1.0f;
+ if (y < 0.0f) {
+ m.m[0][3] = -s * inv_dist_to_plane;
+ } else {
+ m.m[0][3] = s * inv_dist_to_plane;
+ }
+ m.flagBits = General;
+ quick = true;
+ }
+ } else if (y == 0.0f && z == 0.0f) {
+ // Rotate around the X axis.
+ m.setIdentity();
+ m.m[1][1] = c;
+ m.m[2][2] = 1.0f;
+ if (x < 0.0f) {
+ m.m[1][3] = s * inv_dist_to_plane;
+ } else {
+ m.m[1][3] = -s * inv_dist_to_plane;
+ }
+ m.flagBits = General;
+ quick = true;
+ }
+ if (!quick) {
+ qreal len = x * x + y * y + z * z;
+ if (!qFuzzyIsNull(len - 1.0f) && !qFuzzyIsNull(len)) {
+ len = qSqrt(len);
+ x /= len;
+ y /= len;
+ z /= len;
+ }
+ ic = 1.0f - c;
+ m.m[0][0] = x * x * ic + c;
+ m.m[1][0] = x * y * ic - z * s;
+ m.m[2][0] = 0.0f;
+ m.m[3][0] = 0.0f;
+ m.m[0][1] = y * x * ic + z * s;
+ m.m[1][1] = y * y * ic + c;
+ m.m[2][1] = 0.0f;
+ m.m[3][1] = 0.0f;
+ m.m[0][2] = 0.0f;
+ m.m[1][2] = 0.0f;
+ m.m[2][2] = 1.0f;
+ m.m[3][2] = 0.0f;
+ m.m[0][3] = (x * z * ic - y * s) * -inv_dist_to_plane;
+ m.m[1][3] = (y * z * ic + x * s) * -inv_dist_to_plane;
+ m.m[2][3] = 0.0f;
+ m.m[3][3] = 1.0f;
+ }
+ int flags = flagBits;
+ *this *= m;
+ if (flags != Identity)
+ flagBits = flags | Rotation;
+ else
+ flagBits = Rotation;
+ return *this;
+}
+
+#ifndef QT_NO_QUATERNION
/*!
Multiples this matrix by another that rotates coordinates according
@@ -1448,8 +1554,6 @@ QTransform QMatrix4x4::toTransform() const
m[3][0], m[3][1], m[3][3]);
}
-static const qreal inv_dist_to_plane = 1. / 1024.;
-
/*!
Returns the conventional Qt 2D transformation matrix that
corresponds to this matrix.
diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h
index 42d992e..ba74b89 100644
--- a/src/gui/math3d/qmatrix4x4.h
+++ b/src/gui/math3d/qmatrix4x4.h
@@ -207,6 +207,10 @@ private:
QMatrix4x4(int) { flagBits = General; }
QMatrix4x4 orthonormalInverse() const;
+
+ QMatrix4x4& projectedRotate(qreal angle, qreal x, qreal y, qreal z);
+
+ friend class QGraphicsRotation;
};
inline QMatrix4x4::QMatrix4x4
diff --git a/src/gui/text/qfontdatabase_x11.cpp b/src/gui/text/qfontdatabase_x11.cpp
index b582e4a..f184811 100644
--- a/src/gui/text/qfontdatabase_x11.cpp
+++ b/src/gui/text/qfontdatabase_x11.cpp
@@ -1456,7 +1456,7 @@ void qt_addPatternProps(FcPattern *pattern, int screen, int script, const QFontD
slant_value = FC_SLANT_OBLIQUE;
FcPatternAddInteger(pattern, FC_SLANT, slant_value);
- double size_value = qMax(1., request.pixelSize);
+ double size_value = qMax(qreal(1.), request.pixelSize);
FcPatternAddDouble(pattern, FC_PIXEL_SIZE, size_value);
int stretch = request.stretch;
diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
index bcc6bdb..a0810bc 100644
--- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
+++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
@@ -1263,6 +1263,7 @@ void QGL2PaintEngineEx::stroke(const QVectorPath &path, const QPen &pen)
QGLContext *ctx = d->ctx;
+ Q_UNUSED(ctx);
if (opaque) {
d->prepareForDraw(opaque);
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp
index 34114e4..d028522 100644
--- a/src/opengl/qglshaderprogram.cpp
+++ b/src/opengl/qglshaderprogram.cpp
@@ -42,6 +42,7 @@
#include "qglshaderprogram.h"
#include "qglextensions_p.h"
#include "qgl_p.h"
+#include <QtCore/private/qobject_p.h>
#include <QtCore/qdebug.h>
#include <QtCore/qfile.h>
#include <QtCore/qvarlengtharray.h>
@@ -200,8 +201,9 @@ QT_BEGIN_NAMESPACE
#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
#endif
-class QGLShaderPrivate
+class QGLShaderPrivate : public QObjectPrivate
{
+ Q_DECLARE_PUBLIC(QGLShader)
public:
QGLShaderPrivate(const QGLContext *context, QGLShader::ShaderType type)
: shaderGuard(context)
@@ -211,6 +213,7 @@ public:
, hasPartialSource(false)
{
}
+ ~QGLShaderPrivate();
QGLSharedResourceGuard shaderGuard;
QGLShader::ShaderType shaderType;
@@ -227,6 +230,14 @@ public:
#define ctx shaderGuard.context()
+QGLShaderPrivate::~QGLShaderPrivate()
+{
+ if (shaderGuard.id()) {
+ QGLShareContextScope scope(shaderGuard.context());
+ glDeleteShader(shaderGuard.id());
+ }
+}
+
bool QGLShaderPrivate::create()
{
const QGLContext *context = shaderGuard.context();
@@ -306,9 +317,9 @@ void QGLShaderPrivate::deleteShader()
\sa compile(), compileFile()
*/
QGLShader::QGLShader(QGLShader::ShaderType type, QObject *parent)
- : QObject(parent)
+ : QObject(*new QGLShaderPrivate(QGLContext::currentContext(), type), parent)
{
- d = new QGLShaderPrivate(QGLContext::currentContext(), type);
+ Q_D(QGLShader);
d->create();
}
@@ -323,13 +334,21 @@ QGLShader::QGLShader(QGLShader::ShaderType type, QObject *parent)
*/
QGLShader::QGLShader
(const QString& fileName, QGLShader::ShaderType type, QObject *parent)
- : QObject(parent)
+ : QObject(*new QGLShaderPrivate(QGLContext::currentContext(), type), parent)
{
- d = new QGLShaderPrivate(QGLContext::currentContext(), type);
+ Q_D(QGLShader);
if (d->create() && !compileFile(fileName))
d->deleteShader();
}
+static inline const QGLContext *contextOrCurrent(const QGLContext *context)
+{
+ if (context)
+ return context;
+ else
+ return QGLContext::currentContext();
+}
+
/*!
Constructs a new QGLShader object of the specified \a type
and attaches it to \a parent. If shader programs are not supported,
@@ -343,14 +362,12 @@ QGLShader::QGLShader
\sa compile(), compileFile()
*/
QGLShader::QGLShader(QGLShader::ShaderType type, const QGLContext *context, QObject *parent)
- : QObject(parent)
+ : QObject(*new QGLShaderPrivate(contextOrCurrent(context), type), parent)
{
- if (!context)
- context = QGLContext::currentContext();
- d = new QGLShaderPrivate(context, type);
+ Q_D(QGLShader);
#ifndef QT_NO_DEBUG
if (context && !QGLContext::areSharing(context, QGLContext::currentContext())) {
- qWarning("QGLShader::QGLShader: \'context\' must be the currect context or sharing with it.");
+ qWarning("QGLShader::QGLShader: \'context\' must be the current context or sharing with it.");
return;
}
#endif
@@ -368,14 +385,12 @@ QGLShader::QGLShader(QGLShader::ShaderType type, const QGLContext *context, QObj
*/
QGLShader::QGLShader
(const QString& fileName, QGLShader::ShaderType type, const QGLContext *context, QObject *parent)
- : QObject(parent)
+ : QObject(*new QGLShaderPrivate(contextOrCurrent(context), type), parent)
{
- if (!context)
- context = QGLContext::currentContext();
- d = new QGLShaderPrivate(context, type);
+ Q_D(QGLShader);
#ifndef QT_NO_DEBUG
if (context && !QGLContext::areSharing(context, QGLContext::currentContext())) {
- qWarning("QGLShader::QGLShader: \'context\' must be currect context or sharing with it.");
+ qWarning("QGLShader::QGLShader: \'context\' must be current context or sharing with it.");
return;
}
#endif
@@ -390,11 +405,6 @@ QGLShader::QGLShader
*/
QGLShader::~QGLShader()
{
- if (d->shaderGuard.id()) {
- QGLShareContextScope scope(d->shaderGuard.context());
- glDeleteShader(d->shaderGuard.id());
- }
- delete d;
}
/*!
@@ -402,6 +412,7 @@ QGLShader::~QGLShader()
*/
QGLShader::ShaderType QGLShader::shaderType() const
{
+ Q_D(const QGLShader);
return d->shaderType;
}
@@ -439,12 +450,14 @@ static const char redefineHighp[] =
*/
bool QGLShader::compile(const char *source)
{
+ Q_D(QGLShader);
if (d->isPartial) {
d->partialSource = QByteArray(source);
d->hasPartialSource = true;
return d->compile(this);
} else if (d->shaderGuard.id()) {
- QVarLengthArray<const char *> src;
+ QVarLengthArray<const char *, 4> src;
+ QVarLengthArray<GLint, 4> srclen;
int headerLen = 0;
while (source && source[headerLen] == '#') {
// Skip #version and #extension directives at the start of
@@ -459,21 +472,24 @@ bool QGLShader::compile(const char *source)
if (source[headerLen] == '\n')
++headerLen;
}
- QByteArray header;
if (headerLen > 0) {
- header = QByteArray(source, headerLen);
- src.append(header.constData());
+ src.append(source);
+ srclen.append(GLint(headerLen));
}
#ifdef QGL_DEFINE_QUALIFIERS
src.append(qualifierDefines);
+ srclen.append(GLint(sizeof(qualifierDefines) - 1));
#endif
#ifdef QGL_REDEFINE_HIGHP
if (d->shaderType == FragmentShader ||
- d->shaderType == PartialFragmentShader)
+ d->shaderType == PartialFragmentShader) {
src.append(redefineHighp);
+ srclen.append(GLint(sizeof(redefineHighp) - 1));
+ }
#endif
src.append(source + headerLen);
- glShaderSource(d->shaderGuard.id(), src.size(), src.data(), 0);
+ srclen.append(GLint(qstrlen(source + headerLen)));
+ glShaderSource(d->shaderGuard.id(), src.size(), src.data(), srclen.data());
return d->compile(this);
} else {
return false;
@@ -481,6 +497,61 @@ bool QGLShader::compile(const char *source)
}
/*!
+ \internal
+*/
+bool QGLShader::compile
+ (const QList<QGLShader *>& shaders, QGLShader::ShaderType type)
+{
+ Q_D(QGLShader);
+ QVarLengthArray<const char *, 16> src;
+ QVarLengthArray<GLint, 16> srclen;
+ if (!d->shaderGuard.id())
+ return false;
+ foreach (QGLShader *shader, shaders) {
+ if (shader->shaderType() != type)
+ continue;
+ const char *source = shader->d_func()->partialSource.constData();
+ int headerLen = 0;
+ if (src.isEmpty()) {
+ // First shader: handle the #version and #extension tags
+ // plus the precision qualifiers.
+ while (source && source[headerLen] == '#') {
+ // Skip #version and #extension directives at the start of
+ // the shader code. We need to insert the qualifierDefines
+ // and redefineHighp just after them.
+ if (qstrncmp(source + headerLen, "#version", 8) != 0 &&
+ qstrncmp(source + headerLen, "#extension", 10) != 0) {
+ break;
+ }
+ while (source[headerLen] != '\0' && source[headerLen] != '\n')
+ ++headerLen;
+ if (source[headerLen] == '\n')
+ ++headerLen;
+ }
+ if (headerLen > 0) {
+ src.append(source);
+ srclen.append(GLint(headerLen));
+ }
+#ifdef QGL_DEFINE_QUALIFIERS
+ src.append(qualifierDefines);
+ srclen.append(GLint(sizeof(qualifierDefines) - 1));
+#endif
+#ifdef QGL_REDEFINE_HIGHP
+ if (d->shaderType == FragmentShader ||
+ d->shaderType == PartialFragmentShader) {
+ src.append(redefineHighp);
+ srclen.append(GLint(sizeof(redefineHighp) - 1));
+ }
+#endif
+ }
+ src.append(source + headerLen);
+ srclen.append(GLint(qstrlen(source + headerLen)));
+ }
+ glShaderSource(d->shaderGuard.id(), src.size(), src.data(), srclen.data());
+ return d->compile(this);
+}
+
+/*!
\overload
Sets the \a source code for this shader and compiles it.
@@ -555,6 +626,7 @@ bool QGLShader::compileFile(const QString& fileName)
*/
bool QGLShader::setShaderBinary(GLenum format, const void *binary, int length)
{
+ Q_D(QGLShader);
#if !defined(QT_OPENGL_ES_2)
if (!glShaderBinary)
return false;
@@ -588,21 +660,22 @@ bool QGLShader::setShaderBinary(GLenum format, const void *binary, int length)
bool QGLShader::setShaderBinary
(QGLShader& otherShader, GLenum format, const void *binary, int length)
{
+ Q_D(QGLShader);
#if !defined(QT_OPENGL_ES_2)
if (!glShaderBinary)
return false;
#endif
if (d->isPartial || !d->shaderGuard.id())
return false;
- if (otherShader.d->isPartial || !otherShader.d->shaderGuard.id())
+ if (otherShader.d_func()->isPartial || !otherShader.d_func()->shaderGuard.id())
return false;
glGetError(); // Clear error state.
GLuint shaders[2];
shaders[0] = d->shaderGuard.id();
- shaders[1] = otherShader.d->shaderGuard.id();
+ shaders[1] = otherShader.d_func()->shaderGuard.id();
glShaderBinary(2, shaders, format, binary, length);
d->compiled = (glGetError() == GL_NO_ERROR);
- otherShader.d->compiled = d->compiled;
+ otherShader.d_func()->compiled = d->compiled;
return d->compiled;
}
@@ -634,6 +707,7 @@ QList<GLenum> QGLShader::shaderBinaryFormats()
*/
QByteArray QGLShader::sourceCode() const
{
+ Q_D(const QGLShader);
if (d->isPartial)
return d->partialSource;
GLuint shader = d->shaderGuard.id();
@@ -658,6 +732,7 @@ QByteArray QGLShader::sourceCode() const
*/
bool QGLShader::isCompiled() const
{
+ Q_D(const QGLShader);
return d->compiled;
}
@@ -668,6 +743,7 @@ bool QGLShader::isCompiled() const
*/
QString QGLShader::log() const
{
+ Q_D(const QGLShader);
return d->log;
}
@@ -682,14 +758,16 @@ QString QGLShader::log() const
*/
GLuint QGLShader::shaderId() const
{
+ Q_D(const QGLShader);
return d->shaderGuard.id();
}
#undef ctx
#define ctx programGuard.context()
-class QGLShaderProgramPrivate
+class QGLShaderProgramPrivate : public QObjectPrivate
{
+ Q_DECLARE_PUBLIC(QGLShaderProgram)
public:
QGLShaderProgramPrivate(const QGLContext *context)
: programGuard(context)
@@ -713,6 +791,8 @@ public:
QList<QGLShader *> anonShaders;
QGLShader *vertexShader;
QGLShader *fragmentShader;
+
+ bool hasShader(QGLShader::ShaderType type) const;
};
QGLShaderProgramPrivate::~QGLShaderProgramPrivate()
@@ -723,6 +803,15 @@ QGLShaderProgramPrivate::~QGLShaderProgramPrivate()
}
}
+bool QGLShaderProgramPrivate::hasShader(QGLShader::ShaderType type) const
+{
+ foreach (QGLShader *shader, shaders) {
+ if (shader->shaderType() == type)
+ return true;
+ }
+ return false;
+}
+
#undef ctx
#define ctx d->programGuard.context()
@@ -735,9 +824,8 @@ QGLShaderProgramPrivate::~QGLShaderProgramPrivate()
\sa addShader()
*/
QGLShaderProgram::QGLShaderProgram(QObject *parent)
- : QObject(parent)
+ : QObject(*new QGLShaderProgramPrivate(QGLContext::currentContext()), parent)
{
- d = new QGLShaderProgramPrivate(QGLContext::currentContext());
}
/*!
@@ -749,9 +837,8 @@ QGLShaderProgram::QGLShaderProgram(QObject *parent)
\sa addShader()
*/
QGLShaderProgram::QGLShaderProgram(const QGLContext *context, QObject *parent)
- : QObject(parent)
+ : QObject(*new QGLShaderProgramPrivate(context), parent)
{
- d = new QGLShaderProgramPrivate(context);
}
/*!
@@ -759,11 +846,11 @@ QGLShaderProgram::QGLShaderProgram(const QGLContext *context, QObject *parent)
*/
QGLShaderProgram::~QGLShaderProgram()
{
- delete d;
}
bool QGLShaderProgram::init()
{
+ Q_D(QGLShaderProgram);
if (d->programGuard.id() || d->inited)
return true;
d->inited = true;
@@ -801,22 +888,23 @@ bool QGLShaderProgram::init()
*/
bool QGLShaderProgram::addShader(QGLShader *shader)
{
+ Q_D(QGLShaderProgram);
if (!init())
return false;
if (d->shaders.contains(shader))
return true; // Already added to this shader program.
if (d->programGuard.id() && shader) {
- if (!QGLContext::areSharing(shader->d->shaderGuard.context(),
+ if (!QGLContext::areSharing(shader->d_func()->shaderGuard.context(),
d->programGuard.context())) {
qWarning("QGLShaderProgram::addShader: Program and shader are not associated with same context.");
return false;
}
- if (!shader->d->compiled)
+ if (!shader->d_func()->compiled)
return false;
- if (!shader->d->isPartial) {
- if (!shader->d->shaderGuard.id())
+ if (!shader->d_func()->isPartial) {
+ if (!shader->d_func()->shaderGuard.id())
return false;
- glAttachShader(d->programGuard.id(), shader->d->shaderGuard.id());
+ glAttachShader(d->programGuard.id(), shader->d_func()->shaderGuard.id());
} else {
d->hasPartialShaders = true;
}
@@ -843,6 +931,7 @@ bool QGLShaderProgram::addShader(QGLShader *shader)
*/
bool QGLShaderProgram::addShader(QGLShader::ShaderType type, const char *source)
{
+ Q_D(QGLShaderProgram);
if (!init())
return false;
QGLShader *shader = new QGLShader(type, this);
@@ -908,6 +997,7 @@ bool QGLShaderProgram::addShader(QGLShader::ShaderType type, const QString& sour
bool QGLShaderProgram::addShaderFromFile
(QGLShader::ShaderType type, const QString& fileName)
{
+ Q_D(QGLShaderProgram);
if (!init())
return false;
QGLShader *shader = new QGLShader(type, this);
@@ -927,9 +1017,10 @@ bool QGLShaderProgram::addShaderFromFile
*/
void QGLShaderProgram::removeShader(QGLShader *shader)
{
- if (d->programGuard.id() && shader && shader->d->shaderGuard.id()) {
+ Q_D(QGLShaderProgram);
+ if (d->programGuard.id() && shader && shader->d_func()->shaderGuard.id()) {
QGLShareContextScope scope(d->programGuard.context());
- glDetachShader(d->programGuard.id(), shader->d->shaderGuard.id());
+ glDetachShader(d->programGuard.id(), shader->d_func()->shaderGuard.id());
}
d->linked = false; // Program needs to be relinked.
if (shader) {
@@ -947,6 +1038,7 @@ void QGLShaderProgram::removeShader(QGLShader *shader)
*/
QList<QGLShader *> QGLShaderProgram::shaders() const
{
+ Q_D(const QGLShaderProgram);
return d->shaders;
}
@@ -960,10 +1052,11 @@ QList<QGLShader *> QGLShaderProgram::shaders() const
*/
void QGLShaderProgram::removeAllShaders()
{
+ Q_D(QGLShaderProgram);
d->removingShaders = true;
foreach (QGLShader *shader, d->shaders) {
- if (d->programGuard.id() && shader && shader->d->shaderGuard.id())
- glDetachShader(d->programGuard.id(), shader->d->shaderGuard.id());
+ if (d->programGuard.id() && shader && shader->d_func()->shaderGuard.id())
+ glDetachShader(d->programGuard.id(), shader->d_func()->shaderGuard.id());
}
foreach (QGLShader *shader, d->anonShaders) {
// Delete shader objects that were created anonymously.
@@ -1009,6 +1102,7 @@ void QGLShaderProgram::removeAllShaders()
QByteArray QGLShaderProgram::programBinary(int *format) const
{
#if defined(QT_OPENGL_ES_2)
+ Q_D(const QGLShaderProgram);
if (!isLinked())
return QByteArray();
@@ -1044,6 +1138,7 @@ bool QGLShaderProgram::setProgramBinary(int format, const QByteArray& binary)
{
#if defined(QT_OPENGL_ES_2)
// Load the binary and check that it was linked correctly.
+ Q_D(QGLShaderProgram);
GLuint program = d->programGuard.id();
if (!program)
return false;
@@ -1113,52 +1208,47 @@ QList<int> QGLShaderProgram::programBinaryFormats()
*/
bool QGLShaderProgram::link()
{
+ Q_D(QGLShaderProgram);
GLuint program = d->programGuard.id();
if (!program)
return false;
if (d->hasPartialShaders) {
// Compile the partial vertex and fragment shaders.
- QByteArray vertexSource;
- QByteArray fragmentSource;
- foreach (QGLShader *shader, d->shaders) {
- if (shader->shaderType() == QGLShader::PartialVertexShader)
- vertexSource += shader->sourceCode();
- else if (shader->shaderType() == QGLShader::PartialFragmentShader)
- fragmentSource += shader->sourceCode();
- }
- if (vertexSource.isEmpty()) {
- if (d->vertexShader) {
- glDetachShader(program, d->vertexShader->d->shaderGuard.id());
- delete d->vertexShader;
- d->vertexShader = 0;
- }
- } else {
+ if (d->hasShader(QGLShader::PartialVertexShader)) {
if (!d->vertexShader) {
d->vertexShader =
new QGLShader(QGLShader::VertexShader, this);
}
- if (!d->vertexShader->compile(vertexSource)) {
+ if (!d->vertexShader->compile
+ (d->shaders, QGLShader::PartialVertexShader)) {
d->log = d->vertexShader->log();
return false;
}
- glAttachShader(program, d->vertexShader->d->shaderGuard.id());
- }
- if (fragmentSource.isEmpty()) {
- if (d->fragmentShader) {
- glDetachShader(program, d->fragmentShader->d->shaderGuard.id());
- delete d->fragmentShader;
- d->fragmentShader = 0;
- }
+ glAttachShader(program, d->vertexShader->d_func()->shaderGuard.id());
} else {
+ if (d->vertexShader) {
+ glDetachShader(program, d->vertexShader->d_func()->shaderGuard.id());
+ delete d->vertexShader;
+ d->vertexShader = 0;
+ }
+ }
+ if (d->hasShader(QGLShader::PartialFragmentShader)) {
if (!d->fragmentShader) {
d->fragmentShader =
new QGLShader(QGLShader::FragmentShader, this);
}
- if (!d->fragmentShader->compile(fragmentSource)) {
+ if (!d->fragmentShader->compile
+ (d->shaders, QGLShader::PartialFragmentShader)) {
d->log = d->fragmentShader->log();
return false;
}
- glAttachShader(program, d->fragmentShader->d->shaderGuard.id());
+ glAttachShader(program, d->fragmentShader->d_func()->shaderGuard.id());
+ } else {
+ if (d->fragmentShader) {
+ glDetachShader(program, d->fragmentShader->d_func()->shaderGuard.id());
+ delete d->fragmentShader;
+ d->fragmentShader = 0;
+ }
}
}
glLinkProgram(program);
@@ -1190,6 +1280,7 @@ bool QGLShaderProgram::link()
*/
bool QGLShaderProgram::isLinked() const
{
+ Q_D(const QGLShaderProgram);
return d->linked;
}
@@ -1201,6 +1292,7 @@ bool QGLShaderProgram::isLinked() const
*/
QString QGLShaderProgram::log() const
{
+ Q_D(const QGLShaderProgram);
return d->log;
}
@@ -1214,6 +1306,7 @@ QString QGLShaderProgram::log() const
*/
bool QGLShaderProgram::enable()
{
+ Q_D(QGLShaderProgram);
GLuint program = d->programGuard.id();
if (!program)
return false;
@@ -1252,6 +1345,7 @@ void QGLShaderProgram::disable()
*/
GLuint QGLShaderProgram::programId() const
{
+ Q_D(const QGLShaderProgram);
return d->programGuard.id();
}
@@ -1265,6 +1359,7 @@ GLuint QGLShaderProgram::programId() const
*/
void QGLShaderProgram::bindAttributeLocation(const char *name, int location)
{
+ Q_D(QGLShaderProgram);
if (!d->linked) {
glBindAttribLocation(d->programGuard.id(), location, name);
} else {
@@ -1312,6 +1407,7 @@ void QGLShaderProgram::bindAttributeLocation(const QString& name, int location)
*/
int QGLShaderProgram::attributeLocation(const char *name) const
{
+ Q_D(const QGLShaderProgram);
if (d->linked) {
return glGetAttribLocation(d->programGuard.id(), name);
} else {
@@ -1356,6 +1452,8 @@ int QGLShaderProgram::attributeLocation(const QString& name) const
*/
void QGLShaderProgram::setAttributeValue(int location, GLfloat value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glVertexAttrib1fv(location, &value);
}
@@ -1380,6 +1478,8 @@ void QGLShaderProgram::setAttributeValue(const char *name, GLfloat value)
*/
void QGLShaderProgram::setAttributeValue(int location, GLfloat x, GLfloat y)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[2] = {x, y};
glVertexAttrib2fv(location, values);
@@ -1408,6 +1508,8 @@ void QGLShaderProgram::setAttributeValue(const char *name, GLfloat x, GLfloat y)
void QGLShaderProgram::setAttributeValue
(int location, GLfloat x, GLfloat y, GLfloat z)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[3] = {x, y, z};
glVertexAttrib3fv(location, values);
@@ -1437,6 +1539,8 @@ void QGLShaderProgram::setAttributeValue
void QGLShaderProgram::setAttributeValue
(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {x, y, z, w};
glVertexAttrib4fv(location, values);
@@ -1464,6 +1568,8 @@ void QGLShaderProgram::setAttributeValue
*/
void QGLShaderProgram::setAttributeValue(int location, const QVector2D& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glVertexAttrib2fv(location, reinterpret_cast<const GLfloat *>(&value));
}
@@ -1487,6 +1593,8 @@ void QGLShaderProgram::setAttributeValue(const char *name, const QVector2D& valu
*/
void QGLShaderProgram::setAttributeValue(int location, const QVector3D& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glVertexAttrib3fv(location, reinterpret_cast<const GLfloat *>(&value));
}
@@ -1510,6 +1618,8 @@ void QGLShaderProgram::setAttributeValue(const char *name, const QVector3D& valu
*/
void QGLShaderProgram::setAttributeValue(int location, const QVector4D& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glVertexAttrib4fv(location, reinterpret_cast<const GLfloat *>(&value));
}
@@ -1533,6 +1643,8 @@ void QGLShaderProgram::setAttributeValue(const char *name, const QVector4D& valu
*/
void QGLShaderProgram::setAttributeValue(int location, const QColor& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {value.redF(), value.greenF(), value.blueF(), value.alphaF()};
glVertexAttrib4fv(location, values);
@@ -1563,6 +1675,8 @@ void QGLShaderProgram::setAttributeValue(const char *name, const QColor& value)
void QGLShaderProgram::setAttributeValue
(int location, const GLfloat *values, int columns, int rows)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (rows < 1 || rows > 4) {
qWarning() << "QGLShaderProgram::setAttributeValue: rows" << rows << "not supported";
return;
@@ -1612,6 +1726,8 @@ void QGLShaderProgram::setAttributeValue
void QGLShaderProgram::setAttributeArray
(int location, const GLfloat *values, int size, int stride)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
glVertexAttribPointer(location, size, GL_FLOAT, GL_FALSE,
stride, values);
@@ -1630,6 +1746,8 @@ void QGLShaderProgram::setAttributeArray
void QGLShaderProgram::setAttributeArray
(int location, const QVector2D *values, int stride)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
glVertexAttribPointer(location, 2, GL_FLOAT, GL_FALSE,
stride, values);
@@ -1648,6 +1766,8 @@ void QGLShaderProgram::setAttributeArray
void QGLShaderProgram::setAttributeArray
(int location, const QVector3D *values, int stride)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE,
stride, values);
@@ -1666,6 +1786,8 @@ void QGLShaderProgram::setAttributeArray
void QGLShaderProgram::setAttributeArray
(int location, const QVector4D *values, int stride)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
glVertexAttribPointer(location, 4, GL_FLOAT, GL_FALSE,
stride, values);
@@ -1746,6 +1868,8 @@ void QGLShaderProgram::setAttributeArray
*/
void QGLShaderProgram::disableAttributeArray(int location)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glDisableVertexAttribArray(location);
}
@@ -1772,6 +1896,8 @@ void QGLShaderProgram::disableAttributeArray(const char *name)
*/
int QGLShaderProgram::uniformLocation(const char *name) const
{
+ Q_D(const QGLShaderProgram);
+ Q_UNUSED(d);
if (d->linked) {
return glGetUniformLocation(d->programGuard.id(), name);
} else {
@@ -1816,6 +1942,8 @@ int QGLShaderProgram::uniformLocation(const QString& name) const
*/
void QGLShaderProgram::setUniformValue(int location, GLfloat value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform1fv(location, 1, &value);
}
@@ -1840,6 +1968,8 @@ void QGLShaderProgram::setUniformValue(const char *name, GLfloat value)
*/
void QGLShaderProgram::setUniformValue(int location, GLint value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform1i(location, value);
}
@@ -1865,6 +1995,8 @@ void QGLShaderProgram::setUniformValue(const char *name, GLint value)
*/
void QGLShaderProgram::setUniformValue(int location, GLuint value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform1i(location, value);
}
@@ -1890,6 +2022,8 @@ void QGLShaderProgram::setUniformValue(const char *name, GLuint value)
*/
void QGLShaderProgram::setUniformValue(int location, GLfloat x, GLfloat y)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[2] = {x, y};
glUniform2fv(location, 1, values);
@@ -1918,6 +2052,8 @@ void QGLShaderProgram::setUniformValue(const char *name, GLfloat x, GLfloat y)
void QGLShaderProgram::setUniformValue
(int location, GLfloat x, GLfloat y, GLfloat z)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[3] = {x, y, z};
glUniform3fv(location, 1, values);
@@ -1947,6 +2083,8 @@ void QGLShaderProgram::setUniformValue
void QGLShaderProgram::setUniformValue
(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {x, y, z, w};
glUniform4fv(location, 1, values);
@@ -1974,6 +2112,8 @@ void QGLShaderProgram::setUniformValue
*/
void QGLShaderProgram::setUniformValue(int location, const QVector2D& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform2fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
}
@@ -1998,6 +2138,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QVector2D& value)
*/
void QGLShaderProgram::setUniformValue(int location, const QVector3D& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform3fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
}
@@ -2022,6 +2164,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QVector3D& value)
*/
void QGLShaderProgram::setUniformValue(int location, const QVector4D& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform4fv(location, 1, reinterpret_cast<const GLfloat *>(&value));
}
@@ -2047,6 +2191,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QVector4D& value)
*/
void QGLShaderProgram::setUniformValue(int location, const QColor& color)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {color.redF(), color.greenF(), color.blueF(), color.alphaF()};
glUniform4fv(location, 1, values);
@@ -2074,6 +2220,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QColor& color)
*/
void QGLShaderProgram::setUniformValue(int location, const QPoint& point)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {point.x(), point.y()};
glUniform2fv(location, 1, values);
@@ -2101,6 +2249,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QPoint& point)
*/
void QGLShaderProgram::setUniformValue(int location, const QPointF& point)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {point.x(), point.y()};
glUniform2fv(location, 1, values);
@@ -2128,6 +2278,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QPointF& point)
*/
void QGLShaderProgram::setUniformValue(int location, const QSize& size)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {size.width(), size.width()};
glUniform2fv(location, 1, values);
@@ -2155,6 +2307,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QSize& size)
*/
void QGLShaderProgram::setUniformValue(int location, const QSizeF& size)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat values[4] = {size.width(), size.height()};
glUniform2fv(location, 1, values);
@@ -2234,6 +2388,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QSizeF& size)
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix2x2& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformMatrix(glUniformMatrix2fv, location, value, 2, 2);
}
@@ -2258,6 +2414,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x2& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix2x3& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrix
(glUniformMatrix2x3fv, glUniform3fv, location, value, 2, 3);
}
@@ -2283,6 +2441,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x3& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix2x4& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrix
(glUniformMatrix2x4fv, glUniform4fv, location, value, 2, 4);
}
@@ -2308,6 +2468,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix2x4& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix3x2& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrix
(glUniformMatrix3x2fv, glUniform2fv, location, value, 3, 2);
}
@@ -2333,6 +2495,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x2& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix3x3& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformMatrix(glUniformMatrix3fv, location, value, 3, 3);
}
@@ -2357,6 +2521,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x3& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix3x4& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrix
(glUniformMatrix3x4fv, glUniform4fv, location, value, 3, 4);
}
@@ -2382,6 +2548,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix3x4& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix4x2& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrix
(glUniformMatrix4x2fv, glUniform2fv, location, value, 4, 2);
}
@@ -2407,6 +2575,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x2& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix4x3& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrix
(glUniformMatrix4x3fv, glUniform3fv, location, value, 4, 3);
}
@@ -2432,6 +2602,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x3& value
*/
void QGLShaderProgram::setUniformValue(int location, const QMatrix4x4& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformMatrix(glUniformMatrix4fv, location, value, 4, 4);
}
@@ -2459,6 +2631,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const QMatrix4x4& value
*/
void QGLShaderProgram::setUniformValue(int location, const GLfloat value[4][4])
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniformMatrix4fv(location, 1, GL_FALSE, value[0]);
}
@@ -2486,6 +2660,8 @@ void QGLShaderProgram::setUniformValue(const char *name, const GLfloat value[4][
*/
void QGLShaderProgram::setUniformValue(int location, const QTransform& value)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
GLfloat mat[3][3] = {
{value.m11(), value.m12(), value.m13()},
@@ -2519,6 +2695,8 @@ void QGLShaderProgram::setUniformValue
*/
void QGLShaderProgram::setUniformValueArray(int location, const GLint *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform1iv(location, count, values);
}
@@ -2546,6 +2724,8 @@ void QGLShaderProgram::setUniformValueArray
*/
void QGLShaderProgram::setUniformValueArray(int location, const GLuint *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform1iv(location, count, reinterpret_cast<const GLint *>(values));
}
@@ -2574,6 +2754,8 @@ void QGLShaderProgram::setUniformValueArray
*/
void QGLShaderProgram::setUniformValueArray(int location, const GLfloat *values, int count, int size)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1) {
if (size == 1)
glUniform1fv(location, count, values);
@@ -2611,6 +2793,8 @@ void QGLShaderProgram::setUniformValueArray
*/
void QGLShaderProgram::setUniformValueArray(int location, const QVector2D *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform2fv(location, count, reinterpret_cast<const GLfloat *>(values));
}
@@ -2636,6 +2820,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QVector2D *v
*/
void QGLShaderProgram::setUniformValueArray(int location, const QVector3D *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform3fv(location, count, reinterpret_cast<const GLfloat *>(values));
}
@@ -2661,6 +2847,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QVector3D *v
*/
void QGLShaderProgram::setUniformValueArray(int location, const QVector4D *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
if (location != -1)
glUniform4fv(location, count, reinterpret_cast<const GLfloat *>(values));
}
@@ -2747,6 +2935,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QVector4D *v
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x2 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformMatrixArray
(glUniformMatrix2fv, location, values, count, QMatrix2x2, 2, 2);
}
@@ -2772,6 +2962,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x2 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x3 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrixArray
(glUniformMatrix2x3fv, glUniform3fv, location, values, count,
QMatrix2x3, 2, 3);
@@ -2798,6 +2990,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x3 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix2x4 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrixArray
(glUniformMatrix2x4fv, glUniform4fv, location, values, count,
QMatrix2x4, 2, 4);
@@ -2824,6 +3018,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix2x4 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x2 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrixArray
(glUniformMatrix3x2fv, glUniform2fv, location, values, count,
QMatrix3x2, 3, 2);
@@ -2850,6 +3046,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x2 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x3 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformMatrixArray
(glUniformMatrix3fv, location, values, count, QMatrix3x3, 3, 3);
}
@@ -2875,6 +3073,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x3 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix3x4 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrixArray
(glUniformMatrix3x4fv, glUniform4fv, location, values, count,
QMatrix3x4, 3, 4);
@@ -2901,6 +3101,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix3x4 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x2 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrixArray
(glUniformMatrix4x2fv, glUniform2fv, location, values, count,
QMatrix4x2, 4, 2);
@@ -2927,6 +3129,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x2 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x3 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformGenericMatrixArray
(glUniformMatrix4x3fv, glUniform3fv, location, values, count,
QMatrix4x3, 4, 3);
@@ -2953,6 +3157,8 @@ void QGLShaderProgram::setUniformValueArray(const char *name, const QMatrix4x3 *
*/
void QGLShaderProgram::setUniformValueArray(int location, const QMatrix4x4 *values, int count)
{
+ Q_D(QGLShaderProgram);
+ Q_UNUSED(d);
setUniformMatrixArray
(glUniformMatrix4fv, location, values, count, QMatrix4x4, 4, 4);
}
@@ -2998,6 +3204,7 @@ bool QGLShaderProgram::hasShaderPrograms(const QGLContext *context)
*/
void QGLShaderProgram::shaderDestroyed()
{
+ Q_D(QGLShaderProgram);
QGLShader *shader = qobject_cast<QGLShader *>(sender());
if (shader && !d->removingShaders)
removeShader(shader);
diff --git a/src/opengl/qglshaderprogram.h b/src/opengl/qglshaderprogram.h
index f2d70fa..d8b9a0c 100644
--- a/src/opengl/qglshaderprogram.h
+++ b/src/opengl/qglshaderprogram.h
@@ -101,11 +101,12 @@ public:
GLuint shaderId() const;
private:
- QGLShaderPrivate *d;
-
friend class QGLShaderProgram;
Q_DISABLE_COPY(QGLShader)
+ Q_DECLARE_PRIVATE(QGLShader)
+
+ bool compile(const QList<QGLShader *>& shaders, QGLShader::ShaderType type);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QGLShader::ShaderType)
@@ -286,9 +287,8 @@ private Q_SLOTS:
void shaderDestroyed();
private:
- QGLShaderProgramPrivate *d;
-
Q_DISABLE_COPY(QGLShaderProgram)
+ Q_DECLARE_PRIVATE(QGLShaderProgram)
bool init();
};
diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
index 4547416..42e1c1e 100644
--- a/src/opengl/qwindowsurface_gl.cpp
+++ b/src/opengl/qwindowsurface_gl.cpp
@@ -364,7 +364,7 @@ void QGLWindowSurface::hijackWindow(QWidget *widget)
if (ctxpriv->eglSurface == EGL_NO_SURFACE) {
qWarning() << "hijackWindow() could not create EGL surface";
}
- qDebug("QGLWindowSurface - using EGLConfig %d", ctxpriv->eglContext->config());
+ qDebug("QGLWindowSurface - using EGLConfig %d", reinterpret_cast<int>(ctxpriv->eglContext->config()));
#endif
widgetPrivate->extraData()->glContext = ctx;
diff --git a/src/opengl/qwindowsurface_x11gl.cpp b/src/opengl/qwindowsurface_x11gl.cpp
index 8ef239d..db81be2 100644
--- a/src/opengl/qwindowsurface_x11gl.cpp
+++ b/src/opengl/qwindowsurface_x11gl.cpp
@@ -124,6 +124,9 @@ void QX11GLWindowSurface::setGeometry(const QRect &rect)
bool QX11GLWindowSurface::scroll(const QRegion &area, int dx, int dy)
{
+ Q_UNUSED(area);
+ Q_UNUSED(dx);
+ Q_UNUSED(dy);
return false;
}
diff --git a/tests/auto/declarative/qmldom/tst_qmldom.cpp b/tests/auto/declarative/qmldom/tst_qmldom.cpp
index 77c13c3..8079a23 100644
--- a/tests/auto/declarative/qmldom/tst_qmldom.cpp
+++ b/tests/auto/declarative/qmldom/tst_qmldom.cpp
@@ -20,6 +20,7 @@ private slots:
void loadImports();
void testValueSource();
+ void testValueInterceptor();
private:
QmlEngine engine;
@@ -30,7 +31,6 @@ void tst_qmldom::loadSimple()
{
QByteArray qml = "import Qt 4.6\n"
"Item {}";
- //QByteArray qml = "<Item/>";
QmlDomDocument document;
QVERIFY(document.load(&engine, qml));
@@ -49,7 +49,6 @@ void tst_qmldom::loadProperties()
{
QByteArray qml = "import Qt 4.6\n"
"Item { id : item; x : 300; visible : true }";
- //QByteArray qml = "<Item id='item' x='300' visible='true'/>";
QmlDomDocument document;
QVERIFY(document.load(&engine, qml));
@@ -74,7 +73,6 @@ void tst_qmldom::loadChildObject()
{
QByteArray qml = "import Qt 4.6\n"
"Item { Item {} }";
- //QByteArray qml = "<Item> <Item/> </Item>";
QmlDomDocument document;
QVERIFY(document.load(&engine, qml));
@@ -148,6 +146,32 @@ void tst_qmldom::testValueSource()
QVERIFY(sourceValue.toBinding().binding() == "Math.min(Math.max(-130, value*2.2 - 130), 133)");
}
+void tst_qmldom::testValueInterceptor()
+{
+ QByteArray qml = "import Qt 4.6\n"
+ "Rectangle { height: Behavior { NumberAnimation { duration: 100 } } }";
+
+ QmlEngine freshEngine;
+ QmlDomDocument document;
+ QVERIFY(document.load(&freshEngine, qml));
+
+ QmlDomObject rootItem = document.rootObject();
+ QVERIFY(rootItem.isValid());
+ QmlDomProperty heightProperty = rootItem.properties().at(0);
+ QVERIFY(heightProperty.propertyName() == "height");
+ QVERIFY(heightProperty.value().isValueInterceptor());
+
+ const QmlDomValueValueInterceptor valueInterceptor = heightProperty.value().toValueInterceptor();
+ QmlDomObject valueInterceptorObject = valueInterceptor.object();
+ QVERIFY(valueInterceptorObject.isValid());
+
+ QVERIFY(valueInterceptorObject.objectType() == "Qt/Behavior");
+
+ const QmlDomValue animationValue = valueInterceptorObject.property("animation").value();
+ QVERIFY(!animationValue.isInvalid());
+ QVERIFY(animationValue.isObject());
+}
+
void tst_qmldom::loadImports()
{
QByteArray qml = "import Qt 4.6\n"
diff --git a/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp b/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp
index eb5c099..d8ab06e 100644
--- a/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp
+++ b/tests/auto/qgraphicstransform/tst_qgraphicstransform.cpp
@@ -59,6 +59,8 @@ private slots:
void rotation();
void rotation3d_data();
void rotation3d();
+ void rotation3dArbitraryAxis_data();
+ void rotation3dArbitraryAxis();
};
@@ -88,7 +90,7 @@ static QTransform transform2D(const QGraphicsTransform& t)
{
QMatrix4x4 m;
t.applyTo(&m);
- return m.toTransform(0);
+ return m.toTransform();
}
void tst_QGraphicsTransform::scale()
@@ -255,6 +257,19 @@ void tst_QGraphicsTransform::rotation3d()
QVERIFY(fuzzyCompare(transform2D(rotation), expected));
+ // Check that "rotation" produces the 4x4 form of the 3x3 matrix.
+ // i.e. third row and column are 0 0 1 0.
+ t.setIdentity();
+ rotation.applyTo(&t);
+ QMatrix4x4 r(expected);
+ if (sizeof(qreal) == sizeof(float) && angle == 268) {
+ // This test fails, on only this angle, when qreal == float
+ // because the deg2rad value in QTransform is not accurate
+ // enough to match what QMatrix4x4 is doing.
+ } else {
+ QVERIFY(qFuzzyCompare(t, r));
+ }
+
//now let's check that a null vector will not change the transform
rotation.setAxis(QVector3D(0, 0, 0));
rotation.setOrigin(QVector3D(10, 10, 0));
@@ -276,6 +291,58 @@ void tst_QGraphicsTransform::rotation3d()
QVERIFY(transform2D(rotation).isIdentity());
}
+void tst_QGraphicsTransform::rotation3dArbitraryAxis_data()
+{
+ QTest::addColumn<QVector3D>("axis");
+ QTest::addColumn<qreal>("angle");
+
+ QVector3D axis1 = QVector3D(1.0f, 1.0f, 1.0f);
+ QVector3D axis2 = QVector3D(2.0f, -3.0f, 0.5f);
+ QVector3D axis3 = QVector3D(-2.0f, 0.0f, -0.5f);
+ QVector3D axis4 = QVector3D(0.0001f, 0.0001f, 0.0001f);
+ QVector3D axis5 = QVector3D(0.01f, 0.01f, 0.01f);
+
+ for (int angle = 0; angle <= 360; angle++) {
+ QTest::newRow("test rotation on (1, 1, 1)") << axis1 << qreal(angle);
+ QTest::newRow("test rotation on (2, -3, .5)") << axis2 << qreal(angle);
+ QTest::newRow("test rotation on (-2, 0, -.5)") << axis3 << qreal(angle);
+ QTest::newRow("test rotation on (.0001, .0001, .0001)") << axis4 << qreal(angle);
+ QTest::newRow("test rotation on (.01, .01, .01)") << axis5 << qreal(angle);
+ }
+}
+
+void tst_QGraphicsTransform::rotation3dArbitraryAxis()
+{
+ QFETCH(QVector3D, axis);
+ QFETCH(qreal, angle);
+
+ QGraphicsRotation rotation;
+ rotation.setAxis(axis);
+
+ QMatrix4x4 t;
+ rotation.applyTo(&t);
+
+ QVERIFY(t.isIdentity());
+ QVERIFY(transform2D(rotation).isIdentity());
+
+ rotation.setAngle(angle);
+
+ // Compute the expected answer using QMatrix4x4 and a projection.
+ // These two steps are performed in one hit by QGraphicsRotation.
+ QMatrix4x4 exp;
+ exp.rotate(angle, axis);
+ QTransform expected = exp.toTransform(1024.0f);
+
+ QVERIFY(fuzzyCompare(transform2D(rotation), expected));
+
+ // Check that "rotation" produces the 4x4 form of the 3x3 matrix.
+ // i.e. third row and column are 0 0 1 0.
+ t.setIdentity();
+ rotation.applyTo(&t);
+ QMatrix4x4 r(expected);
+ QVERIFY(qFuzzyCompare(t, r));
+}
+
QTEST_MAIN(tst_QGraphicsTransform)
#include "tst_qgraphicstransform.moc"
diff --git a/tools/qmldebugger/canvasframerate.cpp b/tools/qmldebugger/canvasframerate.cpp
index 0d23050..7c5d089 100644
--- a/tools/qmldebugger/canvasframerate.cpp
+++ b/tools/qmldebugger/canvasframerate.cpp
@@ -32,7 +32,6 @@ public slots:
protected:
virtual void paintEvent(QPaintEvent *);
- virtual QSize sizeHint() const;
private slots:
void scrollbarChanged(int);
@@ -57,6 +56,8 @@ private:
QLineGraph::QLineGraph(QWidget *parent)
: QWidget(parent), sb(Qt::Horizontal, this), position(-1), samplesPerWidth(99), resolutionForHeight(50), ignoreScroll(false)
{
+ setMinimumHeight(180);
+
sb.setMaximum(0);
sb.setMinimum(0);
sb.setSingleStep(1);
@@ -68,11 +69,6 @@ QLineGraph::QLineGraph(QWidget *parent)
QObject::connect(&sb, SIGNAL(valueChanged(int)), this, SLOT(scrollbarChanged(int)));
}
-QSize QLineGraph::sizeHint() const
-{
- return QSize(800, 600);
-}
-
void QLineGraph::scrollbarChanged(int v)
{
if(ignoreScroll)
@@ -291,6 +287,16 @@ CanvasFrameRate::CanvasFrameRate(QmlDebugConnection *client, QWidget *parent)
newTab();
}
+void CanvasFrameRate::setSizeHint(const QSize &size)
+{
+ m_sizeHint = size;
+}
+
+QSize CanvasFrameRate::sizeHint() const
+{
+ return m_sizeHint;
+}
+
void CanvasFrameRate::newTab()
{
if (m_tabs->count()) {
diff --git a/tools/qmldebugger/canvasframerate.h b/tools/qmldebugger/canvasframerate.h
index cef267d..aa275aa 100644
--- a/tools/qmldebugger/canvasframerate.h
+++ b/tools/qmldebugger/canvasframerate.h
@@ -14,6 +14,9 @@ class CanvasFrameRate : public QWidget
public:
CanvasFrameRate(QmlDebugConnection *, QWidget *parent = 0);
+ void setSizeHint(const QSize &);
+ virtual QSize sizeHint() const;
+
private slots:
void newTab();
void stateChanged(int);
@@ -22,6 +25,7 @@ private:
QTabWidget *m_tabs;
QSpinBox *m_spin;
QObject *m_plugin;
+ QSize m_sizeHint;
};
QT_END_NAMESPACE
diff --git a/tools/qmldebugger/engine.cpp b/tools/qmldebugger/engine.cpp
index fac10f3..a1fd009 100644
--- a/tools/qmldebugger/engine.cpp
+++ b/tools/qmldebugger/engine.cpp
@@ -12,6 +12,7 @@
#include "engine.h"
#include "objectpropertiesview.h"
+#include "expressionquerywidget.h"
#include "objecttree.h"
#include "watchtable.h"
@@ -37,7 +38,7 @@ private:
};
EnginePane::EnginePane(QmlDebugConnection *conn, QWidget *parent)
-: QWidget(parent), m_client(new QmlEngineDebug(conn, this)), m_engines(0), m_context(0), m_watchTableModel(0)
+: QWidget(parent), m_client(new QmlEngineDebug(conn, this)), m_engines(0), m_context(0), m_watchTableModel(0), m_exprQueryWidget(0)
{
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
@@ -71,7 +72,7 @@ EnginePane::EnginePane(QmlDebugConnection *conn, QWidget *parent)
WatchTableHeaderView *header = new WatchTableHeaderView(m_watchTableModel);
m_watchTableView->setHorizontalHeader(header);
- connect(m_objTree, SIGNAL(objectSelected(QmlDebugObjectReference)),
+ connect(m_objTree, SIGNAL(currentObjectChanged(QmlDebugObjectReference)),
m_propertiesView, SLOT(reload(QmlDebugObjectReference)));
connect(m_objTree, SIGNAL(expressionWatchRequested(QmlDebugObjectReference,QString)),
m_watchTableModel, SLOT(expressionWatchRequested(QmlDebugObjectReference,QString)));
@@ -83,10 +84,20 @@ EnginePane::EnginePane(QmlDebugConnection *conn, QWidget *parent)
m_propertiesView, SLOT(watchCreated(QmlDebugWatch*)));
connect(m_watchTableView, SIGNAL(objectActivated(int)),
- m_objTree, SLOT(selectObject(int)));
-
+ m_objTree, SLOT(setCurrentObject(int)));
+
+ m_exprQueryWidget = new ExpressionQueryWidget(m_client);
+ connect(m_objTree, SIGNAL(currentObjectChanged(QmlDebugObjectReference)),
+ m_exprQueryWidget, SLOT(setCurrentObject(QmlDebugObjectReference)));
+
+ QSplitter *propertiesTab = new QSplitter(Qt::Vertical);
+ propertiesTab->addWidget(m_propertiesView);
+ propertiesTab->addWidget(m_exprQueryWidget);
+ propertiesTab->setStretchFactor(0, 2);
+ propertiesTab->setStretchFactor(1, 1);
+
m_tabs = new QTabWidget(this);
- m_tabs->addTab(m_propertiesView, tr("Properties"));
+ m_tabs->addTab(propertiesTab, tr("Properties"));
m_tabs->addTab(m_watchTableView, tr("Watched"));
splitter->addWidget(m_objTree);
diff --git a/tools/qmldebugger/engine.h b/tools/qmldebugger/engine.h
index 8e8c0f2..a3ebe46 100644
--- a/tools/qmldebugger/engine.h
+++ b/tools/qmldebugger/engine.h
@@ -17,6 +17,7 @@ class QmlDebugWatch;
class ObjectTree;
class WatchTableModel;
class WatchTableView;
+class ExpressionQueryWidget;
class QTabWidget;
@@ -45,12 +46,12 @@ private:
ObjectTree *m_objTree;
QTabWidget *m_tabs;
WatchTableView *m_watchTableView;
+ WatchTableModel *m_watchTableModel;
+ ExpressionQueryWidget *m_exprQueryWidget;
QmlView *m_engineView;
QList<QObject *> m_engineItems;
- WatchTableModel *m_watchTableModel;
-
ObjectPropertiesView *m_propertiesView;
};
diff --git a/tools/qmldebugger/expressionquerywidget.cpp b/tools/qmldebugger/expressionquerywidget.cpp
index b29b465..53ede3a 100644
--- a/tools/qmldebugger/expressionquerywidget.cpp
+++ b/tools/qmldebugger/expressionquerywidget.cpp
@@ -1,3 +1,5 @@
+#include <QtCore/qdebug.h>
+
#include <QtGui/qlabel.h>
#include <QtGui/qtextedit.h>
#include <QtGui/qlineedit.h>
@@ -14,25 +16,21 @@ ExpressionQueryWidget::ExpressionQueryWidget(QmlEngineDebug *client, QWidget *pa
m_style(Compact),
m_client(client),
m_query(0),
- m_groupBox(0),
m_textEdit(new QTextEdit),
m_lineEdit(0),
m_button(0)
{
m_prompt = QLatin1String(">> ");
- m_groupBox = new QGroupBox;
- QVBoxLayout *vbox = new QVBoxLayout(m_groupBox);
- vbox->addWidget(m_textEdit);
-
QVBoxLayout *layout = new QVBoxLayout(this);
- layout->addWidget(m_groupBox);
+ layout->setMargin(0);
+ layout->addWidget(m_textEdit);
updateTitle();
if (m_style == Compact) {
QHBoxLayout *hbox = new QHBoxLayout;
- m_button = new QPushButton(tr("Execute"));
+ m_button = new QPushButton(tr("Query"));
m_button->setEnabled(false);
connect(m_button, SIGNAL(clicked()), SLOT(executeExpression()));
m_lineEdit = new QLineEdit;
@@ -41,7 +39,7 @@ ExpressionQueryWidget::ExpressionQueryWidget(QmlEngineDebug *client, QWidget *pa
hbox->addWidget(new QLabel(tr("Expression:")));
hbox->addWidget(m_lineEdit);
hbox->addWidget(m_button);
- vbox->addLayout(hbox);
+ layout->addLayout(hbox);
m_textEdit->setReadOnly(true);
m_lineEdit->installEventFilter(this);
@@ -50,17 +48,21 @@ ExpressionQueryWidget::ExpressionQueryWidget(QmlEngineDebug *client, QWidget *pa
}
}
+void ExpressionQueryWidget::setEngineDebug(QmlEngineDebug *client)
+{
+ m_client = client;
+}
+
void ExpressionQueryWidget::updateTitle()
{
if (m_currObject.debugId() < 0) {
- m_groupBox->setTitle(tr("Expression queries"));
+ m_title = tr("Expression queries");
} else {
QString desc = QLatin1String("<")
+ m_currObject.className() + QLatin1String(": ")
+ (m_currObject.name().isEmpty() ? QLatin1String("<unnamed>") : m_currObject.name())
+ QLatin1String(">");
- m_groupBox->setTitle(tr("Expression queries (using context for %1)"
- , "Selected object").arg(desc));
+ m_title = tr("Expression queries (using context for %1)" , "Selected object").arg(desc);
}
}
@@ -103,6 +105,9 @@ void ExpressionQueryWidget::showCurrentContext()
void ExpressionQueryWidget::executeExpression()
{
+ if (!m_client)
+ return;
+
if (m_style == Compact)
m_expr = m_lineEdit->text().trimmed();
else
diff --git a/tools/qmldebugger/expressionquerywidget.h b/tools/qmldebugger/expressionquerywidget.h
index 8db8f9f..3d9b580 100644
--- a/tools/qmldebugger/expressionquerywidget.h
+++ b/tools/qmldebugger/expressionquerywidget.h
@@ -21,7 +21,9 @@ public:
Shell
};
- ExpressionQueryWidget(QmlEngineDebug *client, QWidget *parent = 0);
+ ExpressionQueryWidget(QmlEngineDebug *client = 0, QWidget *parent = 0);
+
+ void setEngineDebug(QmlEngineDebug *client);
protected:
bool eventFilter(QObject *obj, QEvent *event);
@@ -44,7 +46,6 @@ private:
QmlEngineDebug *m_client;
QmlDebugExpressionQuery *m_query;
- QGroupBox *m_groupBox;
QTextEdit *m_textEdit;
QLineEdit *m_lineEdit;
QPushButton *m_button;
@@ -52,6 +53,8 @@ private:
QString m_expr;
QString m_lastExpr;
+ QString m_title;
+
QmlDebugObjectReference m_currObject;
QmlDebugObjectReference m_objectAtLastFocus;
};
diff --git a/tools/qmldebugger/objectpropertiesview.cpp b/tools/qmldebugger/objectpropertiesview.cpp
index 61afe3f..274552a 100644
--- a/tools/qmldebugger/objectpropertiesview.cpp
+++ b/tools/qmldebugger/objectpropertiesview.cpp
@@ -53,8 +53,15 @@ ObjectPropertiesView::ObjectPropertiesView(QmlEngineDebug *client, QWidget *pare
layout->addWidget(m_tree);
}
+void ObjectPropertiesView::setEngineDebug(QmlEngineDebug *client)
+{
+ m_client = client;
+}
+
void ObjectPropertiesView::reload(const QmlDebugObjectReference &obj)
{
+ if (!m_client)
+ return;
if (m_query)
delete m_query;
@@ -68,7 +75,7 @@ void ObjectPropertiesView::reload(const QmlDebugObjectReference &obj)
void ObjectPropertiesView::queryFinished()
{
- if (!m_query)
+ if (!m_client || !m_query)
return;
QmlDebugObjectReference obj = m_query->object();
diff --git a/tools/qmldebugger/objectpropertiesview.h b/tools/qmldebugger/objectpropertiesview.h
index 0f72ff4..d555940 100644
--- a/tools/qmldebugger/objectpropertiesview.h
+++ b/tools/qmldebugger/objectpropertiesview.h
@@ -9,13 +9,16 @@ QT_BEGIN_NAMESPACE
class QTreeWidget;
class QTreeWidgetItem;
+class QmlDebugConnection;
class ObjectPropertiesView : public QWidget
{
Q_OBJECT
public:
- ObjectPropertiesView(QmlEngineDebug *client, QWidget *parent = 0);
+ ObjectPropertiesView(QmlEngineDebug *client = 0, QWidget *parent = 0);
+ void setEngineDebug(QmlEngineDebug *client);
+
signals:
void activated(const QmlDebugObjectReference &, const QmlDebugPropertyReference &);
diff --git a/tools/qmldebugger/objecttree.cpp b/tools/qmldebugger/objecttree.cpp
index 0b92ceb..981a80b 100644
--- a/tools/qmldebugger/objecttree.cpp
+++ b/tools/qmldebugger/objecttree.cpp
@@ -18,13 +18,22 @@ ObjectTree::ObjectTree(QmlEngineDebug *client, QWidget *parent)
m_query(0)
{
setHeaderHidden(true);
+ setMinimumWidth(250);
connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
this, SLOT(currentItemChanged(QTreeWidgetItem *)));
}
+void ObjectTree::setEngineDebug(QmlEngineDebug *client)
+{
+ m_client = client;
+}
+
void ObjectTree::reload(int objectDebugId)
{
+ if (!m_client)
+ return;
+
if (m_query) {
delete m_query;
m_query = 0;
diff --git a/tools/qmldebugger/objecttree.h b/tools/qmldebugger/objecttree.h
index 3c0a5c6..95820f3 100644
--- a/tools/qmldebugger/objecttree.h
+++ b/tools/qmldebugger/objecttree.h
@@ -11,14 +11,17 @@ class QmlEngineDebug;
class QmlDebugObjectReference;
class QmlDebugObjectQuery;
class QmlDebugContextReference;
+class QmlDebugConnection;
class ObjectTree : public QTreeWidget
{
Q_OBJECT
public:
- ObjectTree(QmlEngineDebug *client, QWidget *parent = 0);
+ ObjectTree(QmlEngineDebug *client = 0, QWidget *parent = 0);
+ void setEngineDebug(QmlEngineDebug *client);
+
signals:
void currentObjectChanged(const QmlDebugObjectReference &);
void expressionWatchRequested(const QmlDebugObjectReference &, const QString &);
diff --git a/tools/qmldebugger/qmldebugger.cpp b/tools/qmldebugger/qmldebugger.cpp
index e0a76b6..2828026 100644
--- a/tools/qmldebugger/qmldebugger.cpp
+++ b/tools/qmldebugger/qmldebugger.cpp
@@ -46,6 +46,7 @@ QmlDebugger::QmlDebugger(QWidget *parent)
layout->addWidget(m_tabs);
CanvasFrameRate *cfr = new CanvasFrameRate(&client, this);
+ cfr->setSizeHint(QSize(800, 600));
m_tabs->addTab(cfr, tr("Frame Rate"));
m_enginePane = new EnginePane(&client, this);
diff --git a/tools/qmldebugger/watchtable.cpp b/tools/qmldebugger/watchtable.cpp
index 512bfb2..774727b 100644
--- a/tools/qmldebugger/watchtable.cpp
+++ b/tools/qmldebugger/watchtable.cpp
@@ -23,6 +23,11 @@ WatchTableModel::~WatchTableModel()
delete m_columns[i].watch;
}
+void WatchTableModel::setEngineDebug(QmlEngineDebug *client)
+{
+ m_client = client;
+}
+
void WatchTableModel::addWatch(QmlDebugWatch *watch, const QString &title)
{
QString property;
@@ -193,7 +198,7 @@ void WatchTableModel::addValue(int column, const QVariant &value)
void WatchTableModel::togglePropertyWatch(const QmlDebugObjectReference &object, const QmlDebugPropertyReference &property)
{
- if (!property.hasNotifySignal())
+ if (!m_client || !property.hasNotifySignal())
return;
QmlDebugWatch *watch = findWatch(object.debugId(), property.name());
@@ -228,6 +233,9 @@ void WatchTableModel::watchedValueChanged(const QByteArray &propertyName, const
void WatchTableModel::expressionWatchRequested(const QmlDebugObjectReference &obj, const QString &expr)
{
+ if (!m_client)
+ return;
+
QmlDebugWatch *watch = m_client->addWatch(obj, expr, this);
if (watch->state() == QmlDebugWatch::Dead) {
@@ -241,6 +249,9 @@ void WatchTableModel::expressionWatchRequested(const QmlDebugObjectReference &ob
void WatchTableModel::stopWatching(int column)
{
+ if (!m_client)
+ return;
+
QmlDebugWatch *watch = findWatch(column);
if (watch) {
m_client->removeWatch(watch);
diff --git a/tools/qmldebugger/watchtable.h b/tools/qmldebugger/watchtable.h
index abada2b..772142c 100644
--- a/tools/qmldebugger/watchtable.h
+++ b/tools/qmldebugger/watchtable.h
@@ -13,6 +13,7 @@ QT_BEGIN_NAMESPACE
class QmlDebugWatch;
class QmlEngineDebug;
+class QmlDebugConnection;
class QmlDebugPropertyReference;
class QmlDebugObjectReference;
@@ -20,9 +21,11 @@ class WatchTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
- WatchTableModel(QmlEngineDebug *client, QObject *parent = 0);
+ WatchTableModel(QmlEngineDebug *client = 0, QObject *parent = 0);
~WatchTableModel();
+ void setEngineDebug(QmlEngineDebug *client);
+
QmlDebugWatch *findWatch(int column) const;
int columnForWatch(QmlDebugWatch *watch) const;
diff --git a/tools/qmlviewer/qmlviewer.cpp b/tools/qmlviewer/qmlviewer.cpp
index 60fa13a..b115abb 100644
--- a/tools/qmlviewer/qmlviewer.cpp
+++ b/tools/qmlviewer/qmlviewer.cpp
@@ -310,6 +310,7 @@ QmlViewer::QmlViewer(QWidget *parent, Qt::WindowFlags flags)
canvas->setFocus();
QObject::connect(canvas, SIGNAL(sceneResized(QSize)), this, SLOT(sceneResized(QSize)));
+ QObject::connect(canvas, SIGNAL(initialSize(QSize)), this, SLOT(adjustSizeSlot()));
QObject::connect(canvas, SIGNAL(errors(QList<QmlError>)), this, SLOT(executeErrors()));
if (!(flags & Qt::FramelessWindowHint))
@@ -335,6 +336,11 @@ QmlViewer::QmlViewer(QWidget *parent, Qt::WindowFlags flags)
recordTimer.setRepeating(true);
}
+void QmlViewer::adjustSizeSlot()
+{
+ adjustSize();
+}
+
QMenuBar *QmlViewer::menuBar() const
{
if (!mb)
@@ -600,14 +606,17 @@ void QmlViewer::addLibraryPath(const QString& lib)
void QmlViewer::reload()
{
- openQml(currentFileName);
+ openQml(canvas->url());
}
void QmlViewer::open()
{
- QString fileName = QFileDialog::getOpenFileName(this, tr("Open QML file"), currentFileName, tr("QML Files (*.qml)"));
- if (!fileName.isEmpty())
- openQml(fileName);
+ QString cur = canvas->url().toLocalFile();
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open QML file"), cur, tr("QML Files (*.qml)"));
+ if (!fileName.isEmpty()) {
+ QFileInfo fi(fileName);
+ openQml(QUrl::fromLocalFile(fi.absoluteFilePath()));
+ }
}
void QmlViewer::executeErrors()
@@ -615,55 +624,55 @@ void QmlViewer::executeErrors()
if (tester) tester->executefailure();
}
-void QmlViewer::openQml(const QString& fileName)
+void QmlViewer::openQml(const QUrl& url)
{
- setWindowTitle(tr("%1 - Qt Declarative UI Viewer").arg(fileName));
+ QString fileName = url.toLocalFile();
+ setWindowTitle(tr("%1 - Qt Declarative UI Viewer").arg(fileName.isEmpty() ? url.toString() : fileName));
if (!m_script.isEmpty())
tester = new QFxTester(m_script, m_scriptOptions, canvas);
canvas->reset();
- currentFileName = fileName;
- QUrl url(fileName);
- QFileInfo fi(fileName);
- if (fi.exists()) {
- if (fi.suffix().toLower() != QLatin1String("qml")) {
- qWarning() << "qmlviewer cannot open non-QML file" << fileName;
- return;
- }
+ if (!fileName.isEmpty()) {
+ QFileInfo fi(fileName);
+ if (fi.exists()) {
+ if (fi.suffix().toLower() != QLatin1String("qml")) {
+ qWarning() << "qmlviewer cannot open non-QML file" << fileName;
+ return;
+ }
- url = QUrl::fromLocalFile(fi.absoluteFilePath());
- QmlContext *ctxt = canvas->rootContext();
- QDir dir(fi.path()+"/dummydata", "*.qml");
- QStringList list = dir.entryList();
- for (int i = 0; i < list.size(); ++i) {
- QString qml = list.at(i);
- QFile f(dir.filePath(qml));
- f.open(QIODevice::ReadOnly);
- QByteArray data = f.readAll();
- QmlComponent comp(canvas->engine());
- comp.setData(data, QUrl());
- QObject *dummyData = comp.create();
-
- if(comp.isError()) {
- QList<QmlError> errors = comp.errors();
- foreach (const QmlError &error, errors) {
- qWarning() << error;
+ QmlContext *ctxt = canvas->rootContext();
+ QDir dir(fi.path()+"/dummydata", "*.qml");
+ QStringList list = dir.entryList();
+ for (int i = 0; i < list.size(); ++i) {
+ QString qml = list.at(i);
+ QFile f(dir.filePath(qml));
+ f.open(QIODevice::ReadOnly);
+ QByteArray data = f.readAll();
+ QmlComponent comp(canvas->engine());
+ comp.setData(data, QUrl());
+ QObject *dummyData = comp.create();
+
+ if(comp.isError()) {
+ QList<QmlError> errors = comp.errors();
+ foreach (const QmlError &error, errors) {
+ qWarning() << error;
+ }
+ if (tester) tester->executefailure();
}
- if (tester) tester->executefailure();
- }
- if (dummyData) {
- qWarning() << "Loaded dummy data:" << dir.filePath(qml);
- qml.truncate(qml.length()-4);
- ctxt->setContextProperty(qml, dummyData);
- dummyData->setParent(this);
+ if (dummyData) {
+ qWarning() << "Loaded dummy data:" << dir.filePath(qml);
+ qml.truncate(qml.length()-4);
+ ctxt->setContextProperty(qml, dummyData);
+ dummyData->setParent(this);
+ }
}
+ } else {
+ qWarning() << "qmlviewer cannot find file:" << fileName;
+ return;
}
- } else {
- qWarning() << "qmlviewer cannot find file:" << fileName;
- return;
}
canvas->setUrl(url);
@@ -677,7 +686,7 @@ void QmlViewer::openQml(const QString& fileName)
canvas->updateGeometry();
if (mb)
mb->updateGeometry();
- resize(sizeHint());
+ adjustSize();
} else {
if (scaleSkin)
canvas->resize(canvas->sizeHint());
diff --git a/tools/qmlviewer/qmlviewer.h b/tools/qmlviewer/qmlviewer.h
index 7f9dca0..50495db 100644
--- a/tools/qmlviewer/qmlviewer.h
+++ b/tools/qmlviewer/qmlviewer.h
@@ -63,7 +63,7 @@ public:
public slots:
void sceneResized(QSize size);
- void openQml(const QString& fileName);
+ void openQml(const QUrl&);
void open();
void reload();
void takeSnapShot();
@@ -88,12 +88,12 @@ private slots:
void chooseRecordingOptions();
void pickRecordingFile();
void setScaleSkin();
+ void adjustSizeSlot();
private:
void setupProxy();
QString getVideoFileName();
- QString currentFileName;
PreviewDeviceSkin *skin;
QSize skinscreensize;
QmlView *canvas;