[gnome-calendar/wip/pandusonu/week-view] week-header: fix merging events



commit 4a7754c677112d6702aeb5e275fe24b25511919f
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Dec 3 00:00:16 2016 -0200

    week-header: fix merging events

 src/views/gcal-week-header.c |   48 ++++++++++++++++++++++-------------------
 1 files changed, 26 insertions(+), 22 deletions(-)
---
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 5933ef1..0c46961 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -209,7 +209,7 @@ add_event_to_weekday (GcalWeekHeader *self,
   return g_list_index (l, event);
 }
 
-static gint
+static void
 merge_events (GcalWeekHeader *self,
               GtkWidget      *event,
               GtkWidget      *to_be_removed)
@@ -222,9 +222,6 @@ merge_events (GcalWeekHeader *self,
                            "width", &deleted_width,
                            NULL);
 
-  if (event == to_be_removed)
-    goto out;
-
   gtk_container_child_get (GTK_CONTAINER (self->grid),
                            event,
                            "width", &current_width,
@@ -237,26 +234,23 @@ merge_events (GcalWeekHeader *self,
                            event,
                            "width", current_width + deleted_width,
                            NULL);
-
-out:
-  return deleted_width;
 }
 
 static void
 check_mergeable_events (GcalWeekHeader *self)
 {
+  GList *checked_events[7] = { NULL, };
   gint weekday;
 
   /* We don't need to check the last column */
   for (weekday = 0; weekday < 6; weekday++)
     {
-      GList *events_at_weekday, *l;
+      GList *l;
       gint index;
 
       index = 0;
-      events_at_weekday = self->events[weekday];
 
-      for (l = events_at_weekday; l != NULL; l = l->next)
+      for (l = self->events[weekday]; l != NULL; l = l->next)
         {
           GcalEvent *current_event;
           gint events_to_merge, i;
@@ -264,9 +258,15 @@ check_mergeable_events (GcalWeekHeader *self)
           current_event = l->data;
           events_to_merge = 0;
 
-          /* No need to continue if we're hiding the events */
-          if (!self->expanded && index > 2)
-            break;
+          if (g_list_find (checked_events[weekday], current_event))
+            {
+              index++;
+              continue;
+            }
+          else
+            {
+              checked_events[weekday] = g_list_prepend (checked_events[weekday], current_event);
+            }
 
           /*
            * Horizontally check if the next cells have the same event
@@ -282,28 +282,32 @@ check_mergeable_events (GcalWeekHeader *self)
                 break;
 
               events_to_merge++;
+
+              /* Add to the list of checked days so we don't check it more times than necessary */
+              checked_events[weekday + i] = g_list_prepend (checked_events[weekday + i], current_event);
             }
 
           /* We found events to merge. Lets merge them */
           i = 0;
 
-          while (events_to_merge > 0)
+          for (i = 0; i < events_to_merge; i++)
             {
               GtkWidget *current_widget, *to_be_removed;
-              gint removed_cells;
 
-              current_widget = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i, index);
-              to_be_removed = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i + 1, index);
+              current_widget = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i, index + 1);
+              to_be_removed = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i + 1, index + 1);
 
-              /* First, remove the events from the cells */
-              removed_cells = merge_events (self, current_widget, to_be_removed);
+              if (current_widget == to_be_removed)
+                continue;
 
-              events_to_merge -= removed_cells;
-              i += removed_cells;
+              merge_events (self, current_widget, to_be_removed);
             }
 
           index++;
         }
+
+      /* We can get rid of the checked list here */
+      g_list_free (checked_events[weekday]);
     }
 }
 
@@ -378,7 +382,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
                        old_width - 1,
                        1);
 
-      new_width = old_width - (column - left_attach + 1);
+      new_width = column - left_attach + 1;
 
       /* Only update the current widget's width */
       gtk_container_child_set (GTK_CONTAINER (self->grid),


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