on ed593dc help sign in
152 lines 3.3 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);
118void FakeTimerFactory::updateTime(qint64 targetTime)
120 qint64 minTimeoutTime = targetTime;
122 for (int i = 0; i < timers.count(); ++i) {
123 FakeTimer *timer = timers[i].data();
124 if (timer && timer->isRunning() && timer->nextTimeoutTime() < minTimeoutTime) {
125 minTimeoutTime = timer->nextTimeoutTime();
126 }
127 }
129 m_timeSource->m_msecsSinceReference = minTimeoutTime;
131 for (int i = 0; i < timers.count(); ++i) {
132 FakeTimer *timer = timers[i].data();
133 if (timer) {
134 timer->update();
135 }
136 }
138 if (m_timeSource->msecsSinceReference() < targetTime) {
139 updateTime(targetTime);
140 }
143AbstractTimer *FakeTimerFactory::createTimer(QObject *parent)
145 FakeTimer *fakeTimer = new FakeTimer(m_timeSource, parent);
147 timers.append(fakeTimer);
149 return fakeTimer;
152} // namespace UbuntuGestures