File indexing completed on 2024-05-12 15:58:45

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_timed_signal_threshold.h"
0008 #include <QElapsedTimer>
0009 #include "kis_debug.h"
0010 
0011 
0012 struct KisTimedSignalThreshold::Private
0013 {
0014     Private(int _delay, int _cancelDelay)
0015         : delay(_delay),
0016           cancelDelay(0),
0017           enabled(true)
0018     {
0019         setCancelDelay(_cancelDelay);
0020     }
0021 
0022     void setCancelDelay(int value) {
0023         cancelDelay = value >= 0 ? value : 2 * delay;
0024     }
0025 
0026     QElapsedTimer timer;
0027     int delay;
0028     int cancelDelay;
0029     bool enabled;
0030 };
0031 
0032 
0033 KisTimedSignalThreshold::KisTimedSignalThreshold(int delay, int cancelDelay, QObject *parent)
0034     : QObject(parent),
0035       m_d(new Private(delay, cancelDelay))
0036 {
0037 }
0038 
0039 KisTimedSignalThreshold::~KisTimedSignalThreshold()
0040 {
0041 }
0042 
0043 void KisTimedSignalThreshold::forceDone()
0044 {
0045     stop();
0046     emit timeout();
0047 }
0048 
0049 void KisTimedSignalThreshold::start()
0050 {
0051     if (!m_d->enabled) return;
0052 
0053     if (!m_d->timer.isValid()) {
0054         m_d->timer.start();
0055     } else if (m_d->timer.elapsed() > m_d->cancelDelay) {
0056         stop();
0057     } else if (m_d->timer.elapsed() > m_d->delay) {
0058         forceDone();
0059     }
0060 }
0061 
0062 void KisTimedSignalThreshold::stop()
0063 {
0064     m_d->timer.invalidate();
0065 }
0066 
0067 void KisTimedSignalThreshold::setEnabled(bool value)
0068 {
0069     m_d->enabled = value;
0070     if (!m_d->enabled) {
0071         stop();
0072     }
0073 }
0074 
0075 void KisTimedSignalThreshold::setDelayThreshold(int delay, int cancelDelay)
0076 {
0077     m_d->delay = delay;
0078     m_d->setCancelDelay(cancelDelay);
0079 }