File indexing completed on 2024-05-19 05:35:21

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