week-header: batch fix overflow management
It's getting close to be completely working.
This commit is contained in:
@@ -367,8 +367,19 @@ check_mergeable_events (GcalWeekHeader *self)
|
|||||||
current_widget = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i, index + 1);
|
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);
|
to_be_removed = gtk_grid_get_child_at (GTK_GRID (self->grid), weekday + i + 1, index + 1);
|
||||||
|
|
||||||
if (current_widget == to_be_removed)
|
/*
|
||||||
|
* 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;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
merge_events (self, current_widget, to_be_removed);
|
merge_events (self, current_widget, to_be_removed);
|
||||||
|
|
||||||
@@ -423,6 +434,8 @@ split_event_widget_at_column (GcalWeekHeader *self,
|
|||||||
column - left_attach,
|
column - left_attach,
|
||||||
1);
|
1);
|
||||||
|
|
||||||
|
gtk_widget_set_visible (widget_before, is_event_visible (self, left_attach, top_attach - 1));
|
||||||
|
|
||||||
new_width = old_width - column + left_attach;
|
new_width = old_width - column + left_attach;
|
||||||
old_width = new_width;
|
old_width = new_width;
|
||||||
left_attach = column;
|
left_attach = column;
|
||||||
@@ -434,7 +447,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
|
|||||||
"width", new_width,
|
"width", new_width,
|
||||||
NULL);
|
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 */
|
/* Create a new widget after the current widget */
|
||||||
@@ -464,7 +477,7 @@ split_event_widget_at_column (GcalWeekHeader *self,
|
|||||||
"width", new_width,
|
"width", new_width,
|
||||||
NULL);
|
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);
|
g_clear_pointer (&end_column_date, g_date_time_unref);
|
||||||
@@ -516,6 +529,25 @@ move_events_at_column (GcalWeekHeader *self,
|
|||||||
g_clear_pointer (&children, g_list_free);
|
g_clear_pointer (&children, g_list_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
add_event_to_grid (GcalWeekHeader *self,
|
add_event_to_grid (GcalWeekHeader *self,
|
||||||
GcalEvent *event,
|
GcalEvent *event,
|
||||||
@@ -525,6 +557,7 @@ add_event_to_grid (GcalWeekHeader *self,
|
|||||||
g_autoptr (GDateTime) week_start = NULL;
|
g_autoptr (GDateTime) week_start = NULL;
|
||||||
g_autoptr (GDateTime) week_end = NULL;
|
g_autoptr (GDateTime) week_end = NULL;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
|
gboolean is_visible, was_visible;
|
||||||
gint position;
|
gint position;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
@@ -543,7 +576,13 @@ add_event_to_grid (GcalWeekHeader *self,
|
|||||||
1,
|
1,
|
||||||
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 */
|
/* Single-day events are the simplest case, and the code above is enough to deal with them */
|
||||||
if (!gcal_event_is_multiday (event))
|
if (!gcal_event_is_multiday (event))
|
||||||
@@ -567,10 +606,13 @@ add_event_to_grid (GcalWeekHeader *self,
|
|||||||
/* Add the event to that day */
|
/* Add the event to that day */
|
||||||
new_position = add_event_to_weekday (self, event, i);
|
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);
|
move_events_at_column (self, DOWN, i, new_position);
|
||||||
|
|
||||||
/* Add the event to the grid */
|
/* 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),
|
gtk_container_child_set (GTK_CONTAINER (self->grid),
|
||||||
widget,
|
widget,
|
||||||
@@ -597,16 +639,17 @@ add_event_to_grid (GcalWeekHeader *self,
|
|||||||
/* From now on, let's modify this widget */
|
/* From now on, let's modify this widget */
|
||||||
widget = cloned_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);
|
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 */
|
/* Update the widget's end date */
|
||||||
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget), week_end);
|
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget), week_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_widget_show (widget);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -743,6 +786,8 @@ header_collapse (GcalWeekHeader *self)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
gtk_widget_set_visible (l->data, is_event_visible (self, left_attach, top_attach - 1));
|
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);
|
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);
|
g_clear_pointer (&children, g_list_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user