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

0001 /*
0002     this file is part of the oxygen gtk engine
0003     SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "oxygenwidgetstatedata.h"
0009 #include "../config.h"
0010 
0011 #include <iostream>
0012 
0013 namespace Oxygen
0014 {
0015 
0016     //_____________________________________________
0017     void WidgetStateData::connect( GtkWidget* widget )
0018     {
0019 
0020         #if OXYGEN_DEBUG
0021         std::cerr << "Oxygen::WidgetStateData::connect - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
0022         #endif
0023 
0024         _target = widget;
0025         _timeLine.connect( (GSourceFunc)delayedUpdate, this );
0026     }
0027 
0028     //_____________________________________________
0029     void WidgetStateData::disconnect( GtkWidget* widget )
0030     {
0031         #if OXYGEN_DEBUG
0032         std::cerr << "Oxygen::WidgetStateData::disconnect - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
0033         #endif
0034 
0035         _timeLine.disconnect();
0036         _target = 0L;
0037         _state = false;
0038     }
0039 
0040     //_____________________________________________
0041     bool WidgetStateData::updateState( bool state, const GdkRectangle& rect )
0042     {
0043 
0044         // always update dirty rect
0045         _dirtyRect = rect;
0046 
0047         // check state and update
0048         if( state == _state ) return false;
0049 
0050         #if OXYGEN_DEBUG
0051         std::cerr
0052             << "Oxygen::WidgetStateData::updateState - "
0053             << _target << " (" << ( _target ? std::string( G_OBJECT_TYPE_NAME( _target ) ) : "none" ) << ")"
0054             << " state: " << state
0055             << std::endl;
0056         #endif
0057 
0058         _state = state;
0059 
0060         // change direction
0061         _timeLine.setDirection( state ? TimeLine::Forward:TimeLine::Backward );
0062 
0063         // restart timeLine if needed
0064         if( _timeLine.isConnected() && !_timeLine.isRunning() ) _timeLine.start();
0065 
0066         return true;
0067     }
0068 
0069     //_____________________________________________
0070     gboolean WidgetStateData::delayedUpdate( gpointer pointer )
0071     {
0072 
0073         WidgetStateData& data( *static_cast<WidgetStateData*>( pointer ) );
0074 
0075         #if OXYGEN_DEBUG
0076         std::cerr
0077             << "Oxygen::WidgetStateData::updateState - "
0078             << data._target << " (" << G_OBJECT_TYPE_NAME( data._target ) << ")"
0079             << " state: " << data._state
0080             << " rect: " << data._dirtyRect
0081             << " opacity: " << data._timeLine.value()
0082             << std::endl;
0083         #endif
0084 
0085         if( data._target && gtk_widget_get_realized(data._target) )
0086         { Gtk::gtk_widget_queue_draw( data._target, &data._dirtyRect ); }
0087 
0088         return FALSE;
0089 
0090     }
0091 
0092 }