week-header: fix merging events

This commit is contained in:
Georges Basile Stavracas Neto
2016-12-03 00:04:06 -02:00
parent adc4bbae9e
commit 4a7754c677
+26 -22
View File
@@ -209,7 +209,7 @@ add_event_to_weekday (GcalWeekHeader *self,
return g_list_index (l, event); return g_list_index (l, event);
} }
static gint static void
merge_events (GcalWeekHeader *self, merge_events (GcalWeekHeader *self,
GtkWidget *event, GtkWidget *event,
GtkWidget *to_be_removed) GtkWidget *to_be_removed)
@@ -222,9 +222,6 @@ merge_events (GcalWeekHeader *self,
"width", &deleted_width, "width", &deleted_width,
NULL); NULL);
if (event == to_be_removed)
goto out;
gtk_container_child_get (GTK_CONTAINER (self->grid), gtk_container_child_get (GTK_CONTAINER (self->grid),
event, event,
"width", &current_width, "width", &current_width,
@@ -237,26 +234,23 @@ merge_events (GcalWeekHeader *self,
event, event,
"width", current_width + deleted_width, "width", current_width + deleted_width,
NULL); NULL);
out:
return deleted_width;
} }
static void static void
check_mergeable_events (GcalWeekHeader *self) check_mergeable_events (GcalWeekHeader *self)
{ {
GList *checked_events[7] = { NULL, };
gint weekday; gint weekday;
/* We don't need to check the last column */ /* We don't need to check the last column */
for (weekday = 0; weekday < 6; weekday++) for (weekday = 0; weekday < 6; weekday++)
{ {
GList *events_at_weekday, *l; GList *l;
gint index; gint index;
index = 0; 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; GcalEvent *current_event;
gint events_to_merge, i; gint events_to_merge, i;
@@ -264,9 +258,15 @@ check_mergeable_events (GcalWeekHeader *self)
current_event = l->data; current_event = l->data;
events_to_merge = 0; events_to_merge = 0;
/* No need to continue if we're hiding the events */ if (g_list_find (checked_events[weekday], current_event))
if (!self->expanded && index > 2) {
break; index++;
continue;
}
else
{
checked_events[weekday] = g_list_prepend (checked_events[weekday], current_event);
}
/* /*
* Horizontally check if the next cells have the same event * Horizontally check if the next cells have the same event
@@ -282,28 +282,32 @@ check_mergeable_events (GcalWeekHeader *self)
break; break;
events_to_merge++; 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 */ /* We found events to merge. Lets merge them */
i = 0; i = 0;
while (events_to_merge > 0) for (i = 0; i < events_to_merge; i++)
{ {
GtkWidget *current_widget, *to_be_removed; GtkWidget *current_widget, *to_be_removed;
gint removed_cells;
current_widget = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i, 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); to_be_removed = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i + 1, index + 1);
/* First, remove the events from the cells */ if (current_widget == to_be_removed)
removed_cells = merge_events (self, current_widget, to_be_removed); continue;
events_to_merge -= removed_cells; merge_events (self, current_widget, to_be_removed);
i += removed_cells;
} }
index++; 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, old_width - 1,
1); 1);
new_width = old_width - (column - left_attach + 1); new_width = column - left_attach + 1;
/* Only update the current widget's width */ /* Only update the current widget's width */
gtk_container_child_set (GTK_CONTAINER (self->grid), gtk_container_child_set (GTK_CONTAINER (self->grid),