File indexing completed on 2024-06-09 05:25:57

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2007 Philip Falkner <philip.falkner@gmail.com>
0006     SPDX-FileCopyrightText: 2009 Martin Gräßlin <mgraesslin@kde.org>
0007     SPDX-FileCopyrightText: 2010 Alexandre Pereira <pereira.alex@gmail.com>
0008     SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0009 
0010     SPDX-License-Identifier: GPL-2.0-or-later
0011 */
0012 
0013 #pragma once
0014 
0015 // kwineffects
0016 #include "effect/effect.h"
0017 #include "effect/effectwindow.h"
0018 #include "effect/timeline.h"
0019 
0020 namespace KWin
0021 {
0022 
0023 struct GlideAnimation
0024 {
0025     EffectWindowDeletedRef deletedRef;
0026     TimeLine timeLine;
0027 };
0028 
0029 class GlideEffect : public Effect
0030 {
0031     Q_OBJECT
0032     Q_PROPERTY(int duration READ duration)
0033     Q_PROPERTY(RotationEdge inRotationEdge READ inRotationEdge)
0034     Q_PROPERTY(qreal inRotationAngle READ inRotationAngle)
0035     Q_PROPERTY(qreal inDistance READ inDistance)
0036     Q_PROPERTY(qreal inOpacity READ inOpacity)
0037     Q_PROPERTY(RotationEdge outRotationEdge READ outRotationEdge)
0038     Q_PROPERTY(qreal outRotationAngle READ outRotationAngle)
0039     Q_PROPERTY(qreal outDistance READ outDistance)
0040     Q_PROPERTY(qreal outOpacity READ outOpacity)
0041 
0042 public:
0043     GlideEffect();
0044     ~GlideEffect() override;
0045 
0046     void reconfigure(ReconfigureFlags flags) override;
0047 
0048     void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override;
0049     void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime) override;
0050     void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data) override;
0051     void postPaintScreen() override;
0052 
0053     bool isActive() const override;
0054     int requestedEffectChainPosition() const override;
0055 
0056     static bool supported();
0057 
0058     enum RotationEdge {
0059         Top = 0,
0060         Right = 1,
0061         Bottom = 2,
0062         Left = 3
0063     };
0064     Q_ENUM(RotationEdge)
0065 
0066     int duration() const;
0067     RotationEdge inRotationEdge() const;
0068     qreal inRotationAngle() const;
0069     qreal inDistance() const;
0070     qreal inOpacity() const;
0071     RotationEdge outRotationEdge() const;
0072     qreal outRotationAngle() const;
0073     qreal outDistance() const;
0074     qreal outOpacity() const;
0075 
0076 private Q_SLOTS:
0077     void windowAdded(EffectWindow *w);
0078     void windowClosed(EffectWindow *w);
0079     void windowDataChanged(EffectWindow *w, int role);
0080 
0081 private:
0082     bool isGlideWindow(EffectWindow *w) const;
0083 
0084     std::chrono::milliseconds m_duration;
0085     QHash<EffectWindow *, GlideAnimation> m_animations;
0086 
0087     struct GlideParams
0088     {
0089         RotationEdge edge;
0090         struct
0091         {
0092             qreal from;
0093             qreal to;
0094         } angle, distance, opacity;
0095     };
0096 
0097     GlideParams m_inParams;
0098     GlideParams m_outParams;
0099 };
0100 
0101 inline int GlideEffect::requestedEffectChainPosition() const
0102 {
0103     return 50;
0104 }
0105 
0106 inline int GlideEffect::duration() const
0107 {
0108     return m_duration.count();
0109 }
0110 
0111 inline GlideEffect::RotationEdge GlideEffect::inRotationEdge() const
0112 {
0113     return m_inParams.edge;
0114 }
0115 
0116 inline qreal GlideEffect::inRotationAngle() const
0117 {
0118     return m_inParams.angle.from;
0119 }
0120 
0121 inline qreal GlideEffect::inDistance() const
0122 {
0123     return m_inParams.distance.from;
0124 }
0125 
0126 inline qreal GlideEffect::inOpacity() const
0127 {
0128     return m_inParams.opacity.from;
0129 }
0130 
0131 inline GlideEffect::RotationEdge GlideEffect::outRotationEdge() const
0132 {
0133     return m_outParams.edge;
0134 }
0135 
0136 inline qreal GlideEffect::outRotationAngle() const
0137 {
0138     return m_outParams.angle.to;
0139 }
0140 
0141 inline qreal GlideEffect::outDistance() const
0142 {
0143     return m_outParams.distance.to;
0144 }
0145 
0146 inline qreal GlideEffect::outOpacity() const
0147 {
0148     return m_outParams.opacity.to;
0149 }
0150 
0151 } // namespace KWin