event-editor/multi-choice: Port from GtkEventControllerKey to shortcuts

Since we wrap the values all the time now, this also removes
the `gtk_widget_error_bell()` call.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/841>
This commit is contained in:
Hari Rana
2026-09-25 19:09:11 +00:00
committed by Marge Bot
parent 34be5e4663
commit c3d5c777ec
2 changed files with 20 additions and 87 deletions
+2 -6
View File
@@ -12,7 +12,7 @@ template $GcalMultiChoice: Widget {
Button down_button {
icon-name: "pan-start-symbolic";
clicked => $button_clicked_cb();
action-name: "multi-choice.down";
can-focus: false;
tooltip-text: bind template.previous-button-tooltip;
@@ -34,10 +34,6 @@ template $GcalMultiChoice: Widget {
"popup",
]
EventControllerKey {
key-pressed => $key_pressed_cb(template);
}
Stack stack {
hexpand: true;
vexpand: true;
@@ -58,7 +54,7 @@ template $GcalMultiChoice: Widget {
Button up_button {
icon-name: "pan-end-symbolic";
clicked => $button_clicked_cb();
action-name: "multi-choice.up";
can-focus: false;
tooltip-text: bind template.next-button-tooltip;
+18 -81
View File
@@ -23,6 +23,7 @@
#include "config.h"
#include "gcal-multi-choice.h"
#include "gcal-utils.h"
struct _GcalMultiChoice
{
@@ -155,13 +156,13 @@ set_value (GcalMultiChoice *self,
}
static void
go_up (GcalMultiChoice *self)
up_action_activated (GcalMultiChoice *self)
{
gboolean wrapped = FALSE;
gint value;
value = self->next_cb ? self->next_cb (self->value) : self->value + 1;
g_assert_cmpint (value, > ,self->value);
g_assert_cmpint (value, >, self->value);
if (value > self->max_value)
{
@@ -173,16 +174,18 @@ go_up (GcalMultiChoice *self)
if (wrapped)
g_signal_emit (self, signals[WRAPPED], 0);
gtk_widget_grab_focus (GTK_WIDGET (self));
}
static void
go_down (GcalMultiChoice *self)
down_action_activated (GcalMultiChoice *self)
{
gint value;
gboolean wrapped = FALSE;
value = self->prev_cb ? self->prev_cb (self->value) : self->value - 1;
g_assert_cmpint (value, < , self->value);
g_assert_cmpint (value, <, self->value);
if (value < self->min_value)
{
@@ -194,6 +197,8 @@ go_down (GcalMultiChoice *self)
if (wrapped)
g_signal_emit (self, signals[WRAPPED], 0);
gtk_widget_grab_focus (GTK_WIDGET (self));
}
static void
@@ -217,72 +222,6 @@ update_sensitivity (GcalMultiChoice *self)
GTK_ACCESSIBLE_RELATION_CONTROLS);
}
static void
button_clicked_cb (GtkWidget *button,
GcalMultiChoice *self)
{
GtkStateFlags state_flags;
state_flags = gtk_widget_get_state_flags (button);
if (button == self->down_button)
go_down (self);
else if (button == self->up_button)
go_up (self);
else
g_assert_not_reached ();
if (!gtk_widget_grab_focus (GTK_WIDGET (self)))
g_assert_not_reached ();
gtk_widget_set_state_flags (button, state_flags, TRUE);
}
static gboolean
key_pressed_cb (GcalMultiChoice *self,
guint keyval,
guint keycode,
GdkModifierType state,
GtkEventControllerKey *event_controller)
{
gboolean is_active;
gint old_value;
g_assert (GCAL_IS_MULTI_CHOICE (self));
g_assert (GTK_IS_EVENT_CONTROLLER_KEY (event_controller));
switch (keyval)
{
case GDK_KEY_space:
case GDK_KEY_KP_Space:
case GDK_KEY_Return:
case GDK_KEY_ISO_Enter:
case GDK_KEY_KP_Enter:
is_active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->button));
if (gtk_popover_bin_get_popover (self->popover_bin))
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->button), !is_active);
return TRUE;
case GDK_KEY_Up:
case GDK_KEY_KP_Up:
old_value = self->value;
go_up (self);
if (old_value == self->value)
gtk_widget_error_bell (GTK_WIDGET (self));
return TRUE;
case GDK_KEY_Down:
case GDK_KEY_KP_Down:
old_value = self->value;
go_down (self);
if (old_value == self->value)
gtk_widget_error_bell (GTK_WIDGET (self));
return TRUE;
}
return FALSE;
}
static void
button_toggled_cb (GcalMultiChoice *self)
{
@@ -583,16 +522,14 @@ gcal_multi_choice_class_init (GcalMultiChoiceClass *class)
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
signals[ACTIVATE] =
g_signal_new ("activate",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
0,
NULL, NULL,
NULL,
G_TYPE_NONE, 0);
gtk_widget_class_set_activate_signal (widget_class, signals[ACTIVATE]);
gtk_widget_class_install_action (widget_class, "multi-choice.up", NULL, (GtkWidgetActionActivateFunc) up_action_activated);
gtk_widget_class_install_action (widget_class, "multi-choice.down", NULL, (GtkWidgetActionActivateFunc) down_action_activated);
gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Up, 0, "multi-choice.up", NULL);
gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Down, 0, "multi-choice.down", NULL);
signals[ACTIVATE] = gcal_util_create_activate_signal_and_shortcuts (widget_class, GCAL_TYPE_MULTI_CHOICE);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/event-editor/gcal-multi-choice.ui");
@@ -604,10 +541,8 @@ gcal_multi_choice_class_init (GcalMultiChoiceClass *class)
gtk_widget_class_bind_template_child (widget_class, GcalMultiChoice, label2);
gtk_widget_class_bind_template_child (widget_class, GcalMultiChoice, popover_bin);
gtk_widget_class_bind_template_callback (widget_class, button_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, button_toggled_cb);
gtk_widget_class_bind_template_callback (widget_class, button_state_flags_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, key_pressed_cb);
gtk_widget_class_set_css_name (widget_class, "navigator");
@@ -632,6 +567,8 @@ gcal_multi_choice_init (GcalMultiChoice *self)
gtk_widget_init_template (GTK_WIDGET (self));
update_sensitivity (self);
g_signal_connect_swapped (self, "activate", (GCallback) button_toggled_cb, self);
}
/*