on 148f507 help sign in
162 lines 3.5 kB history raw
1/*
2 * Copyright (C) 2014-2015 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
17#include "Timer.h"
19namespace UbuntuGestures {
21Timer::Timer(QObject *parent) : AbstractTimer(parent)
23 m_timer.setSingleShot(false);
24 connect(&m_timer, &QTimer::timeout, this, &AbstractTimer::timeout);
27int Timer::interval() const
29 return m_timer.interval();
32void Timer::setInterval(int msecs)
34 m_timer.setInterval(msecs);
37void Timer::start()
39 m_timer.start();
40 AbstractTimer::start();
43void Timer::stop()
45 m_timer.stop();
46 AbstractTimer::stop();
49bool Timer::isSingleShot() const
51 return m_timer.isSingleShot();
54void Timer::setSingleShot(bool value)
56 m_timer.setSingleShot(value);
59/////////////////////////////////// FakeTimer //////////////////////////////////
61FakeTimer::FakeTimer(const SharedTimeSource &timeSource, QObject *parent)
62 : UbuntuGestures::AbstractTimer(parent)
63 , m_interval(0)
64 , m_singleShot(false)
65 , m_timeSource(timeSource)
69void FakeTimer::update()
71 if (!isRunning()) {
72 return;
73 }
75 if (m_nextTimeoutTime <= m_timeSource->msecsSinceReference()) {
76 if (isSingleShot()) {
77 stop();
78 } else {
79 m_nextTimeoutTime += interval();
80 }
81 Q_EMIT timeout();
82 }
85void FakeTimer::start()
87 AbstractTimer::start();
88 m_nextTimeoutTime = m_timeSource->msecsSinceReference() + (qint64)interval();
91int FakeTimer::interval() const
93 return m_interval;
96void FakeTimer::setInterval(int msecs)
98 m_interval = msecs;
101bool FakeTimer::isSingleShot() const
103 return m_singleShot;
106void FakeTimer::setSingleShot(bool value)
108 m_singleShot = value;
111/////////////////////////////////// FakeTimerFactory //////////////////////////////////
113FakeTimerFactory::FakeTimerFactory()
115 m_timeSource.reset(new FakeTimeSource);
118FakeTimerFactory::~FakeTimerFactory()
120 for (int i = 0; i < timers.count(); ++i) {
121 FakeTimer *timer = timers[i].data();
122 if (timer) {
123 delete timer;
124 }
125 }
128void FakeTimerFactory::updateTime(qint64 targetTime)
130 qint64 minTimeoutTime = targetTime;
132 for (int i = 0; i < timers.count(); ++i) {
133 FakeTimer *timer = timers[i].data();
134 if (timer && timer->isRunning() && timer->nextTimeoutTime() < minTimeoutTime) {
135 minTimeoutTime = timer->nextTimeoutTime();
136 }
137 }
139 m_timeSource->m_msecsSinceReference = minTimeoutTime;
141 for (int i = 0; i < timers.count(); ++i) {
142 FakeTimer *timer = timers[i].data();
143 if (timer) {
144 timer->update();
145 }
146 }
148 if (m_timeSource->msecsSinceReference() < targetTime) {
149 updateTime(targetTime);
150 }
153AbstractTimer *FakeTimerFactory::createTimer(QObject *parent)
155 FakeTimer *fakeTimer = new FakeTimer(m_timeSource, parent);
157 timers.append(fakeTimer);
159 return fakeTimer;
162} // namespace UbuntuGestures