1 /*
2  * SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 
7 #ifndef breezespinbox_data_h
8 #define breezespinbox_data_h
9 
10 #include "breezeanimationdata.h"
11 
12 #include <QStyle>
13 
14 namespace Breeze
15 {
16 
17     //* handles spinbox arrows hover
18     class SpinBoxData: public AnimationData
19     {
20 
21         Q_OBJECT
22 
23         //* declare opacity property
24         Q_PROPERTY( qreal upArrowOpacity READ upArrowOpacity WRITE setUpArrowOpacity )
25         Q_PROPERTY( qreal downArrowOpacity READ downArrowOpacity WRITE setDownArrowOpacity )
26 
27         public:
28 
29         //* constructor
30         SpinBoxData( QObject*, QWidget*, int );
31 
32         //* animation state
updateState(QStyle::SubControl subControl,bool value)33         bool updateState( QStyle::SubControl subControl, bool value )
34         {
35             if( subControl == QStyle::SC_SpinBoxUp ) return _upArrowData.updateState( value );
36             else if( subControl == QStyle::SC_SpinBoxDown ) return _downArrowData.updateState( value );
37             else return false;
38         }
39 
40         //* animation state
isAnimated(QStyle::SubControl subControl)41         bool isAnimated( QStyle::SubControl subControl ) const
42         {
43             return(
44                 ( subControl == QStyle::SC_SpinBoxUp && upArrowAnimation().data()->isRunning() ) ||
45                 ( subControl == QStyle::SC_SpinBoxDown && downArrowAnimation().data()->isRunning() ) );
46         }
47 
48         //* opacity
opacity(QStyle::SubControl subControl)49         qreal opacity( QStyle::SubControl subControl ) const
50         {
51             if( subControl == QStyle::SC_SpinBoxUp ) return upArrowOpacity();
52             else if( subControl == QStyle::SC_SpinBoxDown ) return downArrowOpacity();
53             else return OpacityInvalid;
54         }
55 
56         //* duration
setDuration(int duration)57         void setDuration( int duration ) override
58         {
59             upArrowAnimation().data()->setDuration( duration );
60             downArrowAnimation().data()->setDuration( duration );
61         }
62 
63         //*@name up arrow animation
64         //@{
65 
66         //* opacity
upArrowOpacity()67         qreal upArrowOpacity() const
68         { return _upArrowData._opacity; }
69 
70         //* opacity
setUpArrowOpacity(qreal value)71         void setUpArrowOpacity( qreal value )
72         {
73             value = digitize( value );
74             if( _upArrowData._opacity == value ) return;
75             _upArrowData._opacity = value;
76             setDirty();
77         }
78 
79         //* animation
upArrowAnimation()80         Animation::Pointer upArrowAnimation() const
81         { return _upArrowData._animation; }
82 
83         //@}
84 
85         //*@name down arrow animation
86         //@{
87 
88         //* opacity
downArrowOpacity()89         qreal downArrowOpacity() const
90         { return _downArrowData._opacity; }
91 
92         //* opacity
setDownArrowOpacity(qreal value)93         void setDownArrowOpacity( qreal value )
94         {
95             value = digitize( value );
96             if( _downArrowData._opacity == value ) return;
97             _downArrowData._opacity = value;
98             setDirty();
99         }
100 
101         //* animation
downArrowAnimation()102         Animation::Pointer downArrowAnimation() const
103         { return _downArrowData._animation; }
104 
105         //@}
106 
107         private:
108 
109         //* container for needed animation data
110         class Data
111         {
112 
113             public:
114 
115             //* default constructor
Data()116             Data():
117                 _state( false ),
118                 _opacity(0)
119                 {}
120 
121             //* state
122             bool updateState( bool );
123 
124             //* arrow state
125             bool _state;
126 
127             //* animation
128             Animation::Pointer _animation;
129 
130             //* opacity
131             qreal _opacity;
132 
133         };
134 
135         //* up arrow data
136         Data _upArrowData;
137 
138         //* down arrow data
139         Data _downArrowData;
140 
141     };
142 
143 
144 }
145 
146 #endif
147