File indexing completed on 2024-05-12 05:34:36

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