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