week-view: reimplement editing events

This commit is contained in:
Georges Basile Stavracas Neto
2016-12-08 18:23:25 -02:00
parent 5238e6ff9d
commit 36f716ebf4
7 changed files with 206 additions and 14 deletions
+71 -1
View File
@@ -75,6 +75,13 @@ enum
LAST_PROP
};
enum
{
EVENT_ACTIVATED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0, };
static GParamSpec* properties[LAST_PROP] = { NULL, };
/* ChildData methods */
@@ -93,6 +100,30 @@ child_data_new (GtkWidget *widget,
return data;
}
/* Event activation methods */
static void
on_event_widget_activated (GcalEventWidget *widget,
GcalWeekGrid *self)
{
g_signal_emit (self, signals[EVENT_ACTIVATED], 0, widget);
}
static inline void
setup_event_widget (GcalWeekGrid *self,
GtkWidget *widget)
{
g_signal_connect (widget, "activate", G_CALLBACK (on_event_widget_activated), self);
}
static inline void
destroy_event_widget (GcalWeekGrid *self,
GtkWidget *widget)
{
g_signal_handlers_disconnect_by_func (widget, on_event_widget_activated, self);
gtk_widget_destroy (widget);
}
/* Auxiliary methods */
static GDateTime*
get_start_of_week (icaltimetype *date)
@@ -624,6 +655,15 @@ gcal_week_grid_class_init (GcalWeekGridClass *klass)
ICAL_TIME_TYPE,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated",
GCAL_TYPE_WEEK_GRID,
G_SIGNAL_RUN_FIRST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
1,
GCAL_TYPE_EVENT_WIDGET);
g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties);
gtk_widget_class_set_css_name (widget_class, "weekgrid");
@@ -699,6 +739,7 @@ gcal_week_grid_add_event (GcalWeekGrid *self,
end,
child_data_new (widget, start, end));
setup_event_widget (self, widget);
gtk_widget_show (widget);
gtk_container_add (GTK_CONTAINER (self), widget);
@@ -733,9 +774,38 @@ gcal_week_grid_remove_event (GcalWeekGrid *self,
get_event_range (self, event, &event_start, &event_end);
gcal_range_tree_remove_range (self->events, data->start, data->end, data);
gtk_widget_destroy (data->widget);
destroy_event_widget (self, data->widget);
g_free (data);
}
g_clear_pointer (&widgets, g_ptr_array_unref);
}
GList*
gcal_week_grid_get_children_by_uuid (GcalWeekGrid *self,
const gchar *uid)
{
GPtrArray *widgets;
GList *result;
guint i;
result = NULL;
widgets = gcal_range_tree_get_data_at_range (self->events, 0, MAX_MINUTES);
for (i = 0; widgets && i < widgets->len; i++)
{
ChildData *data;
GcalEvent *event;
data = g_ptr_array_index (widgets, i);
event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (data->widget));
if (g_strcmp0 (gcal_event_get_uid (event), uid) == 0)
result = g_list_prepend (result, data->widget);
}
g_clear_pointer (&widgets, g_ptr_array_unref);
return result;
}