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

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