summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/examples/tankgame.qdoc2
-rw-r--r--examples/animation/animation.pro3
-rw-r--r--examples/animation/moveblocks/main.cpp2
-rw-r--r--examples/animation/stickman/lifecycle.cpp4
-rw-r--r--examples/animation/sub-attaq/boat_p.h6
-rw-r--r--examples/animation/sub-attaq/states.cpp6
-rw-r--r--examples/animation/sub-attaq/states.h6
-rw-r--r--examples/statemachine/factorial/main.cpp4
-rw-r--r--examples/statemachine/pingpong/main.cpp4
-rw-r--r--examples/statemachine/tankgame/gameovertransition.cpp39
-rw-r--r--examples/statemachine/tankgame/gameovertransition.h22
-rw-r--r--examples/statemachine/tankgame/mainwindow.cpp53
-rw-r--r--examples/statemachine/tankgame/mainwindow.h3
-rw-r--r--examples/statemachine/tankgame/tankgame.pro4
-rw-r--r--examples/statemachine/tankgame/tankitem.cpp1
-rw-r--r--examples/statemachine/tankgame/tankitem.h1
-rw-r--r--examples/statemachine/tankgameplugins/seek_ai/seek_ai.h12
-rw-r--r--examples/statemachine/tankgameplugins/spin_ai/spin_ai.h7
-rw-r--r--examples/statemachine/tankgameplugins/spin_ai_with_error/spin_ai_with_error.h7
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp2
-rw-r--r--src/corelib/animation/qpauseanimation.cpp2
-rw-r--r--src/corelib/animation/qpropertyanimation.cpp4
-rw-r--r--src/corelib/animation/qpropertyanimation_p.h1
-rw-r--r--src/corelib/animation/qvariantanimation.cpp85
-rw-r--r--src/corelib/animation/qvariantanimation_p.h4
-rw-r--r--src/corelib/statemachine/qabstracttransition.cpp4
-rw-r--r--src/corelib/statemachine/qabstracttransition.h2
-rw-r--r--src/corelib/statemachine/qabstracttransition_p.h2
-rw-r--r--src/corelib/statemachine/qeventtransition.cpp2
-rw-r--r--src/corelib/statemachine/qeventtransition.h2
-rw-r--r--src/corelib/statemachine/qsignaltransition.cpp2
-rw-r--r--src/corelib/statemachine/qsignaltransition.h2
-rw-r--r--src/corelib/statemachine/qstate.cpp2
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp2
-rw-r--r--src/gui/statemachine/qbasickeyeventtransition.cpp2
-rw-r--r--src/gui/statemachine/qbasickeyeventtransition_p.h2
-rw-r--r--src/gui/statemachine/qbasicmouseeventtransition.cpp2
-rw-r--r--src/gui/statemachine/qbasicmouseeventtransition_p.h2
-rw-r--r--src/gui/statemachine/qkeyeventtransition.cpp2
-rw-r--r--src/gui/statemachine/qkeyeventtransition.h2
-rw-r--r--src/gui/statemachine/qmouseeventtransition.cpp2
-rw-r--r--src/gui/statemachine/qmouseeventtransition.h2
-rw-r--r--tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp69
-rw-r--r--tests/auto/qstate/tst_qstate.cpp2
-rw-r--r--tests/auto/qstatemachine/tst_qstatemachine.cpp8
45 files changed, 293 insertions, 106 deletions
diff --git a/doc/src/examples/tankgame.qdoc b/doc/src/examples/tankgame.qdoc
index 1501a99..ab3e0f4 100644
--- a/doc/src/examples/tankgame.qdoc
+++ b/doc/src/examples/tankgame.qdoc
@@ -82,6 +82,8 @@
"Add tank" menu item should be disabled. This is implemented by giving the "stopped" state two
children which define whether the map is full or not.
+ \snippet examples/statemachine/tankgame/mainwindow.cpp 5
+
To make sure that we go into the correct child state when returning from the "running" state
(if the "Stop game" menu item is selected while the game is running) we also give the "stopped"
state a history state which we make the initial state of "stopped" state.
diff --git a/examples/animation/animation.pro b/examples/animation/animation.pro
index d5121a1..0a57d3d 100644
--- a/examples/animation/animation.pro
+++ b/examples/animation/animation.pro
@@ -7,9 +7,6 @@ SUBDIRS += \
example \
moveblocks \
padnavigator-ng \
- photobrowser \
- piemenu \
- selectbutton \
states \
stickman \
sub-attaq
diff --git a/examples/animation/moveblocks/main.cpp b/examples/animation/moveblocks/main.cpp
index 06ed3dd..0ce07fc 100644
--- a/examples/animation/moveblocks/main.cpp
+++ b/examples/animation/moveblocks/main.cpp
@@ -95,7 +95,7 @@ public:
}
protected:
- virtual bool eventTest(QEvent *event) const
+ virtual bool eventTest(QEvent *event)
{
return (event->type() == QEvent::Type(StateSwitchEvent::StateSwitchType))
&& (static_cast<StateSwitchEvent *>(event)->rand() == m_rand);
diff --git a/examples/animation/stickman/lifecycle.cpp b/examples/animation/stickman/lifecycle.cpp
index b22af55..423d7ad 100644
--- a/examples/animation/stickman/lifecycle.cpp
+++ b/examples/animation/stickman/lifecycle.cpp
@@ -69,7 +69,7 @@ public:
{
}
- virtual bool eventTest(QEvent *e) const
+ virtual bool eventTest(QEvent *e)
{
if (QSignalTransition::eventTest(e)) {
QVariant key = static_cast<QSignalEvent*>(e)->arguments().at(0);
@@ -92,7 +92,7 @@ public:
startTimer(1000);
}
- virtual bool eventTest(QEvent *e) const
+ virtual bool eventTest(QEvent *e)
{
return QEventTransition::eventTest(e) && ((qrand() % 50) == 0);
}
diff --git a/examples/animation/sub-attaq/boat_p.h b/examples/animation/sub-attaq/boat_p.h
index 17fbe5c..6f03e48 100644
--- a/examples/animation/sub-attaq/boat_p.h
+++ b/examples/animation/sub-attaq/boat_p.h
@@ -67,7 +67,7 @@ public:
this->key = key;
}
protected:
- virtual bool eventTest(QEvent *event) const
+ virtual bool eventTest(QEvent *event)
{
Q_UNUSED(event);
if (!QKeyEventTransition::eventTest(event))
@@ -93,7 +93,7 @@ public:
this->key = key;
}
protected:
- virtual bool eventTest(QEvent *event) const
+ virtual bool eventTest(QEvent *event)
{
Q_UNUSED(event);
if (!QKeyEventTransition::eventTest(event))
@@ -131,7 +131,7 @@ public:
this->key = key;
}
protected:
- virtual bool eventTest(QEvent *event) const
+ virtual bool eventTest(QEvent *event)
{
Q_UNUSED(event);
if (!QKeyEventTransition::eventTest(event))
diff --git a/examples/animation/sub-attaq/states.cpp b/examples/animation/sub-attaq/states.cpp
index c6af924..7650b0f 100644
--- a/examples/animation/sub-attaq/states.cpp
+++ b/examples/animation/sub-attaq/states.cpp
@@ -281,7 +281,7 @@ UpdateScoreTransition::UpdateScoreTransition(GraphicsScene *scene, PlayState *ga
{
}
-bool UpdateScoreTransition::eventTest(QEvent *event) const
+bool UpdateScoreTransition::eventTest(QEvent *event)
{
if (!QSignalTransition::eventTest(event))
return false;
@@ -300,7 +300,7 @@ WinTransition::WinTransition(GraphicsScene *scene, PlayState *game, QAbstractSta
{
}
-bool WinTransition::eventTest(QEvent *event) const
+bool WinTransition::eventTest(QEvent *event)
{
if (!QSignalTransition::eventTest(event))
return false;
@@ -319,7 +319,7 @@ CustomSpaceTransition::CustomSpaceTransition(QWidget *widget, PlayState *game, Q
{
}
-bool CustomSpaceTransition::eventTest(QEvent *event) const
+bool CustomSpaceTransition::eventTest(QEvent *event)
{
Q_UNUSED(event);
if (!QKeyEventTransition::eventTest(event))
diff --git a/examples/animation/sub-attaq/states.h b/examples/animation/sub-attaq/states.h
index 27beb71..a1cb5ff 100644
--- a/examples/animation/sub-attaq/states.h
+++ b/examples/animation/sub-attaq/states.h
@@ -152,7 +152,7 @@ class UpdateScoreTransition : public QSignalTransition
public:
UpdateScoreTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target);
protected:
- virtual bool eventTest(QEvent *event) const;
+ virtual bool eventTest(QEvent *event);
private:
PlayState * game;
GraphicsScene *scene;
@@ -164,7 +164,7 @@ class WinTransition : public QSignalTransition
public:
WinTransition(GraphicsScene *scene, PlayState *game, QAbstractState *target);
protected:
- virtual bool eventTest(QEvent *event) const;
+ virtual bool eventTest(QEvent *event);
private:
PlayState * game;
GraphicsScene *scene;
@@ -176,7 +176,7 @@ private:
public:
CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key);
protected:
- virtual bool eventTest(QEvent *event) const;
+ virtual bool eventTest(QEvent *event);
private:
PlayState *game;
int key;
diff --git a/examples/statemachine/factorial/main.cpp b/examples/statemachine/factorial/main.cpp
index ae5928f..1065eb8 100644
--- a/examples/statemachine/factorial/main.cpp
+++ b/examples/statemachine/factorial/main.cpp
@@ -100,7 +100,7 @@ public:
: QSignalTransition(fact, SIGNAL(xChanged(int))), m_fact(fact)
{}
- virtual bool eventTest(QEvent *e) const
+ virtual bool eventTest(QEvent *e)
{
if (!QSignalTransition::eventTest(e))
return false;
@@ -130,7 +130,7 @@ public:
: QSignalTransition(fact, SIGNAL(xChanged(int))), m_fact(fact)
{}
- virtual bool eventTest(QEvent *e) const
+ virtual bool eventTest(QEvent *e)
{
if (!QSignalTransition::eventTest(e))
return false;
diff --git a/examples/statemachine/pingpong/main.cpp b/examples/statemachine/pingpong/main.cpp
index db66bfd..331627e 100644
--- a/examples/statemachine/pingpong/main.cpp
+++ b/examples/statemachine/pingpong/main.cpp
@@ -86,7 +86,7 @@ public:
PongTransition() {}
protected:
- virtual bool eventTest(QEvent *e) const {
+ virtual bool eventTest(QEvent *e) {
return (e->type() == QEvent::User+3);
}
virtual void onTransition(QEvent *)
@@ -104,7 +104,7 @@ public:
PingTransition() {}
protected:
- virtual bool eventTest(QEvent *e) const {
+ virtual bool eventTest(QEvent *e) {
return (e->type() == QEvent::User+2);
}
virtual void onTransition(QEvent *)
diff --git a/examples/statemachine/tankgame/gameovertransition.cpp b/examples/statemachine/tankgame/gameovertransition.cpp
new file mode 100644
index 0000000..cec786e
--- /dev/null
+++ b/examples/statemachine/tankgame/gameovertransition.cpp
@@ -0,0 +1,39 @@
+#include "gameovertransition.h"
+#include "tankitem.h"
+
+#include <QSignalEvent>
+#include <QSignalMapper>
+
+GameOverTransition::GameOverTransition(QAbstractState *targetState)
+ : QSignalTransition(new QSignalMapper(), SIGNAL(mapped(QObject*)))
+{
+ setTargetState(targetState);
+
+ QSignalMapper *mapper = qobject_cast<QSignalMapper *>(senderObject());
+ mapper->setParent(this);
+}
+
+void GameOverTransition::addTankItem(TankItem *tankItem)
+{
+ m_tankItems.append(tankItem);
+
+ QSignalMapper *mapper = qobject_cast<QSignalMapper *>(senderObject());
+ mapper->setMapping(tankItem, tankItem);
+ connect(tankItem, SIGNAL(aboutToBeDestroyed()), mapper, SLOT(map()));
+}
+
+bool GameOverTransition::eventTest(QEvent *e)
+{
+ bool ret = QSignalTransition::eventTest(e);
+
+ if (ret) {
+ QSignalEvent *signalEvent = static_cast<QSignalEvent *>(e);
+ QObject *sender = qvariant_cast<QObject *>(signalEvent->arguments().at(0));
+ TankItem *tankItem = qobject_cast<TankItem *>(sender);
+ m_tankItems.removeAll(tankItem);
+
+ return m_tankItems.size() <= 1;
+ } else {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/examples/statemachine/tankgame/gameovertransition.h b/examples/statemachine/tankgame/gameovertransition.h
new file mode 100644
index 0000000..9a86b83
--- /dev/null
+++ b/examples/statemachine/tankgame/gameovertransition.h
@@ -0,0 +1,22 @@
+#ifndef GAMEOVERTRANSITION_H
+#define GAMEOVERTRANSITION_H
+
+#include <QSignalTransition>
+
+class TankItem;
+class GameOverTransition: public QSignalTransition
+{
+ Q_OBJECT
+public:
+ GameOverTransition(QAbstractState *targetState);
+
+ void addTankItem(TankItem *tankItem);
+
+protected:
+ bool eventTest(QEvent *event);
+
+private:
+ QList<TankItem *> m_tankItems;
+};
+
+#endif
diff --git a/examples/statemachine/tankgame/mainwindow.cpp b/examples/statemachine/tankgame/mainwindow.cpp
index 870bc9c..fcc0325 100644
--- a/examples/statemachine/tankgame/mainwindow.cpp
+++ b/examples/statemachine/tankgame/mainwindow.cpp
@@ -2,6 +2,7 @@
#include "tankitem.h"
#include "rocketitem.h"
#include "plugin.h"
+#include "gameovertransition.h"
#include <QStateMachine>
#include <QGraphicsView>
@@ -53,7 +54,7 @@ void MainWindow::init()
{
TankItem *item = new TankItem(this);
- item->setPos(m_scene->sceneRect().topLeft() + QPointF(15.0, 15.0));
+ item->setPos(m_scene->sceneRect().topLeft() + QPointF(30.0, 30.0));
item->setDirection(45.0);
item->setColor(Qt::red);
@@ -63,7 +64,7 @@ void MainWindow::init()
{
TankItem *item = new TankItem(this);
- item->setPos(m_scene->sceneRect().topRight() + QPointF(-15.0, 15.0));
+ item->setPos(m_scene->sceneRect().topRight() + QPointF(-30.0, 30.0));
item->setDirection(135.0);
item->setColor(Qt::green);
@@ -73,7 +74,7 @@ void MainWindow::init()
{
TankItem *item = new TankItem(this);
- item->setPos(m_scene->sceneRect().bottomRight() + QPointF(-15.0, -15.0));
+ item->setPos(m_scene->sceneRect().bottomRight() + QPointF(-30.0, -30.0));
item->setDirection(225.0);
item->setColor(Qt::blue);
@@ -83,7 +84,7 @@ void MainWindow::init()
{
TankItem *item = new TankItem(this);
- item->setPos(m_scene->sceneRect().bottomLeft() + QPointF(15.0, -15.0));
+ item->setPos(m_scene->sceneRect().bottomLeft() + QPointF(30.0, -30.0));
item->setDirection(315.0);
item->setColor(Qt::yellow);
@@ -125,20 +126,23 @@ void MainWindow::init()
stoppedState->assignProperty(this, "started", false);
m_machine->setInitialState(stoppedState);
- QState *spawnsAvailable = new QState(stoppedState);
- spawnsAvailable->setObjectName("spawnsAvailable");
+//! [5]
+ QState *spawnsAvailable = new QState(stoppedState);
spawnsAvailable->assignProperty(addTankAction, "enabled", true);
- QState *noSpawnsAvailable = new QState(stoppedState);
- noSpawnsAvailable->setObjectName("noSpawnsAvailable");
+ QState *noSpawnsAvailable = new QState(stoppedState);
noSpawnsAvailable->assignProperty(addTankAction, "enabled", false);
+//! [5]
+ spawnsAvailable->setObjectName("spawnsAvailable");
+ noSpawnsAvailable->setObjectName("noSpawnsAvailable");
spawnsAvailable->addTransition(this, SIGNAL(mapFull()), noSpawnsAvailable);
//! [3]
- QHistoryState *hs = new QHistoryState(stoppedState);
+ QHistoryState *hs = new QHistoryState(stoppedState);
hs->setDefaultState(spawnsAvailable);
//! [3]
+ hs->setObjectName("hs");
stoppedState->setInitialState(hs);
@@ -149,10 +153,18 @@ void MainWindow::init()
m_runningState->assignProperty(addTankAction, "enabled", false);
m_runningState->assignProperty(runGameAction, "enabled", false);
m_runningState->assignProperty(stopGameAction, "enabled", true);
+
+ QState *gameOverState = new QState(m_machine->rootState());
+ gameOverState->setObjectName("gameOverState");
+ gameOverState->assignProperty(stopGameAction, "enabled", false);
+ connect(gameOverState, SIGNAL(entered()), this, SLOT(gameOver()));
stoppedState->addTransition(runGameAction, SIGNAL(triggered()), m_runningState);
m_runningState->addTransition(stopGameAction, SIGNAL(triggered()), stoppedState);
+ m_gameOverTransition = new GameOverTransition(gameOverState);
+ m_runningState->addTransition(m_gameOverTransition);
+
QTimer *timer = new QTimer(this);
timer->setInterval(100);
connect(timer, SIGNAL(timeout()), this, SLOT(runStep()));
@@ -182,6 +194,22 @@ void MainWindow::runStep()
}
}
+void MainWindow::gameOver()
+{
+ QList<QGraphicsItem *> items = m_scene->items();
+
+ TankItem *lastTankStanding = 0;
+ foreach (QGraphicsItem *item, items) {
+ if (GameItem *gameItem = qgraphicsitem_cast<GameItem *>(item)) {
+ if (lastTankStanding = qobject_cast<TankItem *>(gameItem))
+ break;
+ }
+ }
+
+ QMessageBox::information(this, "Game over!",
+ QString::fromLatin1("The tank played by '%1' has won!").arg(lastTankStanding->objectName()));
+}
+
void MainWindow::addRocket()
{
TankItem *tankItem = qobject_cast<TankItem *>(sender());
@@ -244,21 +272,26 @@ void MainWindow::addTank()
int idx = itemNames.indexOf(selectedName);
if (Plugin *plugin = idx >= 0 ? items.at(idx) : 0) {
TankItem *tankItem = m_spawns.takeLast();
+ tankItem->setObjectName(selectedName);
+ tankItem->setToolTip(selectedName);
m_scene->addItem(tankItem);
connect(tankItem, SIGNAL(cannonFired()), this, SLOT(addRocket()));
if (m_spawns.isEmpty())
emit mapFull();
+
+ m_gameOverTransition->addTankItem(tankItem);
QState *region = new QState(m_runningState);
+ region->setObjectName(QString::fromLatin1("region%1").arg(m_spawns.size()));
//! [2]
QState *pluginState = plugin->create(region, tankItem);
//! [2]
region->setInitialState(pluginState);
-
// If the plugin has an error it is disabled
//! [4]
QState *errorState = new QState(region);
+ errorState->setObjectName(QString::fromLatin1("errorState%1").arg(m_spawns.size()));
errorState->assignProperty(tankItem, "enabled", false);
pluginState->setErrorState(errorState);
//! [4]
diff --git a/examples/statemachine/tankgame/mainwindow.h b/examples/statemachine/tankgame/mainwindow.h
index 622dabe..40e1595 100644
--- a/examples/statemachine/tankgame/mainwindow.h
+++ b/examples/statemachine/tankgame/mainwindow.h
@@ -7,6 +7,7 @@
class QGraphicsScene;
class QStateMachine;
class QState;
+class GameOverTransition;
class TankItem;
class MainWindow: public QMainWindow
{
@@ -23,6 +24,7 @@ public slots:
void addTank();
void addRocket();
void runStep();
+ void gameOver();
signals:
void mapFull();
@@ -35,6 +37,7 @@ private:
QStateMachine *m_machine;
QState *m_runningState;
+ GameOverTransition *m_gameOverTransition;
QList<TankItem *> m_spawns;
QTime m_time;
diff --git a/examples/statemachine/tankgame/tankgame.pro b/examples/statemachine/tankgame/tankgame.pro
index f7b0760..46cfe2e 100644
--- a/examples/statemachine/tankgame/tankgame.pro
+++ b/examples/statemachine/tankgame/tankgame.pro
@@ -8,6 +8,6 @@ DEPENDPATH += .
INCLUDEPATH += C:/dev/kinetic/examples/statemachine/tankgame/. .
# Input
-HEADERS += mainwindow.h plugin.h tankitem.h rocketitem.h gameitem.h
-SOURCES += main.cpp mainwindow.cpp tankitem.cpp rocketitem.cpp gameitem.cpp
+HEADERS += mainwindow.h plugin.h tankitem.h rocketitem.h gameitem.h gameovertransition.h
+SOURCES += main.cpp mainwindow.cpp tankitem.cpp rocketitem.cpp gameitem.cpp gameovertransition.cpp
CONFIG += console
diff --git a/examples/statemachine/tankgame/tankitem.cpp b/examples/statemachine/tankgame/tankitem.cpp
index 5506a7e..c322d21 100644
--- a/examples/statemachine/tankgame/tankitem.cpp
+++ b/examples/statemachine/tankgame/tankitem.cpp
@@ -113,6 +113,7 @@ void TankItem::idle(qreal elapsed)
void TankItem::hitByRocket()
{
+ emit aboutToBeDestroyed();
deleteLater();
}
diff --git a/examples/statemachine/tankgame/tankitem.h b/examples/statemachine/tankgame/tankitem.h
index 66f05aa..9475397 100644
--- a/examples/statemachine/tankgame/tankitem.h
+++ b/examples/statemachine/tankgame/tankitem.h
@@ -41,6 +41,7 @@ signals:
void collision(const QLineF &collidedLine);
void actionCompleted();
void cannonFired();
+ void aboutToBeDestroyed();
public slots:
void moveForwards(qreal length = 10.0);
diff --git a/examples/statemachine/tankgameplugins/seek_ai/seek_ai.h b/examples/statemachine/tankgameplugins/seek_ai/seek_ai.h
index 2835988..9d4aabc 100644
--- a/examples/statemachine/tankgameplugins/seek_ai/seek_ai.h
+++ b/examples/statemachine/tankgameplugins/seek_ai/seek_ai.h
@@ -81,7 +81,7 @@ public:
}
protected:
- bool eventTest(QEvent *event) const
+ bool eventTest(QEvent *event)
{
bool b = QSignalTransition::eventTest(event);
if (b) {
@@ -105,7 +105,7 @@ protected:
}
private:
- mutable QLineF m_lastLine;
+ QLineF m_lastLine;
QObject *m_tank;
QState *m_turnTo;
};
@@ -137,16 +137,20 @@ public:
ChaseState(QObject *tank, QState *parentState = 0) : QState(parentState), m_tank(tank)
{
QState *fireCannon = new QState(this);
+ fireCannon->setObjectName("fireCannon");
connect(fireCannon, SIGNAL(entered()), tank, SLOT(fireCannon()));
setInitialState(fireCannon);
- m_goToLocation = new GoToLocationState(this);
+ m_goToLocation = new GoToLocationState(tank, this);
+ m_goToLocation->setObjectName("goToLocation");
fireCannon->addTransition(tank, SIGNAL(actionCompleted()), m_goToLocation);
m_turnToDirection = new QState(this);
+ m_turnToDirection->setObjectName("turnToDirection");
m_goToLocation->addTransition(tank, SIGNAL(actionCompleted()), m_turnToDirection);
QFinalState *finalState = new QFinalState(this);
+ finalState->setObjectName("finalState");
m_turnToDirection->addTransition(tank, SIGNAL(actionCompleted()), finalState);
}
@@ -176,7 +180,7 @@ public:
}
protected:
- bool eventTest(QEvent *event) const
+ bool eventTest(QEvent *event)
{
bool b = QSignalTransition::eventTest(event);
if (b) {
diff --git a/examples/statemachine/tankgameplugins/spin_ai/spin_ai.h b/examples/statemachine/tankgameplugins/spin_ai/spin_ai.h
index a331a3e..d8d3d73 100644
--- a/examples/statemachine/tankgameplugins/spin_ai/spin_ai.h
+++ b/examples/statemachine/tankgameplugins/spin_ai/spin_ai.h
@@ -18,7 +18,7 @@ public:
public slots:
void spin()
{
- m_tank->setProperty("direction", 90.0);
+ m_tank->setProperty("direction", m_tank->property("direction").toDouble() + 90.0);
}
protected:
@@ -28,6 +28,11 @@ protected:
spin();
}
+ void onExit(QEvent *)
+ {
+ disconnect(m_tank, SIGNAL(actionCompleted()), this, SLOT(spin()));
+ }
+
private:
QObject *m_tank;
diff --git a/examples/statemachine/tankgameplugins/spin_ai_with_error/spin_ai_with_error.h b/examples/statemachine/tankgameplugins/spin_ai_with_error/spin_ai_with_error.h
index 5cfb364..456ba01 100644
--- a/examples/statemachine/tankgameplugins/spin_ai_with_error/spin_ai_with_error.h
+++ b/examples/statemachine/tankgameplugins/spin_ai_with_error/spin_ai_with_error.h
@@ -18,7 +18,7 @@ public:
public slots:
void spin()
{
- m_tank->setProperty("direction", 90.0);
+ m_tank->setProperty("direction", m_tank->property("direction").toDouble() + 90.0);
}
protected:
@@ -28,6 +28,11 @@ protected:
spin();
}
+ void onExit(QEvent *)
+ {
+ disconnect(m_tank, SIGNAL(actionCompleted()), this, SLOT(spin()));
+ }
+
private:
QObject *m_tank;
diff --git a/src/corelib/animation/qparallelanimationgroup.cpp b/src/corelib/animation/qparallelanimationgroup.cpp
index e4bce6a..48c8b3e 100644
--- a/src/corelib/animation/qparallelanimationgroup.cpp
+++ b/src/corelib/animation/qparallelanimationgroup.cpp
@@ -62,7 +62,7 @@
group->start();
\endcode
-
+
In this example, \c anim1 and \c anim2 are two
\l{QPropertyAnimation}s that have already been set up.
diff --git a/src/corelib/animation/qpauseanimation.cpp b/src/corelib/animation/qpauseanimation.cpp
index 685fa98..c853745 100644
--- a/src/corelib/animation/qpauseanimation.cpp
+++ b/src/corelib/animation/qpauseanimation.cpp
@@ -52,7 +52,7 @@
\l{QAbstractAnimation::finished()}{finish} before a specified
number of milliseconds have elapsed from when it was started. You
specify the duration of the pause in the constructor. It can also
- be set directly with setDuration().
+ be set directly with setDuration().
It is not necessary to construct a QPauseAnimation yourself.
QSequentialAnimationGroup provides the convenience functions
diff --git a/src/corelib/animation/qpropertyanimation.cpp b/src/corelib/animation/qpropertyanimation.cpp
index 96cfa6b..1755aa7 100644
--- a/src/corelib/animation/qpropertyanimation.cpp
+++ b/src/corelib/animation/qpropertyanimation.cpp
@@ -48,14 +48,14 @@
QPropertyAnimation interpolates over \l{Qt's Property System}{Qt
properties}. As property values are stored in \l{QVariant}s, the
class inherits QVariantAnimation, and supports animation of the
- same \l{QVariant::Type}{variant types} as its super class.
+ same \l{QVariant::Type}{variant types} as its super class.
A class declaring properties must be a QObject. To make it
possible to animate a property, it must provide a setter (so that
QPropertyAnimation can set the property's value). Note that this
makes it possible to animate many of Qt's widgets. Let's look at
an example:
-
+
\code
QPropertyAnimation animation(myWidget, "geometry");
animation.setDuration(10000);
diff --git a/src/corelib/animation/qpropertyanimation_p.h b/src/corelib/animation/qpropertyanimation_p.h
index ed3666d..9d9dd31 100644
--- a/src/corelib/animation/qpropertyanimation_p.h
+++ b/src/corelib/animation/qpropertyanimation_p.h
@@ -70,7 +70,6 @@ public:
{
}
-
QPointer<QObject> target;
//for the QProperty
diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp
index 73ed0df..157a321 100644
--- a/src/corelib/animation/qvariantanimation.cpp
+++ b/src/corelib/animation/qvariantanimation.cpp
@@ -72,7 +72,7 @@ QT_BEGIN_NAMESPACE
animates Qt \l{Qt's Property System}{properties}. See the
QPropertyAnimation class description if you wish to animate such
properties.
-
+
You can then set start and end values for the property by calling
setStartValue() and setEndValue(), and finally call start() to
start the animation. QVariantAnimation will interpolate the
@@ -111,12 +111,12 @@ QT_BEGIN_NAMESPACE
\o \l{QMetaType::}{QSizeF}
\o \l{QMetaType::}{QRect}
\o \l{QMetaType::}{QRectF}
- \endlist
+ \endlist
If you need to interpolate other variant types, including custom
types, you have to implement interpolation for these yourself.
You do this by reimplementing interpolated(), which returns
- interpolation values for the value being interpolated.
+ interpolation values for the value being interpolated.
\omit We need some snippets around here. \endomit
@@ -152,7 +152,7 @@ template<> Q_INLINE_TEMPLATE QRectF _q_interpolate(const QRectF &f, const QRectF
f.getRect(&x1, &y1, &w1, &h1);
qreal x2, y2, w2, h2;
t.getRect(&x2, &y2, &w2, &h2);
- return QRectF( _q_interpolate(x1, x2, progress), _q_interpolate(y1, y2, progress),
+ return QRectF(_q_interpolate(x1, x2, progress), _q_interpolate(y1, y2, progress),
_q_interpolate(w1, w2, progress), _q_interpolate(h1, h2, progress));
}
@@ -174,47 +174,61 @@ void QVariantAnimationPrivate::convertValues(int t)
if (pair.second.userType() != t)
pair.second.convert(static_cast<QVariant::Type>(t));
}
- currentInterval.start.first = 2; // this will force the refresh
- interpolator = 0; // if the type changed we need to update the interpolator
+ interpolator = 0; // if the type changed we need to update the interpolator
}
/*!
- \fn void QVariantAnimation::updateCurrentValue(const QVariant &value) = 0;
- This pure virtual function is called when the animated value is changed.
- \a value is the new value.
+ \internal
+ The goal of this function is to update the currentInterval member. As a consequence, we also
+ need to update the currentValue.
+ Set \a force to true to always recalculate the interval.
*/
-
-void QVariantAnimationPrivate::updateCurrentValue()
+void QVariantAnimationPrivate::recalculateCurrentInterval(bool force/*=false*/)
{
- Q_Q(QVariantAnimation);
+ // can't interpolate if we have only 1 key value
+ if (keyValues.count() <= 1)
+ return;
+
const qreal progress = easing.valueForProgress(((duration == 0) ? qreal(1) : qreal(currentTime) / qreal(duration)));
- if (progress < currentInterval.start.first || progress > currentInterval.end.first) {
+ if (force || progress < currentInterval.start.first || progress > currentInterval.end.first) {
//let's update currentInterval
- QVariantAnimation::KeyValues::const_iterator itStart = qLowerBound(keyValues.constBegin(), keyValues.constEnd(), qMakePair(progress, QVariant()), animationValueLessThan);
+ QVariantAnimation::KeyValues::const_iterator itStart = qLowerBound(keyValues.constBegin(),
+ keyValues.constEnd(),
+ qMakePair(progress, QVariant()),
+ animationValueLessThan);
QVariantAnimation::KeyValues::const_iterator itEnd = itStart;
// If we are at the end we should continue to use the last keyValues in case of extrapolation (progress > 1.0).
// This is because the easing function can return a value slightly outside the range [0, 1]
if (itStart != keyValues.constEnd()) {
-
- //this can't happen because we always prepend the default start value there
- if (itStart == keyValues.begin()) {
+ // this can't happen because we always prepend the default start value there
+ if (itStart == keyValues.constBegin()) {
++itEnd;
- if (itEnd == keyValues.constEnd())
- return; //there is no upper bound
} else {
--itStart;
}
- //update all the values of the currentInterval
+ // update all the values of the currentInterval
currentInterval.start = *itStart;
currentInterval.end = *itEnd;
}
}
+ setCurrentValueForProgress(progress);
+}
+
+void QVariantAnimationPrivate::setCurrentValue()
+{
+ const qreal progress = easing.valueForProgress(((duration == 0) ? qreal(1) : qreal(currentTime) / qreal(duration)));
+ setCurrentValueForProgress(progress);
+}
- const qreal startProgress = currentInterval.start.first,
- endProgress = currentInterval.end.first;
+void QVariantAnimationPrivate::setCurrentValueForProgress(const qreal progress)
+{
+ Q_Q(QVariantAnimation);
+
+ const qreal startProgress = currentInterval.start.first;
+ const qreal endProgress = currentInterval.end.first;
const qreal localProgress = (progress - startProgress) / (endProgress - startProgress);
QVariant ret = q->interpolated(currentInterval.start.second,
@@ -227,11 +241,10 @@ void QVariantAnimationPrivate::updateCurrentValue()
#endif
if (currentValue != ret) {
//the value has changed
- emit q->valueChanged(currentValue);
+ emit q->valueChanged(currentValue);
}
}
-
QVariant QVariantAnimationPrivate::valueAt(qreal step) const
{
QVariantAnimation::KeyValues::const_iterator result =
@@ -242,7 +255,6 @@ QVariant QVariantAnimationPrivate::valueAt(qreal step) const
return QVariant();
}
-
void QVariantAnimationPrivate::setValueAt(qreal step, const QVariant &value)
{
if (step < qreal(0.0) || step > qreal(1.0)) {
@@ -257,15 +269,14 @@ void QVariantAnimationPrivate::setValueAt(qreal step, const QVariant &value)
keyValues.insert(result, pair);
} else {
if (value.isValid())
- result->second = value; //remove the previous value
+ result->second = value; // replaces the previous value
else if (step == 0 && !hasStartValue && defaultStartValue.isValid())
- result->second = defaultStartValue; //we reset to the default start value
+ result->second = defaultStartValue; // resets to the default start value
else
- keyValues.erase(result); //replace the previous value
+ keyValues.erase(result); // removes the previous value
}
- currentInterval.start.first = 2; // this will force the refresh
- updateCurrentValue();
+ recalculateCurrentInterval(/*force=*/true);
}
void QVariantAnimationPrivate::setDefaultStartValue(const QVariant &value)
@@ -324,7 +335,7 @@ void QVariantAnimation::setEasingCurve(const QEasingCurve &easing)
{
Q_D(QVariantAnimation);
d->easing = easing;
- d->updateCurrentValue();
+ d->recalculateCurrentInterval();
}
Q_GLOBAL_STATIC(QVector<QVariantAnimation::Interpolator>, registeredInterpolators)
@@ -435,7 +446,7 @@ void QVariantAnimation::setDuration(int msecs)
if (d->duration == msecs)
return;
d->duration = msecs;
- d->updateCurrentValue();
+ d->recalculateCurrentInterval();
}
/*!
@@ -545,8 +556,8 @@ void QVariantAnimation::setKeyValues(const KeyValues &keyValues)
Q_D(QVariantAnimation);
d->keyValues = keyValues;
qSort(d->keyValues.begin(), d->keyValues.end(), animationValueLessThan);
- d->currentInterval.start.first = 2; // this will force the refresh
d->hasStartValue = !d->keyValues.isEmpty() && d->keyValues.at(0).first == 0;
+ d->recalculateCurrentInterval(/*force=*/true);
}
/*!
@@ -571,7 +582,7 @@ QVariant QVariantAnimation::currentValue() const
{
Q_D(const QVariantAnimation);
if (!d->currentValue.isValid())
- const_cast<QVariantAnimationPrivate*>(d)->updateCurrentValue();
+ const_cast<QVariantAnimationPrivate*>(d)->recalculateCurrentInterval();
return d->currentValue;
}
@@ -587,12 +598,10 @@ bool QVariantAnimation::event(QEvent *event)
\reimp
*/
void QVariantAnimation::updateState(QAbstractAnimation::State oldState,
- QAbstractAnimation::State newState)
+ QAbstractAnimation::State newState)
{
Q_UNUSED(oldState);
Q_UNUSED(newState);
- Q_D(QVariantAnimation);
- d->currentValue = QVariant(); // this will force the refresh
}
/*!
@@ -635,7 +644,7 @@ void QVariantAnimation::updateCurrentTime(int msecs)
{
Q_D(QVariantAnimation);
Q_UNUSED(msecs);
- d->updateCurrentValue();
+ d->recalculateCurrentInterval();
}
QT_END_NAMESPACE
diff --git a/src/corelib/animation/qvariantanimation_p.h b/src/corelib/animation/qvariantanimation_p.h
index 14a3ef6..9e81649 100644
--- a/src/corelib/animation/qvariantanimation_p.h
+++ b/src/corelib/animation/qvariantanimation_p.h
@@ -108,7 +108,9 @@ public:
quint32 changedSignalMask;
- void updateCurrentValue();
+ void setCurrentValue();
+ void setCurrentValueForProgress(const qreal progress);
+ void recalculateCurrentInterval(bool force=false);
void setValueAt(qreal, const QVariant &);
QVariant valueAt(qreal step) const;
void convertValues(int t);
diff --git a/src/corelib/statemachine/qabstracttransition.cpp b/src/corelib/statemachine/qabstracttransition.cpp
index f7a7d34..a930581 100644
--- a/src/corelib/statemachine/qabstracttransition.cpp
+++ b/src/corelib/statemachine/qabstracttransition.cpp
@@ -125,9 +125,9 @@ QStateMachine *QAbstractTransitionPrivate::machine() const
return 0;
}
-bool QAbstractTransitionPrivate::callEventTest(QEvent *e) const
+bool QAbstractTransitionPrivate::callEventTest(QEvent *e)
{
- Q_Q(const QAbstractTransition);
+ Q_Q(QAbstractTransition);
return q->eventTest(e);
}
diff --git a/src/corelib/statemachine/qabstracttransition.h b/src/corelib/statemachine/qabstracttransition.h
index 8f0cefa..c63d55a 100644
--- a/src/corelib/statemachine/qabstracttransition.h
+++ b/src/corelib/statemachine/qabstracttransition.h
@@ -88,7 +88,7 @@ public:
#endif
protected:
- virtual bool eventTest(QEvent *event) const = 0;
+ virtual bool eventTest(QEvent *event) = 0;
virtual void onTransition(QEvent *event) = 0;
diff --git a/src/corelib/statemachine/qabstracttransition_p.h b/src/corelib/statemachine/qabstracttransition_p.h
index 156e70e..a6db220 100644
--- a/src/corelib/statemachine/qabstracttransition_p.h
+++ b/src/corelib/statemachine/qabstracttransition_p.h
@@ -75,7 +75,7 @@ public:
static QAbstractTransitionPrivate *get(QAbstractTransition *q);
static const QAbstractTransitionPrivate *get(const QAbstractTransition *q);
- bool callEventTest(QEvent *e) const;
+ bool callEventTest(QEvent *e);
void callOnTransition(QEvent *e);
QState *sourceState() const;
QStateMachine *machine() const;
diff --git a/src/corelib/statemachine/qeventtransition.cpp b/src/corelib/statemachine/qeventtransition.cpp
index 3ae3ed9..74eb577 100644
--- a/src/corelib/statemachine/qeventtransition.cpp
+++ b/src/corelib/statemachine/qeventtransition.cpp
@@ -252,7 +252,7 @@ void QEventTransition::setEventObject(QObject *object)
/*!
\reimp
*/
-bool QEventTransition::eventTest(QEvent *event) const
+bool QEventTransition::eventTest(QEvent *event)
{
Q_D(const QEventTransition);
if (event->type() == QEvent::Wrapped) {
diff --git a/src/corelib/statemachine/qeventtransition.h b/src/corelib/statemachine/qeventtransition.h
index 68ee4fc..3530bdd 100644
--- a/src/corelib/statemachine/qeventtransition.h
+++ b/src/corelib/statemachine/qeventtransition.h
@@ -71,7 +71,7 @@ public:
void setEventType(QEvent::Type type);
protected:
- bool eventTest(QEvent *event) const;
+ bool eventTest(QEvent *event);
void onTransition(QEvent *event);
bool event(QEvent *e);
diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp
index fd17292..4caa917 100644
--- a/src/corelib/statemachine/qsignaltransition.cpp
+++ b/src/corelib/statemachine/qsignaltransition.cpp
@@ -225,7 +225,7 @@ void QSignalTransition::setSignal(const QByteArray &signal)
true if the event's sender and signal index match this transition, and
returns false otherwise.
*/
-bool QSignalTransition::eventTest(QEvent *event) const
+bool QSignalTransition::eventTest(QEvent *event)
{
Q_D(const QSignalTransition);
if (event->type() == QEvent::Signal) {
diff --git a/src/corelib/statemachine/qsignaltransition.h b/src/corelib/statemachine/qsignaltransition.h
index 7f457b8..b485785 100644
--- a/src/corelib/statemachine/qsignaltransition.h
+++ b/src/corelib/statemachine/qsignaltransition.h
@@ -72,7 +72,7 @@ public:
void setSignal(const QByteArray &signal);
protected:
- bool eventTest(QEvent *event) const;
+ bool eventTest(QEvent *event);
void onTransition(QEvent *event);
bool event(QEvent *e);
diff --git a/src/corelib/statemachine/qstate.cpp b/src/corelib/statemachine/qstate.cpp
index 8893bfe..e42e463 100644
--- a/src/corelib/statemachine/qstate.cpp
+++ b/src/corelib/statemachine/qstate.cpp
@@ -363,7 +363,7 @@ public:
: QAbstractTransition(QList<QAbstractState*>() << target) {}
protected:
void onTransition(QEvent *) {}
- bool eventTest(QEvent *) const { return true; }
+ bool eventTest(QEvent *) { return true; }
};
} // namespace
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index 046fbb4..65f49ae 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -1124,7 +1124,7 @@ public:
InitialTransition(QAbstractState *target)
: QAbstractTransition(QList<QAbstractState*>() << target) {}
protected:
- virtual bool eventTest(QEvent *) const { return true; }
+ virtual bool eventTest(QEvent *) { return true; }
virtual void onTransition(QEvent *) {}
};
diff --git a/src/gui/statemachine/qbasickeyeventtransition.cpp b/src/gui/statemachine/qbasickeyeventtransition.cpp
index 9d4e37d..7f515cd 100644
--- a/src/gui/statemachine/qbasickeyeventtransition.cpp
+++ b/src/gui/statemachine/qbasickeyeventtransition.cpp
@@ -158,7 +158,7 @@ void QBasicKeyEventTransition::setModifiersMask(Qt::KeyboardModifiers modifiersM
/*!
\reimp
*/
-bool QBasicKeyEventTransition::eventTest(QEvent *event) const
+bool QBasicKeyEventTransition::eventTest(QEvent *event)
{
Q_D(const QBasicKeyEventTransition);
if (event->type() == d->eventType) {
diff --git a/src/gui/statemachine/qbasickeyeventtransition_p.h b/src/gui/statemachine/qbasickeyeventtransition_p.h
index 0d08da0..7506747 100644
--- a/src/gui/statemachine/qbasickeyeventtransition_p.h
+++ b/src/gui/statemachine/qbasickeyeventtransition_p.h
@@ -55,7 +55,7 @@ public:
void setModifiersMask(Qt::KeyboardModifiers modifiers);
protected:
- bool eventTest(QEvent *event) const;
+ bool eventTest(QEvent *event);
void onTransition(QEvent *);
private:
diff --git a/src/gui/statemachine/qbasicmouseeventtransition.cpp b/src/gui/statemachine/qbasicmouseeventtransition.cpp
index 8aaab85..42b7580 100644
--- a/src/gui/statemachine/qbasicmouseeventtransition.cpp
+++ b/src/gui/statemachine/qbasicmouseeventtransition.cpp
@@ -161,7 +161,7 @@ void QBasicMouseEventTransition::setPath(const QPainterPath &path)
/*!
\reimp
*/
-bool QBasicMouseEventTransition::eventTest(QEvent *event) const
+bool QBasicMouseEventTransition::eventTest(QEvent *event)
{
Q_D(const QBasicMouseEventTransition);
if (event->type() == d->eventType) {
diff --git a/src/gui/statemachine/qbasicmouseeventtransition_p.h b/src/gui/statemachine/qbasicmouseeventtransition_p.h
index 20c7f8f..57f83c6 100644
--- a/src/gui/statemachine/qbasicmouseeventtransition_p.h
+++ b/src/gui/statemachine/qbasicmouseeventtransition_p.h
@@ -58,7 +58,7 @@ public:
void setPath(const QPainterPath &path);
protected:
- bool eventTest(QEvent *event) const;
+ bool eventTest(QEvent *event);
void onTransition(QEvent *);
private:
diff --git a/src/gui/statemachine/qkeyeventtransition.cpp b/src/gui/statemachine/qkeyeventtransition.cpp
index e6ab11b..3cf51a3 100644
--- a/src/gui/statemachine/qkeyeventtransition.cpp
+++ b/src/gui/statemachine/qkeyeventtransition.cpp
@@ -140,7 +140,7 @@ void QKeyEventTransition::setModifiersMask(Qt::KeyboardModifiers modifiersMask)
/*!
\reimp
*/
-bool QKeyEventTransition::eventTest(QEvent *event) const
+bool QKeyEventTransition::eventTest(QEvent *event)
{
Q_D(const QKeyEventTransition);
if (!QEventTransition::eventTest(event))
diff --git a/src/gui/statemachine/qkeyeventtransition.h b/src/gui/statemachine/qkeyeventtransition.h
index 3f797f1..08595e8 100644
--- a/src/gui/statemachine/qkeyeventtransition.h
+++ b/src/gui/statemachine/qkeyeventtransition.h
@@ -46,7 +46,7 @@ public:
protected:
void onTransition(QEvent *event);
- bool eventTest(QEvent *event) const;
+ bool eventTest(QEvent *event);
private:
Q_DISABLE_COPY(QKeyEventTransition)
diff --git a/src/gui/statemachine/qmouseeventtransition.cpp b/src/gui/statemachine/qmouseeventtransition.cpp
index 3191a2f..5ffdab0 100644
--- a/src/gui/statemachine/qmouseeventtransition.cpp
+++ b/src/gui/statemachine/qmouseeventtransition.cpp
@@ -170,7 +170,7 @@ void QMouseEventTransition::setPath(const QPainterPath &path)
/*!
\reimp
*/
-bool QMouseEventTransition::eventTest(QEvent *event) const
+bool QMouseEventTransition::eventTest(QEvent *event)
{
Q_D(const QMouseEventTransition);
if (!QEventTransition::eventTest(event))
diff --git a/src/gui/statemachine/qmouseeventtransition.h b/src/gui/statemachine/qmouseeventtransition.h
index eee971e..e878a58 100644
--- a/src/gui/statemachine/qmouseeventtransition.h
+++ b/src/gui/statemachine/qmouseeventtransition.h
@@ -52,7 +52,7 @@ public:
protected:
void onTransition(QEvent *event);
- bool eventTest(QEvent *event) const;
+ bool eventTest(QEvent *event);
private:
Q_DISABLE_COPY(QMouseEventTransition)
diff --git a/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp b/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp
index 2e5fd00..7e910d4 100644
--- a/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp
+++ b/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp
@@ -42,6 +42,7 @@
#include <QtTest/QtTest>
#include <QtCore/qpropertyanimation.h>
+#include <QtCore/qvariantanimation.h>
#include <QtGui/qwidget.h>
//TESTED_CLASS=QPropertyAnimation
@@ -95,6 +96,8 @@ private slots:
void zeroDurationStart();
void operationsInStates_data();
void operationsInStates();
+ void oneKeyValue();
+ void updateOnSetKeyValues();
};
tst_QPropertyAnimation::tst_QPropertyAnimation()
@@ -794,9 +797,9 @@ void tst_QPropertyAnimation::operationsInStates()
* | pause() |start() |resume() |stop()
* ----------+------------+-----------+-----------+-------------------+
* Stopped | Stopped |Running |Stopped |Stopped |
- * _| qWarning | |qWarning |- |
+ * _| qWarning |restart |qWarning | |
* Paused | Paused |Running |Running |Stopped |
- * _| - | | | |
+ * _| | | | |
* Running | Paused |Running |Running |Stopped |
* | |restart |qWarning | |
* ----------+------------+-----------+-----------+-------------------+
@@ -850,5 +853,67 @@ void tst_QPropertyAnimation::operationsInStates()
#undef Resume
#undef Stop
+void tst_QPropertyAnimation::oneKeyValue()
+{
+ QObject o;
+ o.setProperty("ole", 42);
+ QCOMPARE(o.property("ole").toInt(), 42);
+
+ QPropertyAnimation animation(&o, "ole");
+ animation.setStartValue(43);
+ animation.setEndValue(44);
+ animation.setDuration(100);
+
+ animation.setCurrentTime(0);
+
+ QVERIFY(animation.currentValue().isValid());
+ QCOMPARE(animation.currentValue().toInt(), 43);
+ QCOMPARE(o.property("ole").toInt(), 42);
+
+ // remove the last key value
+ animation.setKeyValueAt(1.0, QVariant());
+
+ // we will neither interpolate, nor update the current value
+ // since there is only one 1 key value defined
+ animation.setCurrentTime(100);
+
+ // the animation should not have been modified
+ QVERIFY(animation.currentValue().isValid());
+ QCOMPARE(animation.currentValue().toInt(), 43);
+ QCOMPARE(o.property("ole").toInt(), 42);
+}
+
+void tst_QPropertyAnimation::updateOnSetKeyValues()
+{
+ QObject o;
+ o.setProperty("ole", 100);
+ QCOMPARE(o.property("ole").toInt(), 100);
+
+ QPropertyAnimation animation(&o, "ole");
+ animation.setStartValue(100);
+ animation.setEndValue(200);
+ animation.setDuration(100);
+
+ animation.setCurrentTime(50);
+ QCOMPARE(animation.currentValue().toInt(), 150);
+ animation.setKeyValueAt(0.0, 300);
+ QCOMPARE(animation.currentValue().toInt(), 250);
+
+ o.setProperty("ole", 100);
+ QPropertyAnimation animation2(&o, "ole");
+ QVariantAnimation::KeyValues kValues;
+ kValues << QVariantAnimation::KeyValue(0.0, 100) << QVariantAnimation::KeyValue(1.0, 200);
+ animation2.setKeyValues(kValues);
+ animation2.setDuration(100);
+ animation2.setCurrentTime(50);
+ QCOMPARE(animation2.currentValue().toInt(), 150);
+
+ kValues.clear();
+ kValues << QVariantAnimation::KeyValue(0.0, 300) << QVariantAnimation::KeyValue(1.0, 200);
+ animation2.setKeyValues(kValues);
+
+ QCOMPARE(animation2.currentValue().toInt(), animation.currentValue().toInt());
+}
+
QTEST_MAIN(tst_QPropertyAnimation)
#include "tst_qpropertyanimation.moc"
diff --git a/tests/auto/qstate/tst_qstate.cpp b/tests/auto/qstate/tst_qstate.cpp
index bb7de20..75b1905 100644
--- a/tests/auto/qstate/tst_qstate.cpp
+++ b/tests/auto/qstate/tst_qstate.cpp
@@ -255,7 +255,7 @@ public:
}
protected:
- bool eventTest(QEvent *e) const
+ bool eventTest(QEvent *e)
{
return e->type() == m_type;
}
diff --git a/tests/auto/qstatemachine/tst_qstatemachine.cpp b/tests/auto/qstatemachine/tst_qstatemachine.cpp
index f8a778a..7476831 100644
--- a/tests/auto/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/qstatemachine/tst_qstatemachine.cpp
@@ -204,7 +204,7 @@ public:
: QAbstractTransition(QList<QAbstractState*>() << target) {}
QList<int> triggers;
protected:
- virtual bool eventTest(QEvent *) const {
+ virtual bool eventTest(QEvent *) {
return true;
}
virtual void onTransition(QEvent *) {
@@ -246,7 +246,7 @@ public:
EventTransition(QEvent::Type type, QAbstractState *target, QState *parent = 0)
: QAbstractTransition(QList<QAbstractState*>() << target, parent), m_type(type) {}
protected:
- virtual bool eventTest(QEvent *e) const {
+ virtual bool eventTest(QEvent *e) {
return (e->type() == m_type);
}
virtual void onTransition(QEvent *) {}
@@ -1394,7 +1394,7 @@ public:
: QAbstractTransition(QList<QAbstractState*>() << target), m_value(value) {}
protected:
- virtual bool eventTest(QEvent *e) const
+ virtual bool eventTest(QEvent *e)
{
if (e->type() != QEvent::Type(QEvent::User+2))
return false;
@@ -1596,7 +1596,7 @@ public:
return m_args;
}
protected:
- bool eventTest(QEvent *e) const {
+ bool eventTest(QEvent *e) {
if (!QSignalTransition::eventTest(e))
return false;
QSignalEvent *se = static_cast<QSignalEvent*>(e);