File indexing completed on 2024-05-12 17:05:50
0001 #ifndef oxygentabwidgetstateengine_h 0002 #define oxygentabwidgetstateengine_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 "oxygentabwidgetstatedata.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 tabwidgetstatees 0025 /*! 0026 ensures that the text entry and the button of editable tabwidgetstatees 0027 gets hovered and focus flags at the same time 0028 */ 0029 class TabWidgetStateEngine: public GenericEngine<TabWidgetStateData>, public AnimationEngine 0030 { 0031 0032 public: 0033 0034 //! constructor 0035 TabWidgetStateEngine( Animations* widget ): 0036 GenericEngine<TabWidgetStateData>( widget ) 0037 {} 0038 0039 //! destructor 0040 virtual ~TabWidgetStateEngine( void ) 0041 {} 0042 0043 //! enabled state 0044 virtual bool setEnabled( bool value ) 0045 { 0046 if( !BaseEngine::setEnabled( value ) ) return false; 0047 for( DataMap<TabWidgetStateData>::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 return true; 0054 } 0055 0056 //! transition duration 0057 virtual bool setDuration( int value ) 0058 { 0059 if( !AnimationEngine::setDuration( value ) ) return false; 0060 for( DataMap<TabWidgetStateData>::Map::iterator iter = data().map().begin(); iter != data().map().end(); iter++ ) 0061 { iter->second.setDuration( value ); } 0062 return false; 0063 } 0064 0065 //! retrieve animation data matching a given widget for provided options 0066 /*! note: for convenience, this method also calls ::registerWidget and ::updateState */ 0067 virtual AnimationData get( GtkWidget* widget, int index, const StyleOptions& options ) 0068 { 0069 0070 // check widget 0071 if( !( enabled() && widget ) ) return AnimationData(); 0072 0073 // register 0074 registerWidget( widget ); 0075 0076 TabWidgetStateData& data( this->data().value( widget ) ); 0077 data.updateState( index, (options&Hover) && !(options&Disabled) ); 0078 0079 return data.isAnimated( index ) ? AnimationData( data.opacity( index ), AnimationHover ):AnimationData(); 0080 0081 } 0082 0083 //@} 0084 0085 protected: 0086 0087 //!@name protected modifiers 0088 //@{ 0089 0090 //! register widget [overloaded] 0091 virtual bool registerWidget( GtkWidget* widget ) 0092 { 0093 const bool registered( GenericEngine<TabWidgetStateData>::registerWidget( widget ) ); 0094 if( registered ) { 0095 data().value( widget ).setEnabled( enabled() ); 0096 data().value( widget ).setDuration( duration() ); 0097 } 0098 return registered; 0099 } 0100 0101 //@} 0102 0103 }; 0104 0105 } 0106 0107 #endif