[gnome-calendar] week-header: correctly check for updatable events



commit 82aa5fadb0cac63c1c7dc6648985a341a5484dee
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Mar 18 03:40:22 2017 +0530

    week-header: correctly check for updatable events
    
    When comparing events' dates against week dates, we must
    be careful to compare UTC with UTC. Otherwise, some events
    will be left, specially at the first and last days.

 src/views/gcal-week-header.c |   47 ++++++++++++++++++++++++++++-------------
 1 files changed, 32 insertions(+), 15 deletions(-)
---
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 5919c39..b546899 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -765,22 +765,24 @@ add_event_to_grid (GcalWeekHeader *self,
 
 static void
 update_unchanged_events (GcalWeekHeader *self,
-                         icaltimetype   *old_icaldt,
                          icaltimetype   *new_icaldt)
 {
-  GDateTime *old_week_start, *old_week_end;
-  GDateTime *new_week_start, *new_week_end;
+  g_autoptr (GDateTime) new_week_start, new_week_end;
+  g_autoptr (GDateTime) utc_week_start, utc_week_end;
   GList *events_to_update, *l;
   gint weekday;
 
   events_to_update = NULL;
 
-  old_week_start = get_start_of_week (old_icaldt);
-  old_week_end = get_end_of_week (old_icaldt);
-
   new_week_start = get_start_of_week (new_icaldt);
   new_week_end = get_end_of_week (new_icaldt);
 
+  utc_week_start = g_date_time_new_utc (g_date_time_get_year (new_week_start),
+                                        g_date_time_get_month (new_week_start),
+                                        g_date_time_get_day_of_month (new_week_start),
+                                        0, 0, 0);
+  utc_week_end = g_date_time_add_days (utc_week_start, 7);
+
   for (weekday = 0; weekday < 7; weekday++)
     {
       GList *events;
@@ -790,17 +792,36 @@ update_unchanged_events (GcalWeekHeader *self,
       for (l = events; l != NULL; l = l->next)
         {
           g_autoptr (GDateTime) event_start, event_end;
+          GDateTime *week_start, *week_end;
+
+          /*
+           * When the event is all day, we must be careful to compare its dates
+           * against the UTC variants of the week start and end dates.
+           */
+          if (gcal_event_get_all_day (l->data))
+            {
+              event_start = g_date_time_ref (gcal_event_get_date_start (l->data));
+              event_end = g_date_time_ref (gcal_event_get_date_end (l->data));
 
-          event_start = g_date_time_to_local (gcal_event_get_date_start (l->data));
-          event_end = g_date_time_to_local (gcal_event_get_date_end (l->data));
+              week_start = utc_week_start;
+              week_end = utc_week_end;
+            }
+          else
+            {
+              event_start = g_date_time_to_local (gcal_event_get_date_start (l->data));
+              event_end = g_date_time_to_local (gcal_event_get_date_end (l->data));
+
+              week_start = new_week_start;
+              week_end = new_week_end;
+            }
 
           /*
            * Check if the event must be updated. If we're going to the future, updatable events
            * are events that started somewhere in the past, and are still present. If we're
            * going to the past, updatable events are events that started
            */
-          if (g_date_time_compare (event_start, new_week_end) <= 0 &&
-              g_date_time_compare (event_end, new_week_start) > 0 &&
+          if (g_date_time_compare (event_start, week_end) < 0 &&
+              g_date_time_compare (event_end, week_start) > 0 &&
               !g_list_find (events_to_update, l->data))
             {
               events_to_update = g_list_append (events_to_update, l->data);
@@ -815,10 +836,6 @@ update_unchanged_events (GcalWeekHeader *self,
     }
 
   g_clear_pointer (&events_to_update, g_list_free);
-  g_clear_pointer (&new_week_start, g_date_time_unref);
-  g_clear_pointer (&old_week_start, g_date_time_unref);
-  g_clear_pointer (&new_week_end, g_date_time_unref);
-  g_clear_pointer (&old_week_end, g_date_time_unref);
 }
 
 /* Header */
@@ -1088,7 +1105,7 @@ gcal_week_header_set_property (GObject      *object,
       gtk_widget_queue_draw (GTK_WIDGET (self));
 
       if (old_date)
-        update_unchanged_events (self, old_date, self->active_date);
+        update_unchanged_events (self, self->active_date);
 
       g_clear_pointer (&old_date, g_free);
       break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]