From ddfd3ae498e2775730094a0be2c0fe034400faac Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 7 Aug 2023 09:26:42 -0300 Subject: [PATCH] month-view-row: Slant edges of multiday events When the start or end of the event block doesn't match the event's range, add slanted edges. --- src/gui/views/gcal-month-view-row.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/gui/views/gcal-month-view-row.c b/src/gui/views/gcal-month-view-row.c index 5ff13f4f..554ef702 100644 --- a/src/gui/views/gcal-month-view-row.c +++ b/src/gui/views/gcal-month-view-row.c @@ -259,9 +259,11 @@ prepare_layout_blocks (GcalMonthViewRow *self, static void recalculate_layout_blocks (GcalMonthViewRow *self) { + g_autoptr (GDateTime) range_start = NULL; guint events_at_weekday[7] = { 0, }; guint n_events; + range_start = gcal_range_get_start (self->range); n_events = g_list_model_get_n_items (G_LIST_MODEL (self->events)); g_hash_table_remove_all (self->layout_blocks); @@ -322,6 +324,32 @@ recalculate_layout_blocks (GcalMonthViewRow *self) } } + /* Adjust slanted edges of multiday events */ + if (gcal_event_is_multiday (event)) + { + g_autoptr (GDateTime) adjusted_range_start = NULL; + + adjusted_range_start = g_date_time_new (g_date_time_get_timezone (gcal_event_get_date_start (event)), + g_date_time_get_year (range_start), + g_date_time_get_month (range_start), + g_date_time_get_day_of_month (range_start), + 0, 0, 0); + + + for (guint j = 0; j < blocks->len; j++) + { + g_autoptr (GDateTime) block_start = NULL; + g_autoptr (GDateTime) block_end = NULL; + + block = g_ptr_array_index (blocks, j); + block_start = g_date_time_add_days (adjusted_range_start, block->cell); + block_end = g_date_time_add_days (block_start, block->length); /* FIXME: use end date's timezone here */ + + gcal_event_widget_set_date_start (GCAL_EVENT_WIDGET (block->event_widget), block_start); + gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (block->event_widget), block_end); + } + } + g_hash_table_insert (self->layout_blocks, event, g_steal_pointer (&blocks)); } }