File indexing completed on 2025-11-02 12:22:34

0001 /*
0002     SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <kwinquickeffect.h>
0010 
0011 namespace KWin
0012 {
0013 
0014 class DesktopGridEffect : public QuickSceneEffect
0015 {
0016     Q_OBJECT
0017     Q_PROPERTY(int gridRows READ gridRows NOTIFY gridRowsChanged)
0018     Q_PROPERTY(int gridColumns READ gridColumns NOTIFY gridColumnsChanged)
0019     Q_PROPERTY(int animationDuration READ animationDuration NOTIFY animationDurationChanged)
0020     Q_PROPERTY(int layout READ layout NOTIFY layoutChanged)
0021     Q_PROPERTY(qreal partialActivationFactor READ partialActivationFactor NOTIFY partialActivationFactorChanged)
0022     Q_PROPERTY(bool gestureInProgress READ gestureInProgress NOTIFY gestureInProgressChanged)
0023     Q_PROPERTY(bool showAddRemove READ showAddRemove NOTIFY showAddRemoveChanged)
0024     Q_PROPERTY(Qt::AlignmentFlag desktopNameAlignment READ desktopNameAlignment NOTIFY desktopNameAlignmentChanged)
0025     Q_PROPERTY(DesktopLayoutMode desktopLayoutMode READ desktopLayoutMode NOTIFY desktopLayoutModeChanged)
0026     Q_PROPERTY(int customLayoutRows READ customLayoutRows NOTIFY customLayoutRowsChanged)
0027 
0028 public:
0029     enum class DesktopLayoutMode {
0030         LayoutPager,
0031         LayoutAutomatic,
0032         LayoutCustom
0033     };
0034     Q_ENUM(DesktopLayoutMode)
0035 
0036     enum class Status {
0037         Inactive,
0038         Activating,
0039         Deactivating,
0040         Active
0041     };
0042 
0043     DesktopGridEffect();
0044     ~DesktopGridEffect() override;
0045 
0046     int layout() const;
0047     void setLayout(int layout);
0048 
0049     int animationDuration() const;
0050     void setAnimationDuration(int duration);
0051 
0052     bool showAddRemove() const;
0053 
0054     qreal partialActivationFactor() const;
0055     void setPartialActivationFactor(qreal factor);
0056 
0057     bool gestureInProgress() const;
0058     void setGestureInProgress(bool gesture);
0059 
0060     int gridRows() const;
0061     int gridColumns() const;
0062 
0063     int requestedEffectChainPosition() const override;
0064     bool borderActivated(ElectricBorder border) override;
0065     void reconfigure(ReconfigureFlags flags) override;
0066     void grabbedKeyboardEvent(QKeyEvent *keyEvent) override;
0067 
0068     Qt::AlignmentFlag desktopNameAlignment() const;
0069     DesktopLayoutMode desktopLayoutMode() const;
0070     int customLayoutRows() const;
0071 
0072     Q_INVOKABLE void addDesktop() const;
0073     Q_INVOKABLE void removeDesktop() const;
0074     Q_INVOKABLE void swapDesktops(int from, int to);
0075 
0076 public Q_SLOTS:
0077     void activate();
0078     void partialActivate(qreal factor);
0079     void cancelPartialActivate();
0080     void partialDeactivate(qreal factor);
0081     void cancelPartialDeactivate();
0082     void deactivate(int timeout);
0083     void toggle();
0084 
0085 protected:
0086     QVariantMap initialProperties(EffectScreen *screen) override;
0087 
0088 Q_SIGNALS:
0089     void gridRowsChanged();
0090     void gridColumnsChanged();
0091     void animationDurationChanged();
0092     void layoutChanged();
0093     void partialActivationFactorChanged();
0094     void gestureInProgressChanged();
0095     void showAddRemoveChanged();
0096     void desktopNameAlignmentChanged();
0097     void desktopLayoutModeChanged();
0098     void customLayoutRowsChanged();
0099 
0100 private:
0101     void realDeactivate();
0102 
0103     QTimer *m_shutdownTimer;
0104     qreal m_partialActivationFactor = 0;
0105     QAction *m_toggleAction = nullptr;
0106     QAction *m_realtimeToggleAction = nullptr;
0107     QList<QKeySequence> m_toggleShortcut;
0108     QList<ElectricBorder> m_borderActivate;
0109     QList<ElectricBorder> m_touchBorderActivate;
0110     Status m_status = Status::Inactive;
0111     int m_animationDuration = 400;
0112     int m_layout = 1;
0113     bool m_gestureInProgress = false;
0114 };
0115 
0116 } // namespace KWin