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

0001 #ifndef oxygenscrollbarstateengine_h
0002 #define oxygenscrollbarstateengine_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 "../oxygenanimationdata.h"
0011 #include "../oxygenstyleoptions.h"
0012 #include "oxygenanimationengine.h"
0013 #include "oxygengenericengine.h"
0014 #include "oxygendatamap.h"
0015 #include "oxygenscrollbarstatedata.h"
0016 
0017 #include <gtk/gtk.h>
0018 
0019 namespace Oxygen
0020 {
0021     //! forward declaration
0022     class Animations;
0023 
0024     //! stores data associated to editable scrollbarstatees
0025     /*!
0026     ensures that the text entry and the button of editable scrollbarstatees
0027     gets hovered and focus flags at the same time
0028     */
0029     class ScrollBarStateEngine: public GenericEngine<ScrollBarStateData>, public AnimationEngine
0030     {
0031 
0032         public:
0033 
0034         //! constructor
0035         ScrollBarStateEngine( Animations* widget ):
0036             GenericEngine<ScrollBarStateData>( widget )
0037             {}
0038 
0039         //! destructor
0040         virtual ~ScrollBarStateEngine( void )
0041         {}
0042 
0043         //! enable state
0044         virtual bool setEnabled( bool value )
0045         {
0046             if( !BaseEngine::setEnabled( value ) ) return false;
0047             for( DataMap<ScrollBarStateData>::Map::iterator iter = data().map().begin(); iter != data().map().end(); iter++ )
0048             {
0049                 iter->second.setEnabled( value );
0050                 if( enabled() && !widgetIsBlackListed( iter->first ) ) iter->second.connect( iter->first );
0051                 else iter->second.disconnect( iter->first );
0052             }
0053 
0054             return true;
0055         }
0056 
0057         //! transition duration
0058         virtual bool setDuration( int value )
0059         {
0060             if( !AnimationEngine::setDuration( value ) ) return false;
0061             for( DataMap<ScrollBarStateData>::Map::iterator iter = data().map().begin(); iter != data().map().end(); iter++ )
0062             { iter->second.setDuration( value ); }
0063             return true;
0064         }
0065 
0066         //! retrieve animation data matching a given widget for provided options
0067         /*! note: for convenience, this method also calls ::registerWidget and ::updateState */
0068         virtual AnimationData get( GtkWidget* widget, const GdkRectangle& rect, GtkArrowType type, const StyleOptions& options )
0069         {
0070 
0071             // check widget
0072             if( !( enabled() && widget ) ) return AnimationData();
0073 
0074             // register
0075             registerWidget( widget );
0076 
0077             ScrollBarStateData& data( this->data().value( widget ) );
0078 
0079             // update rect
0080             if( options&Hover ) data.setRect( type, rect );
0081 
0082             // check intersection and get relevant animation data
0083             if( gdk_rectangle_intersect( &rect, &data.rect( type ), 0L ) )
0084             {
0085 
0086                 data.updateState( type, (options&Hover) && !(options&Disabled) );
0087                 return data.isAnimated( type ) ? AnimationData( data.opacity( type ), AnimationHover ):AnimationData();
0088 
0089             } else return AnimationData();
0090 
0091         }
0092 
0093         //@}
0094 
0095         protected:
0096 
0097         //! register widget [overloaded]
0098         virtual bool registerWidget( GtkWidget* widget )
0099         {
0100             const bool registered( GenericEngine<ScrollBarStateData>::registerWidget( widget ) );
0101             if( registered ) {
0102                 data().value( widget ).setEnabled( enabled() );
0103                 data().value( widget ).setDuration( duration() );
0104             }
0105             return registered;
0106         }
0107 
0108     };
0109 
0110 }
0111 
0112 #endif