summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2009-07-20 05:30:44 (GMT)
committerMartin Jones <martin.jones@nokia.com>2009-07-20 05:30:44 (GMT)
commit8ce0234b9aa4093c86179f038bdbd281b72a829a (patch)
tree7daed15acfcab0399ee58a59c2be3cd05572a8a9
parent2d0e618db203d47bfe5bda50e9cf258a19e9745c (diff)
parent2e4684e1004c3e5be16fb4ef21d8b2400063b241 (diff)
downloadQt-8ce0234b9aa4093c86179f038bdbd281b72a829a.zip
Qt-8ce0234b9aa4093c86179f038bdbd281b72a829a.tar.gz
Qt-8ce0234b9aa4093c86179f038bdbd281b72a829a.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
-rw-r--r--demos/declarative/samegame/README2
-rw-r--r--demos/declarative/samegame/SameGame.qml6
-rw-r--r--demos/declarative/samegame/TODO7
-rw-r--r--demos/declarative/samegame/content/BoomBlock.qml7
-rw-r--r--demos/declarative/samegame/content/FastBlock.qml8
-rw-r--r--demos/declarative/samegame/content/SameDialog.qml4
-rw-r--r--demos/declarative/samegame/content/SpinBlock.qml34
-rw-r--r--demos/declarative/samegame/content/pics/blueStone.pngbin4823 -> 2691 bytes
-rw-r--r--demos/declarative/samegame/content/pics/gnome/blueStone.gifbin0 -> 19122 bytes
-rw-r--r--demos/declarative/samegame/content/pics/gnome/greenStone.gifbin0 -> 20545 bytes
-rw-r--r--demos/declarative/samegame/content/pics/gnome/redStone.gifbin0 -> 18455 bytes
-rw-r--r--demos/declarative/samegame/content/pics/greenStone.pngbin4724 -> 2662 bytes
-rw-r--r--demos/declarative/samegame/content/pics/redStone.pngbin4585 -> 2604 bytes
-rw-r--r--demos/declarative/samegame/content/pics/yellowStone.pngbin4818 -> 2667 bytes
-rw-r--r--demos/declarative/samegame/content/samegame.js41
-rw-r--r--examples/declarative/aspectratio/face_fit.qml4
-rw-r--r--examples/declarative/aspectratio/face_fit_animated.qml4
-rw-r--r--examples/declarative/aspectratio/scale_and_crop.qml4
-rw-r--r--examples/declarative/aspectratio/scale_and_sidecrop.qml4
-rw-r--r--examples/declarative/aspectratio/scale_to_fit.qml7
-rw-r--r--examples/declarative/aspectratio/scale_to_fit_simple.qml17
-rw-r--r--examples/declarative/minehunt/Explosion.qml15
-rw-r--r--examples/declarative/minehunt/minehunt.qml7
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp4
-rw-r--r--src/declarative/extra/qmlxmllistmodel.cpp4
-rw-r--r--src/declarative/fx/qfximage.cpp6
-rw-r--r--src/declarative/fx/qfxlineedit.cpp164
-rw-r--r--src/declarative/fx/qfxlineedit.h39
-rw-r--r--src/declarative/fx/qfxlineedit_p.h3
-rw-r--r--src/declarative/qml/qmlcompiler.cpp2
-rw-r--r--src/declarative/qml/qmlcompositetypemanager.cpp1
-rw-r--r--src/declarative/util/qmlfollow.cpp1
-rw-r--r--src/declarative/util/qmllistmodel.cpp4
-rw-r--r--src/gui/widgets/qlinecontrol.cpp5
-rw-r--r--tools/qmlviewer/main.cpp10
-rw-r--r--tools/qmlviewer/qmlviewer.cpp19
-rw-r--r--tools/qmlviewer/qmlviewer.h2
37 files changed, 250 insertions, 185 deletions
diff --git a/demos/declarative/samegame/README b/demos/declarative/samegame/README
index 244b205..2f2a728 100644
--- a/demos/declarative/samegame/README
+++ b/demos/declarative/samegame/README
@@ -8,3 +8,5 @@ greenStone.png
yellowStone.png
and are presumably under the same GPL2 license as the rest of kdegames
+
+The images in the pics/gnome folder are from the gnome games project, and are also GPL2 licensed.
diff --git a/demos/declarative/samegame/SameGame.qml b/demos/declarative/samegame/SameGame.qml
index 23a83b8..fd3ca88 100644
--- a/demos/declarative/samegame/SameGame.qml
+++ b/demos/declarative/samegame/SameGame.qml
@@ -29,13 +29,13 @@ Rect {
anchors.topMargin: 10
anchors.horizontalCenter: parent.horizontalCenter
MediaButton { id: btnA; text: "New Game"; onClicked: {initBoard();} }
- MediaButton { id: btnB; text: "Swap Theme"; onClicked: {swapTileSrc(); dialog.opacity = 1;}
- }
+ MediaButton { id: btnB; text: "Swap Theme"; onClicked: {swapTileSrc(); dialog.opacity = 1;
+ dialog.text="Takes effect next game.";} }
Text{ text: "Score: " + gameCanvas.score; width:100 }
}
SameDialog {
id: dialog
anchors.centeredIn: parent
- text: "Takes effect next game."
+ text: "Hello World"
}
}
diff --git a/demos/declarative/samegame/TODO b/demos/declarative/samegame/TODO
index b02ce54..3be2a3a 100644
--- a/demos/declarative/samegame/TODO
+++ b/demos/declarative/samegame/TODO
@@ -1,5 +1,2 @@
-Still to do before initial release
--Garbage collect on click
--Particles with count 0->50 should work properly
--Particles are too slow to start
--Everything is too slow, we should have four times the number of tiles there
+Still to do:
+
diff --git a/demos/declarative/samegame/content/BoomBlock.qml b/demos/declarative/samegame/content/BoomBlock.qml
index b7838dd..542e7bc 100644
--- a/demos/declarative/samegame/content/BoomBlock.qml
+++ b/demos/declarative/samegame/content/BoomBlock.qml
@@ -1,14 +1,13 @@
Item { id:block
property bool dying: false
- property bool spawning: false
+ property bool spawned: false
property int type: 0
property int targetX: 0
property int targetY: 0
- x: Follow { source: targetX; spring: 2; damping: 0.2 }
+ x: Follow { enabled: spawned; source: targetX; spring: 2; damping: 0.2 }
y: Follow { source: targetY; spring: 2; damping: 0.2 }
-
Image { id: img
source: {
if(type == 0){
@@ -41,7 +40,7 @@ Item { id:block
states: [
- State{ name: "AliveState"; when: spawning == true && dying == false
+ State{ name: "AliveState"; when: spawned == true && dying == false
SetProperties { target: img; opacity: 1 }
},
State{ name: "DeathState"; when: dying == true
diff --git a/demos/declarative/samegame/content/FastBlock.qml b/demos/declarative/samegame/content/FastBlock.qml
index 04eb59b..6e02ced 100644
--- a/demos/declarative/samegame/content/FastBlock.qml
+++ b/demos/declarative/samegame/content/FastBlock.qml
@@ -1,7 +1,7 @@
Rect { id:block
//Note: These properties are the interface used to control the blocks
property bool dying: false
- property bool spawning: false
+ property bool spawned: false
property int type: 0
property int targetY: 0
property int targetX: 0
@@ -12,12 +12,12 @@ Rect { id:block
opacity: 0
y: targetY
x: targetX
- y: Behavior { NumberAnimation { properties:"y"; duration: 200 } }
- opacity: Behavior { NumberAnimation { properties:"opacity"; duration: 200 } }
+ //y: Behavior { NumberAnimation { properties:"y"; duration: 200 } }
+ //opacity: Behavior { NumberAnimation { properties:"opacity"; duration: 200 } }
states: [
- State{ name: "SpawnState"; when: spawning == true && dying == false
+ State{ name: "AliveState"; when: spawned == true && dying == false
SetProperties { target: block; opacity: 1 }
},
State{ name: "DeathState"; when: dying == true
diff --git a/demos/declarative/samegame/content/SameDialog.qml b/demos/declarative/samegame/content/SameDialog.qml
index eed52f0..a0718f2 100644
--- a/demos/declarative/samegame/content/SameDialog.qml
+++ b/demos/declarative/samegame/content/SameDialog.qml
@@ -5,8 +5,8 @@ Rect {
opacity: 0
opacity: Behavior {
SequentialAnimation {
- NumberAnimation {property: "opacity"; duration: 1000 }
- NumberAnimation {property: "opacity"; to: 0; duration: 1000 }
+ NumberAnimation {property: "opacity"; duration: 1500 }
+ NumberAnimation {property: "opacity"; to: 0; duration: 1500 }
}
}
color: "white"
diff --git a/demos/declarative/samegame/content/SpinBlock.qml b/demos/declarative/samegame/content/SpinBlock.qml
new file mode 100644
index 0000000..6737196
--- /dev/null
+++ b/demos/declarative/samegame/content/SpinBlock.qml
@@ -0,0 +1,34 @@
+Item { id:block
+ //Note: These properties are the interface used to control the blocks
+ property bool dying: false
+ property bool spawned: false
+ property int type: 0
+ property int targetY: 0
+ property int targetX: 0
+
+ AnimatedImage {
+ source: if(type == 0) {
+ "pics/gnome/redStone.gif";
+ } else if (type == 1) {
+ "pics/gnome/blueStone.gif";
+ } else {
+ "pics/gnome/greenStone.gif";
+ }
+ }
+ opacity: 0
+ y: targetY
+ x: targetX
+ y: Behavior { NumberAnimation { properties:"y"; duration: 200 } }
+ x: Behavior { NumberAnimation { properties:"x"; duration: 200 } }
+ opacity: Behavior { NumberAnimation { properties:"opacity"; duration: 200 } }
+
+ states: [
+
+ State{ name: "AliveState"; when: spawned == true && dying == false
+ SetProperties { target: block; opacity: 1 }
+ },
+ State{ name: "DeathState"; when: dying == true
+ SetProperties { target: block; opacity: 0 }
+ }
+ ]
+}
diff --git a/demos/declarative/samegame/content/pics/blueStone.png b/demos/declarative/samegame/content/pics/blueStone.png
index 673f1ce..bf342e0 100644
--- a/demos/declarative/samegame/content/pics/blueStone.png
+++ b/demos/declarative/samegame/content/pics/blueStone.png
Binary files differ
diff --git a/demos/declarative/samegame/content/pics/gnome/blueStone.gif b/demos/declarative/samegame/content/pics/gnome/blueStone.gif
new file mode 100644
index 0000000..4e6bd35
--- /dev/null
+++ b/demos/declarative/samegame/content/pics/gnome/blueStone.gif
Binary files differ
diff --git a/demos/declarative/samegame/content/pics/gnome/greenStone.gif b/demos/declarative/samegame/content/pics/gnome/greenStone.gif
new file mode 100644
index 0000000..c572e80
--- /dev/null
+++ b/demos/declarative/samegame/content/pics/gnome/greenStone.gif
Binary files differ
diff --git a/demos/declarative/samegame/content/pics/gnome/redStone.gif b/demos/declarative/samegame/content/pics/gnome/redStone.gif
new file mode 100644
index 0000000..c6c10c5
--- /dev/null
+++ b/demos/declarative/samegame/content/pics/gnome/redStone.gif
Binary files differ
diff --git a/demos/declarative/samegame/content/pics/greenStone.png b/demos/declarative/samegame/content/pics/greenStone.png
index 0c087d0..5ac14a5 100644
--- a/demos/declarative/samegame/content/pics/greenStone.png
+++ b/demos/declarative/samegame/content/pics/greenStone.png
Binary files differ
diff --git a/demos/declarative/samegame/content/pics/redStone.png b/demos/declarative/samegame/content/pics/redStone.png
index 80c2e2e..b099f60 100644
--- a/demos/declarative/samegame/content/pics/redStone.png
+++ b/demos/declarative/samegame/content/pics/redStone.png
Binary files differ
diff --git a/demos/declarative/samegame/content/pics/yellowStone.png b/demos/declarative/samegame/content/pics/yellowStone.png
index 5349eff..c56124a 100644
--- a/demos/declarative/samegame/content/pics/yellowStone.png
+++ b/demos/declarative/samegame/content/pics/yellowStone.png
Binary files differ
diff --git a/demos/declarative/samegame/content/samegame.js b/demos/declarative/samegame/content/samegame.js
index fe5ac87..1f76b9f 100644
--- a/demos/declarative/samegame/content/samegame.js
+++ b/demos/declarative/samegame/content/samegame.js
@@ -6,23 +6,17 @@ var tileSize = 40;
var maxIndex = maxX*maxY;
var board = new Array(maxIndex);
var tileSrc = "content/BoomBlock.qml";
-var backSrc = "content/pics/background.png";
var swapped = false;
var compSrc;
var component;
function swapTileSrc(){
- if(swapped)
- return;
- if(tileSrc == "content/FastBlock.qml"){
+ if(tileSrc == "content/SpinBlock.qml"){
tileSrc = "content/BoomBlock.qml";
- backSrc = "content/pics/background.png";
}else{
- backSrc = "content/pics/qtlogo.png";
- tileSrc = "content/FastBlock.qml";
+ tileSrc = "content/SpinBlock.qml";
}
- swapped = true;
}
function index(xIdx,yIdx){
@@ -37,8 +31,6 @@ function initBoard()
board[i].destroy();
}
- background.source = backSrc;
- swapped = false;
maxX = Math.floor(gameCanvas.width/tileSize);
maxY = Math.floor(gameCanvas.height/tileSize);
maxIndex = maxX*maxY;
@@ -145,13 +137,35 @@ function shuffleDown()
function victoryCheck()
{
- //Only awards bonuses at the moment
+ //awards bonuses
deservesBonus = true;
for(xIdx=maxX-1; xIdx>=0; xIdx--)
if(board[index(xIdx, maxY - 1)] != null)
deservesBonus = false;
if(deservesBonus)
- gameCanvas.score += 250;
+ gameCanvas.score += 500;
+ //Checks for game over
+ if(deservesBonus || noMoreMoves()){
+ dialog.text = "Game Over. Your score is " + gameCanvas.score;
+ dialog.opacity = 1;
+ }
+}
+
+function noMoreMoves()
+{
+ return !floodMoveCheck(0, maxY-1, -1);
+}
+
+function floodMoveCheck(xIdx, yIdx, type)
+{
+ if(xIdx >= maxX || xIdx < 0 || yIdx >= maxY || yIdx < 0)
+ return false;
+ if(board[index(xIdx, yIdx)] == null)
+ return false;
+ myType = board[index(xIdx, yIdx)].type;
+ if(type == myType)
+ return true;
+ return floodMoveCheck(xIdx + 1, yIdx, myType) || floodMoveCheck(xIdx, yIdx - 1, myType);
}
//Need a simpler method of doing this?
@@ -177,11 +191,12 @@ function finishCreatingBlock(xIdx,yIdx){
}
dynamicObject.type = Math.floor(Math.random() * 3);
dynamicObject.parent = gameCanvas;
+ dynamicObject.x = xIdx*tileSize;
dynamicObject.targetX = xIdx*tileSize;
dynamicObject.targetY = yIdx*tileSize;
dynamicObject.width = tileSize;
dynamicObject.height = tileSize;
- dynamicObject.spawning = true;
+ dynamicObject.spawned = true;
board[index(xIdx,yIdx)] = dynamicObject;
return true;
}else if(component.isError()){
diff --git a/examples/declarative/aspectratio/face_fit.qml b/examples/declarative/aspectratio/face_fit.qml
index 35c63ce..3005d1b 100644
--- a/examples/declarative/aspectratio/face_fit.qml
+++ b/examples/declarative/aspectratio/face_fit.qml
@@ -1,7 +1,3 @@
-// The Image primitive does not have any special handling for maintaining
-// aspect ratio. This example shows that you can provide whatever specific
-// behaviour you like.
-//
// Here, we implement a hybrid of the "scale to fit" and "scale and crop"
// behaviours which will crop up to 25% from *one* dimension if necessary
// to fully scale the other. This is a realistic algorithm, for example
diff --git a/examples/declarative/aspectratio/face_fit_animated.qml b/examples/declarative/aspectratio/face_fit_animated.qml
index 366d27b..9036eeb 100644
--- a/examples/declarative/aspectratio/face_fit_animated.qml
+++ b/examples/declarative/aspectratio/face_fit_animated.qml
@@ -1,7 +1,3 @@
-// The Image primitive does not have any special handling for maintaining
-// aspect ratio. This example shows that you can provide whatever specific
-// behaviour you like.
-//
// Here, we extend the "face_fit" example with animation to show how truly
// diverse and usage-specific behaviours are made possible by NOT putting a
// hard-coded aspect ratio feature into the Image primitive.
diff --git a/examples/declarative/aspectratio/scale_and_crop.qml b/examples/declarative/aspectratio/scale_and_crop.qml
index a5409f9..2f35fb5 100644
--- a/examples/declarative/aspectratio/scale_and_crop.qml
+++ b/examples/declarative/aspectratio/scale_and_crop.qml
@@ -1,7 +1,3 @@
-// The Image primitive does not have any special handling for maintaining
-// aspect ratio. This example shows that you can provide whatever specific
-// behaviour you like.
-//
// Here, we implement "Scale and Crop" behaviour.
//
Rect {
diff --git a/examples/declarative/aspectratio/scale_and_sidecrop.qml b/examples/declarative/aspectratio/scale_and_sidecrop.qml
index e076735..4b1eb63 100644
--- a/examples/declarative/aspectratio/scale_and_sidecrop.qml
+++ b/examples/declarative/aspectratio/scale_and_sidecrop.qml
@@ -1,7 +1,3 @@
-// The Image primitive does not have any special handling for maintaining
-// aspect ratio. This example shows that you can provide whatever specific
-// behaviour you like.
-//
// Here, we implement a variant of "Scale and Crop" behaviour, where we
// crop the sides if necessary to fully fit vertically, but not the reverse.
//
diff --git a/examples/declarative/aspectratio/scale_to_fit.qml b/examples/declarative/aspectratio/scale_to_fit.qml
index 61a4082..867eb37 100644
--- a/examples/declarative/aspectratio/scale_to_fit.qml
+++ b/examples/declarative/aspectratio/scale_to_fit.qml
@@ -1,8 +1,5 @@
-// The Image primitive does not have any special handling for maintaining
-// aspect ratio. This example shows that you can provide whatever specific
-// behaviour you like.
-//
-// Here, we implement "Scale to Fit" behaviour.
+// Here, we implement "Scale to Fit" behaviour "manually", rather
+// than using the preserveAspect property.
//
Rect {
// default size: whole image, unscaled
diff --git a/examples/declarative/aspectratio/scale_to_fit_simple.qml b/examples/declarative/aspectratio/scale_to_fit_simple.qml
new file mode 100644
index 0000000..4f89586
--- /dev/null
+++ b/examples/declarative/aspectratio/scale_to_fit_simple.qml
@@ -0,0 +1,17 @@
+// Here, we implement "Scale to Fit" behaviour, using the
+// preserveAspect property.
+//
+Rect {
+ // default size: whole image, unscaled
+ width: Image.width
+ height: Image.height
+ color: "gray"
+ clip: true
+
+ Image {
+ id: Image
+ source: "pics/face.png"
+ preserveAspect: true
+ anchors.fill: parent
+ }
+}
diff --git a/examples/declarative/minehunt/Explosion.qml b/examples/declarative/minehunt/Explosion.qml
index 2886559..84e93d4 100644
--- a/examples/declarative/minehunt/Explosion.qml
+++ b/examples/declarative/minehunt/Explosion.qml
@@ -2,17 +2,26 @@ Item {
property bool explode : false
Particles {
+ id: particles
width: 38
height: 21
- lifeSpan: 3600000
+ lifeSpan: 1000
lifeSpanDeviation: 0
source: "pics/star.png"
- count: 200
+ count: 0
angle: 270
angleDeviation: 360
velocity: 100
velocityDeviation: 20
z: 100
- emitting: explode
+ opacity: 0
+ streamIn: false
}
+ states: [ State { name: "exploding"; when: explode == true
+ SetProperties { target: particles; count: 200 }
+ SetProperties { target: particles; opacity: 1 }
+ SetProperties { target: particles; emitting: false } // i.e. emit only once
+ }
+ ]
+
}
diff --git a/examples/declarative/minehunt/minehunt.qml b/examples/declarative/minehunt/minehunt.qml
index 286e485..3dc1da4 100644
--- a/examples/declarative/minehunt/minehunt.qml
+++ b/examples/declarative/minehunt/minehunt.qml
@@ -55,9 +55,10 @@ Item {
opacity: modelData.hasMine
}
Explosion {
+ id: expl
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
- explode: modelData.hasMine && modelData.flipped
+ //explode: modelData.hasMine && modelData.flipped//Doesn't wait for the pause
}
}
states: [
@@ -89,6 +90,10 @@ Item {
easing: "easeInOutQuad"
properties: "rotation"
}
+ RunScriptAction{
+ script: if(modelData.hasMine && modelData.flipped)
+ {expl.explode = true;}
+ }
}
}
]
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index e6817fe..dd831a8 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -40,7 +40,9 @@
****************************************************************************/
#include "qmetaobjectbuilder_p.h"
-#include <QDebug>
+#ifndef Q_OS_WIN
+#include <stdint.h>
+#endif
QT_BEGIN_NAMESPACE
diff --git a/src/declarative/extra/qmlxmllistmodel.cpp b/src/declarative/extra/qmlxmllistmodel.cpp
index 7f0029d..91ad538 100644
--- a/src/declarative/extra/qmlxmllistmodel.cpp
+++ b/src/declarative/extra/qmlxmllistmodel.cpp
@@ -432,6 +432,10 @@ QHash<int,QVariant> QmlXmlListModel::data(int index, const QList<int> &roles) co
return rv;
}
+/*!
+ \qmlproperty int XmlListModel::count
+ The number of data entries in the model.
+*/
int QmlXmlListModel::count() const
{
Q_D(const QmlXmlListModel);
diff --git a/src/declarative/fx/qfximage.cpp b/src/declarative/fx/qfximage.cpp
index 027b22a..69030d2 100644
--- a/src/declarative/fx/qfximage.cpp
+++ b/src/declarative/fx/qfximage.cpp
@@ -464,6 +464,12 @@ QUrl QFxImage::source() const
return d->url;
}
+/*!
+ \qmlproperty bool Image::preserveAspect
+
+ Whether the image's aspect ratio should be preserved when resizing. By default this
+ is false.
+*/
bool QFxImage::preserveAspect() const
{
Q_D(const QFxImage);
diff --git a/src/declarative/fx/qfxlineedit.cpp b/src/declarative/fx/qfxlineedit.cpp
index da79979..bafd782 100644
--- a/src/declarative/fx/qfxlineedit.cpp
+++ b/src/declarative/fx/qfxlineedit.cpp
@@ -104,32 +104,6 @@ void QFxLineEdit::setColor(const QColor &c)
d->color = c;
}
-/*
-QFxText::TextStyle QFxLineEdit::style() const
-{
- Q_D(const QFxLineEdit);
- return d->style;
-}
-
-void QFxLineEdit::setStyle(QFxText::TextStyle style)
-{
- Q_D(QFxLineEdit);
- d->style = style;
-}
-
-QColor QFxLineEdit::styleColor() const
-{
- Q_D(const QFxLineEdit);
- return d->styleColor;
-}
-
-void QFxLineEdit::setStyleColor(const QColor &c)
-{
- Q_D(QFxLineEdit);
- d->styleColor = c;
-}
-*/
-
QFxText::HAlignment QFxLineEdit::hAlign() const
{
Q_D(const QFxLineEdit);
@@ -142,19 +116,6 @@ void QFxLineEdit::setHAlign(QFxText::HAlignment align)
d->hAlign = align;
}
-QFxText::VAlignment QFxLineEdit::vAlign() const
-{
- Q_D(const QFxLineEdit);
- return d->vAlign;
-}
-
-void QFxLineEdit::setVAlign(QFxText::VAlignment align)
-{
- Q_D(QFxLineEdit);
- d->vAlign = align;
-}
-
-//### Should this also toggle cursor visibility?
bool QFxLineEdit::isReadOnly() const
{
Q_D(const QFxLineEdit);
@@ -190,16 +151,60 @@ void QFxLineEdit::setCursorPosition(int cp)
d->control->moveCursor(cp);
}
-int QFxLineEdit::selectionLength() const
+/*!
+ \qmlproperty int LineEdit::selectionStart
+
+ The cursor position before the first character in the current selection.
+ Setting this and selectionEnd allows you to specify a selection in the
+ text edit.
+
+ Note that if selectionStart == selectionEnd then there is no current
+ selection. If you attempt to set selectionStart to a value outside of
+ the current text, selectionStart will not be changed.
+
+ \sa selectionEnd, cursorPosition, selectedText
+*/
+int QFxLineEdit::selectionStart() const
+{
+ Q_D(const QFxLineEdit);
+ return d->lastSelectionStart;
+}
+
+void QFxLineEdit::setSelectionStart(int s)
+{
+ Q_D(QFxLineEdit);
+ if(d->lastSelectionStart == s || s < 0 || s > text().length())
+ return;
+ d->lastSelectionStart = s;
+ d->control->setSelection(s, d->lastSelectionEnd - s);
+}
+
+/*!
+ \qmlproperty int LineEdit::selectionEnd
+
+ The cursor position after the last character in the current selection.
+ Setting this and selectionStart allows you to specify a selection in the
+ text edit.
+
+ Note that if selectionStart == selectionEnd then there is no current
+ selection. If you attempt to set selectionEnd to a value outside of
+ the current text, selectionEnd will not be changed.
+
+ \sa selectionStart, cursorPosition, selectedText
+*/
+int QFxLineEdit::selectionEnd() const
{
Q_D(const QFxLineEdit);
- return d->control->selectionEnd() - d->control->selectionStart();
+ return d->lastSelectionEnd;
}
-void QFxLineEdit::setSelectionLength(int len)
+void QFxLineEdit::setSelectionEnd(int s)
{
Q_D(QFxLineEdit);
- d->control->setSelection(d->control->cursor(), len);
+ if(d->lastSelectionEnd == s || s < 0 || s > text().length())
+ return;
+ d->lastSelectionEnd = s;
+ d->control->setSelection(d->lastSelectionStart, s - d->lastSelectionStart);
}
QString QFxLineEdit::selectedText() const
@@ -404,41 +409,8 @@ void QFxLineEdit::drawContents(QPainter *p, const QRect &r)
if (d->control->hasSelectedText())
flags |= QLineControl::DrawSelections;
- //TODO: Clean up this cut'n'pasted section from QLineEdit
- QRect lineRect(r);
-
- int cix = qRound(d->control->cursorToX());
-
- // horizontal scrolling. d->hscroll is the left indent from the beginning
- // of the text line to the left edge of lineRect. we update this value
- // depending on the delta from the last paint event; in effect this means
- // the below code handles all scrolling based on the textline (widthUsed,
- // minLB, minRB), the line edit rect (lineRect) and the cursor position
- // (cix).
- QFontMetrics fm = QApplication::fontMetrics();
- int minLB = qMax(0, -fm.minLeftBearing());
- int minRB = qMax(0, -fm.minRightBearing());
- int widthUsed = d->control->width() + minRB;
- if ((minLB + widthUsed) <= lineRect.width()) {
- // text fits in lineRect; use hscroll for alignment
- d->hscroll = 0;
- d->hscroll -= minLB;
- } else if (cix - d->hscroll >= lineRect.width()) {
- // text doesn't fit, cursor is to the right of lineRect (scroll right)
- d->hscroll = cix - lineRect.width() + 1;
- } else if (cix - d->hscroll < 0 && d->hscroll < widthUsed) {
- // text doesn't fit, cursor is to the left of lineRect (scroll left)
- d->hscroll = cix;
- }
- // the y offset is there to keep the baseline constant in case we have script changes in the text.
- QPoint topLeft = lineRect.topLeft() - QPoint(d->hscroll, d->control->ascent() - fm.ascent());
+ d->control->draw(p, QPoint(0,0), r, flags);
- if(d->hscroll != d->oldScroll)
- moveCursor();
-
- d->control->draw(p, topLeft, r, flags);
-
- d->oldScroll = d->hscroll;
p->restore();
}
@@ -448,13 +420,12 @@ void QFxLineEditPrivate::init()
control->setCursorWidth(1);
control->setPasswordCharacter(QLatin1Char('*'));
control->setLayoutDirection(Qt::LeftToRight);
- control->setSelection(0,0);
q->setSmooth(true);
q->setAcceptedMouseButtons(Qt::LeftButton);
q->setOptions(QFxLineEdit::AcceptsInputMethods | QFxLineEdit::SimpleItem
| QFxLineEdit::HasContents | QFxLineEdit::MouseEvents);
q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
- q, SIGNAL(cursorPositionChanged()));
+ q, SLOT(cursorPosChanged()));
q->connect(control, SIGNAL(selectionChanged()),
q, SLOT(selectionChanged()));
q->connect(control, SIGNAL(textChanged(const QString &)),
@@ -472,16 +443,43 @@ void QFxLineEditPrivate::init()
font = new QmlFont();
q->updateSize();
oldValidity = control->hasAcceptableInput();
- oldSelectLength = q->selectionLength();
+ lastSelectionStart = 0;
+ lastSelectionEnd = 0;
+}
+
+void QFxLineEdit::cursorPosChanged()
+{
+ Q_D(QFxLineEdit);
+ emit cursorPositionChanged();
+
+ if(!d->control->hasSelectedText()){
+ if(d->lastSelectionStart != d->control->cursor()){
+ d->lastSelectionStart = d->control->cursor();
+ emit selectionStartChanged();
+ }
+ if(d->lastSelectionEnd != d->control->cursor()){
+ d->lastSelectionEnd = d->control->cursor();
+ emit selectionEndChanged();
+ }
+ }
}
void QFxLineEdit::selectionChanged()
{
Q_D(QFxLineEdit);
emit selectedTextChanged();
- if(selectionLength() != d->oldSelectLength){
- d->oldSelectLength = selectionLength();
- emit selectionLengthChanged();
+
+ if(d->lastSelectionStart != d->control->selectionStart()){
+ d->lastSelectionStart = d->control->selectionStart();
+ if(d->lastSelectionStart == -1)
+ d->lastSelectionStart = d->control->cursor();
+ emit selectionStartChanged();
+ }
+ if(d->lastSelectionEnd != d->control->selectionEnd()){
+ d->lastSelectionEnd = d->control->selectionEnd();
+ if(d->lastSelectionEnd == -1)
+ d->lastSelectionEnd = d->control->cursor();
+ emit selectionEndChanged();
}
}
diff --git a/src/declarative/fx/qfxlineedit.h b/src/declarative/fx/qfxlineedit.h
index e053c54..2c22d4b 100644
--- a/src/declarative/fx/qfxlineedit.h
+++ b/src/declarative/fx/qfxlineedit.h
@@ -62,17 +62,13 @@ class Q_DECLARATIVE_EXPORT QFxLineEdit : public QFxPaintedItem
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QmlFont *font READ font)
Q_PROPERTY(QColor color READ color WRITE setColor)
- /*
- Q_PROPERTY(QFxText::TextStyle style READ style WRITE setStyle)
- Q_PROPERTY(QColor styleColor READ styleColor WRITE setStyleColor)
Q_PROPERTY(QFxText::HAlignment hAlign READ hAlign WRITE setHAlign)
- Q_PROPERTY(QFxText::VAlignment vAlign READ vAlign WRITE setVAlign)
- */
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly);
Q_PROPERTY(int maxLength READ maxLength WRITE setMaxLength);
Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged);
- Q_PROPERTY(int selectionLength READ selectionLength WRITE setSelectionLength NOTIFY selectionLengthChanged);
+ Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged)
+ Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged)
Q_PROPERTY(QString selectedText READ selectedText NOTIFY selectedTextChanged);
Q_PROPERTY(QObject* validator READ validator WRITE setValidator);
@@ -81,10 +77,6 @@ class Q_DECLARATIVE_EXPORT QFxLineEdit : public QFxPaintedItem
Q_PROPERTY(uint echoMode READ echoMode WRITE setEchoMode);
Q_PROPERTY(QmlComponent *cursorDelegate READ cursorDelegate WRITE setCursorDelegate);
- /*
- Q_PROPERTY(int scrollDuration READ scrollDuration SET setScrollDuration NOTIFY scrollDurationChanged);
- */
-
public:
QFxLineEdit(QFxItem* parent=0);
~QFxLineEdit();
@@ -100,20 +92,9 @@ public:
//### Should we have this function or x variants of properties?
Q_INVOKABLE int xToPos(int x);
- /*
- QFxText::TextStyle style() const;
- void setStyle(QFxText::TextStyle style);
-
- QColor styleColor() const;
- void setStyleColor(const QColor &c);
- */
-
QFxText::HAlignment hAlign() const;
void setHAlign(QFxText::HAlignment align);
- QFxText::VAlignment vAlign() const;
- void setVAlign(QFxText::VAlignment align);
-
bool isReadOnly() const;
void setReadOnly(bool);
@@ -123,8 +104,11 @@ public:
int cursorPosition() const;
void setCursorPosition(int cp);
- int selectionLength() const;
- void setSelectionLength(int len);
+ int selectionStart() const;
+ void setSelectionStart(int);
+
+ int selectionEnd() const;
+ void setSelectionEnd(int);
QString selectedText() const;
@@ -140,18 +124,14 @@ public:
QmlComponent* cursorDelegate() const;
void setCursorDelegate(QmlComponent*);
- /*
- int scrollDuration() const;
- void setScrollDuration(int);
- */
-
bool hasAcceptableInput() const;
void drawContents(QPainter *p,const QRect &r);
Q_SIGNALS:
void textChanged();
void cursorPositionChanged();
- void selectionLengthChanged();
+ void selectionStartChanged();
+ void selectionEndChanged();
void selectedTextChanged();
void accepted();
void acceptableInputChanged();
@@ -174,6 +154,7 @@ private slots:
void updateAll();
void createCursor();
void moveCursor();
+ void cursorPosChanged();
private:
Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr, QFxLineEdit);
diff --git a/src/declarative/fx/qfxlineedit_p.h b/src/declarative/fx/qfxlineedit_p.h
index a0ab19c..a18dea7 100644
--- a/src/declarative/fx/qfxlineedit_p.h
+++ b/src/declarative/fx/qfxlineedit_p.h
@@ -89,7 +89,8 @@ public:
QPointer<QmlComponent> cursorComponent;
QPointer<QFxItem> cursorItem;
- int oldSelectLength;
+ int lastSelectionStart;
+ int lastSelectionEnd;
int oldHeight;
int oldWidth;
bool oldValidity;
diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp
index 138be29..477e6a5 100644
--- a/src/declarative/qml/qmlcompiler.cpp
+++ b/src/declarative/qml/qmlcompiler.cpp
@@ -940,7 +940,7 @@ bool QmlCompiler::buildComponent(QmlParser::Object *obj,
COMPILE_EXCEPTION(obj, "Invalid component id specification");
if (idProp) {
- QString idVal = idProp->values.first()->primitive().toUtf8();
+ QString idVal = idProp->values.first()->primitive();
if (compileState.ids.contains(idVal))
COMPILE_EXCEPTION(obj, "id is not unique");
diff --git a/src/declarative/qml/qmlcompositetypemanager.cpp b/src/declarative/qml/qmlcompositetypemanager.cpp
index 9af5c3c..3037051 100644
--- a/src/declarative/qml/qmlcompositetypemanager.cpp
+++ b/src/declarative/qml/qmlcompositetypemanager.cpp
@@ -251,7 +251,6 @@ void QmlCompositeTypeManager::setData(QmlCompositeTypeData *unit,
error.setUrl(url);
error.setDescription(tr("Import %1 unavailable").arg(imp.uri));
unit->errors << error;
-qDebug() << "ERR";
ok = false;
}
}
diff --git a/src/declarative/util/qmlfollow.cpp b/src/declarative/util/qmlfollow.cpp
index 851d4c2..1e6fea2 100644
--- a/src/declarative/util/qmlfollow.cpp
+++ b/src/declarative/util/qmlfollow.cpp
@@ -191,6 +191,7 @@ void QmlFollowPrivate::start()
property.write(currentValue);
} else if (sourceValue != currentValue && clock.state() != QAbstractAnimation::Running) {
lastTime = 0;
+ currentValue = property.read().toDouble();
clock.start(); // infinity??
emit q->syncChanged();
}
diff --git a/src/declarative/util/qmllistmodel.cpp b/src/declarative/util/qmllistmodel.cpp
index 61d32f4..8edd871 100644
--- a/src/declarative/util/qmllistmodel.cpp
+++ b/src/declarative/util/qmllistmodel.cpp
@@ -331,6 +331,10 @@ QHash<int,QVariant> QmlListModel::data(int index, const QList<int> &roles) const
return rv;
}
+/*!
+ \qmlproperty int ListModel::count
+ The number of data entries in the model.
+*/
int QmlListModel::count() const
{
if (!_root) return 0;
diff --git a/src/gui/widgets/qlinecontrol.cpp b/src/gui/widgets/qlinecontrol.cpp
index 97f4a45..eec890b 100644
--- a/src/gui/widgets/qlinecontrol.cpp
+++ b/src/gui/widgets/qlinecontrol.cpp
@@ -244,14 +244,19 @@ void QLineControl::setSelection(int start, int length)
}
if (length > 0) {
+ if (start == m_selstart && start + length == m_selend)
+ return;
m_selstart = start;
m_selend = qMin(start + length, (int)m_text.length());
m_cursor = m_selend;
} else {
+ if (start == m_selend && start + length == m_selstart)
+ return;
m_selstart = qMax(start + length, 0);
m_selend = start;
m_cursor = m_selstart;
}
+ emit selectionChanged();
}
void QLineControl::_q_clipboardChanged()
diff --git a/tools/qmlviewer/main.cpp b/tools/qmlviewer/main.cpp
index ae9c356..e786edb 100644
--- a/tools/qmlviewer/main.cpp
+++ b/tools/qmlviewer/main.cpp
@@ -36,7 +36,7 @@ void usage()
qWarning(" -record arg .............................. add a recording process argument");
qWarning(" -autorecord [from-]<tomilliseconds> ...... set recording to start and stop");
qWarning(" -devicekeys .............................. use numeric keys (see F1)");
- qWarning(" -cache ................................... disk cache remote content");
+ qWarning(" -netcache <size> ......................... set disk cache to size bytes");
qWarning(" -recordtest <directory> .................. record an autotest");
qWarning(" -runtest <directory> ..................... run a previously recorded test");
qWarning(" -translation <translationfile> ........... set the language to run in");
@@ -74,7 +74,7 @@ int main(int argc, char ** argv)
QStringList libraries;
QString skin;
bool devkeys = false;
- bool cache = false;
+ int cache = 0;
QString translationFile;
for (int i = 1; i < argc; ++i) {
@@ -83,8 +83,8 @@ int main(int argc, char ** argv)
frameless = true;
} else if (arg == "-skin") {
skin = QString(argv[++i]);
- } else if (arg == "-cache") {
- cache = true;
+ } else if (arg == "-netcache") {
+ cache = QString(argv[++i]).toInt();
} else if (arg == "-recordperiod") {
period = QString(argv[++i]).toInt();
} else if (arg == "-recordfile") {
@@ -127,7 +127,7 @@ int main(int argc, char ** argv)
QmlViewer viewer(0, frameless ? Qt::FramelessWindowHint : Qt::Widget);
foreach (QString lib, libraries)
viewer.addLibraryPath(lib);
- viewer.setCacheEnabled(cache);
+ viewer.setNetworkCacheSize(cache);
viewer.setRecordFile(recordfile);
if (period>0)
viewer.setRecordPeriod(period);
diff --git a/tools/qmlviewer/qmlviewer.cpp b/tools/qmlviewer/qmlviewer.cpp
index c9d70e8..8f99206 100644
--- a/tools/qmlviewer/qmlviewer.cpp
+++ b/tools/qmlviewer/qmlviewer.cpp
@@ -699,17 +699,22 @@ void QmlViewer::setupProxy()
nam->setProxyFactory(new SystemProxyFactory);
}
-void QmlViewer::setCacheEnabled(bool on)
+void QmlViewer::setNetworkCacheSize(int size)
{
QNetworkAccessManager * nam = canvas->engine()->networkAccessManager();
- if (on == !!nam->cache())
- return;
- if (on) {
- // Setup a caching network manager
- QNetworkDiskCache *cache = new QNetworkDiskCache;
+ QNetworkDiskCache *cache = qobject_cast<QNetworkDiskCache*>(nam->cache());
+ if (!cache) {
+ if (size==0)
+ return;
+ cache = new QNetworkDiskCache;
cache->setCacheDirectory(QDir::tempPath()+QLatin1String("/qml-duiviewer-network-cache"));
- cache->setMaximumCacheSize(8000000);
nam->setCache(cache);
+ }
+ if (size == cache->maximumCacheSize())
+ return;
+ if (size>0) {
+ // Setup a caching network manager
+ cache->setMaximumCacheSize(size);
} else {
nam->setCache(0);
}
diff --git a/tools/qmlviewer/qmlviewer.h b/tools/qmlviewer/qmlviewer.h
index 4714bdc..62ee908 100644
--- a/tools/qmlviewer/qmlviewer.h
+++ b/tools/qmlviewer/qmlviewer.h
@@ -42,7 +42,7 @@ public:
bool isRecording() const { return recordTimer.isActive(); }
void setAutoRecord(int from, int to);
void setDeviceKeys(bool);
- void setCacheEnabled(bool);
+ void setNetworkCacheSize(int size);
void addLibraryPath(const QString& lib);
QMenuBar *menuBar() const;