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 }