[gnome-calendar/wip/pandusonu/week-view] week-header: reimplement header expansion and collapsing
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/wip/pandusonu/week-view] week-header: reimplement header expansion and collapsing
- Date: Wed, 7 Dec 2016 23:32:34 +0000 (UTC)
commit 54ff4eefc310a6b2f3c7970d0af71ec2655472ef
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Sat Dec 3 01:40:10 2016 -0200
week-header: reimplement header expansion and collapsing
src/views/gcal-week-header.c | 170 +++++++++++++++++++++++++++++-------------
1 files changed, 117 insertions(+), 53 deletions(-)
---
diff --git a/src/views/gcal-week-header.c b/src/views/gcal-week-header.c
index 0c46961..fc5d61a 100644
--- a/src/views/gcal-week-header.c
+++ b/src/views/gcal-week-header.c
@@ -53,6 +53,7 @@ struct _GcalWeekHeader
* and the events will be placed
*/
GList *events[7];
+ GtkWidget *overflow_label[7];
gint first_weekday;
@@ -209,6 +210,68 @@ add_event_to_weekday (GcalWeekHeader *self,
return g_list_index (l, event);
}
+static gboolean
+is_event_visible (GcalWeekHeader *self,
+ gint weekday,
+ gint position)
+{
+ gboolean show_label;
+
+ if (self->expanded)
+ return TRUE;
+
+ show_label = g_list_length (self->events[weekday]) > 3;
+
+ return show_label ? position < 2 : position < 3;
+}
+
+static void
+update_overflow_labels (GcalWeekHeader *self)
+{
+ gint i;
+
+ for (i = 0; i < 7; i++)
+ {
+ GtkWidget *label;
+ gboolean show_label;
+ gint n_events;
+
+ n_events = g_list_length (self->events[i]);
+ show_label = n_events > 3;
+ label = self->overflow_label[i];
+
+ if (show_label)
+ {
+ gchar *text;
+
+ text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "Other event", "Other %d events", n_events -
2), n_events - 2);
+
+ /* TODO: use a button and show an overflow popover */
+ if (!label)
+ {
+ label = gtk_label_new ("");
+ gtk_grid_attach (GTK_GRID (self->grid),
+ label,
+ i,
+ 3,
+ 1,
+ 1);
+
+ self->overflow_label[i] = label;
+
+ gtk_widget_show (label);
+ }
+
+ gtk_label_set_label (GTK_LABEL (label), text);
+ g_free (text);
+ }
+ else
+ {
+ g_clear_pointer (&self->overflow_label[i], gtk_widget_destroy);
+ }
+ }
+}
+
static void
merge_events (GcalWeekHeader *self,
GtkWidget *event,
@@ -301,6 +364,8 @@ check_mergeable_events (GcalWeekHeader *self)
continue;
merge_events (self, current_widget, to_be_removed);
+
+ gtk_widget_set_visible (current_widget, is_event_visible (self, weekday + i, index));
}
index++;
@@ -435,6 +500,8 @@ move_events_at_column (GcalWeekHeader *self,
l->data,
"top_attach", top_attach,
NULL);
+
+ gtk_widget_set_visible (l->data, is_event_visible (self, left_attach, top_attach - 1));
}
g_clear_pointer (&children, g_list_free);
@@ -467,7 +534,7 @@ add_event_to_grid (GcalWeekHeader *self,
1,
1);
- gtk_widget_show (widget);
+ gtk_widget_set_visible (widget, is_event_visible (self, start, position));
/* Single-day events are the simplest case, and the code above is enough to deal with them */
if (!gcal_event_is_multiday (event))
@@ -527,6 +594,8 @@ 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));
+
g_clear_pointer (&cloned_widget_start_dt, g_date_time_unref);
}
@@ -655,7 +724,9 @@ update_title (GcalWeekHeader *self)
static void
header_collapse (GcalWeekHeader *self)
{
- gint hidden_events[7], row, i;
+ GList *children, *l;
+
+ children = gtk_container_get_children (GTK_CONTAINER (self->grid));
self->expanded = FALSE;
@@ -665,68 +736,31 @@ header_collapse (GcalWeekHeader *self)
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (self->scrolledwindow), -1);
gtk_image_set_from_icon_name (GTK_IMAGE (self->expand_button_image), "go-down-symbolic", 4);
- for (i = 0; i < 7; i++)
- hidden_events[i] = 0;
-
- /* Gets count of number of extra events in each column */
- for (row = 4; ; row++)
- {
- gboolean empty;
-
- empty = TRUE;
-
- for (i = 0; i < 7; i++)
- {
- if (gtk_grid_get_child_at (GTK_GRID (self->grid), i, row))
- {
- hidden_events[i]++;
- empty = FALSE;
- }
- }
-
- if (empty)
- break;
- }
-
- /* Removes the excess events and adds them to the object list of events */
- for ( ; row >= 4; row--)
+ for (l = children; l != NULL; l = l->next)
{
- for (i = 0; i < 7; i++)
- {
- if (gtk_grid_get_child_at (GTK_GRID (self->grid), i, row))
- {
- GcalEventWidget *widget;
+ gint top_attach, left_attach;
- widget = GCAL_EVENT_WIDGET (gtk_grid_get_child_at (GTK_GRID (self->grid), i, row));
+ gtk_container_child_get (GTK_CONTAINER (self->grid),
+ l->data,
+ "top-attach", &top_attach,
+ "left_attach", &left_attach,
+ NULL);
- gtk_widget_destroy (GTK_WIDGET (widget));
- }
- }
+ gtk_widget_set_visible (l->data, is_event_visible (self, left_attach, top_attach - 1));
}
- /* Adds labels in the last row */
- for (i = 0; i < 7; i++)
- {
- if (hidden_events[i])
- {
- GtkWidget *widget;
- gchar *other_events_label;
-
- other_events_label = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "Other event", "Other %d
events", hidden_events[i]),
- hidden_events[i]);
- widget = gtk_label_new (other_events_label);
+ update_overflow_labels (self);
- gtk_widget_set_visible (widget, TRUE);
- gtk_grid_attach (GTK_GRID (self->grid), widget, i, 4, 1, 1);
- }
- }
+ g_clear_pointer (&children, g_list_free);
}
static void
header_expand (GcalWeekHeader *self)
{
GtkWidget *week_view;
+ GList *children, *l;
+ children = gtk_container_get_children (GTK_CONTAINER (self->grid));
week_view = gtk_widget_get_ancestor (GTK_WIDGET (self), GCAL_TYPE_WEEK_VIEW);
self->expanded = TRUE;
@@ -734,11 +768,35 @@ header_expand (GcalWeekHeader *self)
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self->scrolledwindow),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
+
+ /* TODO: animate this transition */
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (self->scrolledwindow),
- gtk_widget_get_allocated_height (week_view)/2);
+ 3 * gtk_widget_get_allocated_height (week_view) / 2);
+
gtk_image_set_from_icon_name (GTK_IMAGE (self->expand_button_image), "go-up-symbolic", 4);
- gtk_grid_remove_row (GTK_GRID (self->grid), 4);
+ for (l = children; l != NULL; l = l->next)
+ {
+ /* Remove any remaining labels */
+ if (GTK_IS_LABEL (l->data))
+ {
+ gint left_attach;
+
+ gtk_container_child_get (GTK_CONTAINER (self->grid),
+ l->data,
+ "left_attach", &left_attach,
+ NULL);
+
+ self->overflow_label[left_attach] = NULL;
+ gtk_widget_destroy (l->data);
+ }
+ else
+ {
+ gtk_widget_show (l->data);
+ }
+ }
+
+ g_clear_pointer (&children, g_list_free);
}
static void
@@ -1052,6 +1110,9 @@ gcal_week_header_add_event (GcalWeekHeader *self,
/* Check if we eventually can merge events */
check_mergeable_events (self);
+ /* And also update the overflow labels */
+ update_overflow_labels (self);
+
g_clear_pointer (&week_end, g_date_time_unref);
g_clear_pointer (&week_start, g_date_time_unref);
}
@@ -1111,6 +1172,9 @@ gcal_week_header_remove_event (GcalWeekHeader *self,
/* Check if we eventually can merge events */
check_mergeable_events (self);
+ /* And also update the overflow labels */
+ update_overflow_labels (self);
+
g_clear_pointer (&children, g_list_free);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]