From f825687ae2fa169173d048a3a69b455481ddfaa5 Mon Sep 17 00:00:00 2001 From: Andras Molnar Date: Wed, 21 Apr 2021 18:29:42 +0200 Subject: [PATCH] year-view: Fix of all day events showing up after end date All-day events were showing up after their end date in year-view due to wrong logic when comparing the range of selected dates and the range of an event. Fix this by using gcal_range_calculate_overlap for the comparison; end_selected_date is adjusted such that now it represents the end date of a date range (including end of month and end of year). Fixes https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/589 --- src/gui/views/gcal-year-view.c | 50 ++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/gui/views/gcal-year-view.c b/src/gui/views/gcal-year-view.c index ac32a8f9d..885e067fe 100644 --- a/src/gui/views/gcal-year-view.c +++ b/src/gui/views/gcal-year-view.c @@ -214,6 +214,7 @@ update_selected_dates_from_button_data (GcalYearView *year_view) if (year_view->selected_data->start_day != 0) { ButtonData selected_data = *(year_view->selected_data); + GDateTime *aux; order_selected_data (&selected_data); @@ -227,8 +228,13 @@ update_selected_dates_from_button_data (GcalYearView *year_view) year_view->end_selected_date = g_date_time_new_local (g_date_time_get_year (year_view->date), selected_data.end_month + 1, selected_data.end_day, - 23, 59, 59); - } + 0, 0, 0); + + aux = g_date_time_add_days (year_view->end_selected_date, 1); + gcal_clear_date_time (&year_view->end_selected_date); + year_view->end_selected_date = aux; + + } else { g_autoptr (GDateTime) start_date = NULL; @@ -254,17 +260,6 @@ update_selected_dates_from_button_data (GcalYearView *year_view) year_view->selected_data->end_month = g_date_time_get_month (year_view->end_selected_date)-1; } - if (g_date_time_get_year (year_view->end_selected_date) != g_date_time_get_year (year_view->start_selected_date)) - { - g_autoptr (GDateTime) end_of_year = NULL; - - end_of_year = g_date_time_new (gcal_context_get_timezone (year_view->context), - g_date_time_get_year (year_view->start_selected_date), - G_DATE_DECEMBER, - 31, - 0, 0, 0); - gcal_set_date_time (&year_view->end_selected_date, end_of_year); - } } static void @@ -413,31 +408,36 @@ get_events_for_range (GcalYearView *self, { g_autoptr (GPtrArray) events = NULL; guint i; + g_autoptr (GcalRange) date_range = NULL; + g_autoptr (GDateTime) real_end = NULL; + date_range = gcal_range_new (start, end, GCAL_RANGE_DEFAULT); events = g_ptr_array_sized_new (50); - for (i = g_date_time_get_month (start) - 1; i <= g_date_time_get_month (end) - 1; i++) + /* end is the first day after the selection ends */ + real_end = g_date_time_add_days (end, -1); + + for (i = g_date_time_get_month (start) - 1; i <= g_date_time_get_month (real_end) - 1; i++) { GPtrArray *month_events = self->events[i]; guint j; for (j = 0; j < month_events->len; j++) { - GDateTime *event_start; - GDateTime *event_end; + GcalRange *event_range; GcalEvent *event; + GcalRangePosition *out_position = NULL; + GcalRangeOverlap overlap; event = g_ptr_array_index (month_events, j); - event_start = gcal_event_get_date_start (event); - event_end = gcal_event_get_date_end (event); + event_range = gcal_event_get_range (event); + overlap = gcal_range_calculate_overlap (date_range, event_range, out_position); - if (gcal_date_time_compare_date (event_end, start) < 0 || - gcal_date_time_compare_date (event_start, end) > 0) - { + if ( overlap == GCAL_RANGE_NO_OVERLAP ) continue; - } g_ptr_array_add (events, event); + } } @@ -451,12 +451,14 @@ update_sidebar (GcalYearView *year_view) GtkWidget *child_widget; GList **days_widgets_array; gint i, days_span; + g_autoptr (GDateTime) real_end = NULL; update_selected_dates_from_button_data (year_view); gtk_container_foreach (GTK_CONTAINER (year_view->events_sidebar), (GtkCallback) gtk_widget_destroy, NULL); - days_span = g_date_time_get_day_of_year (year_view->end_selected_date) - g_date_time_get_day_of_year (year_view->start_selected_date) + 1; + real_end = g_date_time_add_days (year_view->end_selected_date, -1); + days_span = g_date_time_get_day_of_year (real_end) - g_date_time_get_day_of_year (year_view->start_selected_date) + 1; days_widgets_array = g_new0 (GList*, days_span); events = get_events_for_range (year_view, @@ -1330,7 +1332,7 @@ add_event_clicked_cb (GcalYearView *year_view, else { start_date = g_date_time_ref (year_view->start_selected_date); - end_date = g_date_time_add_days (year_view->end_selected_date, 1); + end_date = g_date_time_ref (year_view->end_selected_date); } if (year_view->popover_mode) -- GitLab