[evolution] Use an appropriate icon when dragging attachments.



commit df33c633ee19e9420f7d8f660cac71d71bea90c3
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Jun 22 14:29:28 2010 -0400

    Use an appropriate icon when dragging attachments.

 widgets/misc/e-attachment-button.c |   44 +++++++++++++++++++++++++++++++++-
 widgets/misc/e-attachment-view.c   |   45 ++++++++++++++++++++++++++++++++++-
 widgets/misc/e-attachment.c        |   37 ++++++++++++++++++++++++++++-
 widgets/misc/e-attachment.h        |    1 +
 4 files changed, 122 insertions(+), 5 deletions(-)
---
diff --git a/widgets/misc/e-attachment-button.c b/widgets/misc/e-attachment-button.c
index d1b02c0..a248cf6 100644
--- a/widgets/misc/e-attachment-button.c
+++ b/widgets/misc/e-attachment-button.c
@@ -247,6 +247,18 @@ attachment_button_expand_clicked_cb (EAttachmentButton *button)
 }
 
 static void
+attachment_button_expand_drag_begin_cb (EAttachmentButton *button,
+                                        GdkDragContext *context)
+{
+	EAttachmentView *view;
+
+	view = e_attachment_button_get_view (button);
+
+	attachment_button_select_path (button);
+	e_attachment_view_drag_begin (view, context);
+}
+
+static void
 attachment_button_expand_drag_data_get_cb (EAttachmentButton *button,
                                            GdkDragContext *context,
                                            GtkSelectionData *selection,
@@ -255,14 +267,23 @@ attachment_button_expand_drag_data_get_cb (EAttachmentButton *button,
 {
 	EAttachmentView *view;
 
-	attachment_button_select_path (button);
-
 	view = e_attachment_button_get_view (button);
 
 	e_attachment_view_drag_data_get (
 		view, context, selection, info, time);
 }
 
+static void
+attachment_button_expand_drag_end_cb (EAttachmentButton *button,
+                                      GdkDragContext *context)
+{
+	EAttachmentView *view;
+
+	view = e_attachment_button_get_view (button);
+
+	e_attachment_view_drag_end (view, context);
+}
+
 static gboolean
 attachment_button_toggle_button_press_event_cb (EAttachmentButton *button,
                                                 GdkEventButton *event)
@@ -579,20 +600,39 @@ attachment_button_init (EAttachmentButton *button)
 		G_CALLBACK (attachment_button_expand_clicked_cb), button);
 
 	g_signal_connect_swapped (
+		button->priv->expand_button, "drag-begin",
+		G_CALLBACK (attachment_button_expand_drag_begin_cb),
+		button);
+
+	g_signal_connect_swapped (
 		button->priv->expand_button, "drag-data-get",
 		G_CALLBACK (attachment_button_expand_drag_data_get_cb),
 		button);
 
 	g_signal_connect_swapped (
+		button->priv->expand_button, "drag-end",
+		G_CALLBACK (attachment_button_expand_drag_end_cb),
+		button);
+
+	g_signal_connect_swapped (
 		button->priv->toggle_button, "button-press-event",
 		G_CALLBACK (attachment_button_toggle_button_press_event_cb),
 		button);
 
 	g_signal_connect_swapped (
+		button->priv->toggle_button, "drag-begin",
+		G_CALLBACK (attachment_button_expand_drag_begin_cb),
+		button);
+
+	g_signal_connect_swapped (
 		button->priv->toggle_button, "drag-data-get",
 		G_CALLBACK (attachment_button_expand_drag_data_get_cb),
 		button);
 
+	g_signal_connect_swapped (
+		button->priv->toggle_button, "drag-end",
+		G_CALLBACK (attachment_button_expand_drag_end_cb),
+		button);
 }
 
 GType
diff --git a/widgets/misc/e-attachment-view.c b/widgets/misc/e-attachment-view.c
index b810e40..36356e8 100644
--- a/widgets/misc/e-attachment-view.c
+++ b/widgets/misc/e-attachment-view.c
@@ -1218,8 +1218,6 @@ e_attachment_view_motion_notify_event (EAttachmentView *view,
 	context = gtk_drag_begin (
 		widget, targets, GDK_ACTION_COPY, 1, (GdkEvent *) event);
 
-	gtk_drag_set_icon_default (context);
-
 	return TRUE;
 }
 
