[gnome-calendar] month-view: Ignore events outside current range



commit 0c510d6709017808d1d18db13ed13ccdbf3ce8ae
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Apr 16 16:16:49 2020 -0300

    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.

 src/views/gcal-month-view.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
---
diff --git a/src/views/gcal-month-view.c b/src/views/gcal-month-view.c
index 5bd27f71..0558a6f5 100644
--- a/src/views/gcal-month-view.c
+++ b/src/views/gcal-month-view.c
@@ -573,6 +573,16 @@ get_real_event_widget_height (GtkWidget *widget)
   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
 allocate_multiday_events (GcalMonthView *self,
                           gdouble       *vertical_cell_space,
@@ -580,12 +590,14 @@ allocate_multiday_events (GcalMonthView *self,
                           gint          *events_at_day,
                           gint          *allocated_events_at_day)
 {
+  g_autoptr (GcalRange) month_range = NULL;
   GtkAllocation event_allocation;
   GtkBorder margin;
   GList *l;
   gboolean is_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))
     {
@@ -603,6 +615,9 @@ allocate_multiday_events (GcalMonthView *self,
       event = gcal_event_widget_get_event (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:
        *
@@ -744,12 +759,15 @@ allocate_single_day_events (GcalMonthView *self,
                             gint          *events_at_day,
                             gint          *allocated_events_at_day)
 {
+  g_autoptr (GcalRange) month_range = NULL;
   GHashTableIter iter;
   GtkAllocation event_allocation;
   GtkAllocation cell_allocation;
   GtkBorder margin;
   gpointer key, value;
 
+  month_range = gcal_timeline_subscriber_get_range (GCAL_TIMELINE_SUBSCRIBER (self));
+
   g_hash_table_iter_init (&iter, self->single_cell_children);
 
   while (g_hash_table_iter_next (&iter, &key, &value))
@@ -770,6 +788,7 @@ allocate_single_day_events (GcalMonthView *self,
       l = (GList*) value;
       for (aux = l; aux; aux = g_list_next (aux))
         {
+          GcalEvent *event;
           GtkStyleContext *child_context;
           GtkWidget *child_widget;
           gdouble real_height;
@@ -780,10 +799,14 @@ allocate_single_day_events (GcalMonthView *self,
           gint minimum_height;
 
           child_widget = aux->data;
+          event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (child_widget));
 
           if (!gtk_widget_get_visible (child_widget))
             continue;
 
+          if (!month_view_contains_event (month_range, event))
+            continue;
+
           child_context = gtk_widget_get_style_context (child_widget);
 
           gtk_style_context_get_margin (child_context, gtk_style_context_get_state (child_context), &margin);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]