event-editor/multi-choice: Wrap values mathematically
Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/754>
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user