month-view: Ignore events outside current range

The month view looks specially awful when switching between
dates, since it doesn't implicitly filter the ranges it's
displaying.

Ignore events outside the current month range, since they'll
be removed anyway by the timeline.
This commit is contained in:
Georges Basile Stavracas Neto
2020-04-16 16:16:49 -03:00
parent d2da70fb28
commit 0c510d6709
+23
View File
@@ -573,6 +573,16 @@ get_real_event_widget_height (GtkWidget *widget)
return min_height; return min_height;
} }
static inline gboolean
month_view_contains_event (GcalRange *month_range,
GcalEvent *event)
{
GcalRangeOverlap overlap;
overlap = gcal_range_calculate_overlap (month_range, gcal_event_get_range (event), NULL);
return overlap != GCAL_RANGE_NO_OVERLAP;
}
static void static void
allocate_multiday_events (GcalMonthView *self, allocate_multiday_events (GcalMonthView *self,
gdouble *vertical_cell_space, gdouble *vertical_cell_space,
@@ -580,12 +590,14 @@ allocate_multiday_events (GcalMonthView *self,
gint *events_at_day, gint *events_at_day,
gint *allocated_events_at_day) gint *allocated_events_at_day)
{ {
g_autoptr (GcalRange) month_range = NULL;
GtkAllocation event_allocation; GtkAllocation event_allocation;
GtkBorder margin; GtkBorder margin;
GList *l; GList *l;
gboolean is_rtl; gboolean is_rtl;
is_rtl = gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL; is_rtl = gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL;
month_range = gcal_timeline_subscriber_get_range (GCAL_TIMELINE_SUBSCRIBER (self));
for (l = self->multi_cell_children; l; l = g_list_next (l)) for (l = self->multi_cell_children; l; l = g_list_next (l))
{ {
@@ -603,6 +615,9 @@ allocate_multiday_events (GcalMonthView *self,
event = gcal_event_widget_get_event (l->data); event = gcal_event_widget_get_event (l->data);
child_context = gtk_widget_get_style_context (l->data); child_context = gtk_widget_get_style_context (l->data);
if (!month_view_contains_event (month_range, event))
continue;
/* /*
* Multiday events can "break" following these rules: * Multiday events can "break" following these rules:
* *
@@ -744,12 +759,15 @@ allocate_single_day_events (GcalMonthView *self,
gint *events_at_day, gint *events_at_day,
gint *allocated_events_at_day) gint *allocated_events_at_day)
{ {
g_autoptr (GcalRange) month_range = NULL;
GHashTableIter iter; GHashTableIter iter;
GtkAllocation event_allocation; GtkAllocation event_allocation;
GtkAllocation cell_allocation; GtkAllocation cell_allocation;
GtkBorder margin; GtkBorder margin;
gpointer key, value; gpointer key, value;
month_range = gcal_timeline_subscriber_get_range (GCAL_TIMELINE_SUBSCRIBER (self));
g_hash_table_iter_init (&iter, self->single_cell_children); g_hash_table_iter_init (&iter, self->single_cell_children);
while (g_hash_table_iter_next (&iter, &key, &value)) while (g_hash_table_iter_next (&iter, &key, &value))
@@ -770,6 +788,7 @@ allocate_single_day_events (GcalMonthView *self,
l = (GList*) value; l = (GList*) value;
for (aux = l; aux; aux = g_list_next (aux)) for (aux = l; aux; aux = g_list_next (aux))
{ {
GcalEvent *event;
GtkStyleContext *child_context; GtkStyleContext *child_context;
GtkWidget *child_widget; GtkWidget *child_widget;
gdouble real_height; gdouble real_height;
@@ -780,10 +799,14 @@ allocate_single_day_events (GcalMonthView *self,
gint minimum_height; gint minimum_height;
child_widget = aux->data; child_widget = aux->data;
event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (child_widget));
if (!gtk_widget_get_visible (child_widget)) if (!gtk_widget_get_visible (child_widget))
continue; continue;
if (!month_view_contains_event (month_range, event))
continue;
child_context = gtk_widget_get_style_context (child_widget); child_context = gtk_widget_get_style_context (child_widget);
gtk_style_context_get_margin (child_context, gtk_style_context_get_state (child_context), &margin); gtk_style_context_get_margin (child_context, gtk_style_context_get_state (child_context), &margin);