diff options
author | Jens Bache-Wiig <jens.bache-wiig@nokia.com> | 2010-09-16 14:40:07 +0200 |
---|---|---|
committer | Jens Bache-Wiig <jens.bache-wiig@nokia.com> | 2010-09-16 14:40:07 +0200 |
commit | 82fe2213b6649fd0b8c68220cf4ef58b18176d2d (patch) | |
tree | 98a7aac8fb774c470e9f7e2da7e86dea671a219c | |
parent | 6127d0d9766278a69a7e5f372659852c66ae67c0 (diff) |
Fixes to canvastimer
-rw-r--r-- | src/canvas.cpp | 36 | ||||
-rw-r--r-- | src/canvas.h | 2 | ||||
-rw-r--r-- | src/canvastimer.cpp | 36 | ||||
-rw-r--r-- | src/canvastimer.h | 7 |
4 files changed, 47 insertions, 34 deletions
diff --git a/src/canvas.cpp b/src/canvas.cpp index 36198b1..2aecc29 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -224,46 +224,22 @@ bool Canvas::save(const QString &filename) const void Canvas::setTimeout(const QScriptValue &handler, long timeout) { - if (handler.isFunction()) { - CanvasTimer *timer = new CanvasTimer(this, handler); - m_activeTimers.append(timer); - connect(timer, SIGNAL(timeout()), timer, SLOT(handleTimeout())); - timer->setInterval(timeout); - timer->setSingleShot(true); - timer->start(); - } + if (handler.isFunction()) + CanvasTimer::createTimer(this, handler, timeout, true); } void Canvas::setInterval(const QScriptValue &handler, long interval) { - if (handler.isFunction()) { - CanvasTimer *timer = new CanvasTimer(this, handler); - m_activeTimers.append(timer); - connect(timer, SIGNAL(timeout()), timer, SLOT(handleTimeout())); - timer->setInterval(interval); - timer->start(); - } -} - -void Canvas::clearTimer(const QScriptValue &handler, bool singleShot) { - for(int i = 0; i< m_activeTimers.count(); ++i) { - CanvasTimer *timer = m_activeTimers[i]; - if (timer->equals(handler) && timer->isSingleShot() == singleShot) { - Q_ASSERT(timer->isActive()); - m_activeTimers.removeAt(i); - timer->stop(); - timer->deleteLater(); - return; - } - } + if (handler.isFunction()) + CanvasTimer::createTimer(this, handler, interval, false); } void Canvas::clearTimeout(const QScriptValue &handler) { - clearTimer(handler, true); + CanvasTimer::removeTimer(handler); } void Canvas::clearInterval(const QScriptValue &handler) { - clearTimer(handler, false); + CanvasTimer::removeTimer(handler); } diff --git a/src/canvas.h b/src/canvas.h index 144eb6b..3c35c9c 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -97,13 +97,11 @@ Q_SIGNALS: void paint(); private: - void clearTimer(const QScriptValue &, bool singleShot); Context2D *m_context; int m_canvasWidth; int m_canvasHeight; FillMode m_fillMode; QColor m_color; - QList <CanvasTimer *> m_activeTimers; }; #endif //CANVAS_H diff --git a/src/canvastimer.cpp b/src/canvastimer.cpp index 546ee96..e3492fd 100644 --- a/src/canvastimer.cpp +++ b/src/canvastimer.cpp @@ -43,6 +43,8 @@ #include "canvastimer.h" +Q_GLOBAL_STATIC(QList<CanvasTimer*> , activeTimers); + CanvasTimer::CanvasTimer(QObject *parent, const QScriptValue &data) : QTimer(parent), m_value(data) { @@ -52,8 +54,38 @@ void CanvasTimer::handleTimeout() { Q_ASSERT(m_value.isFunction()); m_value.call(); - if (!isActive()) { - deleteLater(); + if (isSingleShot()) { + removeTimer(this); } } +void CanvasTimer::createTimer(QObject *parent, const QScriptValue &val, long timeout, bool singleshot) +{ + + CanvasTimer *timer = new CanvasTimer(parent, val); + timer->setInterval(timeout); + timer->setSingleShot(singleshot); + connect(timer, SIGNAL(timeout()), timer, SLOT(handleTimeout())); + activeTimers()->append(timer); + timer->start(); +} + +void CanvasTimer::removeTimer(CanvasTimer *timer) +{ + activeTimers()->removeAll(timer); + timer->deleteLater(); +} + +void CanvasTimer::removeTimer(const QScriptValue &val) +{ + if (!val.isFunction()) + return; + + for (int i = 0 ; i < activeTimers()->count() ; ++i) { + CanvasTimer *timer = activeTimers()->at(i); + if (timer->equals(val)) { + removeTimer(timer); + return; + } + } +} diff --git a/src/canvastimer.h b/src/canvastimer.h index b4d286b..044fb10 100644 --- a/src/canvastimer.h +++ b/src/canvastimer.h @@ -42,6 +42,7 @@ #include <QtScript/QScriptValue> #include <QtCore/QTimer> +#include <QtCore/QList> class CanvasTimer : public QTimer { @@ -54,8 +55,14 @@ public Q_SLOTS: void handleTimeout(); bool equals(const QScriptValue &value){return m_value.equals(value);} +public: + static void createTimer(QObject *parent, const QScriptValue &val, long timeout, bool singleshot); + static void removeTimer(CanvasTimer *timer); + static void removeTimer(const QScriptValue &); + private: QScriptValue m_value; + }; #endif // CANVASTIMER |