[nautilus/places-sidebar] Handle DnD file operations from the places sidebar
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/places-sidebar] Handle DnD file operations from the places sidebar
- Date: Wed, 5 Dec 2012 00:23:32 +0000 (UTC)
commit 92e21086f5b7430a331da9e9f85dba2145c95c9d
Author: Federico Mena Quintero <federico gnome org>
Date: Tue Dec 4 18:20:52 2012 -0600
Handle DnD file operations from the places sidebar
Signed-off-by: Federico Mena Quintero <federico gnome org>
src/nautilus-window.c | 77 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 72 insertions(+), 5 deletions(-)
---
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 994b4c4..ccdf85d 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -58,6 +58,7 @@
#ifdef HAVE_X11_XF86KEYSYM_H
#include <X11/XF86keysym.h>
#endif
+#include <libnautilus-private/nautilus-dnd.h>
#include <libnautilus-private/nautilus-file-utilities.h>
#include <libnautilus-private/nautilus-file-attributes.h>
#include <libnautilus-private/nautilus-file-operations.h>
@@ -608,16 +609,75 @@ places_sidebar_empty_trash_requested_cb (GtkPlacesSidebar *sidebar,
/* Callback used when the places sidebar needs us to present an error message */
static void
-places_sidebar_show_error_message (GtkPlacesSidebar *sidebar,
- const char *primary,
- const char *secondary,
- gpointer user_data)
+places_sidebar_show_error_message_cb (GtkPlacesSidebar *sidebar,
+ const char *primary,
+ const char *secondary,
+ gpointer user_data)
{
NautilusWindow *window = NAUTILUS_WINDOW (user_data);
eel_show_error_dialog (primary, secondary, GTK_WINDOW (window));
}
+static GList *
+build_selection_list_from_uri_list (GList *uri_list)
+{
+ GList *result;
+ GList *l;
+
+ result = NULL;
+ for (l = uri_list; l; l = l->next) {
+ const char *uri = l->data;
+ NautilusDragSelectionItem *item;
+
+ item = nautilus_drag_selection_item_new ();
+ item->uri = g_strdup (uri);
+ item->got_icon_position = FALSE;
+ result = g_list_prepend (result, item);
+ }
+
+ return g_list_reverse (result);
+}
+
+/* Callback used when the places sidebar needs to know the drag action to suggest */
+static void
+places_sidebar_drag_action_requested_cb (GtkPlacesSidebar *sidebar,
+ GdkDragContext *context,
+ const char *uri,
+ GList *uri_list,
+ int *action,
+ gpointer user_data)
+{
+ GList *items;
+
+ items = build_selection_list_from_uri_list (uri_list);
+
+ nautilus_drag_default_drop_action_for_icons (context, uri, items, action);
+
+ nautilus_drag_destroy_selection_list (items);
+}
+
+/* Callback used when the places sidebar needs us to pop up a menu with possible drag actions */
+static GdkDragAction
+places_sidebar_drag_action_ask_cb (GtkPlacesSidebar *sidebar,
+ GdkDragAction actions,
+ gpointer user_data)
+{
+ return nautilus_drag_drop_action_ask (GTK_WIDGET (sidebar), actions);
+}
+
+/* Callback used when the places sidebar has URIs dropped into it. We do a normal file operation for them. */
+static void
+places_sidebar_drag_perform_drop_cb (GtkPlacesSidebar *sidebar,
+ GList *uris,
+ const char *drop_uri,
+ GdkDragAction action,
+ gpointer user_data)
+{
+ nautilus_file_operations_copy_move (uris, NULL, drop_uri, action, GTK_WIDGET (sidebar), NULL, NULL);
+
+}
+
/* Callback for our own loading_uri signal. We update the sidebar's path. */
static void
window_loading_uri_cb (NautilusWindow *window,
@@ -667,6 +727,7 @@ nautilus_window_set_up_sidebar (NautilusWindow *window)
gtk_places_sidebar_set_multiple_tabs_supported (GTK_PLACES_SIDEBAR (window->details->places_sidebar), TRUE);
gtk_places_sidebar_set_multiple_windows_supported (GTK_PLACES_SIDEBAR (window->details->places_sidebar), TRUE);
gtk_places_sidebar_set_show_properties (GTK_PLACES_SIDEBAR (window->details->places_sidebar), TRUE);
+ gtk_places_sidebar_set_accept_uri_drops (GTK_PLACES_SIDEBAR (window->details->places_sidebar), TRUE);
gtk_places_sidebar_set_show_trash (GTK_PLACES_SIDEBAR (window->details->places_sidebar), TRUE);
g_signal_connect_object (nautilus_trash_monitor_get (), "trash_state_changed",
@@ -679,7 +740,13 @@ nautilus_window_set_up_sidebar (NautilusWindow *window)
g_signal_connect (window->details->places_sidebar, "empty-trash-requested",
G_CALLBACK (places_sidebar_empty_trash_requested_cb), window);
g_signal_connect (window->details->places_sidebar, "show-error-message",
- G_CALLBACK (places_sidebar_show_error_message), window);
+ G_CALLBACK (places_sidebar_show_error_message_cb), window);
+ g_signal_connect (window->details->places_sidebar, "drag-action-requested",
+ G_CALLBACK (places_sidebar_drag_action_requested_cb), window);
+ g_signal_connect (window->details->places_sidebar, "drag-action-ask",
+ G_CALLBACK (places_sidebar_drag_action_ask_cb), window);
+ g_signal_connect (window->details->places_sidebar, "drag-perform-drop",
+ G_CALLBACK (places_sidebar_drag_perform_drop_cb), window);
g_signal_connect (window, "loading-uri",
G_CALLBACK (window_loading_uri_cb), window);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]