on xenial help sign in
Make DirectionalDragArea::setRecognitionTimer() more robust
eee5034Daniel d'Andrada
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+7−5
@@ -31,8 +31,8 @@ public:
31 }
31 }
32 virtual int interval() const { return m_timer.interval(); }
32 virtual int interval() const { return m_timer.interval(); }
33 virtual void setInterval(int msecs) { m_timer.setInterval(msecs); }
33 virtual void setInterval(int msecs) { m_timer.setInterval(msecs); }
34− virtual void start() { m_timer.start(); }
34+ virtual void start() { m_timer.start(); UbuntuGestures::AbstractTimer::start(); }
35− virtual void stop() { m_timer.stop(); }
35+ virtual void stop() { m_timer.stop(); UbuntuGestures::AbstractTimer::stop(); }
36private:
36private:
37 QTimer m_timer;
37 QTimer m_timer;
38};
38};
@@ -120,14 +120,13 @@ void DirectionalDragArea::setMaxSilenceTime(int value)
120
120
121void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *timer)
121void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *timer)
122{
122{
123− // NB: We assume test code (the only client of this method) won't call it while
124− // the current timer is active
125−
126 int interval = 0;
123 int interval = 0;
124+ bool timerWasRunning = false;
127
125
128 // can be null when called from the constructor
126 // can be null when called from the constructor
129 if (m_recognitionTimer) {
127 if (m_recognitionTimer) {
130 interval = m_recognitionTimer->interval();
128 interval = m_recognitionTimer->interval();
129+ timerWasRunning = m_recognitionTimer->isRunning();
131 if (m_recognitionTimer->parent() == this) {
130 if (m_recognitionTimer->parent() == this) {
132 delete m_recognitionTimer;
131 delete m_recognitionTimer;
133 }
132 }
@@ -137,6 +136,9 @@ void DirectionalDragArea::setRecognitionTimer(UbuntuGestures::AbstractTimer *tim
137 timer->setInterval(interval);
136 timer->setInterval(interval);
138 connect(timer, &UbuntuGestures::AbstractTimer::timeout,
137 connect(timer, &UbuntuGestures::AbstractTimer::timeout,
139 this, &DirectionalDragArea::checkSpeed);
138 this, &DirectionalDragArea::checkSpeed);
139+ if (timerWasRunning) {
140+ m_recognitionTimer->start();
141+ }
140}
142}
141
143
142void DirectionalDragArea::setAxisVelocityCalculator(AxisVelocityCalculator *newVelCalc)
144void DirectionalDragArea::setAxisVelocityCalculator(AxisVelocityCalculator *newVelCalc)
plugins/Ubuntu/Gestures/DirectionalDragArea.h+6−3
@@ -27,13 +27,16 @@ namespace UbuntuGestures {
27class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject {
27class UBUNTUGESTURES_EXPORT AbstractTimer : public QObject {
28 Q_OBJECT
28 Q_OBJECT
29public:
29public:
30− AbstractTimer(QObject *parent) : QObject(parent) {}
30+ AbstractTimer(QObject *parent) : QObject(parent), m_isRunning(false) {}
31 virtual int interval() const = 0;
31 virtual int interval() const = 0;
32 virtual void setInterval(int msecs) = 0;
32 virtual void setInterval(int msecs) = 0;
33− virtual void start() = 0;
33+ virtual void start() { m_isRunning = true; };
34− virtual void stop() = 0;
34+ virtual void stop() { m_isRunning = false; }
35+ bool isRunning() const { return m_isRunning; }
35Q_SIGNALS:
36Q_SIGNALS:
36 void timeout();
37 void timeout();
38+private:
39+ bool m_isRunning;
37};
40};
38}
41}
39
42
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+1−6
@@ -27,20 +27,15 @@ class FakeTimer : public UbuntuGestures::AbstractTimer
27 Q_OBJECT
27 Q_OBJECT
28public:
28public:
29 FakeTimer(QObject *parent = 0)
29 FakeTimer(QObject *parent = 0)
30− : UbuntuGestures::AbstractTimer(parent),
30+ : UbuntuGestures::AbstractTimer(parent)
31− m_isRunning(false)
32 {}
31 {}
33
32
34 virtual int interval() const { return m_duration; }
33 virtual int interval() const { return m_duration; }
35 virtual void setInterval(int msecs) { m_duration = msecs; }
34 virtual void setInterval(int msecs) { m_duration = msecs; }
36− virtual void start() { m_isRunning = true; }
37− virtual void stop() { m_isRunning = false; }
38
35
39− bool isRunning() const { return m_isRunning; }
40 void emitTimeout() {Q_EMIT timeout();}
36 void emitTimeout() {Q_EMIT timeout();}
41private:
37private:
42 int m_duration;
38 int m_duration;
43− bool m_isRunning;
44};
39};
45
40
46class FakeTimeSource : public AxisVelocityCalculator::TimeSource
41class FakeTimeSource : public AxisVelocityCalculator::TimeSource