File indexing completed on 2024-05-12 17:05:47
0001 #ifndef oxygencomboboxentrydata_h 0002 #define oxygencomboboxentrydata_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 "oxygenhoverdata.h" 0011 #include "oxygensignal.h" 0012 0013 #include <gtk/gtk.h> 0014 0015 namespace Oxygen 0016 { 0017 0018 // handles focus and hover for editable comboboxes 0019 class ComboBoxEntryData: public HoverData 0020 { 0021 0022 public: 0023 0024 //! constructor 0025 ComboBoxEntryData( void ): 0026 _list( 0L ) 0027 {} 0028 0029 //! destructor 0030 virtual ~ComboBoxEntryData( void ) 0031 { disconnect( _list ); } 0032 0033 //! disconnect 0034 virtual void disconnect( GtkWidget* ); 0035 0036 //!@name modifiers 0037 //@{ 0038 0039 //! list 0040 void setList( GtkWidget* widget ) 0041 { _list = widget; } 0042 0043 //! assign button 0044 void setButton( GtkWidget* value ); 0045 0046 //! assign entry 0047 void setEntry( GtkWidget* value ); 0048 0049 //! button focus 0050 void setButtonFocus( bool value ) 0051 { 0052 if( _button._focus == value ) return; 0053 _button._focus = value; 0054 0055 // trigger entry update 0056 if( _entry._widget ) 0057 { gtk_widget_queue_draw( _entry._widget ); } 0058 0059 return; 0060 } 0061 0062 //! button focus 0063 void setButtonHovered( bool value ) 0064 { 0065 if( _button._hovered == value ) return; 0066 if( _button._widget ) 0067 { setHovered( _button._widget, value ); } 0068 return; 0069 } 0070 0071 //! entry focus 0072 void setEntryFocus( bool value ) 0073 { 0074 0075 if( _entry._focus == value ) return; 0076 _entry._focus = value; 0077 0078 // trigger button update 0079 if( _button._widget ) 0080 { gtk_widget_queue_draw( _button._widget ); } 0081 0082 } 0083 0084 //@} 0085 0086 //!@name accessors 0087 //@{ 0088 0089 //! list 0090 GtkWidget* list( void ) const 0091 { return _list; } 0092 0093 //! true if either button or entry has focus 0094 bool hasFocus( void ) const 0095 { return _button._focus || _entry._focus; } 0096 0097 //! true if either button or entry has hover 0098 bool hovered( void ) const 0099 { return HoverData::hovered() || _button._hovered || _entry._hovered; } 0100 0101 //! pressed 0102 bool pressed( void ) const 0103 { return _button._pressed; } 0104 0105 //@} 0106 0107 protected: 0108 0109 //! set hover flag for given widget 0110 void setPressed( GtkWidget*, bool ); 0111 0112 //! set hover flag for given widget 0113 virtual bool setHovered( GtkWidget*, bool ); 0114 0115 //! disconnect child 0116 void unregisterChild( GtkWidget* ); 0117 0118 //!@name callbacks 0119 //@{ 0120 0121 static gboolean childDestroyNotifyEvent( GtkWidget*, gpointer ); 0122 static void childToggledEvent( GtkWidget*, gpointer ); 0123 0124 //@} 0125 0126 private: 0127 0128 //! drop-down list, if set 0129 GtkWidget* _list; 0130 0131 class Data 0132 { 0133 0134 public: 0135 0136 //! constructor 0137 Data( void ): 0138 _widget( 0L ), 0139 _focus( false ), 0140 _hovered( false ), 0141 _pressed( false ) 0142 {} 0143 0144 //! disconnect 0145 void disconnect( void ); 0146 0147 GtkWidget* _widget; 0148 bool _focus; 0149 bool _hovered; 0150 bool _pressed; 0151 0152 //!@name callback ids 0153 //@{ 0154 Signal _destroyId; 0155 Signal _enterId; 0156 Signal _leaveId; 0157 Signal _toggledId; 0158 //@} 0159 0160 }; 0161 0162 //! button data 0163 Data _button; 0164 0165 //! entry data 0166 Data _entry; 0167 0168 }; 0169 0170 } 0171 0172 #endif