gui/multi-choice: Rework value properties

This changes the way the current value is being set, as well as
proper getter and setter methods for respective min and max values.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/754>
This commit is contained in:
Hari Rana
2026-09-30 18:34:37 +00:00
committed by Marge Bot
parent 12c30b818e
commit 096139721d
2 changed files with 144 additions and 48 deletions
+132 -46
View File
@@ -118,28 +118,6 @@ apply_value (GcalMultiChoice *self)
-1); -1);
} }
static void
set_value (GcalMultiChoice *self,
gint value)
{
value = CLAMP (value, self->min_value, self->max_value);
if (self->value == value)
return;
self->value = value;
apply_value (self);
gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_VALUE_MAX, (gdouble) self->max_value,
GTK_ACCESSIBLE_PROPERTY_VALUE_MIN, (gdouble) self->min_value,
GTK_ACCESSIBLE_PROPERTY_VALUE_NOW, (gdouble) self->value,
-1);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VALUE]);
}
static void static void
action_activated (GcalMultiChoice *self, action_activated (GcalMultiChoice *self,
int value) int value)
@@ -148,7 +126,7 @@ action_activated (GcalMultiChoice *self,
wrapped_value = WRAP (value, self->min_value, self->max_value); wrapped_value = WRAP (value, self->min_value, self->max_value);
set_value (self, wrapped_value); gcal_multi_choice_set_value (self, wrapped_value);
if (wrapped_value != value) if (wrapped_value != value)
g_signal_emit (self, signals[WRAPPED], 0); g_signal_emit (self, signals[WRAPPED], 0);
@@ -268,15 +246,15 @@ gcal_multi_choice_get_property (GObject *object,
switch (property_id) switch (property_id)
{ {
case PROP_VALUE: case PROP_VALUE:
g_value_set_int (value, self->value); g_value_set_int (value, gcal_multi_choice_get_value (self));
break; break;
case PROP_MIN_VALUE: case PROP_MIN_VALUE:
g_value_set_int (value, self->min_value); g_value_set_int (value, gcal_multi_choice_get_min_value (self));
break; break;
case PROP_MAX_VALUE: case PROP_MAX_VALUE:
g_value_set_int (value, self->max_value); g_value_set_int (value, gcal_multi_choice_get_max_value (self));
break; break;
case PROP_STRING_LIST: case PROP_STRING_LIST:
@@ -320,15 +298,11 @@ gcal_multi_choice_set_property (GObject *object,
break; break;
case PROP_MIN_VALUE: case PROP_MIN_VALUE:
self->min_value = g_value_get_int (value); gcal_multi_choice_set_min_value (self, g_value_get_int (value));
g_object_notify_by_pspec (object, properties[PROP_MIN_VALUE]);
gcal_multi_choice_set_value (self, self->value);
break; break;
case PROP_MAX_VALUE: case PROP_MAX_VALUE:
self->max_value = g_value_get_int (value); gcal_multi_choice_set_max_value (self, g_value_get_int (value));
g_object_notify_by_pspec (object, properties[PROP_MAX_VALUE]);
gcal_multi_choice_set_value (self, self->value);
break; break;
case PROP_STRING_LIST: case PROP_STRING_LIST:
@@ -422,18 +396,35 @@ gcal_multi_choice_class_init (GcalMultiChoiceClass *class)
widget_class->state_flags_changed = gcal_multi_choice_state_flags_changed; widget_class->state_flags_changed = gcal_multi_choice_state_flags_changed;
/**
* GcalMultiChoice:value:
*
* The current value.
*/
properties[PROP_VALUE] = properties[PROP_VALUE] =
g_param_spec_int ("value", "Value", "Value", g_param_spec_int ("value", NULL, NULL,
G_MININT, G_MAXINT, 0, G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GcalMultiChoice:min-value:
*
* The minimum value.
*/
properties[PROP_MIN_VALUE] = properties[PROP_MIN_VALUE] =
g_param_spec_int ("min-value", "Minimum Value", "Minimum Value", g_param_spec_int ("min-value", NULL, NULL,
G_MININT, G_MAXINT, 0, G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GcalMultiChoice:max-value:
*
* The maximum value.
*/
properties[PROP_MAX_VALUE] = properties[PROP_MAX_VALUE] =
g_param_spec_int ("max-value", "Maximum Value", "Maximum Value", g_param_spec_int ("max-value", NULL, NULL,
G_MININT, G_MAXINT, 0, G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/** /**
* GcalMultiChoice:string-list: * GcalMultiChoice:string-list:
@@ -536,6 +527,22 @@ gcal_multi_choice_new (void)
return GTK_WIDGET (g_object_new (GCAL_TYPE_MULTI_CHOICE, NULL)); return GTK_WIDGET (g_object_new (GCAL_TYPE_MULTI_CHOICE, NULL));
} }
/**
* gcal_multi_choice_get_value:
* @self: a #GcalMultiChoice
*
* Gets the value for @self.
*
* Returns: The value for @self.
*/
int
gcal_multi_choice_get_value (GcalMultiChoice *self)
{
g_assert (GCAL_IS_MULTI_CHOICE (self));
return self->value;
}
/** /**
* gcal_multi_choice_set_value: * gcal_multi_choice_set_value:
* @self: a #GcalMultiChoice * @self: a #GcalMultiChoice
@@ -545,27 +552,106 @@ gcal_multi_choice_new (void)
*/ */
void void
gcal_multi_choice_set_value (GcalMultiChoice *self, gcal_multi_choice_set_value (GcalMultiChoice *self,
gint value) int value)
{ {
g_assert (GCAL_IS_MULTI_CHOICE (self)); g_assert (GCAL_IS_MULTI_CHOICE (self));
set_value (self, value); value = CLAMP (value, self->min_value, self->max_value);
if (self->value == value)
return;
self->value = value;
apply_value (self);
gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_VALUE_NOW, (double) value,
-1);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VALUE]);
} }
/** /**
* gcal_multi_choice_get_value: * gcal_multi_choice_get_min_value:
* @self: a #GcalMultiChoice * @self: a #GcalMultiChoice
* *
* Gets the value for @self. * Gets the minimum value for @self.
* *
* Returns: The value for @self. * Returns: the minimum value for @self.
*/ */
gint int
gcal_multi_choice_get_value (GcalMultiChoice *self) gcal_multi_choice_get_min_value (GcalMultiChoice *self)
{ {
g_assert (GCAL_IS_MULTI_CHOICE (self)); g_assert (GCAL_IS_MULTI_CHOICE (self));
return self->value; return self->min_value;
}
/**
* gcal_multi_choice_set_min_value:
* @self: a #GcalMultiChoice
* @min_value: the minimum value
*
* Sets the minimum value for @self.
*/
void
gcal_multi_choice_set_min_value (GcalMultiChoice *self,
int min_value)
{
g_assert (GCAL_IS_MULTI_CHOICE (self));
if (self->min_value == min_value)
return;
self->min_value = min_value;
gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_VALUE_MIN, (double) min_value,
-1);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MIN_VALUE]);
}
/**
* gcal_multi_choice_get_max_value:
* @self: a #GcalMultiChoice
*
* Gets the maximum value for @self.
*
* Returns: the maximum value for @self.
*/
int
gcal_multi_choice_get_max_value (GcalMultiChoice *self)
{
g_assert (GCAL_IS_MULTI_CHOICE (self));
return self->max_value;
}
/**
* gcal_multi_choice_set_max_value:
* @self: a #GcalMultiChoice
* @max_value: the maximum value
*
* Sets the maximum value for @self.
*/
void
gcal_multi_choice_set_max_value (GcalMultiChoice *self,
int max_value)
{
g_assert (GCAL_IS_MULTI_CHOICE (self));
if (self->max_value == max_value)
return;
self->max_value = max_value;
gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_VALUE_MAX, (double) max_value,
-1);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MAX_VALUE]);
} }
/** /**
+12 -2
View File
@@ -29,10 +29,20 @@ G_DECLARE_FINAL_TYPE (GcalMultiChoice, gcal_multi_choice, GCAL, MULTI_CHOICE, Gt
GtkWidget* gcal_multi_choice_new (void); GtkWidget* gcal_multi_choice_new (void);
gint gcal_multi_choice_get_value (GcalMultiChoice *self); int gcal_multi_choice_get_value (GcalMultiChoice *self);
void gcal_multi_choice_set_value (GcalMultiChoice *self, void gcal_multi_choice_set_value (GcalMultiChoice *self,
gint value); int value);
int gcal_multi_choice_get_min_value (GcalMultiChoice *self);
void gcal_multi_choice_set_min_value (GcalMultiChoice *self,
int min_value);
int gcal_multi_choice_get_max_value (GcalMultiChoice *self);
void gcal_multi_choice_set_max_value (GcalMultiChoice *self,
int max_value);
GtkPopover* gcal_multi_choice_get_popover (GcalMultiChoice *self); GtkPopover* gcal_multi_choice_get_popover (GcalMultiChoice *self);