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

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 "oxygencomboboxentrydata.h"
0009 #include "../oxygengtkutils.h"
0010 #include "../config.h"
0011 
0012 #include <gtk/gtk.h>
0013 #include <iostream>
0014 #include <cassert>
0015 
0016 namespace Oxygen
0017 {
0018 
0019     //________________________________________________________________________________
0020     void ComboBoxEntryData::disconnect( GtkWidget* widget )
0021     {
0022 
0023         #if OXYGEN_DEBUG
0024         std::cerr << "Oxygen::ComboBoxEntryData::connect - widget: " << widget << std::endl;
0025         #endif
0026 
0027         _list = 0L;
0028 
0029         HoverData::disconnect( widget );
0030         _entry.disconnect();
0031         _button.disconnect();
0032     }
0033 
0034     //________________________________________________________________________________
0035     void ComboBoxEntryData::setButton( GtkWidget* widget )
0036     {
0037         if( _button._widget == widget ) return;
0038         assert( !_button._widget );
0039 
0040         _button._destroyId.connect( G_OBJECT(widget), "destroy", G_CALLBACK( childDestroyNotifyEvent ), this );
0041         _button._enterId.connect( G_OBJECT(widget), "enter-notify-event", (GCallback)enterNotifyEvent, this );
0042         _button._leaveId.connect( G_OBJECT(widget), "leave-notify-event", (GCallback)leaveNotifyEvent, this );
0043         _button._toggledId.connect( G_OBJECT(widget), "toggled", G_CALLBACK( childToggledEvent ), this );
0044         _button._widget = widget;
0045     }
0046 
0047     //________________________________________________________________________________
0048     void ComboBoxEntryData::setEntry( GtkWidget* widget )
0049     {
0050         if( _entry._widget == widget ) return;
0051         assert( !_entry._widget );
0052 
0053         #if OXYGEN_DEBUG
0054         std::cerr << "Oxygen::ComboBoxEntryData::setEntry - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
0055         #endif
0056 
0057         _entry._destroyId.connect( G_OBJECT(widget), "destroy", G_CALLBACK( childDestroyNotifyEvent ), this );
0058         _entry._enterId.connect( G_OBJECT(widget), "enter-notify-event", (GCallback)enterNotifyEvent, this );
0059         _entry._leaveId.connect( G_OBJECT(widget), "leave-notify-event", (GCallback)leaveNotifyEvent, this );
0060         _entry._widget = widget;
0061     }
0062 
0063     //________________________________________________________________________________
0064     void ComboBoxEntryData::setPressed( GtkWidget* widget, bool value )
0065     {
0066         if( widget == _button._widget ) _button._pressed = value;
0067         return;
0068     }
0069 
0070     //________________________________________________________________________________
0071     bool ComboBoxEntryData::setHovered( GtkWidget* widget, bool value )
0072     {
0073         const bool oldHovered( hovered() );
0074         if( widget == _entry._widget ) _entry._hovered = value;
0075         else if( widget == _button._widget ) _button._hovered = value;
0076         else HoverData::setHovered( widget, value );
0077 
0078         if( oldHovered != hovered() )
0079         {
0080 
0081             // trigger repaint
0082             if( _button._widget ) gtk_widget_queue_draw( gtk_widget_get_parent( _button._widget ) );
0083             else if( _entry._widget ) gtk_widget_queue_draw( gtk_widget_get_parent( _entry._widget ) );
0084             return true;
0085 
0086         } else return false;
0087 
0088     }
0089 
0090     //________________________________________________________________________________
0091     void ComboBoxEntryData::unregisterChild( GtkWidget* widget )
0092     {
0093 
0094         #if OXYGEN_DEBUG
0095         std::cerr << "Oxygen::ComboBoxEntryData::unregisterChild - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl;
0096         #endif
0097 
0098         if( widget == _button._widget ) _button.disconnect();
0099         else if( widget == _entry._widget ) _entry.disconnect();
0100         return;
0101 
0102     }
0103 
0104     //________________________________________________________________________________
0105     void ComboBoxEntryData::Data::disconnect( void )
0106     {
0107 
0108         #if OXYGEN_DEBUG
0109         std::cerr << "Oxygen::ComboBoxEntryData::Data::disconnect - " << _widget << " (" << (_widget ? G_OBJECT_TYPE_NAME( _widget ):"null") << ")" << std::endl;
0110         #endif
0111 
0112         if( !_widget ) return;
0113         _destroyId.disconnect();
0114         _enterId.disconnect();
0115         _leaveId.disconnect();
0116         _toggledId.disconnect();
0117         _hovered = false;
0118         _focus = false;
0119         _pressed = false;
0120         _widget = 0L;
0121     }
0122 
0123     //____________________________________________________________________________________________
0124     gboolean ComboBoxEntryData::childDestroyNotifyEvent( GtkWidget* widget, gpointer data )
0125     {
0126         static_cast<ComboBoxEntryData*>(data)->unregisterChild( widget );
0127         return FALSE;
0128     }
0129 
0130     //____________________________________________________________________________________________
0131     void ComboBoxEntryData::childToggledEvent( GtkWidget* widget, gpointer data)
0132     {
0133         if( GTK_IS_TOGGLE_BUTTON( widget ) )
0134         { static_cast<ComboBoxEntryData*>(data)->setPressed( widget, gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ); }
0135         return;
0136     }
0137 }