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: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/711>
This commit is contained in:
Hari Rana
2026-06-26 08:13:24 -04:00
parent 6cd8d631f5
commit b0d5cdbcb8
2 changed files with 44 additions and 20 deletions
+42 -20
View File
@@ -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
@@ -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,