X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=libs%2Fgtkutil%2Fnonmodal.h;h=53318679a4ca51150994da1e08587d7b603bca03;hb=18d60f90d7603cb420150739251cf98519c57406;hp=864779bd1603e8a6912723dacffb426a9ca15a23;hpb=3c73487420fde8d4a3b5360d8b99e48132517900;p=xonotic%2Fnetradiant.git diff --git a/libs/gtkutil/nonmodal.h b/libs/gtkutil/nonmodal.h index 864779bd..53318679 100644 --- a/libs/gtkutil/nonmodal.h +++ b/libs/gtkutil/nonmodal.h @@ -22,142 +22,68 @@ #if !defined( INCLUDED_GTKUTIL_NONMODAL_H ) #define INCLUDED_GTKUTIL_NONMODAL_H -#include -#include -#include -#include - +#include #include "generic/callback.h" #include "pointer.h" #include "button.h" -typedef struct _GtkEntry GtkEntry; - - -inline gboolean escape_clear_focus_widget( GtkWidget* widget, GdkEventKey* event, gpointer data ){ - if ( event->keyval == GDK_Escape ) { - gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), NULL ); - return TRUE; - } - return FALSE; -} - -inline void widget_connect_escape_clear_focus_widget( GtkWidget* widget ){ - g_signal_connect( G_OBJECT( widget ), "key_press_event", G_CALLBACK( escape_clear_focus_widget ), 0 ); -} - - -class NonModalEntry -{ -bool m_editing; -Callback m_apply; -Callback m_cancel; - -static gboolean focus_in( GtkEntry* entry, GdkEventFocus *event, NonModalEntry* self ){ - self->m_editing = false; - return FALSE; -} - -static gboolean focus_out( GtkEntry* entry, GdkEventFocus *event, NonModalEntry* self ){ - if ( self->m_editing && GTK_WIDGET_VISIBLE( entry ) ) { - self->m_apply(); - } - self->m_editing = false; - return FALSE; -} - -static gboolean changed( GtkEntry* entry, NonModalEntry* self ){ - self->m_editing = true; - return FALSE; -} - -static gboolean enter( GtkEntry* entry, GdkEventKey* event, NonModalEntry* self ){ - if ( event->keyval == GDK_Return ) { - self->m_apply(); - self->m_editing = false; - gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( entry ) ) ), NULL ); - return TRUE; - } - return FALSE; -} - -static gboolean escape( GtkEntry* entry, GdkEventKey* event, NonModalEntry* self ){ - if ( event->keyval == GDK_Escape ) { - self->m_cancel(); - self->m_editing = false; - gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( entry ) ) ), NULL ); - return TRUE; - } - return FALSE; -} +gboolean escape_clear_focus_widget(ui::Widget widget, GdkEventKey *event, gpointer data); + +void widget_connect_escape_clear_focus_widget(ui::Widget widget); + +class NonModalEntry { + bool m_editing; + Callback m_apply; + Callback m_cancel; + + static gboolean focus_in(ui::Entry entry, GdkEventFocus *event, NonModalEntry *self); + + static gboolean focus_out(ui::Entry entry, GdkEventFocus *event, NonModalEntry *self); + + static gboolean changed(ui::Entry entry, NonModalEntry *self); + + static gboolean enter(ui::Entry entry, GdkEventKey *event, NonModalEntry *self); + + static gboolean escape(ui::Entry entry, GdkEventKey *event, NonModalEntry *self); public: -NonModalEntry( const Callback& apply, const Callback& cancel ) : m_editing( false ), m_apply( apply ), m_cancel( cancel ){ -} -void connect( GtkEntry* entry ){ - g_signal_connect( G_OBJECT( entry ), "focus_in_event", G_CALLBACK( focus_in ), this ); - g_signal_connect( G_OBJECT( entry ), "focus_out_event", G_CALLBACK( focus_out ), this ); - g_signal_connect( G_OBJECT( entry ), "key_press_event", G_CALLBACK( enter ), this ); - g_signal_connect( G_OBJECT( entry ), "key_press_event", G_CALLBACK( escape ), this ); - g_signal_connect( G_OBJECT( entry ), "changed", G_CALLBACK( changed ), this ); -} + NonModalEntry(const Callback &apply, const Callback &cancel) : m_editing(false), m_apply(apply), m_cancel(cancel) + { + } + + void connect(ui::Entry entry); }; -class NonModalSpinner -{ -Callback m_apply; -Callback m_cancel; - -static gboolean changed( GtkSpinButton* spin, NonModalSpinner* self ){ - self->m_apply(); - return FALSE; -} - -static gboolean enter( GtkSpinButton* spin, GdkEventKey* event, NonModalSpinner* self ){ - if ( event->keyval == GDK_Return ) { - gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( spin ) ) ), NULL ); - return TRUE; - } - return FALSE; -} - -static gboolean escape( GtkSpinButton* spin, GdkEventKey* event, NonModalSpinner* self ){ - if ( event->keyval == GDK_Escape ) { - self->m_cancel(); - gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( spin ) ) ), NULL ); - return TRUE; - } - return FALSE; -} +class NonModalSpinner { + Callback m_apply; + Callback m_cancel; + + static gboolean changed(ui::SpinButton spin, NonModalSpinner *self); + + static gboolean enter(ui::SpinButton spin, GdkEventKey *event, NonModalSpinner *self); + + static gboolean escape(ui::SpinButton spin, GdkEventKey *event, NonModalSpinner *self); public: -NonModalSpinner( const Callback& apply, const Callback& cancel ) : m_apply( apply ), m_cancel( cancel ){ -} -void connect( GtkSpinButton* spin ){ - guint handler = g_signal_connect( G_OBJECT( gtk_spin_button_get_adjustment( spin ) ), "value_changed", G_CALLBACK( changed ), this ); - g_object_set_data( G_OBJECT( spin ), "handler", gint_to_pointer( handler ) ); - g_signal_connect( G_OBJECT( spin ), "key_press_event", G_CALLBACK( enter ), this ); - g_signal_connect( G_OBJECT( spin ), "key_press_event", G_CALLBACK( escape ), this ); -} + NonModalSpinner(const Callback &apply, const Callback &cancel) : m_apply(apply), m_cancel(cancel) + { + } + + void connect(ui::SpinButton spin); }; -class NonModalRadio -{ -Callback m_changed; +class NonModalRadio { + Callback m_changed; public: -NonModalRadio( const Callback& changed ) : m_changed( changed ){ -} -void connect( GtkRadioButton* radio ){ - GSList* group = gtk_radio_button_group( radio ); - for (; group != 0; group = g_slist_next( group ) ) - { - toggle_button_connect_callback( GTK_TOGGLE_BUTTON( group->data ), m_changed ); - } -} + NonModalRadio(const Callback &changed) : m_changed(changed) + { + } + + void connect(ui::RadioButton radio); };