[gnome-calendar/wip/pandusonu/week-view: 10/21] week-header: batch fix overflow management
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/wip/pandusonu/week-view: 10/21] week-header: batch fix overflow management
- Date: Thu, 8 Dec 2016 20:55:34 +0000 (UTC)
commit 3f4715fd4a05f808982f6e799cb1712b57323436
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Thu Dec 8 16:04:07 2016 -0200
week-header: batch fix overflow management
It's getting close to be completely working.
src/views/gcal-week-header.c | 66 ++++++++++++++++++++++++++++++++++++------
1 files changed, 57 insertions(+), 9 deletions(-)
---
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 43d026e..11de534 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -367,8 +367,19 @@ check_mergeable_events (GcalWeekHeader *self)
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);
- if (current_widget == to_be_removed)
- continue;
+ /*
+ * We don't want to merge:
+ * - Overflow labels
+ * - The same widget
+ * - Widgets with different visibilities (i.e. broken by overflow
+ */
+ if (!GCAL_IS_EVENT_WIDGET (current_widget) ||
+ !GCAL_IS_EVENT_WIDGET (to_be_removed) ||
+ current_widget == to_be_removed ||
+ gtk_widget_get_visible (current_widget) != gtk_widget_get_visible (to_be_removed))
+ {
+ continue;
+ }
merge_events (self, current_widget, to_be_removed);
@@ -423,6 +434,8 @@ split_event_widget_at_column (GcalWeekHeader *self,
column - left_attach,
1);
+ gtk_widget_set_visible (widget_before, is_event_visible (self, left_attach, top_attach - 1));
+
new_width = old_width - column + left_attach;
old_width = new_width;
left_attach = column;
@@ -434,7 +447,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
"width", new_width,
NULL);
- gtk_widget_show (widget_before);
+ gtk_widget_set_visible (widget, is_event_visible (self, left_attach, top_attach - 1));
}
/* Create a new widget after the current widget */
@@ -464,7 +477,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
"width", new_width,
NULL);
- gtk_widget_show (widget_after);
+ gtk_widget_set_visible (widget_after, is_event_visible (self, column + 1, top_attach - 1));
}
g_clear_pointer (&end_column_date, g_date_time_unref);
@@ -517,6 +530,25 @@ move_events_at_column (GcalWeekHeader *self,
}
static void
+apply_overflow_at_weekday (GcalWeekHeader *self,
+ guint weekday)
+{
+ GtkWidget *child;
+
+ /*
+ * If we don't need overflow, or we already applied the overflow,
+ * we don't need to do anything els.
+ */
+ if (self->expanded || self->overflow_label[weekday] || g_list_length (self->events[weekday]) < 4)
+ return;
+
+ child = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday, 3);
+
+ split_event_widget_at_column (self, child, weekday);
+ gtk_widget_hide (child);
+}
+
+static void
add_event_to_grid (GcalWeekHeader *self,
GcalEvent *event,
gint start,
@@ -525,6 +557,7 @@ add_event_to_grid (GcalWeekHeader *self,
g_autoptr (GDateTime) week_start = NULL;
g_autoptr (GDateTime) week_end = NULL;
GtkWidget *widget;
+ gboolean is_visible, was_visible;
gint position;
gint i;
@@ -543,7 +576,13 @@ add_event_to_grid (GcalWeekHeader *self,
1,
1);
- gtk_widget_set_visible (widget, is_event_visible (self, start, position));
+ /* Setup event visibility */
+ is_visible = is_event_visible (self, start, position);
+
+ gtk_widget_set_visible (widget, is_visible);
+
+ /* Eventually apply the overflow rules */
+ apply_overflow_at_weekday (self, start);
/* Single-day events are the simplest case, and the code above is enough to deal with them */
if (!gcal_event_is_multiday (event))
@@ -567,10 +606,13 @@ add_event_to_grid (GcalWeekHeader *self,
/* Add the event to that day */
new_position = add_event_to_weekday (self, event, i);
+ was_visible = is_visible;
+ is_visible = is_event_visible (self, i, new_position);
+
move_events_at_column (self, DOWN, i, new_position);
/* Add the event to the grid */
- if (new_position == position)
+ if (new_position == position && was_visible == is_visible)
{
gtk_container_child_set (GTK_CONTAINER (self->grid),
widget,
@@ -597,16 +639,17 @@ add_event_to_grid (GcalWeekHeader *self,
/* From now on, let's modify this widget */
widget = cloned_widget;
- gtk_widget_set_visible (widget, is_event_visible (self, i, new_position));
+ gtk_widget_set_visible (widget, is_visible);
g_clear_pointer (&cloned_widget_start_dt, g_date_time_unref);
}
+ /* Eventually apply the overflow rules */
+ apply_overflow_at_weekday (self, i);
+
/* Update the widget's end date */
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget), week_end);
}
-
- gtk_widget_show (widget);
}
static void
@@ -743,6 +786,8 @@ header_collapse (GcalWeekHeader *self)
NULL);
gtk_widget_set_visible (l->data, is_event_visible (self, left_attach, top_attach - 1));
+
+ apply_overflow_at_weekday (self, left_attach);
}
update_overflow (self);
@@ -792,6 +837,9 @@ header_expand (GcalWeekHeader *self)
}
}
+ /* Merge events that were broken because of the overflow label */
+ check_mergeable_events (self);
+
g_clear_pointer (&children, g_list_free);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]