Handle the recurrence until-date with an action, not via the widgets

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/550>
This commit is contained in:
Federico Mena Quintero
2025-08-27 20:18:52 -03:00
committed by Georges Basile Stavracas Neto
parent 8c0281aef5
commit e9a626ed40
2 changed files with 29 additions and 0 deletions
@@ -106,6 +106,7 @@ template $GcalScheduleSection: Box {
$GcalDateSelector until_date_selector {
visible: false;
valign: center;
notify::date => $on_until_date_changed_cb() swapped;
}
}
}
@@ -125,6 +125,7 @@ static void on_schedule_type_changed_cb (GtkWidget
GcalScheduleSection *self);
static void on_number_of_occurrences_changed_cb (GcalScheduleSection *self);
static void on_until_date_changed_cb (GcalScheduleSection *self);
static GcalScheduleValues
gcal_schedule_values_copy (const GcalScheduleValues *values)
@@ -459,6 +460,22 @@ gcal_schedule_section_values_set_recurrence_count (const GcalScheduleSectionValu
return copy;
}
static GcalScheduleSectionValues *
gcal_schedule_section_values_set_recurrence_until (const GcalScheduleSectionValues *values,
GDateTime *until)
{
GcalScheduleSectionValues *copy = gcal_schedule_section_values_copy (values);
/* An old recurrence would already be present */
g_assert (copy->curr.recur != NULL);
g_assert (copy->curr.recur->frequency != GCAL_RECURRENCE_NO_REPEAT);
g_assert (copy->curr.recur->limit_type == GCAL_RECURRENCE_UNTIL);
gcal_set_date_time (&copy->curr.recur->limit.until, until);
return copy;
}
static WidgetState *
widget_state_from_values (const GcalScheduleSectionValues *values)
{
@@ -610,6 +627,7 @@ update_widgets (GcalScheduleSection *self,
{
g_signal_handlers_block_by_func (self->schedule_type_toggle_group, on_schedule_type_changed_cb, self);
g_signal_handlers_block_by_func (self->number_of_occurrences_spin, on_number_of_occurrences_changed_cb, self);
g_signal_handlers_block_by_func (self->until_date_selector, on_until_date_changed_cb, self);
block_date_signals (self);
adw_toggle_group_set_active_name (self->schedule_type_toggle_group,
@@ -656,6 +674,7 @@ update_widgets (GcalScheduleSection *self,
}
unblock_date_signals (self);
g_signal_handlers_unblock_by_func (self->until_date_selector, on_until_date_changed_cb, self);
g_signal_handlers_unblock_by_func (self->number_of_occurrences_spin, on_number_of_occurrences_changed_cb, self);
g_signal_handlers_unblock_by_func (self->schedule_type_toggle_group, on_schedule_type_changed_cb, self);
}
@@ -744,6 +763,14 @@ on_number_of_occurrences_changed_cb (GcalScheduleSection *self)
update_from_section_values (self, updated);
}
static void
on_until_date_changed_cb (GcalScheduleSection *self)
{
GDateTime *until = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (self->until_date_selector));
GcalScheduleSectionValues *updated = gcal_schedule_section_values_set_recurrence_until (self->values, until);
update_from_section_values (self, updated);
}
static GcalRecurrenceLimitType
get_recurence_limit_type (GcalScheduleSection *self)
{
@@ -1047,6 +1074,7 @@ gcal_schedule_section_class_init (GcalScheduleSectionClass *klass)
gtk_widget_class_bind_template_callback (widget_class, on_repeat_duration_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_repeat_type_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_number_of_occurrences_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_until_date_changed_cb);
}
static void