summaryrefslogtreecommitdiff
blob: e382029ceeb141c16f0a363b21c7b60662fbed6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
From 9f4bc90761bb9eb3b3e8bdc9ec6b42f44f02053e Mon Sep 17 00:00:00 2001
From: Abdullahi Usman
Date: Mon, 10 Jul 2017 11:43:36 +0100
Subject: week-grid : seperate week's events overlaps.

The week view can display mutilple events that can partly or fully span
same time ranges.

But week view fails to make correct assumption about the width of events when
two or more events span some time ranges in which these events also span some
time ranges with other events, and whereby the number of these other events
that they span time ranges with does not coincide with the number of the events
that the other event also span.  Week view ended up calculating cells that
appears horizontally jointed up.  Also int16_compare() does not dereference the
pointer from g_ptr_array_sort() correctly and that makes it sort events
incorrectly and hence making events appears vertically jointed up.

If an event have other events in which they span some time, we calcuate its width
by taking into consideration of all the events that the other event may span
time with.  The event that has the higher number of time spans is considered.
We also save and retrieve our positions using UINT_TO_POINTER and POINTER_TO_UINT()
respectively, and then dereference the pointer from g_ptr_array_sort() correctly.

https://bugzilla.gnome.org/show_bug.cgi?id=777416
---
 src/views/gcal-week-grid.c | 41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/views/gcal-week-grid.c b/src/views/gcal-week-grid.c
index 20ddb48..ab125b0 100644
--- a/src/views/gcal-week-grid.c
+++ b/src/views/gcal-week-grid.c
@@ -184,10 +184,10 @@ get_event_range (GcalWeekGrid *self,
 }
 
 static inline gint
-int16_compare (gconstpointer a,
-               gconstpointer b)
+uint16_compare (gconstpointer a,
+                gconstpointer b)
 {
-  return GPOINTER_TO_INT (a) - GPOINTER_TO_INT (b);
+  return GPOINTER_TO_UINT (*(gint*)a) - GPOINTER_TO_UINT (*(gint*)b);
 }
 
 static inline guint
@@ -204,7 +204,7 @@ get_event_index (GcalRangeTree *tree,
   if (!array)
     return 0;
 
-  g_ptr_array_sort (array, int16_compare);
+  g_ptr_array_sort (array, uint16_compare);
 
   for (i = 0; array && i < array->len; i++)
     {
@@ -235,6 +235,35 @@ count_overlaps_at_range (GcalRangeTree *self,
 
       n_events = gcal_range_tree_count_entries_at_range (self, i, i + 1);
 
+      if (n_events == 0)
+        break;
+
+      counter = MAX (counter, n_events);
+    }
+
+  return counter;
+}
+
+static guint
+count_overlaps_of_event (GcalRangeTree *self,
+                         guint16        day_start,
+                         guint16        day_end,
+                         guint16        event_start,
+                         guint16        event_end)
+{
+  guint64 i, counter;
+
+  counter = count_overlaps_at_range (self, event_start, day_end);
+
+  for (i = event_start; i > day_start; i--)
+    {
+      guint n_events;
+
+      n_events = gcal_range_tree_count_entries_at_range (self, i - 1, i);
+
+      if (n_events == 0)
+        break;
+
       counter = MAX (counter, n_events);
     }
 
@@ -652,7 +681,7 @@ gcal_week_grid_size_allocate (GtkWidget     *widget,
           context = gtk_widget_get_style_context (event_widget);
 
           /* The total number of events available in this range */
-          events_at_range = count_overlaps_at_range (self->events, data->start, data->end);
+          events_at_range = count_overlaps_of_event (self->events, day_start, day_end, data->start, data->end);
 
           /* The real horizontal position of this event */
           widget_index = get_event_index (overlaps, data->start, data->end);
@@ -689,7 +718,7 @@ gcal_week_grid_size_allocate (GtkWidget     *widget,
           gcal_range_tree_add_range (overlaps,
                                      data->start,
                                      data->end,
-                                     GINT_TO_POINTER (widget_index));
+                                     GUINT_TO_POINTER (widget_index));
         }
 
       g_clear_pointer (&widgets_data, g_ptr_array_unref);
-- 
cgit v0.12