[gnome-calendar/gnome-3-28] event: fix multiday check
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/gnome-3-28] event: fix multiday check
- Date: Mon, 30 Apr 2018 22:35:36 +0000 (UTC)
commit a36716046121f8e33c6eeb38e0062b20fe4b832b
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Mon Apr 30 19:31:01 2018 -0300
event: fix multiday check
Checking if an event is multiday is currently broken
because g_date_time_difference() returns raw time spans,
and that value means "there is 24h of difference between
these dates", when what we're looking for is "how many
days are between these two dates".
To fix that, use the GDate API instead of GDateTime.
src/gcal-event.c | 43 +++++++++++++++++++------------------------
1 file changed, 19 insertions(+), 24 deletions(-)
---
diff --git a/src/gcal-event.c b/src/gcal-event.c
index 81e3655d..738bca7f 100644
--- a/src/gcal-event.c
+++ b/src/gcal-event.c
@@ -1499,36 +1499,31 @@ gcal_event_get_uid (GcalEvent *self)
gboolean
gcal_event_is_multiday (GcalEvent *self)
{
- g_autoptr (GDateTime) real_end_date = NULL;
- gboolean is_multiday;
- gint n_days;
+ g_autoptr (GDateTime) inclusive_end_date = NULL;
+ g_autoptr (GDateTime) local_start_date = NULL;
+ g_autoptr (GDateTime) local_end_date = NULL;
+ GDate start_dt;
+ GDate end_dt;
g_return_val_if_fail (GCAL_IS_EVENT (self), FALSE);
- real_end_date = g_date_time_add_seconds (gcal_event_get_date_end (self), -1);
- n_days = g_date_time_difference (real_end_date, self->dt_start) / G_TIME_SPAN_DAY;
- is_multiday = FALSE;
+ inclusive_end_date = g_date_time_add_seconds (gcal_event_get_date_end (self), -1);
+ local_start_date = g_date_time_to_local (self->dt_start);
+ local_end_date = g_date_time_to_local (inclusive_end_date);
- /*
- * An all-day event with only 1 day of time span is treated as a
- * single-day event.
- */
- if (self->all_day && n_days == 1)
- is_multiday = FALSE;
+ g_date_clear (&start_dt, 1);
+ g_date_set_dmy (&start_dt,
+ g_date_time_get_day_of_month (local_start_date),
+ g_date_time_get_month (local_start_date),
+ g_date_time_get_year (local_start_date));
- /*
- * If any of the following fields are different, we're certain that
- * it's a multiday event. Otherwise, we're certain it's NOT a multiday
- * event.
- */
- if (g_date_time_get_year (self->dt_start) != g_date_time_get_year (real_end_date) ||
- g_date_time_get_month (self->dt_start) != g_date_time_get_month (real_end_date) ||
- g_date_time_get_day_of_month (self->dt_start) != g_date_time_get_day_of_month (real_end_date))
- {
- is_multiday = TRUE;
- }
+ g_date_clear (&end_dt, 1);
+ g_date_set_dmy (&end_dt,
+ g_date_time_get_day_of_month (local_end_date),
+ g_date_time_get_month (local_end_date),
+ g_date_time_get_year (local_end_date));
- return is_multiday;
+ return g_date_days_between (&start_dt, &end_dt) > 1;
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]