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:
Georges Basile Stavracas Neto
2023-08-23 11:19:10 -03:00
parent f16b0a1563
commit 0eb3ebb1fa
+33 -15
View File
@@ -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;
} }