yacreader/third_party/KDToolBox/KDSignalThrottler.h
Luis Ángel San Martín 16faacec65 Debounce input from the search edit
This makes writing there a little bit more pleasant
2023-06-03 20:25:14 +02:00

131 lines
3.8 KiB
C++

/****************************************************************************
** MIT License
**
** Copyright (C) 2020-2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo
*<giuseppe.dangelo@kdab.com>
**
** This file is part of KDToolBox (https://github.com/KDAB/KDToolBox).
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, ** and to permit persons to whom the Software is
** furnished to do so, subject to the following conditions:
**
** The above copyright notice and this permission notice (including the next paragraph)
** shall be included in all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF ** CONTRACT, TORT OR OTHERWISE,
** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
** DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef KDSIGNALTHROTTLER_H
#define KDSIGNALTHROTTLER_H
#include <QObject>
#include <QTimer>
#include <chrono>
namespace KDToolBox
{
class KDGenericSignalThrottler : public QObject
{
Q_OBJECT
Q_PROPERTY(Kind kind READ kind CONSTANT)
Q_PROPERTY(EmissionPolicy emissionPolicy READ emissionPolicy CONSTANT)
Q_PROPERTY(int timeout READ timeout WRITE setTimeout NOTIFY timeoutChanged)
Q_PROPERTY(Qt::TimerType timerType READ timerType WRITE setTimerType NOTIFY timerTypeChanged)
public:
enum class Kind
{
Throttler,
Debouncer,
};
Q_ENUM(Kind)
enum class EmissionPolicy
{
Trailing,
Leading,
};
Q_ENUM(EmissionPolicy)
explicit KDGenericSignalThrottler(Kind kind, EmissionPolicy emissionPolicy, QObject *parent = nullptr);
~KDGenericSignalThrottler() override;
Kind kind() const;
EmissionPolicy emissionPolicy() const;
int timeout() const;
void setTimeout(int timeout);
void setTimeout(std::chrono::milliseconds timeout);
Qt::TimerType timerType() const;
void setTimerType(Qt::TimerType timerType);
public Q_SLOTS:
void throttle();
Q_SIGNALS:
void triggered();
void timeoutChanged(int timeout);
void timerTypeChanged(Qt::TimerType timerType);
private:
void maybeEmitTriggered();
void emitTriggered();
QTimer m_timer;
Kind m_kind;
EmissionPolicy m_emissionPolicy;
bool m_hasPendingEmission;
};
// Convenience subclasses, e.g. for registering into QML
class KDSignalThrottler : public KDGenericSignalThrottler
{
Q_OBJECT
public:
explicit KDSignalThrottler(QObject *parent = nullptr);
~KDSignalThrottler() override;
};
class KDSignalLeadingThrottler : public KDGenericSignalThrottler
{
Q_OBJECT
public:
explicit KDSignalLeadingThrottler(QObject *parent = nullptr);
~KDSignalLeadingThrottler() override;
};
class KDSignalDebouncer : public KDGenericSignalThrottler
{
Q_OBJECT
public:
explicit KDSignalDebouncer(QObject *parent = nullptr);
~KDSignalDebouncer() override;
};
class KDSignalLeadingDebouncer : public KDGenericSignalThrottler
{
Q_OBJECT
public:
explicit KDSignalLeadingDebouncer(QObject *parent = nullptr);
~KDSignalLeadingDebouncer() override;
};
} // namespace KDToolBox
#endif // KDSIGNALTHROTTLER_H