From: Trystan Mata <trystan.mata@tytanium.xyz>
Date: Mon, 1 Sep 2025 15:41:21 +0200
Subject: event-editor: Fix template update when updating all events

Change how the template end date is determined by mainly relying on the
new template start date:
- If all day, end date is start date plus 1 day (midnight enforced)
- If time-based, end date is start date plus the time span of the event
  properties

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/652>
(cherry picked from commit b79749e811302f3675bd7c3d8f5d54189ef29b2c)

Origin: future 49.1
---
 src/gui/event-editor/gcal-event-editor-dialog.c | 33 ++++++-------------------
 1 file changed, 7 insertions(+), 26 deletions(-)

diff --git a/src/gui/event-editor/gcal-event-editor-dialog.c b/src/gui/event-editor/gcal-event-editor-dialog.c
index 0c6b259..a7ef425 100644
--- a/src/gui/event-editor/gcal-event-editor-dialog.c
+++ b/src/gui/event-editor/gcal-event-editor-dialog.c
@@ -140,16 +140,12 @@ apply_event_properties_to_template_event (GcalEvent *template_event,
   g_autoptr (GList) alarms =  gcal_event_get_alarms (event);
   GDateTime *template_start_date;
   GDateTime *event_start_date;
-  GDateTime *template_end_date;
   GDateTime *event_end_date;
-  gboolean was_all_day;
   gboolean is_all_day;
 
   is_all_day = gcal_event_get_all_day (event);
-  was_all_day = gcal_event_get_all_day (template_event);
 
   template_start_date = gcal_event_get_date_start (template_event);
-  template_end_date = gcal_event_get_date_end (template_event);
   event_start_date = gcal_event_get_date_start (event);
   event_end_date = gcal_event_get_date_end (event);
 
@@ -157,29 +153,14 @@ apply_event_properties_to_template_event (GcalEvent *template_event,
                                 g_date_time_get_year (template_start_date),
                                 g_date_time_get_month (template_start_date),
                                 g_date_time_get_day_of_month (template_start_date),
-                                g_date_time_get_hour (event_start_date),
-                                g_date_time_get_minute (event_start_date),
-                                g_date_time_get_second (event_start_date));
-
-  end_date = g_date_time_new (g_date_time_get_timezone (event_end_date),
-                              g_date_time_get_year (template_end_date),
-                              g_date_time_get_month (template_end_date),
-                              g_date_time_get_day_of_month (template_end_date),
-                              g_date_time_get_hour (event_end_date),
-                              g_date_time_get_minute (event_end_date),
-                              g_date_time_get_second (event_end_date));
-
-  if (was_all_day != is_all_day)
-    {
-      g_autoptr (GDateTime) fake_end_date = NULL;
-
-      if (is_all_day)
-        fake_end_date = g_date_time_add_days (end_date, -1);
-      else
-        fake_end_date = g_date_time_add_days (end_date, 1);
+                                is_all_day ? 0 : g_date_time_get_hour (event_start_date),
+                                is_all_day ? 0 : g_date_time_get_minute (event_start_date),
+                                is_all_day ? 0 : g_date_time_get_second (event_start_date));
 
-      gcal_set_date_time (&end_date, fake_end_date);
-    }
+  if (is_all_day)
+    end_date = g_date_time_add_days (start_date, 1);
+  else
+    end_date = g_date_time_add (start_date, g_date_time_difference (event_end_date, event_start_date));
 
   gcal_event_set_summary (template_event, gcal_event_get_summary (event));
   gcal_event_set_location (template_event, gcal_event_get_location (event));
