-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathqcrefresher.cpp
81 lines (62 loc) · 1.54 KB
/
qcrefresher.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <QtCore>
#include "qcrefresher.h"
QCRefresher::QCRefresher(QObject* parent) : QObject(parent)
{
m_pending = false;
setFrameRate(60);
timer.start();
lastElapsedTimerEvent = -1;
}
void QCRefresher::markDirty(QObject *object)
{
if (dirtyObjects.contains(object)) {
return;
}
list << object;
dirtyObjects[object] = true;
requestRefresh();
}
void QCRefresher::timerEvent(QTimerEvent *event)
{
killTimer(event->timerId());
lastElapsedTimerEvent = timer.elapsed();
QList<QPointer<QObject> > queue = list;
list.clear();
dirtyObjects.clear();
m_pending = false;
for (int i = 0 ; i < queue.size() ; i++) {
QObject* target = queue.at(i);
if (target) {
QMetaObject::invokeMethod(target,"refresh",Qt::DirectConnection);
}
}
emit refresh();
}
int QCRefresher::frameRate() const
{
return m_frameRate;
}
void QCRefresher::setFrameRate(int frameRate)
{
if (frameRate <= 0 || frameRate > 1000) {
qWarning() << "Refersher::Invalid frame rate";
return;
}
m_frameRate = frameRate;
m_interval = 1000 / m_frameRate;
emit frameRateChanged();
}
void QCRefresher::requestRefresh()
{
if (m_pending) {
return;
}
m_pending = true;
int elapsed = timer.elapsed();
int next = elapsed % m_interval;
if (next == 0 && lastElapsedTimerEvent == elapsed) {
// Condition: Mark a item dirty just after executed the refresh function.
next = m_interval - 1;
}
startTimer(next);
}