summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2009-11-25 05:07:43 (GMT)
committerBea Lam <bea.lam@nokia.com>2009-11-25 05:07:43 (GMT)
commitd8010cfa362a3007d8e71791dea247910bf8d1f6 (patch)
tree48cbb8116d9d6e6166074fe2164b17ef42ede681 /src
parent20504e30096f2942abcadb966b26c834a6062ea5 (diff)
parentf35069228181ed3e5fe7e7b4a51ec4092093d597 (diff)
downloadQt-d8010cfa362a3007d8e71791dea247910bf8d1f6.zip
Qt-d8010cfa362a3007d8e71791dea247910bf8d1f6.tar.gz
Qt-d8010cfa362a3007d8e71791dea247910bf8d1f6.tar.bz2
Merge branch 'kinetic-declarativeui' of scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Conflicts: doc/src/declarative/extending.qdoc
Diffstat (limited to 'src')
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsanchors.cpp39
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsanchors_p.h27
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h7
-rw-r--r--src/declarative/graphicsitems/qmlgraphicsimage.cpp1
-rw-r--r--src/declarative/graphicsitems/qmlgraphicspainteditem.cpp4
-rw-r--r--src/declarative/graphicsitems/qmlgraphicswebview.cpp52
-rw-r--r--src/declarative/graphicsitems/qmlgraphicswebview_p.h3
-rw-r--r--src/declarative/util/qmlstategroup.cpp4
-rw-r--r--src/declarative/util/qmltimer.cpp44
-rw-r--r--src/declarative/util/qmltimer_p.h3
10 files changed, 143 insertions, 41 deletions
diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors.cpp b/src/declarative/graphicsitems/qmlgraphicsanchors.cpp
index 61b6ecc..f26fbf5 100644
--- a/src/declarative/graphicsitems/qmlgraphicsanchors.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicsanchors.cpp
@@ -349,6 +349,9 @@ QmlGraphicsItem *QmlGraphicsAnchors::fill() const
void QmlGraphicsAnchors::setFill(QmlGraphicsItem *f)
{
Q_D(QmlGraphicsAnchors);
+ if (d->fill == f)
+ return;
+
if (!f) {
d->remDepend(d->fill);
d->fill = f;
@@ -361,7 +364,7 @@ void QmlGraphicsAnchors::setFill(QmlGraphicsItem *f)
d->remDepend(d->fill);
d->fill = f;
d->addDepend(d->fill);
-
+ emit fillChanged();
d->fillChanged();
}
@@ -374,6 +377,9 @@ QmlGraphicsItem *QmlGraphicsAnchors::centerIn() const
void QmlGraphicsAnchors::setCenterIn(QmlGraphicsItem* c)
{
Q_D(QmlGraphicsAnchors);
+ if (d->centerIn == c)
+ return;
+
if (!c) {
d->remDepend(d->centerIn);
d->centerIn = c;
@@ -387,7 +393,7 @@ void QmlGraphicsAnchors::setCenterIn(QmlGraphicsItem* c)
d->remDepend(d->centerIn);
d->centerIn = c;
d->addDepend(d->centerIn);
-
+ emit centerInChanged();
d->centerInChanged();
}
@@ -553,7 +559,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::top() const
void QmlGraphicsAnchors::setTop(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkVAnchorValid(edge))
+ if (!d->checkVAnchorValid(edge) || d->top == edge)
return;
d->usedAnchors |= HasTopAnchor;
@@ -566,6 +572,7 @@ void QmlGraphicsAnchors::setTop(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->top.item);
d->top = edge;
d->addDepend(d->top.item);
+ emit topChanged();
d->updateVerticalAnchors();
}
@@ -575,6 +582,7 @@ void QmlGraphicsAnchors::resetTop()
d->usedAnchors &= ~HasTopAnchor;
d->remDepend(d->top.item);
d->top = QmlGraphicsAnchorLine();
+ emit topChanged();
d->updateVerticalAnchors();
}
@@ -587,7 +595,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::bottom() const
void QmlGraphicsAnchors::setBottom(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkVAnchorValid(edge))
+ if (!d->checkVAnchorValid(edge) || d->bottom == edge)
return;
d->usedAnchors |= HasBottomAnchor;
@@ -600,6 +608,7 @@ void QmlGraphicsAnchors::setBottom(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->bottom.item);
d->bottom = edge;
d->addDepend(d->bottom.item);
+ emit bottomChanged();
d->updateVerticalAnchors();
}
@@ -609,6 +618,7 @@ void QmlGraphicsAnchors::resetBottom()
d->usedAnchors &= ~HasBottomAnchor;
d->remDepend(d->bottom.item);
d->bottom = QmlGraphicsAnchorLine();
+ emit bottomChanged();
d->updateVerticalAnchors();
}
@@ -621,7 +631,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::verticalCenter() const
void QmlGraphicsAnchors::setVerticalCenter(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkVAnchorValid(edge))
+ if (!d->checkVAnchorValid(edge) || d->vCenter == edge)
return;
d->usedAnchors |= HasVCenterAnchor;
@@ -634,6 +644,7 @@ void QmlGraphicsAnchors::setVerticalCenter(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->vCenter.item);
d->vCenter = edge;
d->addDepend(d->vCenter.item);
+ emit verticalCenterChanged();
d->updateVerticalAnchors();
}
@@ -643,6 +654,7 @@ void QmlGraphicsAnchors::resetVerticalCenter()
d->usedAnchors &= ~HasVCenterAnchor;
d->remDepend(d->vCenter.item);
d->vCenter = QmlGraphicsAnchorLine();
+ emit verticalCenterChanged();
d->updateVerticalAnchors();
}
@@ -655,7 +667,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::baseline() const
void QmlGraphicsAnchors::setBaseline(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkVAnchorValid(edge))
+ if (!d->checkVAnchorValid(edge) || d->baseline == edge)
return;
d->usedAnchors |= HasBaselineAnchor;
@@ -668,6 +680,7 @@ void QmlGraphicsAnchors::setBaseline(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->baseline.item);
d->baseline = edge;
d->addDepend(d->baseline.item);
+ emit baselineChanged();
d->updateVerticalAnchors();
}
@@ -677,6 +690,7 @@ void QmlGraphicsAnchors::resetBaseline()
d->usedAnchors &= ~HasBaselineAnchor;
d->remDepend(d->baseline.item);
d->baseline = QmlGraphicsAnchorLine();
+ emit baselineChanged();
d->updateVerticalAnchors();
}
@@ -689,7 +703,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::left() const
void QmlGraphicsAnchors::setLeft(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkHAnchorValid(edge))
+ if (!d->checkHAnchorValid(edge) || d->left == edge)
return;
d->usedAnchors |= HasLeftAnchor;
@@ -702,6 +716,7 @@ void QmlGraphicsAnchors::setLeft(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->left.item);
d->left = edge;
d->addDepend(d->left.item);
+ emit leftChanged();
d->updateHorizontalAnchors();
}
@@ -711,6 +726,7 @@ void QmlGraphicsAnchors::resetLeft()
d->usedAnchors &= ~HasLeftAnchor;
d->remDepend(d->left.item);
d->left = QmlGraphicsAnchorLine();
+ emit leftChanged();
d->updateHorizontalAnchors();
}
@@ -723,7 +739,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::right() const
void QmlGraphicsAnchors::setRight(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkHAnchorValid(edge))
+ if (!d->checkHAnchorValid(edge) || d->right == edge)
return;
d->usedAnchors |= HasRightAnchor;
@@ -736,7 +752,7 @@ void QmlGraphicsAnchors::setRight(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->right.item);
d->right = edge;
d->addDepend(d->right.item);
-
+ emit rightChanged();
d->updateHorizontalAnchors();
}
@@ -746,6 +762,7 @@ void QmlGraphicsAnchors::resetRight()
d->usedAnchors &= ~HasRightAnchor;
d->remDepend(d->right.item);
d->right = QmlGraphicsAnchorLine();
+ emit rightChanged();
d->updateHorizontalAnchors();
}
@@ -758,7 +775,7 @@ QmlGraphicsAnchorLine QmlGraphicsAnchors::horizontalCenter() const
void QmlGraphicsAnchors::setHorizontalCenter(const QmlGraphicsAnchorLine &edge)
{
Q_D(QmlGraphicsAnchors);
- if (!d->checkHAnchorValid(edge))
+ if (!d->checkHAnchorValid(edge) || d->hCenter == edge)
return;
d->usedAnchors |= HasHCenterAnchor;
@@ -771,6 +788,7 @@ void QmlGraphicsAnchors::setHorizontalCenter(const QmlGraphicsAnchorLine &edge)
d->remDepend(d->hCenter.item);
d->hCenter = edge;
d->addDepend(d->hCenter.item);
+ emit horizontalCenterChanged();
d->updateHorizontalAnchors();
}
@@ -780,6 +798,7 @@ void QmlGraphicsAnchors::resetHorizontalCenter()
d->usedAnchors &= ~HasHCenterAnchor;
d->remDepend(d->hCenter.item);
d->hCenter = QmlGraphicsAnchorLine();
+ emit horizontalCenterChanged();
d->updateHorizontalAnchors();
}
diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors_p.h b/src/declarative/graphicsitems/qmlgraphicsanchors_p.h
index bdddafe..e432428 100644
--- a/src/declarative/graphicsitems/qmlgraphicsanchors_p.h
+++ b/src/declarative/graphicsitems/qmlgraphicsanchors_p.h
@@ -58,13 +58,13 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsAnchors : public QObject
{
Q_OBJECT
- Q_PROPERTY(QmlGraphicsAnchorLine left READ left WRITE setLeft RESET resetLeft)
- Q_PROPERTY(QmlGraphicsAnchorLine right READ right WRITE setRight RESET resetRight)
- Q_PROPERTY(QmlGraphicsAnchorLine horizontalCenter READ horizontalCenter WRITE setHorizontalCenter RESET resetHorizontalCenter)
- Q_PROPERTY(QmlGraphicsAnchorLine top READ top WRITE setTop RESET resetTop)
- Q_PROPERTY(QmlGraphicsAnchorLine bottom READ bottom WRITE setBottom RESET resetBottom)
- Q_PROPERTY(QmlGraphicsAnchorLine verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter)
- Q_PROPERTY(QmlGraphicsAnchorLine baseline READ baseline WRITE setBaseline RESET resetBaseline)
+ Q_PROPERTY(QmlGraphicsAnchorLine left READ left WRITE setLeft RESET resetLeft NOTIFY leftChanged)
+ Q_PROPERTY(QmlGraphicsAnchorLine right READ right WRITE setRight RESET resetRight NOTIFY rightChanged)
+ Q_PROPERTY(QmlGraphicsAnchorLine horizontalCenter READ horizontalCenter WRITE setHorizontalCenter RESET resetHorizontalCenter NOTIFY horizontalCenterChanged)
+ Q_PROPERTY(QmlGraphicsAnchorLine top READ top WRITE setTop RESET resetTop NOTIFY topChanged)
+ Q_PROPERTY(QmlGraphicsAnchorLine bottom READ bottom WRITE setBottom RESET resetBottom NOTIFY bottomChanged)
+ Q_PROPERTY(QmlGraphicsAnchorLine verticalCenter READ verticalCenter WRITE setVerticalCenter RESET resetVerticalCenter NOTIFY verticalCenterChanged)
+ Q_PROPERTY(QmlGraphicsAnchorLine baseline READ baseline WRITE setBaseline RESET resetBaseline NOTIFY baselineChanged)
Q_PROPERTY(qreal leftMargin READ leftMargin WRITE setLeftMargin NOTIFY leftMarginChanged)
Q_PROPERTY(qreal rightMargin READ rightMargin WRITE setRightMargin NOTIFY rightMarginChanged)
Q_PROPERTY(qreal horizontalCenterOffset READ horizontalCenterOffset WRITE setHorizontalCenterOffset NOTIFY horizontalCenterOffsetChanged())
@@ -72,8 +72,8 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsAnchors : public QObject
Q_PROPERTY(qreal bottomMargin READ bottomMargin WRITE setBottomMargin NOTIFY bottomMarginChanged)
Q_PROPERTY(qreal verticalCenterOffset READ verticalCenterOffset WRITE setVerticalCenterOffset NOTIFY verticalCenterOffsetChanged())
Q_PROPERTY(qreal baselineOffset READ baselineOffset WRITE setBaselineOffset NOTIFY baselineOffsetChanged())
- Q_PROPERTY(QmlGraphicsItem *fill READ fill WRITE setFill)
- Q_PROPERTY(QmlGraphicsItem *centerIn READ centerIn WRITE setCenterIn)
+ Q_PROPERTY(QmlGraphicsItem *fill READ fill WRITE setFill NOTIFY fillChanged)
+ Q_PROPERTY(QmlGraphicsItem *centerIn READ centerIn WRITE setCenterIn NOTIFY centerInChanged)
public:
QmlGraphicsAnchors(QObject *parent=0);
@@ -155,6 +155,15 @@ public:
void componentComplete();
Q_SIGNALS:
+ void leftChanged();
+ void rightChanged();
+ void topChanged();
+ void bottomChanged();
+ void verticalCenterChanged();
+ void horizontalCenterChanged();
+ void baselineChanged();
+ void fillChanged();
+ void centerInChanged();
void leftMarginChanged();
void rightMarginChanged();
void topMarginChanged();
diff --git a/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h b/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h
index d21d9c5..2156565 100644
--- a/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h
+++ b/src/declarative/graphicsitems/qmlgraphicsanchors_p_p.h
@@ -80,9 +80,16 @@ public:
QmlGraphicsItem *item;
AnchorLine anchorLine;
+
+ bool operator==(const QmlGraphicsAnchorLine& other) const
+ {
+ return item == other.item && anchorLine == other.anchorLine;
+ }
};
Q_DECLARE_METATYPE(QmlGraphicsAnchorLine)
+
+
class QmlGraphicsAnchorsPrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QmlGraphicsAnchors)
diff --git a/src/declarative/graphicsitems/qmlgraphicsimage.cpp b/src/declarative/graphicsitems/qmlgraphicsimage.cpp
index 9d59796..38df0c7 100644
--- a/src/declarative/graphicsitems/qmlgraphicsimage.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicsimage.cpp
@@ -171,6 +171,7 @@ void QmlGraphicsImagePrivate::setPixmap(const QPixmap &pixmap)
q->setImplicitWidth(pix.width());
q->setImplicitHeight(pix.height());
+ status = pix.isNull() ? QmlGraphicsImageBase::Null : QmlGraphicsImageBase::Ready;
q->update();
emit q->pixmapChanged();
diff --git a/src/declarative/graphicsitems/qmlgraphicspainteditem.cpp b/src/declarative/graphicsitems/qmlgraphicspainteditem.cpp
index 2f467e7..948f69a 100644
--- a/src/declarative/graphicsitems/qmlgraphicspainteditem.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicspainteditem.cpp
@@ -289,7 +289,7 @@ void QmlGraphicsPaintedItem::paint(QPainter *p, const QStyleOptionGraphicsItem *
}
cachesize -= d->imagecache[oldest]->area.width()*d->imagecache[oldest]->area.height();
uncached += d->imagecache[oldest]->area;
- d->imagecache.removeAt(oldest);
+ delete d->imagecache.takeAt(oldest);
}
const QRegion bigger = QRegion(biggerrect) & uncached;
const QVector<QRect> rects = bigger.rects();
@@ -366,7 +366,7 @@ void QmlGraphicsPaintedItem::setPixelCacheSize(int pixels)
}
}
cachesize -= d->imagecache[oldest]->area.width()*d->imagecache[oldest]->area.height();
- d->imagecache.removeAt(oldest);
+ delete d->imagecache.takeAt(oldest);
}
}
d->max_imagecache_size = pixels;
diff --git a/src/declarative/graphicsitems/qmlgraphicswebview.cpp b/src/declarative/graphicsitems/qmlgraphicswebview.cpp
index aedf787..e21bda3 100644
--- a/src/declarative/graphicsitems/qmlgraphicswebview.cpp
+++ b/src/declarative/graphicsitems/qmlgraphicswebview.cpp
@@ -79,6 +79,7 @@ public:
: QmlGraphicsPaintedItemPrivate(), page(0), preferredwidth(0), preferredheight(0),
progress(1.0), status(QmlGraphicsWebView::Null), pending(PendingNone),
newWindowComponent(0), newWindowParent(0),
+ pressTime(400),
windowObjects(this),
rendering(true)
{
@@ -99,6 +100,11 @@ public:
QmlComponent *newWindowComponent;
QmlGraphicsItem *newWindowParent;
+ QBasicTimer pressTimer;
+ QPoint pressPoint;
+ int pressTime; // milliseconds before it's a "hold" XXX not currently settable
+ static const int pressDragLength = 15; // XXX #pixels before it's no longer a "hold"; device-specific
+
void updateWindowObjects();
class WindowObjectList : public QmlConcreteList<QObject *>
{
@@ -613,8 +619,15 @@ bool QmlGraphicsWebView::heuristicZoom(int clickX, int clickY, qreal maxzoom)
void QmlGraphicsWebView::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
+ Q_D(QmlGraphicsWebView);
+
setFocus (true);
QMouseEvent *me = sceneMouseEventToMouseEvent(event);
+
+ d->pressPoint = me->pos();
+ d->pressTimer.start(d->pressTime,this);
+ setKeepMouseGrab(false);
+
page()->event(me);
event->setAccepted(
/*
@@ -636,8 +649,11 @@ void QmlGraphicsWebView::mousePressEvent(QGraphicsSceneMouseEvent *event)
void QmlGraphicsWebView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
+ Q_D(QmlGraphicsWebView);
+
QMouseEvent *me = sceneMouseEventToMouseEvent(event);
page()->event(me);
+ d->pressTimer.stop();
event->setAccepted(
/*
It is not correct to send the press event upwards, if it is not accepted by WebKit
@@ -653,24 +669,45 @@ void QmlGraphicsWebView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
if (!event->isAccepted()) {
QmlGraphicsPaintedItem::mouseReleaseEvent(event);
}
+ setKeepMouseGrab(false);
+ ungrabMouse();
+}
+
+void QmlGraphicsWebView::timerEvent(QTimerEvent *event)
+{
+ Q_D(QmlGraphicsWebView);
+ if (event->timerId() == d->pressTimer.timerId()) {
+ d->pressTimer.stop();
+ grabMouse();
+ setKeepMouseGrab(true);
+ }
}
void QmlGraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
+ Q_D(QmlGraphicsWebView);
+
QMouseEvent *me = sceneMouseEventToMouseEvent(event);
- page()->event(me);
- event->setAccepted(
+ if (d->pressTimer.isActive()) {
+ if ((me->pos() - d->pressPoint).manhattanLength() > d->pressDragLength) {
+ d->pressTimer.stop();
+ }
+ }
+ if (keepMouseGrab()) {
+ page()->event(me);
+ event->setAccepted(
/*
It is not correct to send the press event upwards, if it is not accepted by WebKit
e.g. push button does not work, if done so as QGraphicsScene will not send the release event at all to WebKit
Might be a bug in WebKit, though
*/
#if 1 // QT_VERSION <= 0x040500 // XXX see bug 230835
- true
+ true
#else
- me->isAccepted()
+ me->isAccepted()
#endif
- );
+ );
+ }
delete me;
if (!event->isAccepted())
QmlGraphicsPaintedItem::mouseMoveEvent(event);
@@ -722,7 +759,6 @@ bool QmlGraphicsWebView::sceneEvent(QEvent *event)
}
-
/*!
\qmlproperty action WebView::back
This property holds the action for causing the previous URL in the history to be displayed.
@@ -1161,6 +1197,8 @@ void QmlGraphicsWebPage::javaScriptConsoleMessage(const QString& message, int li
QString QmlGraphicsWebPage::chooseFile(QWebFrame *originatingFrame, const QString& oldFile)
{
// Not supported (it's modal)
+ Q_UNUSED(originatingFrame)
+ Q_UNUSED(oldFile)
return oldFile;
}
@@ -1172,6 +1210,8 @@ void QmlGraphicsWebPage::javaScriptAlert(QWebFrame *originatingFrame, const QStr
bool QmlGraphicsWebPage::javaScriptConfirm(QWebFrame *originatingFrame, const QString& msg)
{
// Not supported (it's modal)
+ Q_UNUSED(originatingFrame)
+ Q_UNUSED(msg)
return false;
}
diff --git a/src/declarative/graphicsitems/qmlgraphicswebview_p.h b/src/declarative/graphicsitems/qmlgraphicswebview_p.h
index 17546c1..7ff51f3 100644
--- a/src/declarative/graphicsitems/qmlgraphicswebview_p.h
+++ b/src/declarative/graphicsitems/qmlgraphicswebview_p.h
@@ -89,7 +89,7 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsWebView : public QmlGraphicsPaintedItem
{
Q_OBJECT
- Q_ENUMS(Status)
+ Q_ENUMS(Status SelectionMode)
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(QPixmap icon READ icon NOTIFY iconChanged)
@@ -220,6 +220,7 @@ protected:
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
+ void timerEvent(QTimerEvent *event);
void hoverMoveEvent (QGraphicsSceneHoverEvent * event);
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
diff --git a/src/declarative/util/qmlstategroup.cpp b/src/declarative/util/qmlstategroup.cpp
index 4dfa34a..f206f5c 100644
--- a/src/declarative/util/qmlstategroup.cpp
+++ b/src/declarative/util/qmlstategroup.cpp
@@ -331,8 +331,10 @@ void QmlStateGroupPrivate::setCurrentStateInternal(const QString &state,
bool ignoreTrans)
{
Q_Q(QmlStateGroup);
- if (!componentComplete)
+ if (!componentComplete) {
+ currentState = state;
return;
+ }
if (applyingState) {
qWarning() << "Can't apply a state change as part of a state definition.";
diff --git a/src/declarative/util/qmltimer.cpp b/src/declarative/util/qmltimer.cpp
index 6ac4e32..da60193 100644
--- a/src/declarative/util/qmltimer.cpp
+++ b/src/declarative/util/qmltimer.cpp
@@ -55,7 +55,7 @@ class QmlTimerPrivate : public QObjectPrivate
public:
QmlTimerPrivate()
: interval(1000), running(false), repeating(false), triggeredOnStart(false)
- , classBegun(false), componentComplete(false) {}
+ , classBegun(false), componentComplete(false), firstTick(true) {}
int interval;
QPauseAnimation pause;
bool running : 1;
@@ -63,6 +63,7 @@ public:
bool triggeredOnStart : 1;
bool classBegun : 1;
bool componentComplete : 1;
+ bool firstTick : 1;
};
/*!
@@ -88,6 +89,12 @@ public:
QmlTimer is synchronized with the animation timer. Since the animation
timer is usually set to 60fps, the resolution of QmlTimer will be
at best 16ms.
+
+ If the Timer is running and one of its properties is changed, the
+ elapsed time will be reset. For example, if a Timer with interval of
+ 1000ms has its \e repeat property changed 500ms after starting, the
+ elapsed time will be reset to 0, and the Timer will be triggered
+ 1000ms later.
*/
QmlTimer::QmlTimer(QObject *parent)
@@ -95,8 +102,7 @@ QmlTimer::QmlTimer(QObject *parent)
{
Q_D(QmlTimer);
connect(&d->pause, SIGNAL(currentLoopChanged(int)), this, SLOT(ticked()));
- connect(&d->pause, SIGNAL(stateChanged(QAbstractAnimation::State,QAbstractAnimation::State))
- , this, SLOT(stateChanged(QAbstractAnimation::State,QAbstractAnimation::State)));
+ connect(&d->pause, SIGNAL(finished()), this, SLOT(finished()));
d->pause.setLoopCount(1);
d->pause.setDuration(d->interval);
}
@@ -145,6 +151,7 @@ void QmlTimer::setRunning(bool running)
Q_D(QmlTimer);
if (d->running != running) {
d->running = running;
+ d->firstTick = true;
emit runningChanged();
update();
}
@@ -232,6 +239,20 @@ void QmlTimer::stop()
setRunning(false);
}
+/*!
+ \qmlmethod Timer::restart()
+ \brief Restarts the timer.
+
+ If the Timer is not running it will be started, otherwise it will be
+ stopped, reset to initial state and started. The \c running property
+ will be true following a call to \c restart().
+*/
+void QmlTimer::restart()
+{
+ setRunning(false);
+ setRunning(true);
+}
+
void QmlTimer::update()
{
Q_D(QmlTimer);
@@ -239,10 +260,11 @@ void QmlTimer::update()
return;
d->pause.stop();
if (d->running) {
+ d->pause.setCurrentTime(0);
d->pause.setLoopCount(d->repeating ? -1 : 1);
d->pause.setDuration(d->interval);
d->pause.start();
- if (d->triggeredOnStart) {
+ if (d->triggeredOnStart && d->firstTick) {
QCoreApplication::removePostedEvents(this, QEvent::MetaCall);
QMetaObject::invokeMethod(this, "ticked", Qt::QueuedConnection);
}
@@ -270,18 +292,18 @@ void QmlTimer::componentComplete()
void QmlTimer::ticked()
{
Q_D(QmlTimer);
- if (d->running)
+ if (d->running && (d->pause.currentTime() > 0 || (d->triggeredOnStart && d->firstTick)))
emit triggered();
+ d->firstTick = false;
}
-void QmlTimer::stateChanged(QAbstractAnimation::State state, QAbstractAnimation::State)
+void QmlTimer::finished()
{
Q_D(QmlTimer);
- if (d->running && state != QAbstractAnimation::Running) {
- d->running = false;
- emit triggered();
- emit runningChanged();
- }
+ if (d->repeating || !d->running)
+ return;
+ emit triggered();
+ d->firstTick = false;
}
QT_END_NAMESPACE
diff --git a/src/declarative/util/qmltimer_p.h b/src/declarative/util/qmltimer_p.h
index bd96d4a..50cae2b 100644
--- a/src/declarative/util/qmltimer_p.h
+++ b/src/declarative/util/qmltimer_p.h
@@ -85,6 +85,7 @@ protected:
public Q_SLOTS:
void start();
void stop();
+ void restart();
Q_SIGNALS:
void triggered();
@@ -95,7 +96,7 @@ private:
private Q_SLOTS:
void ticked();
- void stateChanged(QAbstractAnimation::State,QAbstractAnimation::State);
+ void finished();
};
QT_END_NAMESPACE