summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-07-20 08:33:57 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-07-20 08:33:57 (GMT)
commitc0a02f5c67d3de5e16fd506df83fef968e09c798 (patch)
tree53643122e75a4d549159a9ec6000aa5b6c4a1e03
parent86529642cfdc5cc5a94b735042d0807e3b57e9e1 (diff)
parent3182e16fa31a7def9775375971bea203af419d76 (diff)
downloadQt-c0a02f5c67d3de5e16fd506df83fef968e09c798.zip
Qt-c0a02f5c67d3de5e16fd506df83fef968e09c798.tar.gz
Qt-c0a02f5c67d3de5e16fd506df83fef968e09c798.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.qml7
-rw-r--r--demos/declarative/samegame/TODO7
-rw-r--r--demos/declarative/samegame/content/BoomBlock.qml8
-rw-r--r--demos/declarative/samegame/content/FastBlock.qml9
-rw-r--r--demos/declarative/samegame/content/SameDialog.qml4
-rw-r--r--demos/declarative/samegame/content/SpinBlock.qml36
-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.js116
-rw-r--r--doc/src/declarative/elements.qdoc1
-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/follow/follow.qml17
-rw-r--r--examples/declarative/minehunt/Explosion.qml15
-rw-r--r--examples/declarative/minehunt/minehunt.qml7
-rw-r--r--examples/declarative/snow/snow.qml9
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp4
-rw-r--r--src/declarative/extra/qfxanimatedimageitem.cpp14
-rw-r--r--src/declarative/extra/qfxanimatedimageitem_p.h3
-rw-r--r--src/declarative/extra/qfxflowview.cpp4
-rw-r--r--src/declarative/extra/qfxflowview.h6
-rw-r--r--src/declarative/extra/qmlbehaviour.cpp4
-rw-r--r--src/declarative/extra/qmlxmllistmodel.cpp4
-rw-r--r--src/declarative/fx/qfxgridview.cpp6
-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/fx/qfxlistview.cpp10
-rw-r--r--src/declarative/fx/qfxvisualitemmodel.cpp2
-rw-r--r--src/declarative/qml/qmlcompiler.cpp2
-rw-r--r--src/declarative/qml/qmlcompositetypemanager.cpp1
-rw-r--r--src/declarative/util/qmlfollow.cpp30
-rw-r--r--src/declarative/util/qmlfollow.h3
-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
49 files changed, 382 insertions, 241 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..5e998e8 100644
--- a/demos/declarative/samegame/SameGame.qml
+++ b/demos/declarative/samegame/SameGame.qml
@@ -22,6 +22,7 @@ Rect {
MouseRegion { id: gameMR; anchors.fill: parent;
onClicked: handleClick(mouseX, mouseY);
+ onPositionChanged: handleHover(mouseX, mouseY);
}
}
HorizontalLayout {
@@ -29,13 +30,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..9148e60 100644
--- a/demos/declarative/samegame/content/BoomBlock.qml
+++ b/demos/declarative/samegame/content/BoomBlock.qml
@@ -1,14 +1,14 @@
Item { id:block
property bool dying: false
- property bool spawning: false
+ property bool spawned: false
+ property bool selected: 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 +41,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..5149911 100644
--- a/demos/declarative/samegame/content/FastBlock.qml
+++ b/demos/declarative/samegame/content/FastBlock.qml
@@ -1,7 +1,8 @@
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 bool selected: false
property int type: 0
property int targetY: 0
property int targetX: 0
@@ -12,12 +13,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..42276d0
--- /dev/null
+++ b/demos/declarative/samegame/content/SpinBlock.qml
@@ -0,0 +1,36 @@
+Item { id:block
+ //Note: These properties are the interface used to control the blocks
+ property bool dying: false
+ property bool spawned: false
+ property bool selected: 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";
+ }
+ playing: selected
+ }
+ 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..333efbe
--- /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..1bc5bf4
--- /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..b80f901
--- /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..1814031 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;
@@ -54,55 +46,82 @@ function initBoard()
//TODO: a flag that handleMouse uses to ignore clicks when we're loading
}
-var removed;
+var fillFound;
var floodBoard;
+
+var lastHoveredIdx = -1
+function handleHover(x,y, btn)
+{
+ xIdx = Math.floor(x/tileSize);
+ yIdx = Math.floor(y/tileSize);
+ if(index(xIdx, yIdx) == lastHoveredIdx)
+ return;
+ lastHoveredIdx = index(xIdx, yIdx);
+ //if(btn != 0)
+ // return;
+ floodFill(xIdx, yIdx, -1, "hover");
+ for(i=0; i<maxIndex; i++){
+ if(floodBoard[i] != 1 && board[i] != null)
+ board[i].selected = false;
+ }
+ //Could use the fillFound value to tell the player how many stones/points
+}
+
function handleClick(x,y)
{
- //NOTE: Be careful with vars named x,y - they can set to the calling object?
+ //NOTE: Be careful with vars named x,y - they can set to the calling object
xIdx = Math.floor(x/tileSize);
yIdx = Math.floor(y/tileSize);
if(xIdx >= maxX || xIdx < 0 || yIdx >= maxY || yIdx < 0)
return;
if(board[index(xIdx, yIdx)] == null)
return;
- removed = 0;
- floodBoard = new Array(maxIndex);
- floodKill(xIdx,yIdx, -1);
- if(removed <= 0)
+ floodFill(xIdx,yIdx, -1, "kill");
+ if(fillFound <= 0)
return;
- gameCanvas.score += (removed - 1) * (removed - 1);
+ gameCanvas.score += (fillFound - 1) * (fillFound - 1);
shuffleDown();
victoryCheck();
}
-function floodKill(xIdx,yIdx,type)
+//cmd = "kill" is the removal case, cmd = "hover" is the mouse overed case
+function floodFill(xIdx,yIdx,type, cmd)
{
- if(xIdx >= maxX || xIdx < 0 || yIdx >= maxY || yIdx < 0)
- return;
- if(floodBoard[index(xIdx, yIdx)] == 1)
- return;
if(board[index(xIdx, yIdx)] == null)
return;
var first = false;
if(type == -1){
- type = board[index(xIdx,yIdx)].type;
first = true;
- }else{
- if(type != board[index(xIdx,yIdx)].type)
- return;
+ type = board[index(xIdx,yIdx)].type;
+
+ //Flood fill initialization
+ fillFound = 0;
+ floodBoard = new Array(maxIndex);
}
+ if(xIdx >= maxX || xIdx < 0 || yIdx >= maxY || yIdx < 0)
+ return;
+ if(floodBoard[index(xIdx, yIdx)] == 1)
+ return;
+ if(!first && type != board[index(xIdx,yIdx)].type)
+ return;
floodBoard[index(xIdx, yIdx)] = 1;
- floodKill(xIdx+1,yIdx,type);
- floodKill(xIdx-1,yIdx,type);
- floodKill(xIdx,yIdx+1,type);
- floodKill(xIdx,yIdx-1,type);
- if(first==true && removed == 0){
+ floodFill(xIdx+1,yIdx,type,cmd);
+ floodFill(xIdx-1,yIdx,type,cmd);
+ floodFill(xIdx,yIdx+1,type,cmd);
+ floodFill(xIdx,yIdx-1,type,cmd);
+ if(first==true && fillFound == 0){
//TODO: Provide a way to inform the delegate
return;//Can't remove single tiles
}
- board[index(xIdx,yIdx)].dying = true;
- board[index(xIdx,yIdx)] = null;//They'll have to destroy themselves(can we do that?)
- removed += 1;
+ if(cmd == "kill"){
+ board[index(xIdx,yIdx)].dying = true;
+ board[index(xIdx,yIdx)] = null;//They'll have to destroy themselves(can we do that?)
+ }else if(cmd == "hover"){
+ board[index(xIdx,yIdx)].selected = true;
+ }else{
+ print ("Flood Error");
+ }
+ fillFound += 1;
}
function shuffleDown()
@@ -145,13 +164,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 +218,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/doc/src/declarative/elements.qdoc b/doc/src/declarative/elements.qdoc
index e6e31f4..88b5963 100644
--- a/doc/src/declarative/elements.qdoc
+++ b/doc/src/declarative/elements.qdoc
@@ -53,6 +53,7 @@ The following table lists the Qml elements provided by the Qt Declarative module
\o \l Script
\o \l Connection
\o \l Component
+\o \l Timer
\endlist
\endtable
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/follow/follow.qml b/examples/declarative/follow/follow.qml
index 21a0309..37a953c 100644
--- a/examples/declarative/follow/follow.qml
+++ b/examples/declarative/follow/follow.qml
@@ -40,11 +40,24 @@ Rect {
id: Mouse
anchors.fill: parent
Rect {
+ id: "Ball"
width: 20; height: 20
radius: 10
color: "#0000ff"
- x: Follow { source: Mouse.mouseX-10; spring: 1.0; damping: 0.05 }
- y: Follow { source: Mouse.mouseY-10; spring: 1.0; damping: 0.05 }
+ x: Follow { id: "F1"; source: Mouse.mouseX-10; spring: 1.0; damping: 0.05; epsilon: 0.25 }
+ y: Follow { id: "F2"; source: Mouse.mouseY-10; spring: 1.0; damping: 0.05; epsilon: 0.25 }
+ states: [
+ State {
+ name: "following"
+ when: !F1.inSync || !F2.inSync
+ SetProperties { target: Ball; color: "#ff0000" }
+ }
+ ]
+ transitions: [
+ Transition {
+ ColorAnimation { duration: 200 }
+ }
+ ]
}
}
}
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/examples/declarative/snow/snow.qml b/examples/declarative/snow/snow.qml
index 2b413bb..f65e0ac 100644
--- a/examples/declarative/snow/snow.qml
+++ b/examples/declarative/snow/snow.qml
@@ -27,11 +27,12 @@ Rect {
property real targetDeform: 0
property bool slowDeform: true
- property real deform
- deform: Follow { source: MyLayout.targetDeform; velocity: MyLayout.slowDeform?0.1:2 }
+ property real deform: 0
+ deform: Follow {
+ id: "DeformFollow"; source: MyLayout.targetDeform; velocity: MyLayout.slowDeform?0.1:2
+ onSyncChanged: if(inSync) { MyLayout.slowDeform = true; MyLayout.targetDeform = 0; }
+ }
- onDeformChanged: if(deform == targetDeform) { slowDeform = true; targetDeform = 0; }
-
ImageBatch { offset: 0; ref: ImagePanel }
x: Follow { source: MyLayout.targetX; velocity: 1000 }
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/qfxanimatedimageitem.cpp b/src/declarative/extra/qfxanimatedimageitem.cpp
index d22959a..5516a00 100644
--- a/src/declarative/extra/qfxanimatedimageitem.cpp
+++ b/src/declarative/extra/qfxanimatedimageitem.cpp
@@ -112,12 +112,15 @@ bool QFxAnimatedImageItem::isPlaying() const
void QFxAnimatedImageItem::setPlaying(bool play)
{
Q_D(QFxAnimatedImageItem);
+ if(play == d->playing)
+ return;
+ d->playing = play;
if (!d->_movie)
return;
if (play)
d->_movie->start();
else
- d->_movie->stop();
+ d->_movie->setPaused(true);
}
/*!
@@ -166,7 +169,7 @@ void QFxAnimatedImageItem::setSource(const QUrl &url)
d->reply = 0;
}
- d->url = url;
+ d->url = qmlContext(this)->resolvedUrl(url);
if (url.isEmpty()) {
delete d->_movie;
@@ -188,7 +191,7 @@ void QFxAnimatedImageItem::movieRequestFinished()
Q_D(QFxAnimatedImageItem);
d->_movie = new QMovie(d->reply);
if (!d->_movie->isValid()){
- qWarning() << "Error Reading File " << d->url;
+ qWarning() << "Error Reading Animated Image File " << d->url;
delete d->_movie;
d->_movie = 0;
return;
@@ -198,7 +201,10 @@ void QFxAnimatedImageItem::movieRequestFinished()
connect(d->_movie, SIGNAL(frameChanged(int)),
this, SLOT(movieUpdate()));
d->_movie->setCacheMode(QMovie::CacheAll);
- d->_movie->start();
+ if(d->playing)
+ d->_movie->start();
+ else
+ d->_movie->jumpToFrame(0);
setPixmap(d->_movie->currentPixmap());
}
diff --git a/src/declarative/extra/qfxanimatedimageitem_p.h b/src/declarative/extra/qfxanimatedimageitem_p.h
index e7d8fb8..d743ba4 100644
--- a/src/declarative/extra/qfxanimatedimageitem_p.h
+++ b/src/declarative/extra/qfxanimatedimageitem_p.h
@@ -65,10 +65,11 @@ class QFxAnimatedImageItemPrivate : public QFxImagePrivate
public:
QFxAnimatedImageItemPrivate()
- : _movie(0)
+ : playing(true), _movie(0)
{
}
+ bool playing;
QMovie *_movie;
};
diff --git a/src/declarative/extra/qfxflowview.cpp b/src/declarative/extra/qfxflowview.cpp
index 412cbc8..1676512 100644
--- a/src/declarative/extra/qfxflowview.cpp
+++ b/src/declarative/extra/qfxflowview.cpp
@@ -49,8 +49,8 @@ QT_BEGIN_NAMESPACE
class QFxFlowViewAttached : public QObject
{
Q_OBJECT
-Q_PROPERTY(int row READ row NOTIFY posChanged);
-Q_PROPERTY(int column READ column NOTIFY posChanged);
+Q_PROPERTY(int row READ row NOTIFY posChanged)
+Q_PROPERTY(int column READ column NOTIFY posChanged)
public:
QFxFlowViewAttached(QObject *parent);
diff --git a/src/declarative/extra/qfxflowview.h b/src/declarative/extra/qfxflowview.h
index 126f567..c2b30a3 100644
--- a/src/declarative/extra/qfxflowview.h
+++ b/src/declarative/extra/qfxflowview.h
@@ -58,8 +58,8 @@ class Q_DECLARATIVE_EXPORT QFxFlowView : public QFxItem
{
Q_OBJECT
Q_PROPERTY(QFxVisualItemModel *model READ model WRITE setModel)
- Q_PROPERTY(int column READ columns WRITE setColumns);
- Q_PROPERTY(bool vertical READ vertical WRITE setVertical);
+ Q_PROPERTY(int column READ columns WRITE setColumns)
+ Q_PROPERTY(bool vertical READ vertical WRITE setVertical)
public:
QFxFlowView();
@@ -101,7 +101,7 @@ private:
QT_END_NAMESPACE
-QML_DECLARE_TYPE(QFxFlowView);
+QML_DECLARE_TYPE(QFxFlowView)
QT_END_HEADER
diff --git a/src/declarative/extra/qmlbehaviour.cpp b/src/declarative/extra/qmlbehaviour.cpp
index c7ab1da..92a85b0 100644
--- a/src/declarative/extra/qmlbehaviour.cpp
+++ b/src/declarative/extra/qmlbehaviour.cpp
@@ -57,8 +57,8 @@ public:
QmlBehaviourData(QObject *parent)
: QObject(parent) {}
- Q_PROPERTY(QVariant endValue READ endValue NOTIFY valuesChanged);
- Q_PROPERTY(QVariant startValue READ startValue NOTIFY valuesChanged);
+ Q_PROPERTY(QVariant endValue READ endValue NOTIFY valuesChanged)
+ Q_PROPERTY(QVariant startValue READ startValue NOTIFY valuesChanged)
QVariant endValue() const { return e; }
QVariant startValue() const { return s; }
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/qfxgridview.cpp b/src/declarative/fx/qfxgridview.cpp
index 905af3b..3c80e98 100644
--- a/src/declarative/fx/qfxgridview.cpp
+++ b/src/declarative/fx/qfxgridview.cpp
@@ -59,10 +59,10 @@ public:
attachedProperties.remove(parent());
}
- Q_PROPERTY(QFxGridView *view READ view);
+ Q_PROPERTY(QFxGridView *view READ view)
QFxGridView *view() { return m_view; }
- Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged);
+ Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
bool isCurrentItem() const { return m_isCurrent; }
void setIsCurrentItem(bool c) {
if (m_isCurrent != c) {
@@ -71,7 +71,7 @@ public:
}
}
- Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged);
+ Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
bool delayRemove() const { return m_delayRemove; }
void setDelayRemove(bool delay) {
if (m_delayRemove != delay) {
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/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index 351365d..50564fb 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -59,10 +59,10 @@ public:
attachedProperties.remove(parent());
}
- Q_PROPERTY(QFxListView *view READ view);
+ Q_PROPERTY(QFxListView *view READ view)
QFxListView *view() { return m_view; }
- Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged);
+ Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
bool isCurrentItem() const { return m_isCurrent; }
void setIsCurrentItem(bool c) {
if (m_isCurrent != c) {
@@ -71,7 +71,7 @@ public:
}
}
- Q_PROPERTY(QString prevSection READ prevSection NOTIFY prevSectionChanged);
+ Q_PROPERTY(QString prevSection READ prevSection NOTIFY prevSectionChanged)
QString prevSection() const { return m_prevSection; }
void setPrevSection(const QString &sect) {
if (m_prevSection != sect) {
@@ -80,7 +80,7 @@ public:
}
}
- Q_PROPERTY(QString section READ section NOTIFY sectionChanged);
+ Q_PROPERTY(QString section READ section NOTIFY sectionChanged)
QString section() const { return m_section; }
void setSection(const QString &sect) {
if (m_section != sect) {
@@ -89,7 +89,7 @@ public:
}
}
- Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged);
+ Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
bool delayRemove() const { return m_delayRemove; }
void setDelayRemove(bool delay) {
if (m_delayRemove != delay) {
diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp
index eb10df3..1b15a48 100644
--- a/src/declarative/fx/qfxvisualitemmodel.cpp
+++ b/src/declarative/fx/qfxvisualitemmodel.cpp
@@ -160,7 +160,7 @@ Q_OBJECT
public:
QFxVisualItemModelData(int index, QFxVisualItemModelPrivate *model);
- Q_PROPERTY(int index READ index NOTIFY indexChanged);
+ Q_PROPERTY(int index READ index NOTIFY indexChanged)
int index() const;
void setIndex(int index);
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 b8e6685..1e6fea2 100644
--- a/src/declarative/util/qmlfollow.cpp
+++ b/src/declarative/util/qmlfollow.cpp
@@ -56,7 +56,7 @@ class QmlFollowPrivate : public QObjectPrivate
public:
QmlFollowPrivate()
: sourceValue(0), maxVelocity(0), lastTime(0)
- , mass(1.0), spring(0.), damping(0.), velocity(0), epsilon(0.005), modulus(0.0), enabled(true), mode(Track), clock(this) {}
+ , mass(1.0), spring(0.), damping(0.), velocity(0), epsilon(0.01), modulus(0.0), enabled(true), mode(Track), clock(this) {}
QmlMetaProperty property;
qreal currentValue;
@@ -164,8 +164,10 @@ void QmlFollowPrivate::tick(int time)
}
lastTime = time;
}
- emit q->valueChanged(currentValue);
property.write(currentValue);
+ emit q->valueChanged(currentValue);
+ if (clock.state() != QAbstractAnimation::Running)
+ emit q->syncChanged();
}
void QmlFollowPrivate::updateMode()
@@ -183,12 +185,15 @@ void QmlFollowPrivate::start()
if (!enabled)
return;
+ Q_Q(QmlFollow);
if (mode == QmlFollowPrivate::Track) {
currentValue = sourceValue;
property.write(currentValue);
} else if (sourceValue != currentValue && clock.state() != QAbstractAnimation::Running) {
lastTime = 0;
+ currentValue = property.read().toDouble();
clock.start(); // infinity??
+ emit q->syncChanged();
}
}
@@ -261,8 +266,10 @@ qreal QmlFollow::sourceValue() const
void QmlFollow::setSourceValue(qreal value)
{
Q_D(QmlFollow);
- d->sourceValue = value;
- d->start();
+ if (d->sourceValue != value) {
+ d->sourceValue = value;
+ d->start();
+ }
}
/*!
@@ -338,7 +345,7 @@ void QmlFollow::setDamping(qreal damping)
to 0 to be considered equal to zero. This will depend on the usage of the value.
For pixel positions, 0.25 would suffice. For scale, 0.005 will suffice.
- The default is 0.005. Small performance improvements can result in tuning this
+ The default is 0.01. Small performance improvements can result in tuning this
value.
*/
qreal QmlFollow::epsilon() const
@@ -397,6 +404,19 @@ void QmlFollow::setEnabled(bool enabled)
d->stop();
}
+/*!
+ \qmlproperty bool Follow::inSync
+ This property is true when target is equal to the source; otherwise
+ false. If inSync is true the target is not being animated.
+
+ If \l enabled is false then inSync will also be false.
+*/
+bool QmlFollow::inSync() const
+{
+ Q_D(const QmlFollow);
+ return d->enabled && d->clock.state() != QAbstractAnimation::Running;
+}
+
qreal QmlFollow::value() const
{
Q_D(const QmlFollow);
diff --git a/src/declarative/util/qmlfollow.h b/src/declarative/util/qmlfollow.h
index 07e15e9..e0a588b 100644
--- a/src/declarative/util/qmlfollow.h
+++ b/src/declarative/util/qmlfollow.h
@@ -68,6 +68,7 @@ class Q_DECLARATIVE_EXPORT QmlFollow : public QmlPropertyValueSource,
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled)
Q_PROPERTY(qreal followValue READ value NOTIFY valueChanged)
Q_PROPERTY(qreal modulus READ modulus WRITE setModulus NOTIFY modulusChanged)
+ Q_PROPERTY(bool inSync READ inSync NOTIFY syncChanged)
public:
QmlFollow(QObject *parent=0);
@@ -89,11 +90,13 @@ public:
void setModulus(qreal modulus);
bool enabled() const;
void setEnabled(bool enabled);
+ bool inSync() const;
qreal value() const;
Q_SIGNALS:
void valueChanged(qreal);
+ void syncChanged();
};
QT_END_NAMESPACE
diff --git a/src/declarative/util/qmllistmodel.cpp b/src/declarative/util/qmllistmodel.cpp
index a969100..0c167c0 100644
--- a/src/declarative/util/qmllistmodel.cpp
+++ b/src/declarative/util/qmllistmodel.cpp
@@ -330,6 +330,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 2eb8845..7844b5a 100644
--- a/tools/qmlviewer/qmlviewer.cpp
+++ b/tools/qmlviewer/qmlviewer.cpp
@@ -698,17 +698,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;