@@ -1408,6 +1406,7 @@ e_attachment_view_drag_begin (EAttachmentView *view,
                               GdkDragContext *context)
 {
 	EAttachmentViewPrivate *priv;
+	guint n_selected;
 
 	g_return_if_fail (E_IS_ATTACHMENT_VIEW (view));
 	g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
@@ -1421,6 +1420,48 @@ e_attachment_view_drag_begin (EAttachmentView *view,
 
 	g_warn_if_fail (priv->selected == NULL);
 	priv->selected = e_attachment_view_get_selected_attachments (view);
+	n_selected = g_list_length (priv->selected);
+
+	if (n_selected > 1)
+		gtk_drag_set_icon_stock (
+			context, GTK_STOCK_DND_MULTIPLE, 0, 0);
+
+	else if (n_selected == 1) {
+		EAttachment *attachment;
+		GtkIconTheme *icon_theme;
+		GtkIconInfo *icon_info;
+		GIcon *icon;
+		gint width, height;
+
+		attachment = E_ATTACHMENT (priv->selected->data);
+		icon = e_attachment_get_icon (attachment);
+		g_return_if_fail (icon != NULL);
+
+		icon_theme = gtk_icon_theme_get_default ();
+		gtk_icon_size_lookup (GTK_ICON_SIZE_DND, &width, &height);
+
+		icon_info = gtk_icon_theme_lookup_by_gicon (
+			icon_theme, icon, MIN (width, height),
+			GTK_ICON_LOOKUP_USE_BUILTIN);
+
+		if (icon_info != NULL) {
+			GdkPixbuf *pixbuf;
+			GError *error = NULL;
+
+			pixbuf = gtk_icon_info_load_icon (icon_info, &error);
+
+			if (pixbuf != NULL) {
+				gtk_drag_set_icon_pixbuf (
+					context, pixbuf, 0, 0);
+				g_object_unref (pixbuf);
+			} else if (error != NULL) {
+				g_warning ("%s", error->message);
+				g_error_free (error);
+			}
+
+			gtk_icon_info_free (icon_info);
+		}
+	}
 }
 
 void
diff --git a/widgets/misc/e-attachment.c b/widgets/misc/e-attachment.c
index ba4e400..1872de6 100644
--- a/widgets/misc/e-attachment.c
+++ b/widgets/misc/e-attachment.c
@@ -56,6 +56,7 @@
 
 struct _EAttachmentPrivate {
 	GFile *file;
+	GIcon *icon;
 	GFileInfo *file_info;
 	GCancellable *cancellable;
 	CamelMimePart *mime_part;
@@ -85,6 +86,7 @@ enum {
 	PROP_ENCRYPTED,
 	PROP_FILE,
 	PROP_FILE_INFO,
+	PROP_ICON,
 	PROP_LOADING,
 	PROP_MIME_PART,
 	PROP_PERCENT,
@@ -357,7 +359,11 @@ attachment_update_icon_column (EAttachment *attachment)
 		E_ATTACHMENT_STORE_COLUMN_ICON, icon,
 		-1);
 
-	g_object_unref (icon);
+	/* Cache the icon to reuse for things like drag-n-drop. */
+	if (attachment->priv->icon != NULL)
+		g_object_unref (attachment->priv->icon);
+	attachment->priv->icon = icon;
+	g_object_notify (G_OBJECT (attachment), "icon");
 }
 
 static void
@@ -601,6 +607,12 @@ attachment_get_property (GObject *object,
 				E_ATTACHMENT (object)));
 			return;
 
+		case PROP_ICON:
+			g_value_set_object (
+				value, e_attachment_get_icon (
+				E_ATTACHMENT (object)));
+			return;
+
 		case PROP_SHOWN:
 			g_value_set_boolean (
 				value, e_attachment_get_shown (
@@ -659,6 +671,11 @@ attachment_dispose (GObject *object)
 		priv->file = NULL;
 	}
 
+	if (priv->icon != NULL) {
+		g_object_unref (priv->icon);
+		priv->icon = NULL;
+	}
+
 	if (priv->file_info != NULL) {
 		g_object_unref (priv->file_info);
 		priv->file_info = NULL;
@@ -773,6 +790,16 @@ attachment_class_init (EAttachmentClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_ICON,
+		g_param_spec_object (
+			"icon",
+			"Icon",
+			NULL,
+			G_TYPE_ICON,
+			G_PARAM_READABLE));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_LOADING,
 		g_param_spec_boolean (
 			"loading",
@@ -1178,6 +1205,14 @@ e_attachment_get_file_info (EAttachment *attachment)
 	return attachment->priv->file_info;
 }
 
+GIcon *
+e_attachment_get_icon (EAttachment *attachment)
+{
+	g_return_val_if_fail (E_IS_ATTACHMENT (attachment), NULL);
+
+	return attachment->priv->icon;
+}
+
 gboolean
 e_attachment_get_loading (EAttachment *attachment)
 {
diff --git a/widgets/misc/e-attachment.h b/widgets/misc/e-attachment.h
index 7cd655c..8b9edc9 100644
--- a/widgets/misc/e-attachment.h
+++ b/widgets/misc/e-attachment.h
@@ -80,6 +80,7 @@ void		e_attachment_set_file		(EAttachment *attachment,
 GFileInfo *	e_attachment_get_file_info	(EAttachment *attachment);
 void		e_attachment_set_file_info	(EAttachment *attachment,
 						 GFileInfo *file_info);
+GIcon *		e_attachment_get_icon		(EAttachment *attachment);
 gboolean	e_attachment_get_loading	(EAttachment *attachment);
 CamelMimePart *	e_attachment_get_mime_part	(EAttachment *attachment);
 void		e_attachment_set_mime_part	(EAttachment *attachment,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]