File indexing completed on 2024-05-12 05:34:35

0001 #ifndef oxygenscrollbarstatedata_h
0002 #define oxygenscrollbarstatedata_h
0003 /*
0004 * this file is part of the oxygen gtk engine
0005 * SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0006 *
0007 * SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include "../oxygengtkutils.h"
0011 #include "oxygentimeline.h"
0012 
0013 #include <gtk/gtk.h>
0014 
0015 namespace Oxygen
0016 {
0017     //! track scrollbar arrow state changes events
0018     class ScrollBarStateData
0019     {
0020 
0021         public:
0022 
0023         //! constructor
0024         explicit ScrollBarStateData( void ):
0025             _target( 0L )
0026         {}
0027 
0028         //! destructor
0029         virtual ~ScrollBarStateData( void )
0030         {}
0031 
0032         //! setup connections
0033         void connect( GtkWidget* );
0034 
0035         //! disconnect
0036         void disconnect( GtkWidget* );
0037 
0038         //! update state
0039         bool updateState( GtkArrowType type, bool value )
0040         { return data( type ).updateState( value ); }
0041 
0042         //! enable state
0043         void setEnabled( bool value )
0044         {
0045             data( GTK_ARROW_UP )._timeLine.setEnabled( value );
0046             data( GTK_ARROW_DOWN )._timeLine.setEnabled( value );
0047         }
0048 
0049         //! duration
0050         void setDuration( int value )
0051         {
0052             data( GTK_ARROW_UP )._timeLine.setDuration( value );
0053             data( GTK_ARROW_DOWN )._timeLine.setDuration( value );
0054         }
0055 
0056         //! true if timeline for give arrow type is running
0057         bool isAnimated( GtkArrowType type ) const
0058         { return data( type )._timeLine.isRunning(); }
0059 
0060         //! opacity
0061         double opacity( GtkArrowType type ) const
0062         { return data( type )._timeLine.value(); }
0063 
0064         //! rect
0065         const GdkRectangle& rect( GtkArrowType type ) const
0066         { return data( type )._rect; }
0067 
0068         //! rect
0069         void setRect( GtkArrowType type, const GdkRectangle& rect )
0070         { data( type )._rect = rect; }
0071 
0072         protected:
0073 
0074         // arrow data
0075         class Data
0076         {
0077 
0078             public:
0079 
0080             //! constructor
0081             explicit Data( void ):
0082                 _rect( Gtk::gdk_rectangle() ),
0083                 _state( false )
0084             {}
0085 
0086             //! update state
0087             bool updateState( bool );
0088 
0089             //! timeline
0090             TimeLine _timeLine;
0091 
0092             //! rectangle
0093             GdkRectangle _rect;
0094 
0095             //! state
0096             bool _state;
0097 
0098         };
0099 
0100         //! get data for given arrow type
0101         const Data& data( GtkArrowType type ) const
0102         {
0103             switch( type )
0104             {
0105 
0106                 case GTK_ARROW_UP:
0107                 case GTK_ARROW_LEFT:
0108                 return _upArrowData;
0109 
0110                 default:
0111                 case GTK_ARROW_DOWN:
0112                 case GTK_ARROW_RIGHT:
0113                 return _downArrowData;
0114 
0115             }
0116         }
0117 
0118         //! get data for given arrow type
0119         Data& data( GtkArrowType type )
0120         {
0121             switch( type )
0122             {
0123 
0124                 case GTK_ARROW_UP:
0125                 case GTK_ARROW_LEFT:
0126                 return _upArrowData;
0127 
0128                 default:
0129                 case GTK_ARROW_DOWN:
0130                 case GTK_ARROW_RIGHT:
0131                 return _downArrowData;
0132 
0133             }
0134         }
0135 
0136         //! delayed update
0137         static gboolean delayedUpdate( gpointer );
0138 
0139         private:
0140 
0141         //! target
0142         GtkWidget* _target;
0143 
0144         // up/left arrow
0145         Data _upArrowData;
0146 
0147         // down/right arrow
0148         Data _downArrowData;
0149 
0150     };
0151 
0152 }
0153 
0154 #endif