spinbutton: Add activate signal

Add a new activate signal that fires when enter is pressed after
editing, and make the default handler activate the default widget if
activates-default is set.
This commit is contained in:
PBS
2023-11-10 18:35:00 +09:00
parent 3d898af736
commit fe224c3ad9

View File

@@ -218,6 +218,7 @@ struct _GtkSpinButton
guint timer_calls : 3;
guint wrap : 1;
guint editing_canceled : 1;
guint edited : 1;
guint activates_default : 1;
};
@@ -229,6 +230,7 @@ struct _GtkSpinButtonClass
double *new_value);
int (*output) (GtkSpinButton *spin_button);
void (*value_changed) (GtkSpinButton *spin_button);
void (*activate) (GtkSpinButton *spin_button);
/* Action signals for keybindings, do not connect to these */
void (*change_value) (GtkSpinButton *spin_button,
@@ -259,6 +261,7 @@ enum
INPUT,
OUTPUT,
VALUE_CHANGED,
ACTIVATE,
CHANGE_VALUE,
WRAPPED,
LAST_SIGNAL
@@ -284,6 +287,9 @@ static gboolean gtk_spin_button_stop_spinning (GtkSpinButton *spin);
static void gtk_spin_button_value_changed (GtkAdjustment *adjustment,
GtkSpinButton *spin_button);
static void gtk_spin_button_changed (GtkEditable *editable,
GtkSpinButton *spin_button);
static void gtk_spin_button_real_activate (GtkSpinButton *spin_button);
static void gtk_spin_button_activate (GtkText *entry,
gpointer user_data);
static void gtk_spin_button_unset_adjustment (GtkSpinButton *spin_button);
@@ -367,6 +373,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
class->input = NULL;
class->output = NULL;
class->change_value = gtk_spin_button_real_change_value;
class->activate = gtk_spin_button_real_activate;
/**
* GtkSpinButton:activates-default: (attributes org.gtk.Property.get=gtk_spin_button_get_activates_default org.gtk.Property.set=gtk_spin_button_set_activates_default)
@@ -556,6 +563,31 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
NULL,
G_TYPE_NONE, 0);
/**
* GtkSpinButton::activate:
* @self: The widget on which the signal is emitted
*
* Emitted when the spin button is activated.
*
* The keybindings for this signal are all forms of the <kbd>Enter</kbd> key.
*
* If the <kbd>Enter</kbd> key results in the value being committed to the
* spin button, then activation does not occur until <kbd>Enter</kbd> is
* pressed again.
*
* Since: 4.14
*/
spinbutton_signals[ACTIVATE] =
g_signal_new (I_("activate"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (GtkSpinButtonClass, activate),
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
gtk_widget_class_set_activate_signal (widget_class, spinbutton_signals[ACTIVATE]);
/**
* GtkSpinButton::wrapped:
* @spin_button: the object on which the signal was emitted
@@ -1037,6 +1069,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
spin_button->digits = 0;
spin_button->numeric = FALSE;
spin_button->wrap = FALSE;
spin_button->edited = FALSE;
spin_button->snap_to_ticks = FALSE;
spin_button->width_chars = -1;
@@ -1049,6 +1082,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
gtk_widget_set_hexpand (spin_button->entry, TRUE);
gtk_widget_set_vexpand (spin_button->entry, TRUE);
g_signal_connect (spin_button->entry, "activate", G_CALLBACK (gtk_spin_button_activate), spin_button);
g_signal_connect (spin_button->entry, "changed", G_CALLBACK (gtk_spin_button_changed), spin_button);
gtk_widget_set_parent (spin_button->entry, GTK_WIDGET (spin_button));
spin_button->down_button = g_object_new (GTK_TYPE_BUTTON,
@@ -1384,6 +1418,8 @@ gtk_spin_button_value_changed (GtkAdjustment *adjustment,
update_buttons_sensitivity (spin_button);
g_object_notify_by_pspec (G_OBJECT (spin_button), spinbutton_props[PROP_VALUE]);
spin_button->edited = FALSE;
}
static void
@@ -1505,14 +1541,35 @@ gtk_spin_button_snap (GtkSpinButton *spin_button,
return val;
}
static void
gtk_spin_button_changed (GtkEditable *editable,
GtkSpinButton *spin_button)
{
spin_button->edited = TRUE;
}
static void
gtk_spin_button_real_activate (GtkSpinButton *spin_button)
{
if (spin_button->activates_default)
gtk_widget_activate_default (GTK_WIDGET (spin_button));
}
static void
gtk_spin_button_activate (GtkText *entry,
gpointer user_data)
{
GtkSpinButton *spin_button = user_data;
if (gtk_editable_get_editable (GTK_EDITABLE (spin_button->entry)))
gtk_spin_button_update (spin_button);
if (!gtk_editable_get_editable (GTK_EDITABLE (spin_button->entry)))
return;
const gboolean was_edited = spin_button->edited;
gtk_spin_button_update (spin_button); /* resets edited */
if (!was_edited)
g_signal_emit (spin_button, spinbutton_signals[ACTIVATE], 0);
}
static void
@@ -2168,6 +2225,8 @@ gtk_spin_button_set_value (GtkSpinButton *spin_button,
if (!return_val)
gtk_spin_button_default_output (spin_button);
}
spin_button->edited = FALSE;
}
/**