[gnome-calendar/wip/pandusonu/week-view: 21/31] week-header: sort events before placing them



commit a18435c80b8dd4e42ebc25ac6c843596223c4f4d
Author: pandusonu2 <pandu sonu yahoo com>
Date:   Thu Jun 30 21:03:06 2016 +0530

    week-header: sort events before placing them
    
    Sort the events based on multiday/single day, start date and duration.

 src/views/gcal-week-header.c |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)
---
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index dd92fd3..8727d8a 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -59,6 +59,9 @@ struct _GcalWeekHeader
 
 static GDateTime*     get_start_of_week                     (GcalWeekHeader *self);
 
+static gint           events_compare_func                   (GcalEvent *first,
+                                                             GcalEvent *second);
+
 static void           update_headers                        (GcalWeekHeader *self);
 
 static void           place_events                          (GcalWeekHeader *self);
@@ -112,6 +115,27 @@ get_start_of_week (GcalWeekHeader *self)
   return icaltime_to_datetime (new_date);
 }
 
+static gint
+events_compare_func (GcalEvent *first,
+                     GcalEvent *second)
+{
+  gint retval;
+
+  /* Multiday events should come before single day events */
+  if (gcal_event_is_multiday (first) != gcal_event_is_multiday (second))
+    return gcal_event_is_multiday (second) - gcal_event_is_multiday (first);
+
+  /* Compare with respect to start day */
+  retval = g_date_time_compare (gcal_event_get_date_start (first),
+                                gcal_event_get_date_start (second));
+
+  if (retval != 0)
+    return retval;
+
+  /* Compare with respect to end day effectively comparing with respect to duration */
+  return g_date_time_compare (gcal_event_get_date_end (second), gcal_event_get_date_end (first));
+}
+
 static void
 update_headers (GcalWeekHeader *self)
 {
@@ -173,6 +197,8 @@ place_events (GcalWeekHeader *self)
   week_start = get_start_of_week (self);
   iter = g_list_copy (self->events);
 
+  iter = g_list_sort (iter, (GCompareFunc) events_compare_func);
+
   for (l = iter; l != NULL; l = l->next)
     {
       GcalEvent *event;


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