From 72fff3213ae1221b3c13841cb43df39f963efb1f Mon Sep 17 00:00:00 2001 From: Ettore Perazzoli Date: Mon, 25 Sep 2000 19:09:13 +0000 Subject: Make the shortcut bar not alter the model by itself on a drag and drop operation; instead, just emit some newly created dnd signals. The code using the library will then dispatch this to the appropriate data structures. Also, disconnect the model signals on ::destroy. svn path=/trunk/; revision=5574 --- widgets/shortcut-bar/e-shortcut-bar.c | 51 +++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 5 deletions(-) (limited to 'widgets/shortcut-bar/e-shortcut-bar.c') diff --git a/widgets/shortcut-bar/e-shortcut-bar.c b/widgets/shortcut-bar/e-shortcut-bar.c index 2826f612d5..0a29ef3729 100644 --- a/widgets/shortcut-bar/e-shortcut-bar.c +++ b/widgets/shortcut-bar/e-shortcut-bar.c @@ -134,6 +134,8 @@ static GdkPixbuf* e_shortcut_bar_load_image (const gchar *filename); enum { ITEM_SELECTED, + SHORTCUT_DROPPED, + SHORTCUT_DRAGGED, LAST_SIGNAL }; @@ -141,6 +143,21 @@ static guint e_shortcut_bar_signals[LAST_SIGNAL] = {0}; static EGroupBarClass *parent_class; +static void +e_shortcut_bar_marshal_NONE__INT_INT_STRING_STRING (GtkObject *object, + GtkSignalFunc func, + gpointer func_data, + GtkArg *args) +{ + void (*rfunc) (GtkObject *, gint, gint, gchar *, gchar *, gpointer) = func; + + (*rfunc) (object, + GTK_VALUE_INT (args[0]), + GTK_VALUE_INT (args[1]), + GTK_VALUE_STRING (args[2]), + GTK_VALUE_STRING (args[3]), + func_data); +} E_MAKE_TYPE(e_shortcut_bar, "EShortcutBar", EShortcutBar, e_shortcut_bar_class_init, e_shortcut_bar_init, @@ -163,11 +180,33 @@ e_shortcut_bar_class_init (EShortcutBarClass *class) GTK_RUN_LAST | GTK_RUN_ACTION, object_class->type, GTK_SIGNAL_OFFSET (EShortcutBarClass, - selected_item), + item_selected), gtk_marshal_NONE__POINTER_INT_INT, GTK_TYPE_NONE, 3, GTK_TYPE_GDK_EVENT, GTK_TYPE_INT, GTK_TYPE_INT); + e_shortcut_bar_signals[SHORTCUT_DROPPED] = + gtk_signal_new ("shortcut_dropped", + GTK_RUN_LAST | GTK_RUN_ACTION, + object_class->type, + GTK_SIGNAL_OFFSET (EShortcutBarClass, shortcut_dropped), + e_shortcut_bar_marshal_NONE__INT_INT_STRING_STRING, + GTK_TYPE_NONE, 4, + GTK_TYPE_INT, + GTK_TYPE_INT, + GTK_TYPE_STRING, + GTK_TYPE_STRING); + + e_shortcut_bar_signals[SHORTCUT_DRAGGED] = + gtk_signal_new ("shortcut_dragged", + GTK_RUN_LAST | GTK_RUN_ACTION, + object_class->type, + GTK_SIGNAL_OFFSET (EShortcutBarClass, shortcut_dragged), + gtk_marshal_NONE__INT_INT, + GTK_TYPE_NONE, 2, + GTK_TYPE_INT, + GTK_TYPE_INT); + gtk_object_class_add_signals (object_class, e_shortcut_bar_signals, LAST_SIGNAL); @@ -207,6 +246,8 @@ e_shortcut_bar_destroy (GtkObject *object) g_array_free (shortcut_bar->groups, TRUE); + e_shortcut_bar_disconnect_model (shortcut_bar); + g_free (shortcut_bar->dragged_url); g_free (shortcut_bar->dragged_name); @@ -623,8 +664,9 @@ e_shortcut_bar_on_drag_data_received (GtkWidget *widget, group_num = e_group_bar_get_group_num (E_GROUP_BAR (shortcut_bar), GTK_WIDGET (icon_bar)->parent); - e_shortcut_model_add_item (shortcut_bar->model, group_num, - position, item_url, item_name); + gtk_signal_emit (GTK_OBJECT (shortcut_bar), + e_shortcut_bar_signals[SHORTCUT_DROPPED], + group_num, position, item_url, item_name); gtk_drag_finish (context, TRUE, TRUE, time); return; @@ -647,8 +689,7 @@ e_shortcut_bar_on_drag_data_delete (GtkWidget *widget, group_num = e_group_bar_get_group_num (E_GROUP_BAR (shortcut_bar), widget->parent); - e_shortcut_model_remove_item (shortcut_bar->model, group_num, - icon_bar->dragged_item_num); + gtk_signal_emit (GTK_OBJECT (shortcut_bar), group_num, icon_bar->dragged_item_num); } -- cgit v1.2.3