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:
@@ -12,7 +12,7 @@ template $GcalMultiChoice: Widget {
|
|||||||
|
|
||||||
Button down_button {
|
Button down_button {
|
||||||
icon-name: "pan-start-symbolic";
|
icon-name: "pan-start-symbolic";
|
||||||
clicked => $button_clicked_cb();
|
action-name: "multi-choice.down";
|
||||||
can-focus: false;
|
can-focus: false;
|
||||||
tooltip-text: bind template.previous-button-tooltip;
|
tooltip-text: bind template.previous-button-tooltip;
|
||||||
|
|
||||||
@@ -34,10 +34,6 @@ template $GcalMultiChoice: Widget {
|
|||||||
"popup",
|
"popup",
|
||||||
]
|
]
|
||||||
|
|
||||||
EventControllerKey {
|
|
||||||
key-pressed => $key_pressed_cb(template);
|
|
||||||
}
|
|
||||||
|
|
||||||
Stack stack {
|
Stack stack {
|
||||||
hexpand: true;
|
hexpand: true;
|
||||||
vexpand: true;
|
vexpand: true;
|
||||||
@@ -58,7 +54,7 @@ template $GcalMultiChoice: Widget {
|
|||||||
|
|
||||||
Button up_button {
|
Button up_button {
|
||||||
icon-name: "pan-end-symbolic";
|
icon-name: "pan-end-symbolic";
|
||||||
clicked => $button_clicked_cb();
|
action-name: "multi-choice.up";
|
||||||
can-focus: false;
|
can-focus: false;
|
||||||
tooltip-text: bind template.next-button-tooltip;
|
tooltip-text: bind template.next-button-tooltip;
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "gcal-multi-choice.h"
|
#include "gcal-multi-choice.h"
|
||||||
|
#include "gcal-utils.h"
|
||||||
|
|
||||||
struct _GcalMultiChoice
|
struct _GcalMultiChoice
|
||||||
{
|
{
|
||||||
@@ -155,13 +156,13 @@ set_value (GcalMultiChoice *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
go_up (GcalMultiChoice *self)
|
up_action_activated (GcalMultiChoice *self)
|
||||||
{
|
{
|
||||||
gboolean wrapped = FALSE;
|
gboolean wrapped = FALSE;
|
||||||
gint value;
|
gint value;
|
||||||
|
|
||||||
value = self->next_cb ? self->next_cb (self->value) : self->value + 1;
|
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)
|
if (value > self->max_value)
|
||||||
{
|
{
|
||||||
@@ -173,16 +174,18 @@ go_up (GcalMultiChoice *self)
|
|||||||
|
|
||||||
if (wrapped)
|
if (wrapped)
|
||||||
g_signal_emit (self, signals[WRAPPED], 0);
|
g_signal_emit (self, signals[WRAPPED], 0);
|
||||||
|
|
||||||
|
gtk_widget_grab_focus (GTK_WIDGET (self));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
go_down (GcalMultiChoice *self)
|
down_action_activated (GcalMultiChoice *self)
|
||||||
{
|
{
|
||||||
gint value;
|
gint value;
|
||||||
gboolean wrapped = FALSE;
|
gboolean wrapped = FALSE;
|
||||||
|
|
||||||
value = self->prev_cb ? self->prev_cb (self->value) : self->value - 1;
|
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)
|
if (value < self->min_value)
|
||||||
{
|
{
|
||||||
@@ -194,6 +197,8 @@ go_down (GcalMultiChoice *self)
|
|||||||
|
|
||||||
if (wrapped)
|
if (wrapped)
|
||||||
g_signal_emit (self, signals[WRAPPED], 0);
|
g_signal_emit (self, signals[WRAPPED], 0);
|
||||||
|
|
||||||
|
gtk_widget_grab_focus (GTK_WIDGET (self));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -217,72 +222,6 @@ update_sensitivity (GcalMultiChoice *self)
|
|||||||
GTK_ACCESSIBLE_RELATION_CONTROLS);
|
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
|
static void
|
||||||
button_toggled_cb (GcalMultiChoice *self)
|
button_toggled_cb (GcalMultiChoice *self)
|
||||||
{
|
{
|
||||||
@@ -583,16 +522,14 @@ gcal_multi_choice_class_init (GcalMultiChoiceClass *class)
|
|||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
NULL,
|
NULL,
|
||||||
G_TYPE_NONE, 0);
|
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");
|
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, label2);
|
||||||
gtk_widget_class_bind_template_child (widget_class, GcalMultiChoice, popover_bin);
|
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_toggled_cb);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, button_state_flags_changed_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");
|
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));
|
gtk_widget_init_template (GTK_WIDGET (self));
|
||||||
|
|
||||||
update_sensitivity (self);
|
update_sensitivity (self);
|
||||||
|
|
||||||
|
g_signal_connect_swapped (self, "activate", (GCallback) button_toggled_cb, self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user