File indexing completed on 2024-05-12 17:05:46
0001 #ifndef oxygenarrowstateengine_h 0002 #define oxygenarrowstateengine_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 "oxygenarrowstatedata.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 arrowstatees 0025 /*! 0026 ensures that the text entry and the button of editable arrowstatees 0027 gets hovered and focus flags at the same time 0028 */ 0029 class ArrowStateEngine: public GenericEngine<ArrowStateData>, public AnimationEngine 0030 { 0031 0032 public: 0033 0034 //! constructor 0035 ArrowStateEngine( Animations* widget ): 0036 GenericEngine<ArrowStateData>( widget ) 0037 {} 0038 0039 //! destructor 0040 virtual ~ArrowStateEngine( void ) 0041 {} 0042 0043 //! enable state 0044 virtual bool setEnabled( bool value ) 0045 { 0046 if( !BaseEngine::setEnabled( value ) ) return false; 0047 for( DataMap<ArrowStateData>::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<ArrowStateData>::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, GtkArrowType type, const StyleOptions& options ) 0069 { 0070 0071 // check widget 0072 if( !( enabled() && widget ) ) return AnimationData(); 0073 0074 // register 0075 registerWidget( widget ); 0076 0077 ArrowStateData& data( this->data().value( widget ) ); 0078 data.updateState( type, (options&Hover) && !(options&Disabled) ); 0079 0080 return data.isAnimated( type ) ? AnimationData( data.opacity( type ), AnimationHover ):AnimationData(); 0081 0082 } 0083 0084 //@} 0085 0086 protected: 0087 0088 //!@name protected modifiers 0089 //@{ 0090 0091 //! register widget [overloaded] 0092 virtual bool registerWidget( GtkWidget* widget ) 0093 { 0094 const bool registered( GenericEngine<ArrowStateData>::registerWidget( widget ) ); 0095 if( registered ) { 0096 data().value( widget ).setEnabled( enabled() ); 0097 data().value( widget ).setDuration( duration() ); 0098 } 0099 return registered; 0100 } 0101 0102 //@} 0103 0104 }; 0105 0106 } 0107 0108 #endif