File indexing completed on 2024-05-12 17:05:50
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