[gnome-calendar] year-view: Optimize sidebar update



commit 00e883ca6345923785600421a658383d6aeccbbd
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Jul 13 20:44:27 2019 -0300

    year-view: Optimize sidebar update
    
    Use the cached events to fill the sidebar, instead of
    querying e-d-s every time we need an update.

 src/views/gcal-year-view.c | 68 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 56 insertions(+), 12 deletions(-)
---
diff --git a/src/views/gcal-year-view.c b/src/views/gcal-year-view.c
index 25c432b8..f97193cd 100644
--- a/src/views/gcal-year-view.c
+++ b/src/views/gcal-year-view.c
@@ -404,14 +404,51 @@ add_event_to_day_array (GcalYearView  *year_view,
     }
 }
 
+static GPtrArray*
+get_events_for_range (GcalYearView *self,
+                      GDateTime    *start,
+                      GDateTime    *end)
+{
+  g_autoptr (GPtrArray) events = NULL;
+  guint i;
+
+  events = g_ptr_array_sized_new (50);
+
+  g_message ("Range: %s  --  %s", g_date_time_format (start, "%x %X %z"), g_date_time_format (end, "%x %X 
%z"));
+
+  for (i = g_date_time_get_month (start) - 1; i <= g_date_time_get_month (end) - 1; i++)
+    {
+      GPtrArray *month_events = self->events[i];
+      guint j;
+
+      for (j = 0; j < month_events->len; j++)
+        {
+          GDateTime *event_start;
+          GDateTime *event_end;
+          GcalEvent *event;
+
+          event = g_ptr_array_index (month_events, j);
+          event_start = gcal_event_get_date_start (event);
+          event_end = gcal_event_get_date_end (event);
+
+          if (gcal_date_time_compare_date (event_end, start) < 0 ||
+              gcal_date_time_compare_date (event_start, end) > 0)
+            {
+              continue;
+            }
+
+          g_ptr_array_add (events, event);
+        }
+    }
+
+  return g_steal_pointer (&events);
+}
+
 static void
 update_sidebar (GcalYearView *year_view)
 {
-  g_autoptr (ICalTime) start_icaldatetime = NULL;
-  g_autoptr (ICalTime) end_icaldatetime = NULL;
-  GcalManager *manager;
+  g_autoptr (GPtrArray) events = NULL;
   GtkWidget *child_widget;
-  GList *events, *l;
   GList **days_widgets_array;
   gint i, days_span;
 
@@ -422,11 +459,12 @@ update_sidebar (GcalYearView *year_view)
   days_span = g_date_time_get_day_of_year (year_view->end_selected_date) - g_date_time_get_day_of_year 
(year_view->start_selected_date) + 1;
   days_widgets_array = g_new0 (GList*, days_span);
 
-  manager = gcal_context_get_manager (year_view->context);
-  start_icaldatetime = gcal_date_time_to_icaltime (year_view->start_selected_date);
-  end_icaldatetime = gcal_date_time_to_icaltime (year_view->end_selected_date);
-  events = gcal_manager_get_events (manager, start_icaldatetime, end_icaldatetime);
-  if (events == NULL)
+  events = get_events_for_range (year_view,
+                                 year_view->start_selected_date,
+                                 year_view->end_selected_date);
+
+
+  if (events->len == 0)
     {
       days_span = 0;
       update_no_events_page (year_view);
@@ -437,14 +475,21 @@ update_sidebar (GcalYearView *year_view)
       gtk_stack_set_visible_child_name (GTK_STACK (year_view->navigator_stack), "events-list");
     }
 
-  for (l = events; l != NULL; l = g_list_next (l))
-    add_event_to_day_array (year_view, l->data, days_widgets_array, days_span);
+  for (i = 0; i < events->len; i++)
+    {
+      add_event_to_day_array (year_view,
+                              g_ptr_array_index (events, i),
+                              days_widgets_array,
+                              days_span);
+    }
 
   gtk_widget_queue_draw (year_view->navigator);
 
   for (i = 0; i < days_span; i++)
     {
       GList *current_day = days_widgets_array[i];
+      GList *l;
+
       for (l = current_day; l != NULL; l = g_list_next (l))
         {
           child_widget = l->data;
@@ -457,7 +502,6 @@ update_sidebar (GcalYearView *year_view)
       g_list_free (current_day);
     }
 
-  g_list_free_full (events, g_object_unref);
   g_free (days_widgets_array);
 }
 


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