event: add recurrence property

Earlier, an event had no recurrence property. Hence, the event's
recurrence pattern etc. could not be analysed, and as a result
could not be changed by the user. gnome-calendar just displayed
all the recurrences of a recurring event but had no 'readable'
knowledge regarding the characteristics of those recurrences.

This patch adds the recurrence property, which is basically
a GcalRecurrence structure linked to the event.

https://bugzilla.gnome.org/show_bug.cgi?id=782755
This commit is contained in:
Yash Singh
2017-07-13 13:32:52 -03:00
committed by Georges Basile Stavracas Neto
parent 59fcd01192
commit 2c75e72582
2 changed files with 96 additions and 0 deletions
+88
View File
@@ -20,6 +20,7 @@
#include "gcal-event.h"
#include "gcal-utils.h"
#include "gcal-recurrence.h"
#define LIBICAL_TZID_PREFIX "/freeassociation.sourceforge.net/"
@@ -104,6 +105,8 @@ struct _GcalEvent
ECalComponent *component;
ESource *source;
GcalRecurrence *recurrence;
gboolean is_valid : 1;
GError *initialization_error;
};
@@ -127,6 +130,7 @@ enum {
PROP_TIMEZONE,
PROP_UID,
PROP_HAS_RECURRENCE,
PROP_RECURRENCE,
N_PROPS
};
@@ -368,10 +372,14 @@ gcal_event_set_component_internal (GcalEvent *self,
/* Set has-recurrence to check if the component has recurrence or not */
self->has_recurrence = e_cal_component_has_recurrences(component);
/* Load the recurrence-rules in GcalRecurrence struct */
self->recurrence = gcal_recurrence_parse_recurrence_rules (component);
/* Load and setup the alarms */
load_alarms (self);
g_object_notify (G_OBJECT (self), "has-recurrence");
g_object_notify (G_OBJECT (self), "recurrence");
g_object_notify (G_OBJECT (self), "component");
g_object_notify (G_OBJECT (self), "location");
g_object_notify (G_OBJECT (self), "summary");
@@ -429,6 +437,7 @@ gcal_event_finalize (GObject *object)
g_clear_pointer (&self->color, gdk_rgba_free);
g_clear_object (&self->component);
g_clear_object (&self->source);
g_clear_pointer (&self->recurrence, gcal_recurrence_free);
G_OBJECT_CLASS (gcal_event_parent_class)->finalize (object);
}
@@ -491,6 +500,10 @@ gcal_event_get_property (GObject *object,
g_value_set_boolean (value, self->has_recurrence);
break;
case PROP_RECURRENCE:
g_value_set_boxed (value, self->recurrence);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -546,6 +559,10 @@ gcal_event_set_property (GObject *object,
gcal_event_set_timezone (self, g_value_get_boxed (value));
break;
case PROP_RECURRENCE:
gcal_event_set_recurrence (self, g_value_get_boxed (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -716,6 +733,18 @@ gcal_event_class_init (GcalEventClass *klass)
FALSE,
G_PARAM_READABLE));
/**
* GcalEvent::recurrence:
*
* The recurrence-rules property of the event.
*/
g_object_class_install_property (object_class,
PROP_RECURRENCE,
g_param_spec_boxed ("recurrence",
"Recurrence property of the event",
"The recurrence property of the event",
GCAL_TYPE_RECURRENCE,
G_PARAM_READWRITE));
}
@@ -1597,3 +1626,62 @@ gcal_event_compare_with_current (GcalEvent *event1,
return 0;
}
/**
* gcal_event_set_recurrence:
* @self: a #GcalEvent
* @recur: (nullable): a #GcalRecurrence
*
* Sets the recurrence struct of the event to @recur
* and adds the corresponding rrule to the event.
*/
void
gcal_event_set_recurrence (GcalEvent *self,
GcalRecurrence *recur)
{
ECalComponent *comp;
icalcomponent *icalcomp;
icalproperty *prop;
struct icalrecurrencetype *rrule;
g_return_if_fail (GCAL_IS_EVENT (self));
rrule = gcal_recurrence_to_rrule (recur);
comp = gcal_event_get_component (self);
icalcomp = e_cal_component_get_icalcomponent (comp);
g_clear_pointer (&self->recurrence, gcal_recurrence_free);
self->recurrence = gcal_recurrence_copy (recur);
prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY);
if (prop)
{
icalproperty_set_rrule (prop, *rrule);
}
else
{
prop = icalproperty_new_rrule (*rrule);
icalcomponent_add_property (icalcomp, prop);
}
/* Rescan the component for the changes to be detected and registered */
e_cal_component_rescan (comp);
}
/**
* gcal_event_get_recurrence:
* @self: a #GcalEvent
*
* Gets the recurrence struct @recur of the event.
*
* Returns: (transfer full): a #GcalRecurrence
*/
GcalRecurrence*
gcal_event_get_recurrence (GcalEvent *self)
{
g_return_val_if_fail (GCAL_IS_EVENT (self), NULL);
return self->recurrence;
}
+8
View File
@@ -19,6 +19,8 @@
#ifndef GCAL_EVENT_H
#define GCAL_EVENT_H
#include "gcal-recurrence.h"
#include <glib-object.h>
#include <gtk/gtk.h>
#include <libecal/libecal.h>
@@ -122,6 +124,12 @@ gint gcal_event_compare_with_current (GcalEvent
GcalEvent *event2,
time_t *current_time);
void gcal_event_set_recurrence (GcalEvent *event,
GcalRecurrence *recur);
GcalRecurrence* gcal_event_get_recurrence (GcalEvent *self);
G_END_DECLS
#endif /* GCAL_EVENT_H */