File indexing completed on 2024-05-12 17:05:46

0001 #ifndef oxygenarrowstatedata_h
0002 #define oxygenarrowstatedata_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 "oxygentimeline.h"
0011 
0012 #include <gtk/gtk.h>
0013 
0014 namespace Oxygen
0015 {
0016     //! track arrow state changes events,
0017     /*! used to deal with spinbox and Notebook arrows */
0018     class ArrowStateData
0019     {
0020 
0021         public:
0022 
0023         //! constructor
0024         explicit ArrowStateData( void ):
0025             _target( 0L )
0026         {}
0027 
0028         //! destructor
0029         virtual ~ArrowStateData( 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             _upArrowData._timeLine.setEnabled( value );
0046             _downArrowData._timeLine.setEnabled( value );
0047         }
0048 
0049         //! duration
0050         void setDuration( int value )
0051         {
0052             _upArrowData._timeLine.setDuration( value );
0053             _downArrowData._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         protected:
0065 
0066         // arrow data
0067         class Data
0068         {
0069 
0070             public:
0071 
0072             //! constructor
0073             explicit Data( void ):
0074                 _state( false )
0075             {}
0076 
0077             //! update state
0078             bool updateState( bool );
0079 
0080             //! timeline
0081             TimeLine _timeLine;
0082 
0083             //! state
0084             bool _state;
0085 
0086         };
0087 
0088         //! get data for given arrow type
0089         const Data& data( GtkArrowType type ) const
0090         {
0091             switch( type )
0092             {
0093 
0094                 case GTK_ARROW_UP:
0095                 case GTK_ARROW_LEFT:
0096                 return _upArrowData;
0097 
0098                 default:
0099                 case GTK_ARROW_DOWN:
0100                 case GTK_ARROW_RIGHT:
0101                 return _downArrowData;
0102 
0103             }
0104         }
0105 
0106         //! get data for given arrow type
0107         Data& data( GtkArrowType type )
0108         {
0109             switch( type )
0110             {
0111 
0112                 case GTK_ARROW_UP:
0113                 case GTK_ARROW_LEFT:
0114                 return _upArrowData;
0115 
0116                 default:
0117                 case GTK_ARROW_DOWN:
0118                 case GTK_ARROW_RIGHT:
0119                 return _downArrowData;
0120 
0121             }
0122         }
0123 
0124         //! delayed update
0125         static gboolean delayedUpdate( gpointer );
0126 
0127         private:
0128 
0129         //! target
0130         GtkWidget* _target;
0131 
0132         // up/left arrow
0133         Data _upArrowData;
0134 
0135         // down/right arrow
0136         Data _downArrowData;
0137 
0138     };
0139 
0140 }
0141 
0142 #endif