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