File indexing completed on 2024-05-19 05:28:49

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #pragma once
0008 
0009 #include "breezeanimationdata.h"
0010 
0011 #include <QStyle>
0012 
0013 namespace Breeze
0014 {
0015 //* handles spinbox arrows hover
0016 class SpinBoxData : public AnimationData
0017 {
0018     Q_OBJECT
0019 
0020     //* declare opacity property
0021     Q_PROPERTY(qreal upArrowOpacity READ upArrowOpacity WRITE setUpArrowOpacity)
0022     Q_PROPERTY(qreal downArrowOpacity READ downArrowOpacity WRITE setDownArrowOpacity)
0023 
0024 public:
0025     //* constructor
0026     SpinBoxData(QObject *parent, QObject *target, int duration);
0027 
0028     //* animation state
0029     bool updateState(QStyle::SubControl subControl, bool value)
0030     {
0031         if (subControl == QStyle::SC_SpinBoxUp) {
0032             return _upArrowData.updateState(value);
0033         } else if (subControl == QStyle::SC_SpinBoxDown) {
0034             return _downArrowData.updateState(value);
0035         } else {
0036             return false;
0037         }
0038     }
0039 
0040     //* animation state
0041     bool isAnimated(QStyle::SubControl subControl) const
0042     {
0043         return ((subControl == QStyle::SC_SpinBoxUp && upArrowAnimation().data()->isRunning())
0044                 || (subControl == QStyle::SC_SpinBoxDown && downArrowAnimation().data()->isRunning()));
0045     }
0046 
0047     //* opacity
0048     qreal opacity(QStyle::SubControl subControl) const
0049     {
0050         if (subControl == QStyle::SC_SpinBoxUp) {
0051             return upArrowOpacity();
0052         } else if (subControl == QStyle::SC_SpinBoxDown) {
0053             return downArrowOpacity();
0054         } else {
0055             return OpacityInvalid;
0056         }
0057     }
0058 
0059     //* duration
0060     void setDuration(int duration) override
0061     {
0062         upArrowAnimation().data()->setDuration(duration);
0063         downArrowAnimation().data()->setDuration(duration);
0064     }
0065 
0066     //*@name up arrow animation
0067     //@{
0068 
0069     //* opacity
0070     qreal upArrowOpacity() const
0071     {
0072         return _upArrowData._opacity;
0073     }
0074 
0075     //* opacity
0076     void setUpArrowOpacity(qreal value)
0077     {
0078         value = digitize(value);
0079         if (_upArrowData._opacity == value) {
0080             return;
0081         }
0082         _upArrowData._opacity = value;
0083         setDirty();
0084     }
0085 
0086     //* animation
0087     Animation::Pointer upArrowAnimation() const
0088     {
0089         return _upArrowData._animation;
0090     }
0091 
0092     //@}
0093 
0094     //*@name down arrow animation
0095     //@{
0096 
0097     //* opacity
0098     qreal downArrowOpacity() const
0099     {
0100         return _downArrowData._opacity;
0101     }
0102 
0103     //* opacity
0104     void setDownArrowOpacity(qreal value)
0105     {
0106         value = digitize(value);
0107         if (_downArrowData._opacity == value) {
0108             return;
0109         }
0110         _downArrowData._opacity = value;
0111         setDirty();
0112     }
0113 
0114     //* animation
0115     Animation::Pointer downArrowAnimation() const
0116     {
0117         return _downArrowData._animation;
0118     }
0119 
0120     //@}
0121 
0122 private:
0123     //* container for needed animation data
0124     class Data
0125     {
0126     public:
0127         //* default constructor
0128         Data()
0129             : _state(false)
0130             , _opacity(0)
0131         {
0132         }
0133 
0134         //* state
0135         bool updateState(bool);
0136 
0137         //* arrow state
0138         bool _state;
0139 
0140         //* animation
0141         Animation::Pointer _animation;
0142 
0143         //* opacity
0144         qreal _opacity;
0145     };
0146 
0147     //* up arrow data
0148     Data _upArrowData;
0149 
0150     //* down arrow data
0151     Data _downArrowData;
0152 };
0153 
0154 }