File indexing completed on 2024-05-12 17:05:47
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 }