diff options
author | Martin Wehner <martin.wehner@gmail.com> | 2006-07-11 00:57:47 +0000 |
---|---|---|
committer | Martin Wehner <mwehner@src.gnome.org> | 2006-07-11 00:57:47 +0000 |
commit | 293e7cd0ef01b01dcd93f3602c48407a923575c7 (patch) | |
tree | 296946cf40c624fd8dad60833321c4e193e948f2 /libnautilus-private/nautilus-icon-dnd.c | |
parent | e1f4d9dbfa583a8cae2e2f9a730586dc518c7edb (diff) | |
download | nautilus-293e7cd0ef01b01dcd93f3602c48407a923575c7.tar.gz |
Add functions nautilus_drag_can_accept_files and
2006-07-11 Martin Wehner <martin.wehner@gmail.com>
* libnautilus-private/nautilus-file-dnd.[ch]:
Add functions nautilus_drag_can_accept_files and
nautilus_drag_can_accept_info.
* libnautilus-private/nautilus-icon-dnd.c: (receive_dropped_url),
(receive_dropped_uri_list), (receive_dropped_text),
(drag_data_received_callback):
Accept the entire drag context as parameter and use
nautilus_icon_container_find_drop_target.
(nautilus_icon_container_find_drop_target):
(nautilus_icon_dnd_update_drop_target):
Use nautilus_drag_can_accept_info.
* libnautilus-private/nautilus-marshal.list:
Add new signature.
* libnautilus-private/nautilus-tree-view-drag-dest.c:
Add function get_drop_target_uri_at_pos and use it in the drop
handlers to determine the target uris for actions.
Rename get_drop_target to get_drop_target_uri_for path.
(nautilus_tree_view_drag_dest_class_init):
Adapt to new drag handler signatures.
(set_widget_highlight):
Fix DND highlighting of an empty tree view.
(drag_motion_callback):
Ignore drags on the header.
* libnautilus-private/nautilus-tree-view-drag-dest.[ch]:
* libnautilus-private/nautilus-icon-container.[ch]:
* src/file-manager/fm-icon-view.c:
* src/file-manager/fm-list-view.c:
Add a target/parent uri parameter to the drop handler functions.
* src/file-manager/fm-directory-view.[ch]:
Add handling for the additional target parameter to support
drops of URIs, URLs and text to subfolders.
Patch from Christian Neumair <chris@gnome-de.org>
Diffstat (limited to 'libnautilus-private/nautilus-icon-dnd.c')
-rw-r--r-- | libnautilus-private/nautilus-icon-dnd.c | 75 |
1 files changed, 53 insertions, 22 deletions
diff --git a/libnautilus-private/nautilus-icon-dnd.c b/libnautilus-private/nautilus-icon-dnd.c index 3cb4829d2..6771d1eca 100644 --- a/libnautilus-private/nautilus-icon-dnd.c +++ b/libnautilus-private/nautilus-icon-dnd.c @@ -84,6 +84,10 @@ static void dnd_highlight_queue_redraw (GtkWidget *widget); static GtkTargetList *drop_types_list = NULL; static GtkTargetList *drop_types_list_root = NULL; +static char * nautilus_icon_container_find_drop_target (NautilusIconContainer *container, + GdkDragContext *context, + int x, int y, gboolean *icon_hit); + static EelCanvasItem * create_selection_shadow (NautilusIconContainer *container, GList *list) @@ -618,44 +622,65 @@ receive_dropped_keyword (NautilusIconContainer *container, const char *keyword, /* handle dropped url */ static void -receive_dropped_url (NautilusIconContainer *container, const char *encoded_url, GdkDragAction action, int x, int y) +receive_dropped_url (NautilusIconContainer *container, const char *encoded_url, GdkDragContext *context, int x, int y) { + char *drop_target; + if (encoded_url == NULL) { return; } + drop_target = nautilus_icon_container_find_drop_target (container, context, x, y, NULL); + g_signal_emit_by_name (container, "handle_url", encoded_url, - action, + drop_target, + context->action, x, y); + + g_free (drop_target); } /* handle dropped uri list */ static void -receive_dropped_uri_list (NautilusIconContainer *container, const char *uri_list, GdkDragAction action, int x, int y) +receive_dropped_uri_list (NautilusIconContainer *container, const char *uri_list, GdkDragContext *context, int x, int y) { + char *drop_target; + if (uri_list == NULL) { return; } - + + drop_target = nautilus_icon_container_find_drop_target (container, context, x, y, NULL); + g_signal_emit_by_name (container, "handle_uri_list", uri_list, - action, + drop_target, + context->action, x, y); + + g_free (drop_target); } /* handle dropped text */ static void -receive_dropped_text (NautilusIconContainer *container, const char *text, GdkDragAction action, int x, int y) +receive_dropped_text (NautilusIconContainer *container, const char *text, GdkDragContext *context, int x, int y) { + char *drop_target; + if (text == NULL) { return; } + + drop_target = nautilus_icon_container_find_drop_target (container, context, x, y, NULL); g_signal_emit_by_name (container, "handle_text", text, - action, + drop_target, + context->action, x, y); + + g_free (drop_target); } static int @@ -939,8 +964,11 @@ nautilus_icon_container_find_drop_target (NautilusIconContainer *container, NautilusFile *file; char *icon_uri; - *icon_hit = FALSE; - if (container->details->dnd_info->drag_info.selection_list == NULL) { + if (icon_hit) { + *icon_hit = FALSE; + } + + if (!container->details->dnd_info->drag_info.got_drop_data_type) { return NULL; } @@ -959,8 +987,9 @@ nautilus_icon_container_find_drop_target (NautilusIconContainer *container, if (icon_uri != NULL) { file = nautilus_file_get (icon_uri); - if (!nautilus_drag_can_accept_items (file, - container->details->dnd_info->drag_info.selection_list)) { + if (!nautilus_drag_can_accept_info (file, + container->details->dnd_info->drag_info.data_type, + container->details->dnd_info->drag_info.selection_list)) { /* the item we dropped our selection on cannot accept the items, * do the same thing as if we just dropped the items on the canvas */ @@ -973,11 +1002,16 @@ nautilus_icon_container_find_drop_target (NautilusIconContainer *container, } if (drop_target_icon == NULL) { - *icon_hit = FALSE; + if (icon_hit) { + *icon_hit = FALSE; + } + return get_container_uri (container); } - *icon_hit = TRUE; + if (icon_hit) { + *icon_hit = TRUE; + } return nautilus_icon_container_get_icon_drop_target_uri (container, drop_target_icon); } @@ -1177,10 +1211,6 @@ nautilus_icon_dnd_update_drop_target (NautilusIconContainer *container, char *uri; g_assert (NAUTILUS_IS_ICON_CONTAINER (container)); - if ((container->details->dnd_info->drag_info.selection_list == NULL) - && (container->details->dnd_info->drag_info.data_type != NAUTILUS_ICON_DND_KEYWORD)) { - return; - } canvas_widget_to_world (EEL_CANVAS (container), x, y, &world_x, &world_y); @@ -1199,8 +1229,9 @@ nautilus_icon_dnd_update_drop_target (NautilusIconContainer *container, file = nautilus_file_get (uri); g_free (uri); - if (!nautilus_drag_can_accept_items (file, - container->details->dnd_info->drag_info.selection_list)) { + if (!nautilus_drag_can_accept_info (file, + container->details->dnd_info->drag_info.data_type, + container->details->dnd_info->drag_info.selection_list)) { icon = NULL; } @@ -1642,20 +1673,20 @@ drag_data_received_callback (GtkWidget *widget, case NAUTILUS_ICON_DND_URL: receive_dropped_url (NAUTILUS_ICON_CONTAINER (widget), - (char *) data->data, context->action, x, y); + (char *) data->data, context, x, y); success = TRUE; break; case NAUTILUS_ICON_DND_URI_LIST: receive_dropped_uri_list (NAUTILUS_ICON_CONTAINER (widget), - (char *) data->data, context->action, x, y); + (char *) data->data, context, x, y); success = TRUE; break; case NAUTILUS_ICON_DND_TEXT: tmp = gtk_selection_data_get_text (data); receive_dropped_text (NAUTILUS_ICON_CONTAINER (widget), - (char *) tmp, context->action, x, y); + (char *) tmp, context, x, y); success = TRUE; g_free (tmp); break; |