core/timeline: Track complete state differently
Don't try and track the number of completed calendars; instead, recalculate the completed state from scratch every time. This is not a performance concern, as we're dealing with at most some hundreds of calendars.
This commit is contained in:
+33
-15
@@ -70,7 +70,7 @@ struct _GcalTimeline
|
|||||||
gchar *filter;
|
gchar *filter;
|
||||||
|
|
||||||
GHashTable *calendars; /* GcalCalendar* -> GcalCalendarMonitor* */
|
GHashTable *calendars; /* GcalCalendar* -> GcalCalendarMonitor* */
|
||||||
guint completed_calendars;
|
gboolean complete;
|
||||||
|
|
||||||
GHashTable *subscribers; /* GcalTimelineSubscriber* -> SubscriberData* */
|
GHashTable *subscribers; /* GcalTimelineSubscriber* -> SubscriberData* */
|
||||||
GcalRangeTree *subscriber_ranges;
|
GcalRangeTree *subscriber_ranges;
|
||||||
@@ -188,10 +188,36 @@ queue_event_data (GcalTimeline *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static void
|
||||||
is_timeline_complete (GcalTimeline *self)
|
update_completed_calendars (GcalTimeline *self)
|
||||||
{
|
{
|
||||||
return self->completed_calendars == g_hash_table_size (self->calendars);
|
GcalCalendarMonitor *calendar_monitor;
|
||||||
|
GcalCalendar *calendar;
|
||||||
|
GHashTableIter iter;
|
||||||
|
gboolean was_complete;
|
||||||
|
gboolean is_complete;
|
||||||
|
|
||||||
|
GCAL_ENTRY;
|
||||||
|
|
||||||
|
was_complete = self->complete;
|
||||||
|
is_complete = TRUE;
|
||||||
|
|
||||||
|
g_hash_table_iter_init (&iter, self->calendars);
|
||||||
|
while (g_hash_table_iter_next (&iter, (gpointer*) &calendar, (gpointer*) &calendar_monitor))
|
||||||
|
{
|
||||||
|
if (gcal_calendar_get_visible (calendar))
|
||||||
|
is_complete &= gcal_calendar_monitor_is_complete (calendar_monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (was_complete != is_complete)
|
||||||
|
{
|
||||||
|
GCAL_TRACE_MSG ("Timeline %p is %s", self, is_complete ? "complete" : "incomplete");
|
||||||
|
|
||||||
|
self->complete = is_complete;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
GCAL_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -610,15 +636,7 @@ on_calendar_monitor_completed_cb (GcalCalendarMonitor *monitor,
|
|||||||
{
|
{
|
||||||
GCAL_ENTRY;
|
GCAL_ENTRY;
|
||||||
|
|
||||||
if (gcal_calendar_monitor_is_complete (monitor))
|
update_completed_calendars (self);
|
||||||
self->completed_calendars++;
|
|
||||||
else
|
|
||||||
self->completed_calendars--;
|
|
||||||
|
|
||||||
g_assert (self->completed_calendars <= g_hash_table_size (self->calendars));
|
|
||||||
|
|
||||||
if (is_timeline_complete (self))
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]);
|
|
||||||
|
|
||||||
GCAL_EXIT;
|
GCAL_EXIT;
|
||||||
}
|
}
|
||||||
@@ -823,7 +841,7 @@ gcal_timeline_get_property (GObject *object,
|
|||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_COMPLETE:
|
case PROP_COMPLETE:
|
||||||
g_value_set_boolean (value, is_timeline_complete (self));
|
g_value_set_boolean (value, self->complete);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_CONTEXT:
|
case PROP_CONTEXT:
|
||||||
@@ -1110,5 +1128,5 @@ gcal_timeline_is_complete (GcalTimeline *self)
|
|||||||
{
|
{
|
||||||
g_return_val_if_fail (GCAL_IS_TIMELINE (self), FALSE);
|
g_return_val_if_fail (GCAL_IS_TIMELINE (self), FALSE);
|
||||||
|
|
||||||
return is_timeline_complete (self);
|
return self->complete;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user