edit-dialog: Factor out update code to a separate function
To simplify readability of the response function, move some of its code to an auxiliary function.
This commit is contained in:
+135
-127
@@ -654,6 +654,140 @@ clear_alarms (GcalEditDialog *self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
apply_changes_to_event (GcalEditDialog *self)
|
||||||
|
{
|
||||||
|
GcalRecurrenceFrequency freq;
|
||||||
|
GcalRecurrence *old_recur;
|
||||||
|
GDateTime *start_date, *end_date;
|
||||||
|
gboolean was_all_day;
|
||||||
|
gboolean all_day;
|
||||||
|
gchar *note_text;
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
/* Update summary */
|
||||||
|
gcal_event_set_summary (self->event, gtk_entry_get_text (GTK_ENTRY (self->summary_entry)));
|
||||||
|
|
||||||
|
/* Update description */
|
||||||
|
g_object_get (G_OBJECT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->notes_text))),
|
||||||
|
"text", ¬e_text,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
gcal_event_set_description (self->event, note_text);
|
||||||
|
g_free (note_text);
|
||||||
|
|
||||||
|
all_day = gtk_switch_get_active (self->all_day_switch);
|
||||||
|
was_all_day = gcal_event_get_all_day (self->event);
|
||||||
|
|
||||||
|
if (!was_all_day && all_day)
|
||||||
|
gcal_event_save_original_timezones (self->event);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update start & end dates. The dates are already translated to the current
|
||||||
|
* timezone (unless the event used to be all day, but no longer is).
|
||||||
|
*/
|
||||||
|
start_date = get_date_start (self);
|
||||||
|
end_date = get_date_end (self);
|
||||||
|
|
||||||
|
#ifdef GCAL_ENABLE_TRACE
|
||||||
|
{
|
||||||
|
g_autofree gchar *start_dt_string = g_date_time_format (start_date, "%x %X %z");
|
||||||
|
g_autofree gchar *end_dt_string = g_date_time_format (end_date, "%x %X %z");
|
||||||
|
|
||||||
|
g_debug ("New start date: %s", start_dt_string);
|
||||||
|
g_debug ("New end date: %s", end_dt_string);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gcal_event_set_all_day (self->event, all_day);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The end date for multi-day events is exclusive, so we bump it by a day.
|
||||||
|
* This fixes the discrepancy between the end day of the event and how it
|
||||||
|
* is displayed in the month view. See bug 769300.
|
||||||
|
*/
|
||||||
|
if (all_day)
|
||||||
|
{
|
||||||
|
GDateTime *fake_end_date = g_date_time_add_days (end_date, 1);
|
||||||
|
|
||||||
|
g_clear_pointer (&end_date, g_date_time_unref);
|
||||||
|
end_date = fake_end_date;
|
||||||
|
}
|
||||||
|
else if (!all_day && was_all_day)
|
||||||
|
{
|
||||||
|
/* When an all day event is changed to be not an all day event, we
|
||||||
|
* need to correct for the fact that the event's timezone was until
|
||||||
|
* now set to UTC. That means we need to change the timezone to
|
||||||
|
* localtime now, or else it will be saved incorrectly.
|
||||||
|
*/
|
||||||
|
GDateTime *localtime_date;
|
||||||
|
|
||||||
|
localtime_date = g_date_time_to_local (start_date);
|
||||||
|
g_clear_pointer (&start_date, g_date_time_unref);
|
||||||
|
start_date = localtime_date;
|
||||||
|
|
||||||
|
localtime_date = g_date_time_to_local (end_date);
|
||||||
|
g_clear_pointer (&end_date, g_date_time_unref);
|
||||||
|
end_date = localtime_date;
|
||||||
|
}
|
||||||
|
|
||||||
|
gcal_event_set_date_start (self->event, start_date);
|
||||||
|
gcal_event_set_date_end (self->event, end_date);
|
||||||
|
|
||||||
|
g_clear_pointer (&start_date, g_date_time_unref);
|
||||||
|
g_clear_pointer (&end_date, g_date_time_unref);
|
||||||
|
|
||||||
|
/* Update alarms */
|
||||||
|
gcal_event_remove_all_alarms (self->event);
|
||||||
|
|
||||||
|
for (i = 0; i < self->alarms->len; i++)
|
||||||
|
gcal_event_add_alarm (self->event, g_ptr_array_index (self->alarms, i));
|
||||||
|
|
||||||
|
clear_alarms (self);
|
||||||
|
|
||||||
|
/* Check Repeat popover and set recurrence-rules accordingly */
|
||||||
|
old_recur = gcal_event_get_recurrence (self->event);
|
||||||
|
freq = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_combo));
|
||||||
|
|
||||||
|
if (freq != GCAL_RECURRENCE_NO_REPEAT)
|
||||||
|
{
|
||||||
|
GcalRecurrence *recur;
|
||||||
|
|
||||||
|
recur = gcal_recurrence_new ();
|
||||||
|
recur->frequency = freq;
|
||||||
|
recur->limit_type = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_duration_combo));
|
||||||
|
|
||||||
|
if (recur->limit_type == GCAL_RECURRENCE_UNTIL)
|
||||||
|
recur->limit.until = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (self->until_date_selector));
|
||||||
|
else if (recur->limit_type == GCAL_RECURRENCE_COUNT)
|
||||||
|
recur->limit.count = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (self->number_of_occurrences_spin));
|
||||||
|
|
||||||
|
/* Only apply the new recurrence if it's different from the old one */
|
||||||
|
if (!gcal_recurrence_is_equal (old_recur, recur))
|
||||||
|
{
|
||||||
|
/* Remove the previous recurrence... */
|
||||||
|
remove_recurrence_properties (self->event);
|
||||||
|
|
||||||
|
/* ... and set the new one */
|
||||||
|
gcal_event_set_recurrence (self->event, recur);
|
||||||
|
|
||||||
|
self->recurrence_changed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_clear_pointer (&recur, gcal_recurrence_unref);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* When NO_REPEAT is set, make sure to remove the old recurrent */
|
||||||
|
remove_recurrence_properties (self->event);
|
||||||
|
|
||||||
|
/* If the recurrence from an recurrent event was removed, mark it as changed */
|
||||||
|
if (old_recur && old_recur->frequency != GCAL_RECURRENCE_NO_REPEAT)
|
||||||
|
self->recurrence_changed = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Callbacks
|
* Callbacks
|
||||||
*/
|
*/
|
||||||
@@ -791,135 +925,9 @@ on_action_button_clicked_cb (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GcalRecurrenceFrequency freq;
|
|
||||||
GcalRecurrence *old_recur;
|
|
||||||
GcalCalendar *calendar;
|
GcalCalendar *calendar;
|
||||||
GDateTime *start_date, *end_date;
|
|
||||||
gboolean was_all_day;
|
|
||||||
gboolean all_day;
|
|
||||||
gchar *note_text;
|
|
||||||
gsize i;
|
|
||||||
|
|
||||||
/* Update summary */
|
apply_changes_to_event (self);
|
||||||
gcal_event_set_summary (self->event, gtk_entry_get_text (GTK_ENTRY (self->summary_entry)));
|
|
||||||
|
|
||||||
/* Update description */
|
|
||||||
g_object_get (G_OBJECT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->notes_text))),
|
|
||||||
"text", ¬e_text,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
gcal_event_set_description (self->event, note_text);
|
|
||||||
g_free (note_text);
|
|
||||||
|
|
||||||
all_day = gtk_switch_get_active (self->all_day_switch);
|
|
||||||
was_all_day = gcal_event_get_all_day (self->event);
|
|
||||||
|
|
||||||
if (!was_all_day && all_day)
|
|
||||||
gcal_event_save_original_timezones (self->event);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Update start & end dates. The dates are already translated to the current
|
|
||||||
* timezone (unless the event used to be all day, but no longer is).
|
|
||||||
*/
|
|
||||||
start_date = get_date_start (self);
|
|
||||||
end_date = get_date_end (self);
|
|
||||||
|
|
||||||
#ifdef GCAL_ENABLE_TRACE
|
|
||||||
{
|
|
||||||
g_autofree gchar *start_dt_string = g_date_time_format (start_date, "%x %X %z");
|
|
||||||
g_autofree gchar *end_dt_string = g_date_time_format (end_date, "%x %X %z");
|
|
||||||
|
|
||||||
g_debug ("New start date: %s", start_dt_string);
|
|
||||||
g_debug ("New end date: %s", end_dt_string);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gcal_event_set_all_day (self->event, all_day);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The end date for multi-day events is exclusive, so we bump it by a day.
|
|
||||||
* This fixes the discrepancy between the end day of the event and how it
|
|
||||||
* is displayed in the month view. See bug 769300.
|
|
||||||
*/
|
|
||||||
if (all_day)
|
|
||||||
{
|
|
||||||
GDateTime *fake_end_date = g_date_time_add_days (end_date, 1);
|
|
||||||
|
|
||||||
g_clear_pointer (&end_date, g_date_time_unref);
|
|
||||||
end_date = fake_end_date;
|
|
||||||
}
|
|
||||||
else if (!all_day && was_all_day)
|
|
||||||
{
|
|
||||||
/* When an all day event is changed to be not an all day event, we
|
|
||||||
* need to correct for the fact that the event's timezone was until
|
|
||||||
* now set to UTC. That means we need to change the timezone to
|
|
||||||
* localtime now, or else it will be saved incorrectly.
|
|
||||||
*/
|
|
||||||
GDateTime *localtime_date;
|
|
||||||
|
|
||||||
localtime_date = g_date_time_to_local (start_date);
|
|
||||||
g_clear_pointer (&start_date, g_date_time_unref);
|
|
||||||
start_date = localtime_date;
|
|
||||||
|
|
||||||
localtime_date = g_date_time_to_local (end_date);
|
|
||||||
g_clear_pointer (&end_date, g_date_time_unref);
|
|
||||||
end_date = localtime_date;
|
|
||||||
}
|
|
||||||
|
|
||||||
gcal_event_set_date_start (self->event, start_date);
|
|
||||||
gcal_event_set_date_end (self->event, end_date);
|
|
||||||
|
|
||||||
g_clear_pointer (&start_date, g_date_time_unref);
|
|
||||||
g_clear_pointer (&end_date, g_date_time_unref);
|
|
||||||
|
|
||||||
/* Update alarms */
|
|
||||||
gcal_event_remove_all_alarms (self->event);
|
|
||||||
|
|
||||||
for (i = 0; i < self->alarms->len; i++)
|
|
||||||
gcal_event_add_alarm (self->event, g_ptr_array_index (self->alarms, i));
|
|
||||||
|
|
||||||
clear_alarms (self);
|
|
||||||
|
|
||||||
/* Check Repeat popover and set recurrence-rules accordingly */
|
|
||||||
old_recur = gcal_event_get_recurrence (self->event);
|
|
||||||
freq = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_combo));
|
|
||||||
|
|
||||||
if (freq != GCAL_RECURRENCE_NO_REPEAT)
|
|
||||||
{
|
|
||||||
GcalRecurrence *recur;
|
|
||||||
|
|
||||||
recur = gcal_recurrence_new ();
|
|
||||||
recur->frequency = freq;
|
|
||||||
recur->limit_type = gtk_combo_box_get_active (GTK_COMBO_BOX (self->repeat_duration_combo));
|
|
||||||
|
|
||||||
if (recur->limit_type == GCAL_RECURRENCE_UNTIL)
|
|
||||||
recur->limit.until = gcal_date_selector_get_date (GCAL_DATE_SELECTOR (self->until_date_selector));
|
|
||||||
else if (recur->limit_type == GCAL_RECURRENCE_COUNT)
|
|
||||||
recur->limit.count = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (self->number_of_occurrences_spin));
|
|
||||||
|
|
||||||
/* Only apply the new recurrence if it's different from the old one */
|
|
||||||
if (!gcal_recurrence_is_equal (old_recur, recur))
|
|
||||||
{
|
|
||||||
/* Remove the previous recurrence... */
|
|
||||||
remove_recurrence_properties (self->event);
|
|
||||||
|
|
||||||
/* ... and set the new one */
|
|
||||||
gcal_event_set_recurrence (self->event, recur);
|
|
||||||
|
|
||||||
self->recurrence_changed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_pointer (&recur, gcal_recurrence_unref);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* When NO_REPEAT is set, make sure to remove the old recurrent */
|
|
||||||
remove_recurrence_properties (self->event);
|
|
||||||
|
|
||||||
/* If the recurrence from an recurrent event was removed, mark it as changed */
|
|
||||||
if (old_recur && old_recur->frequency != GCAL_RECURRENCE_NO_REPEAT)
|
|
||||||
self->recurrence_changed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the source if needed */
|
/* Update the source if needed */
|
||||||
calendar = gcal_event_get_calendar (self->event);
|
calendar = gcal_event_get_calendar (self->event);
|
||||||
|
|||||||
Reference in New Issue
Block a user