From 220d7c88bd31aac48d5200e0770c8da0feea13e5 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sat, 21 May 2016 17:32:53 -0300 Subject: [PATCH] month-view: save the event when dragged and dropped This magical commit finally implements the Drag n' Drop feature for Month view by changing the start and end dates of the events according to the cell where the user drops the event. --- src/gcal-month-view.c | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/gcal-month-view.c b/src/gcal-month-view.c index 75786856..49cffbda 100644 --- a/src/gcal-month-view.c +++ b/src/gcal-month-view.c @@ -847,6 +847,74 @@ gcal_month_view_drag_motion (GtkWidget *widget, return priv->dnd_cell != -1; } +static gboolean +gcal_month_view_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time) +{ + GcalMonthViewPrivate *priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (widget)); + GtkWidget *event_widget; + GDateTime *start_dt, *end_dt; + GcalEvent *event; + gint cell, diff; + + cell = get_dnd_cell (widget, x, y); + event_widget = gtk_drag_get_source_widget (context); + event = gcal_event_widget_get_event (GCAL_EVENT_WIDGET (event_widget)); + + /* Move the event's date */ + start_dt = gcal_event_get_date_start (event); + end_dt = gcal_event_get_date_end (event); + + diff = cell - g_date_time_get_day_of_month (start_dt) + 1; + + if (diff != 0) + { + GDateTime *new_start = g_date_time_add_days (start_dt, diff); + + gcal_event_set_date_start (event, new_start); + + /* The event may have a NULL end date, so we have to check it here */ + if (end_dt) + { + GDateTime *new_end = g_date_time_add_days (end_dt, diff); + + gcal_event_set_date_end (event, new_end); + g_clear_pointer (&new_end, g_date_time_unref); + } + + gcal_manager_update_event (priv->manager, event); + + g_clear_pointer (&new_start, g_date_time_unref); + } + + /* Cancel the DnD */ + priv->dnd_cell = -1; + gtk_drag_unhighlight (widget); + + gtk_drag_finish (context, TRUE, FALSE, time); + + gtk_widget_queue_draw (widget); + + return TRUE; +} + +static void +gcal_month_view_drag_leave (GtkWidget *widget, + GdkDragContext *context, + guint time) +{ + GcalMonthViewPrivate *priv = gcal_month_view_get_instance_private (GCAL_MONTH_VIEW (widget)); + + /* Cancel the drag */ + priv->dnd_cell = -1; + gtk_drag_unhighlight (widget); + + gtk_widget_queue_draw (widget); +} + static void add_new_event_button_cb (GtkWidget *button, gpointer user_data) @@ -892,6 +960,8 @@ gcal_month_view_class_init (GcalMonthViewClass *klass) widget_class->direction_changed = gcal_month_view_direction_changed; widget_class->key_press_event = gcal_month_view_key_press; widget_class->drag_motion = gcal_month_view_drag_motion; + widget_class->drag_drop = gcal_month_view_drag_drop; + widget_class->drag_leave = gcal_month_view_drag_leave; subscriber_view_class = GCAL_SUBSCRIBER_VIEW_CLASS (klass); subscriber_view_class->get_child_cell = gcal_month_view_get_child_cell;