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.
This commit is contained in:
+56
-12
@@ -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
|
static void
|
||||||
update_sidebar (GcalYearView *year_view)
|
update_sidebar (GcalYearView *year_view)
|
||||||
{
|
{
|
||||||
g_autoptr (ICalTime) start_icaldatetime = NULL;
|
g_autoptr (GPtrArray) events = NULL;
|
||||||
g_autoptr (ICalTime) end_icaldatetime = NULL;
|
|
||||||
GcalManager *manager;
|
|
||||||
GtkWidget *child_widget;
|
GtkWidget *child_widget;
|
||||||
GList *events, *l;
|
|
||||||
GList **days_widgets_array;
|
GList **days_widgets_array;
|
||||||
gint i, days_span;
|
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_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);
|
days_widgets_array = g_new0 (GList*, days_span);
|
||||||
|
|
||||||
manager = gcal_context_get_manager (year_view->context);
|
events = get_events_for_range (year_view,
|
||||||
start_icaldatetime = gcal_date_time_to_icaltime (year_view->start_selected_date);
|
year_view->start_selected_date,
|
||||||
end_icaldatetime = gcal_date_time_to_icaltime (year_view->end_selected_date);
|
year_view->end_selected_date);
|
||||||
events = gcal_manager_get_events (manager, start_icaldatetime, end_icaldatetime);
|
|
||||||
if (events == NULL)
|
|
||||||
|
if (events->len == 0)
|
||||||
{
|
{
|
||||||
days_span = 0;
|
days_span = 0;
|
||||||
update_no_events_page (year_view);
|
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");
|
gtk_stack_set_visible_child_name (GTK_STACK (year_view->navigator_stack), "events-list");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = events; l != NULL; l = g_list_next (l))
|
for (i = 0; i < events->len; i++)
|
||||||
add_event_to_day_array (year_view, l->data, days_widgets_array, days_span);
|
{
|
||||||
|
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);
|
gtk_widget_queue_draw (year_view->navigator);
|
||||||
|
|
||||||
for (i = 0; i < days_span; i++)
|
for (i = 0; i < days_span; i++)
|
||||||
{
|
{
|
||||||
GList *current_day = days_widgets_array[i];
|
GList *current_day = days_widgets_array[i];
|
||||||
|
GList *l;
|
||||||
|
|
||||||
for (l = current_day; l != NULL; l = g_list_next (l))
|
for (l = current_day; l != NULL; l = g_list_next (l))
|
||||||
{
|
{
|
||||||
child_widget = l->data;
|
child_widget = l->data;
|
||||||
@@ -457,7 +502,6 @@ update_sidebar (GcalYearView *year_view)
|
|||||||
g_list_free (current_day);
|
g_list_free (current_day);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_list_free_full (events, g_object_unref);
|
|
||||||
g_free (days_widgets_array);
|
g_free (days_widgets_array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user