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
+83 -8
View File
@@ -94,20 +94,52 @@ static void gcal_week_header_set_property (GObject *objec
static void gcal_week_header_size_allocate (GtkWidget *widget,
GtkAllocation *alloc);
enum
{
PROP_0,
PROP_ACTIVE_DATE
};
typedef enum
{
UP,
DOWN
} MoveDirection;
enum
{
PROP_0,
PROP_ACTIVE_DATE
};
enum
{
EVENT_ACTIVATED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (GcalWeekHeader, gcal_week_header, GTK_TYPE_GRID);
/* Event activation methods */
static void
on_event_widget_activated (GcalEventWidget *widget,
GcalWeekHeader *self)
{
g_signal_emit (self, signals[EVENT_ACTIVATED], 0, widget);
}
static inline void
setup_event_widget (GcalWeekHeader *self,
GtkWidget *widget)
{
g_signal_connect (widget, "activate", G_CALLBACK (on_event_widget_activated), self);
}
static inline void
destroy_event_widget (GcalWeekHeader *self,
GtkWidget *widget)
{
g_signal_handlers_disconnect_by_func (widget, on_event_widget_activated, self);
gtk_widget_destroy (widget);
}
/* Auxiliary methods */
static GcalEvent*
get_event_by_uuid (GcalWeekHeader *self,
@@ -307,7 +339,7 @@ merge_events (GcalWeekHeader *self,
"width", &current_width,
NULL);
gtk_widget_destroy (to_be_removed);
destroy_event_widget (self, to_be_removed);
/* Update the event's size */
gtk_container_child_set (GTK_CONTAINER (self->grid),
@@ -438,6 +470,8 @@ split_event_widget_at_column (GcalWeekHeader *self,
widget_before = gcal_event_widget_clone (GCAL_EVENT_WIDGET (widget));
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget_before), column_date);
setup_event_widget (self, widget_before);
gtk_grid_attach (GTK_GRID (self->grid),
widget_before,
left_attach,
@@ -474,6 +508,8 @@ split_event_widget_at_column (GcalWeekHeader *self,
gcal_event_widget_set_date_start (GCAL_EVENT_WIDGET (widget_after), end_column_date);
gcal_event_widget_set_date_end (GCAL_EVENT_WIDGET (widget_after), event_end);
setup_event_widget (self, widget_after);
gtk_grid_attach (GTK_GRID (self->grid),
widget_after,
column + 1,
@@ -580,6 +616,7 @@ add_event_to_grid (GcalWeekHeader *self,
/* Add the event to the grid */
widget = gcal_event_widget_new (event);
setup_event_widget (self, widget);
gtk_grid_attach (GTK_GRID (self->grid),
widget,
@@ -638,6 +675,7 @@ add_event_to_grid (GcalWeekHeader *self,
cloned_widget_start_dt = g_date_time_add_days (week_start, i);
cloned_widget = gcal_event_widget_clone (GCAL_EVENT_WIDGET (widget));
setup_event_widget (self, cloned_widget);
gtk_grid_attach (GTK_GRID (self->grid),
cloned_widget,
@@ -1170,6 +1208,14 @@ gcal_week_header_class_init (GcalWeekHeaderClass *kclass)
ICAL_TIME_TYPE,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE));
signals[EVENT_ACTIVATED] = g_signal_new ("event-activated",
GCAL_TYPE_WEEK_HEADER,
G_SIGNAL_RUN_FIRST,
0, NULL, NULL, NULL,
G_TYPE_NONE,
1,
GCAL_TYPE_EVENT_WIDGET);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/week-header.ui");
gtk_widget_class_bind_template_child (widget_class, GcalWeekHeader, expand_button);
@@ -1304,7 +1350,7 @@ gcal_week_header_remove_event (GcalWeekHeader *self,
event = gcal_event_widget_get_event (child_widget);
if (g_strcmp0 (uuid, gcal_event_get_uid (event)) == 0)
gtk_widget_destroy (l->data);
destroy_event_widget (self, l->data);
}
/* Remove from the weekday's GList */
@@ -1336,6 +1382,35 @@ gcal_week_header_remove_event (GcalWeekHeader *self,
g_clear_pointer (&children, g_list_free);
}
GList*
gcal_week_header_get_children_by_uuid (GcalWeekHeader *self,
const gchar *uuid)
{
GList *children, *l, *result;
result = NULL;
children = gtk_container_get_children (GTK_CONTAINER (self->grid));
for (l = children; l != NULL; l = l->next)
{
GcalEventWidget *child_widget;
GcalEvent *event;
if (!GCAL_IS_EVENT_WIDGET (l->data))
continue;
child_widget = GCAL_EVENT_WIDGET (l->data);
event = gcal_event_widget_get_event (child_widget);
if (g_strcmp0 (uuid, gcal_event_get_uid (event)) == 0)
result = g_list_prepend (result, l->data);
}
g_list_free (children);
return result;
}
void
gcal_week_header_set_current_date (GcalWeekHeader *self,
icaltimetype *current_date)