core/event: Add utility functions for checking equality

This adds:
- `gcal_event_alarms_equal()`
- `gcal_event_schedule_equal()`
- `gcal_event_strings_equal()`

We aren't going to make use of it yet, but eventually these functions
will be used for the event editor dialog, as well as writing tests for.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/783>
This commit is contained in:
Hari Rana
2026-06-26 07:09:52 -04:00
parent 8aa3b7442b
commit 2ee6dfc5e7
2 changed files with 160 additions and 0 deletions
+151
View File
@@ -1668,6 +1668,157 @@ gcal_event_compare_with_current (GcalEvent *event1,
return 0;
}
/**
* gcal_event_alarms_equal:
* @event1: a #GcalEvent
* @event2: a #GcalEvent
*
* Checks if the alarms set by @event1 and @event2 are identical.
*
* Returns: %TRUE if the events' alarms are identical
*/
gboolean
gcal_event_alarms_equal (GcalEvent *event1,
GcalEvent *event2)
{
g_autoptr (GList) alarms1 = NULL;
g_autoptr (GList) alarms2 = NULL;
GCAL_ENTRY;
g_assert (GCAL_IS_EVENT (event1) && GCAL_IS_EVENT (event2));
alarms1 = gcal_event_get_alarms (event1);
alarms2 = gcal_event_get_alarms (event2);
if (g_list_length (alarms1) != g_list_length (alarms2))
GCAL_RETURN (FALSE);
for (GList *l = alarms1; l != NULL; l = l->next)
{
ECalComponentAlarm *other_alarm;
ECalComponentAlarm *alarm;
alarm = l->data;
other_alarm = NULL;
for (GList *i = alarms2; i != NULL; i = i->next)
{
ECalComponentAlarm *aux = i->data;
if (get_alarm_trigger_minutes (event1, alarm) != get_alarm_trigger_minutes (event1, aux))
continue;
other_alarm = aux;
if (e_cal_component_alarm_get_action (alarm) != e_cal_component_alarm_get_action (aux))
GCAL_RETURN (FALSE);
break;
}
if (!other_alarm)
GCAL_RETURN (FALSE);
/* TODO: this certainly needs deeper comparisons! */
}
GCAL_RETURN (TRUE);
}
/**
* gcal_event_schedule_equal:
* @event1: a #GcalEvent
* @event2: a #GcalEvent
*
* Checks if the schedule set by @event1 and @event2 are identical.
*
* Returns: %TRUE if the events' schedule are identical
*/
gboolean
gcal_event_schedule_equal (GcalEvent *event1,
GcalEvent *event2)
{
GcalRecurrence *recurrence1, *recurrence2;
GTimeZone *date_start_tz1, *date_start_tz2;
GTimeZone *date_end_tz1, *date_end_tz2;
GDateTime *date_start1, *date_start2;
GDateTime *date_end1, *date_end2;
GCAL_ENTRY;
g_assert (GCAL_IS_EVENT (event1) && GCAL_IS_EVENT (event2));
if (gcal_event_has_recurrence (event1) != gcal_event_has_recurrence (event2))
GCAL_RETURN (FALSE);
recurrence1 = gcal_event_get_recurrence (event1);
recurrence2 = gcal_event_get_recurrence (event2);
if (recurrence1 == recurrence2)
GCAL_RETURN (TRUE);
if (!recurrence1 != !recurrence2)
GCAL_RETURN (FALSE);
if (!gcal_recurrence_is_equal (recurrence1, recurrence2))
GCAL_RETURN (FALSE);
if (gcal_event_get_all_day (event1) != gcal_event_get_all_day (event2))
GCAL_RETURN (FALSE);
date_start1 = gcal_event_get_date_start (event1);
date_start2 = gcal_event_get_date_start (event2);
date_end1 = gcal_event_get_date_end (event1);
date_end2 = gcal_event_get_date_end (event2);
if (gcal_date_time_compare_date (date_start1, date_start2) < 0 ||
gcal_date_time_compare_date (date_end1, date_end2) > 0)
GCAL_RETURN (FALSE);
date_start_tz1 = g_date_time_get_timezone (date_start1);
date_end_tz1 = g_date_time_get_timezone (date_end1);
date_start_tz2 = g_date_time_get_timezone (date_start2);
date_end_tz2 = g_date_time_get_timezone (date_end2);
if (g_strcmp0 (g_time_zone_get_identifier (date_start_tz1), g_time_zone_get_identifier (date_start_tz2)) != 0)
GCAL_RETURN (FALSE);
if (g_strcmp0 (g_time_zone_get_identifier (date_end_tz1), g_time_zone_get_identifier (date_end_tz2)) != 0)
GCAL_RETURN (FALSE);
GCAL_RETURN (TRUE);
}
/**
* gcal_event_strings_equal:
* @event1: a #GcalEvent
* @event2: a #GcalEvent
*
* Checks if the strings set by @event1 and @event2 are identical.
*
* Specifically, this checks whether [property@Gcal.Event:summary], [property@Gcal.Event:description],
* and [property@Gcal.Event:location] are identical.
*
* Returns: %TRUE if the events' strings are identical
*/
gboolean
gcal_event_strings_equal (GcalEvent *event1,
GcalEvent *event2)
{
GCAL_ENTRY;
g_assert (GCAL_IS_EVENT (event1) && GCAL_IS_EVENT (event2));
if (g_strcmp0 (gcal_event_get_summary (event1), gcal_event_get_summary (event2)) != 0)
GCAL_RETURN (FALSE);
if (g_strcmp0 (gcal_event_get_description (event1), gcal_event_get_description (event2)) != 0)
GCAL_RETURN (FALSE);
if (g_strcmp0 (gcal_event_get_location (event1), gcal_event_get_location (event2)) != 0)
GCAL_RETURN (FALSE);
GCAL_RETURN (TRUE);
}
/**
* gcal_event_set_recurrence:
* @self: a #GcalEvent
+9
View File
@@ -142,6 +142,15 @@ GListModel * gcal_event_get_attendees (GcalEvent
GcalEventOrganizer * gcal_event_get_organizer (GcalEvent *self);
gboolean gcal_event_alarms_equal (GcalEvent *event1,
GcalEvent *event2);
gboolean gcal_event_schedule_equal (GcalEvent *event1,
GcalEvent *event2);
gboolean gcal_event_strings_equal (GcalEvent *event1,
GcalEvent *event2);
G_END_DECLS
#endif /* GCAL_EVENT_H */