core/timeline: Sort events better
The previous sorter was a simple GcalRange proxy, but we need a more robust and stable sorting mechanism. Use multiday, start and end dates, length, and finally the last modified date to sort events. Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/761>
This commit is contained in:
@@ -107,15 +107,49 @@ event_in_subscriber_range_func (gpointer item,
|
|||||||
return gcal_event_overlaps (item, data->range);
|
return gcal_event_overlaps (item, data->range);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
compare_events_by_length (GcalEvent *event_a,
|
||||||
|
GcalEvent *event_b)
|
||||||
|
{
|
||||||
|
time_t time_s1, time_s2;
|
||||||
|
time_t time_e1, time_e2;
|
||||||
|
|
||||||
|
time_s1 = g_date_time_to_unix (gcal_event_get_date_start (event_a));
|
||||||
|
time_e1 = g_date_time_to_unix (gcal_event_get_date_end (event_a));
|
||||||
|
|
||||||
|
time_s2 = g_date_time_to_unix (gcal_event_get_date_start (event_b));
|
||||||
|
time_e2 = g_date_time_to_unix (gcal_event_get_date_end (event_b));
|
||||||
|
|
||||||
|
return (time_e2 - time_s2) - (time_e1 - time_s1);
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
compare_events_cb (gconstpointer a,
|
compare_events_cb (gconstpointer a,
|
||||||
gconstpointer b,
|
gconstpointer b,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
|
g_autoptr (ICalTime) icaltime_a = NULL;
|
||||||
|
g_autoptr (ICalTime) icaltime_b = NULL;
|
||||||
GcalEvent *event_a = (GcalEvent *) a;
|
GcalEvent *event_a = (GcalEvent *) a;
|
||||||
GcalEvent *event_b = (GcalEvent *) b;
|
GcalEvent *event_b = (GcalEvent *) b;
|
||||||
|
gint diff;
|
||||||
|
|
||||||
return gcal_range_compare (gcal_event_get_range (event_b), gcal_event_get_range (event_a));
|
diff = gcal_event_is_multiday (event_b) - gcal_event_is_multiday (event_a);
|
||||||
|
if (diff != 0)
|
||||||
|
return diff;
|
||||||
|
|
||||||
|
diff = g_date_time_compare (gcal_event_get_date_start (event_a), gcal_event_get_date_start (event_b));
|
||||||
|
if (diff != 0)
|
||||||
|
return diff;
|
||||||
|
|
||||||
|
diff = compare_events_by_length (event_a, event_b);
|
||||||
|
if (diff != 0)
|
||||||
|
return diff;
|
||||||
|
|
||||||
|
icaltime_a = e_cal_component_get_last_modified (gcal_event_get_component (event_a));
|
||||||
|
icaltime_b = e_cal_component_get_last_modified (gcal_event_get_component (event_b));
|
||||||
|
|
||||||
|
return icaltime_a && icaltime_b ? i_cal_time_compare (icaltime_b, icaltime_a) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SubscriberData *
|
static SubscriberData *
|
||||||
|
|||||||
Reference in New Issue
Block a user