event-editor/multi-choice: Wrap values mathematically

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/754>
This commit is contained in:
Hari Rana
2026-09-30 18:34:36 +00:00
committed by Marge Bot
parent 32504d3092
commit cc655b6459
+10 -18
View File
@@ -25,6 +25,8 @@
#include "gcal-multi-choice.h" #include "gcal-multi-choice.h"
#include "gcal-utils.h" #include "gcal-utils.h"
#define WRAP(value, min, max) (((value - min) % (max + 1 - min)) + (max + 1 - min)) % (max + 1 - min) + min
struct _GcalMultiChoice struct _GcalMultiChoice
{ {
GtkWidget parent; GtkWidget parent;
@@ -155,21 +157,16 @@ set_value (GcalMultiChoice *self,
static void static void
up_action_activated (GcalMultiChoice *self) up_action_activated (GcalMultiChoice *self)
{ {
gboolean wrapped = FALSE; int value, wrapped_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) wrapped_value = WRAP (value, self->min_value, self->max_value);
{
value = self->min_value;
wrapped = TRUE;
}
set_value (self, value, GTK_STACK_TRANSITION_TYPE_NONE); set_value (self, wrapped_value, GTK_STACK_TRANSITION_TYPE_NONE);
if (wrapped) if (wrapped_value != value)
g_signal_emit (self, signals[WRAPPED], 0); g_signal_emit (self, signals[WRAPPED], 0);
gtk_widget_grab_focus (GTK_WIDGET (self)); gtk_widget_grab_focus (GTK_WIDGET (self));
@@ -178,21 +175,16 @@ up_action_activated (GcalMultiChoice *self)
static void static void
down_action_activated (GcalMultiChoice *self) down_action_activated (GcalMultiChoice *self)
{ {
gint value; int value, wrapped_value;
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) wrapped_value = WRAP (value, self->min_value, self->max_value);
{
value = self->max_value;
wrapped = TRUE;
}
set_value (self, value, GTK_STACK_TRANSITION_TYPE_NONE); set_value (self, wrapped_value, GTK_STACK_TRANSITION_TYPE_NONE);
if (wrapped) if (wrapped_value != value)
g_signal_emit (self, signals[WRAPPED], 0); g_signal_emit (self, signals[WRAPPED], 0);
gtk_widget_grab_focus (GTK_WIDGET (self)); gtk_widget_grab_focus (GTK_WIDGET (self));