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