Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_queues_progress_updater.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QMutex>
10#include <QMutexLocker>
11#include <QTimer>
12#include <KoProgressProxy.h>
13
14
15struct Q_DECL_HIDDEN KisQueuesProgressUpdater::Private
16{
18 : timer(q)
19 , startDelayTimer(q)
20 , queueSizeMetric(0)
21 , initialQueueSizeMetric(0)
22 , progressProxy(0)
23 , tickingRequested(false)
24 {
25 }
26
27 QMutex mutex;
28 QTimer timer;
30
33 QString jobName;
34
36
38
39 static const int TIMER_INTERVAL = 500;
40 static const int PROGRESS_DELAY = 1000;
41};
42
43
45 : QObject(parent),
46 m_d(new Private(this))
47{
48 m_d->progressProxy = progressProxy;
49
50 m_d->timer.setInterval(Private::TIMER_INTERVAL);
51 m_d->timer.setSingleShot(false);
52
53 connect(this, SIGNAL(sigStartTicking()), SLOT(startTicking()), Qt::QueuedConnection);
54 connect(this, SIGNAL(sigStopTicking()), SLOT(stopTicking()), Qt::QueuedConnection);
55 connect(&m_d->timer, SIGNAL(timeout()), SLOT(timerTicked()));
56
57 m_d->startDelayTimer.setInterval(Private::PROGRESS_DELAY);
58 m_d->startDelayTimer.setSingleShot(true);
59
60 connect(&m_d->startDelayTimer, SIGNAL(timeout()), &m_d->timer, SLOT(start()));
61 connect(&m_d->startDelayTimer, SIGNAL(timeout()), SLOT(timerTicked()));
62}
63
68
69void KisQueuesProgressUpdater::updateProgress(int queueSizeMetric, const QString &jobName)
70{
71 QMutexLocker locker(&m_d->mutex);
72
73 m_d->queueSizeMetric = queueSizeMetric;
74
75 if (queueSizeMetric &&
76 (jobName != m_d->jobName ||
77 m_d->queueSizeMetric > m_d->initialQueueSizeMetric)) {
78
79 m_d->jobName = jobName;
80 m_d->initialQueueSizeMetric = m_d->queueSizeMetric;
81 }
82
83 if (m_d->queueSizeMetric && !m_d->tickingRequested) {
84
85 m_d->tickingRequested = true;
86 Q_EMIT sigStartTicking();
87
88 } else if (!m_d->queueSizeMetric && m_d->tickingRequested) {
89
90 m_d->initialQueueSizeMetric = 0;
91 m_d->jobName.clear();
92 m_d->tickingRequested = false;
93 Q_EMIT sigStopTicking();
94 }
95}
96
101
103{
104 m_d->startDelayTimer.start();
105}
106
108{
109 m_d->startDelayTimer.stop();
110 m_d->timer.stop();
111 timerTicked();
112}
113
115{
116 QMutexLocker locker(&m_d->mutex);
117
118 if (!m_d->initialQueueSizeMetric) {
119 m_d->progressProxy->setRange(0, 100);
120 m_d->progressProxy->setValue(100);
121 m_d->progressProxy->setFormat("%p%");
122 } else {
123 m_d->progressProxy->setRange(0, m_d->initialQueueSizeMetric);
124 m_d->progressProxy->setValue(m_d->initialQueueSizeMetric - m_d->queueSizeMetric);
125 m_d->progressProxy->setFormat(m_d->jobName);
126 }
127}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void updateProgress(int queueSizeMetric, const QString &jobName)
Private(KisQueuesProgressUpdater *q)
KisQueuesProgressUpdater(KoProgressProxy *progressProxy, QObject *parent=0)