From b0d5cdbcb88ab795278be2cfe673098d0ecd94a4 Mon Sep 17 00:00:00 2001 From: Hari Rana Date: Fri, 22 May 2026 22:05:31 -0400 Subject: [PATCH] event-editor/event-editor-dialog: Store duplicate event instance This is a preliminary step for moving the comparison and application logic of each section into the dialog. Essentially, the dialog will pass the duplicate event to each section, and these sections will modify the event. If the user presses "Save", the dialog will compare the edited event to the original event, and apply if they are different. This also adds the `get_event()` method which will be used in the future. Part-of: --- .../event-editor/gcal-event-editor-dialog.c | 62 +++++++++++++------ .../event-editor/gcal-event-editor-dialog.h | 2 + 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/gui/event-editor/gcal-event-editor-dialog.c b/src/gui/event-editor/gcal-event-editor-dialog.c index 18722cfe..6a8cd14d 100644 --- a/src/gui/event-editor/gcal-event-editor-dialog.c +++ b/src/gui/event-editor/gcal-event-editor-dialog.c @@ -72,6 +72,7 @@ struct _GcalEventEditorDialog GcalEvent *event; + GcalEvent *edited_event; GListStore *read_only_calendar_model; GListModel *attendees_model; @@ -131,23 +132,26 @@ set_event (GcalEventEditorDialog *self, { g_autoptr (GdkPaintable) paintable = NULL; - g_autoptr (GcalEvent) cloned_event = NULL; GcalEventEditorFlags flags; GcalCalendar *calendar; gint i; GCAL_ENTRY; - g_clear_object (&self->event); + g_clear_pointer (&self->edited_event, g_object_unref); /* If we just set the event to NULL, simply send a property notify */ if (!event) GCAL_GOTO (out); - cloned_event = gcal_event_new_from_event (event); - self->event = g_object_ref (cloned_event); + g_set_object (&self->event, event); - calendar = gcal_event_get_calendar (cloned_event); + if (!event) + GCAL_RETURN (); + + self->edited_event = gcal_event_new_from_event (self->event); + + calendar = gcal_event_get_calendar (self->edited_event); /* dialog's title */ if (new_event) @@ -167,7 +171,7 @@ set_event (GcalEventEditorDialog *self, self->recurrence_changed = FALSE; set_writable (self, !gcal_calendar_is_read_only (calendar)); - gboolean has_participants = gcal_event_get_organizer (self->event) != NULL; + gboolean has_participants = gcal_event_get_organizer (self->edited_event) != NULL; gtk_widget_set_visible (GTK_WIDGET (self->attendees_section), has_participants); gtk_widget_set_visible (self->cancel_button, self->writable); @@ -176,7 +180,7 @@ set_event (GcalEventEditorDialog *self, gtk_widget_set_visible (self->delete_group, !new_event && self->writable); /* fill attendees list */ - self->attendees_model = gcal_event_get_attendees (self->event); + self->attendees_model = gcal_event_get_attendees (self->edited_event); out: flags = GCAL_EVENT_EDITOR_FLAG_NONE; @@ -185,7 +189,7 @@ out: flags |= GCAL_EVENT_EDITOR_FLAG_NEW_EVENT; for (i = 0; i < G_N_ELEMENTS (self->sections); i++) - gcal_event_editor_section_set_event (self->sections[i], cloned_event, flags); + gcal_event_editor_section_set_event (self->sections[i], self->edited_event, flags); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_EVENT]); @@ -292,7 +296,7 @@ save_event_and_close_dialog (GcalEventEditorDialog *self) context = gcal_application_get_context (GCAL_DEFAULT_APPLICATION); manager = gcal_context_get_manager (context); - calendar = gcal_event_get_calendar (self->event); + calendar = gcal_event_get_calendar (self->edited_event); if (gcal_calendar_is_read_only (calendar)) GCAL_GOTO (out); @@ -336,25 +340,25 @@ save_event_and_close_dialog (GcalEventEditorDialog *self) { if (self->event_is_new) { - gcal_event_set_calendar (self->event, selected_calendar); + gcal_event_set_calendar (self->edited_event, selected_calendar); } else { ESource *source = gcal_calendar_get_source (selected_calendar); - gcal_manager_move_event_to_source (manager, self->event, source); + gcal_manager_move_event_to_source (manager, self->edited_event, source); goto out; } } if (self->event_is_new) { - gcal_manager_create_event (manager, self->event); + gcal_manager_create_event (manager, self->edited_event); } - else if (was_recurrent && gcal_event_has_recurrence (self->event)) + else if (was_recurrent && gcal_event_has_recurrence (self->edited_event)) { gcal_utils_ask_recurrence_modification_type (GTK_WIDGET (self), - self->event, + self->edited_event, can_show_mod_all, on_ask_recurrence_response_save_cb, self); @@ -362,7 +366,7 @@ save_event_and_close_dialog (GcalEventEditorDialog *self) } else { - gcal_manager_update_event (manager, self->event, GCAL_RECURRENCE_MOD_THIS_ONLY); + gcal_manager_update_event (manager, self->edited_event, GCAL_RECURRENCE_MOD_THIS_ONLY); } out: @@ -434,17 +438,17 @@ on_delete_row_activated_cb (AdwButtonRow *button, GCAL_ENTRY; - if (gcal_event_has_recurrence (self->event)) + if (gcal_event_has_recurrence (self->edited_event)) { gcal_utils_ask_recurrence_modification_type (GTK_WIDGET (self), - self->event, + self->edited_event, TRUE, on_ask_recurrence_response_delete_cb, self); } else { - g_signal_emit (self, signals[REMOVE_EVENT], 0, self->event, mod); + g_signal_emit (self, signals[REMOVE_EVENT], 0, self->edited_event, mod); clear_and_hide_dialog (self); } @@ -516,7 +520,7 @@ on_ask_recurrence_response_save_cb (GcalEvent *event, case GCAL_RECURRENCE_MOD_THIS_AND_FUTURE: case GCAL_RECURRENCE_MOD_THIS_ONLY: - gcal_manager_update_event (manager, self->event, mod_type); + gcal_manager_update_event (manager, self->edited_event, mod_type); break; } @@ -542,6 +546,8 @@ gcal_event_editor_dialog_finalize (GObject *object) g_clear_object (&self->read_only_calendar_model); g_clear_object (&self->event); + g_clear_pointer (&self->edited_event, g_object_unref); + self->attendees_model = NULL; /* not owned */ G_OBJECT_CLASS (gcal_event_editor_dialog_parent_class)->finalize (object); @@ -560,7 +566,7 @@ gcal_event_editor_dialog_get_property (GObject *object, switch (prop_id) { case PROP_EVENT: - g_value_set_object (value, self->event); + g_value_set_object (value, gcal_event_editor_dialog_get_event (self)); break; case PROP_WRITABLE: @@ -695,6 +701,22 @@ gcal_event_editor_dialog_new (void) return g_object_new (GCAL_TYPE_EVENT_EDITOR_DIALOG, NULL); } +/** + * gcal_event_editor_dialog_get_event: + * @self: a #GcalEventEditorDialog + * + * Gets the event being edited. + * + * Returns: (nullable) (transfer none): the #GcalEvent being edited + */ +GcalEvent * +gcal_event_editor_dialog_get_event (GcalEventEditorDialog *self) +{ + g_assert (GCAL_IS_EVENT_EDITOR_DIALOG (self)); + + return self->edited_event; +} + /** * gcal_event_editor_dialog_present_event: (set-property event) * @dialog: a #GcalDialog diff --git a/src/gui/event-editor/gcal-event-editor-dialog.h b/src/gui/event-editor/gcal-event-editor-dialog.h index d3eb7978..e354e1af 100644 --- a/src/gui/event-editor/gcal-event-editor-dialog.h +++ b/src/gui/event-editor/gcal-event-editor-dialog.h @@ -32,6 +32,8 @@ G_DECLARE_FINAL_TYPE (GcalEventEditorDialog, gcal_event_editor_dialog, GCAL, EVE GtkWidget* gcal_event_editor_dialog_new (void); +GcalEvent *gcal_event_editor_dialog_get_event (GcalEventEditorDialog *self); + void gcal_event_editor_dialog_present_event (GcalEventEditorDialog *self, GtkWidget *parent, GcalEvent *event,