kwin/src/effect/effecttogglablestate.h
2023-11-20 11:32:43 +00:00

140 lines
3.5 KiB
C++

/*
SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez <aleixpol@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "effect/globals.h"
#include <QAction>
#include <QObject>
namespace KWin
{
class Effect;
/**
* It's common to have effects that get activated and deactivated.
* This class helps us simplify this process, especially in the cases where we want activation to happen
* progressively, like through a touch our touchpad events.
*/
class KWIN_EXPORT EffectTogglableState : public QObject
{
Q_OBJECT
public:
enum class Status {
Inactive,
Activating,
Deactivating,
Active,
Stopped
};
Q_ENUM(Status)
/** Constructs the object, passes the effect as the parent. */
EffectTogglableState(Effect *parent);
bool inProgress() const;
void setInProgress(bool gesture);
qreal partialActivationFactor() const
{
return m_partialActivationFactor;
}
void setPartialActivationFactor(qreal factor);
QAction *activateAction() const
{
return m_activateAction.get();
}
QAction *deactivateAction() const
{
return m_deactivateAction.get();
}
QAction *toggleAction() const
{
return m_toggleAction.get();
}
void activate();
void deactivate();
void toggle();
void stop();
void setStatus(Status status);
Status status() const
{
return m_status;
}
Q_SIGNALS:
void inProgressChanged();
void partialActivationFactorChanged();
void activated();
void deactivated();
void statusChanged(Status status);
protected:
std::function<void(qreal progress)> progressCallback();
std::function<void(qreal progress)> regressCallback();
void setProgress(qreal progress);
/// regress being the progress when on an active state
void setRegress(qreal regress);
private:
void partialActivate(qreal factor);
void partialDeactivate(qreal factor);
std::unique_ptr<QAction> m_deactivateAction;
std::unique_ptr<QAction> m_activateAction;
std::unique_ptr<QAction> m_toggleAction;
Status m_status = Status::Inactive;
bool m_inProgress = false;
qreal m_partialActivationFactor = 0;
friend class EffectTogglableGesture;
friend class EffectTogglableTouchBorder;
};
class KWIN_EXPORT EffectTogglableGesture : public QObject
{
public:
/**
* Allows specifying which gestures toggle the state.
*
* The gesture will activate it and once enabled the opposite will disable it back.
*
* @param state the state we care about. This state will become the parent object and will take care to clean it up.
*/
EffectTogglableGesture(EffectTogglableState *state);
void addTouchpadPinchGesture(PinchDirection dir, uint fingerCount);
void addTouchpadSwipeGesture(SwipeDirection dir, uint fingerCount);
void addTouchscreenSwipeGesture(SwipeDirection direction, uint fingerCount);
private:
EffectTogglableState *const m_state;
};
class KWIN_EXPORT EffectTogglableTouchBorder : public QObject
{
public:
/**
* Allows specifying which boarders get to toggle the state.
*
* @param state the state we care about. This state will become the parent object and will take care to clean it up.
*/
EffectTogglableTouchBorder(EffectTogglableState *state);
~EffectTogglableTouchBorder();
void setBorders(const QList<int> &borders);
private:
QList<ElectricBorder> m_touchBorderActivate;
EffectTogglableState *const m_state;
};
}