File indexing completed on 2024-05-12 15:58:38
0001 /* 0002 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kis_queues_progress_updater.h" 0008 0009 #include <QMutex> 0010 #include <QTimer> 0011 #include <KoProgressProxy.h> 0012 0013 0014 struct Q_DECL_HIDDEN KisQueuesProgressUpdater::Private 0015 { 0016 Private(KisQueuesProgressUpdater *q) 0017 : timer(q) 0018 , startDelayTimer(q) 0019 , queueSizeMetric(0) 0020 , initialQueueSizeMetric(0) 0021 , progressProxy(0) 0022 , tickingRequested(false) 0023 { 0024 } 0025 0026 QMutex mutex; 0027 QTimer timer; 0028 QTimer startDelayTimer; 0029 0030 int queueSizeMetric; 0031 int initialQueueSizeMetric; 0032 QString jobName; 0033 0034 KoProgressProxy *progressProxy; 0035 0036 bool tickingRequested; 0037 0038 static const int TIMER_INTERVAL = 500; 0039 static const int PROGRESS_DELAY = 1000; 0040 }; 0041 0042 0043 KisQueuesProgressUpdater::KisQueuesProgressUpdater(KoProgressProxy *progressProxy, QObject *parent) 0044 : QObject(parent), 0045 m_d(new Private(this)) 0046 { 0047 m_d->progressProxy = progressProxy; 0048 0049 m_d->timer.setInterval(Private::TIMER_INTERVAL); 0050 m_d->timer.setSingleShot(false); 0051 0052 connect(this, SIGNAL(sigStartTicking()), SLOT(startTicking()), Qt::QueuedConnection); 0053 connect(this, SIGNAL(sigStopTicking()), SLOT(stopTicking()), Qt::QueuedConnection); 0054 connect(&m_d->timer, SIGNAL(timeout()), SLOT(timerTicked())); 0055 0056 m_d->startDelayTimer.setInterval(Private::PROGRESS_DELAY); 0057 m_d->startDelayTimer.setSingleShot(true); 0058 0059 connect(&m_d->startDelayTimer, SIGNAL(timeout()), &m_d->timer, SLOT(start())); 0060 connect(&m_d->startDelayTimer, SIGNAL(timeout()), SLOT(timerTicked())); 0061 } 0062 0063 KisQueuesProgressUpdater::~KisQueuesProgressUpdater() 0064 { 0065 delete m_d; 0066 } 0067 0068 void KisQueuesProgressUpdater::updateProgress(int queueSizeMetric, const QString &jobName) 0069 { 0070 QMutexLocker locker(&m_d->mutex); 0071 0072 m_d->queueSizeMetric = queueSizeMetric; 0073 0074 if (queueSizeMetric && 0075 (jobName != m_d->jobName || 0076 m_d->queueSizeMetric > m_d->initialQueueSizeMetric)) { 0077 0078 m_d->jobName = jobName; 0079 m_d->initialQueueSizeMetric = m_d->queueSizeMetric; 0080 } 0081 0082 if (m_d->queueSizeMetric && !m_d->tickingRequested) { 0083 0084 m_d->tickingRequested = true; 0085 emit sigStartTicking(); 0086 0087 } else if (!m_d->queueSizeMetric && m_d->tickingRequested) { 0088 0089 m_d->initialQueueSizeMetric = 0; 0090 m_d->jobName.clear(); 0091 m_d->tickingRequested = false; 0092 emit sigStopTicking(); 0093 } 0094 } 0095 0096 void KisQueuesProgressUpdater::hide() 0097 { 0098 updateProgress(0, ""); 0099 } 0100 0101 void KisQueuesProgressUpdater::startTicking() 0102 { 0103 m_d->startDelayTimer.start(); 0104 } 0105 0106 void KisQueuesProgressUpdater::stopTicking() 0107 { 0108 m_d->startDelayTimer.stop(); 0109 m_d->timer.stop(); 0110 timerTicked(); 0111 } 0112 0113 void KisQueuesProgressUpdater::timerTicked() 0114 { 0115 QMutexLocker locker(&m_d->mutex); 0116 0117 if (!m_d->initialQueueSizeMetric) { 0118 m_d->progressProxy->setRange(0, 100); 0119 m_d->progressProxy->setValue(100); 0120 m_d->progressProxy->setFormat("%p%"); 0121 } else { 0122 m_d->progressProxy->setRange(0, m_d->initialQueueSizeMetric); 0123 m_d->progressProxy->setValue(m_d->initialQueueSizeMetric - m_d->queueSizeMetric); 0124 m_d->progressProxy->setFormat(m_d->jobName); 0125 } 0126 }