summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2016-03-30 15:39:13 +0200
committerCarlos Soriano <csoriano@gnome.org>2016-04-06 10:55:12 +0200
commit3e76538e5433da64830e72ce1320184ca080f527 (patch)
tree40fcef392e50eb5c1b19279c17a92415f05ac233
parent40e6775fdcf1130157df651d00d95c607e6994fe (diff)
downloadnautilus-3e76538e5433da64830e72ce1320184ca080f527.tar.gz
file-dnd: move dnd handling to file
We are requiring file handling like special casing subclasses in the dnd handling. We are currently doing it outside of nautilus class... which makes overriding on subclasses impossible. This design goes against inheritance design, so there is no point on making it that way if it defeats this purpose. So merge the handling of file dnd inside the file class itself, and in upcoming patches we will override that handling in order to use inheritance instead of special casing in the parent.
-rw-r--r--libnautilus-private/Makefile.am2
-rw-r--r--libnautilus-private/nautilus-canvas-dnd.c1
-rw-r--r--libnautilus-private/nautilus-dnd.h20
-rw-r--r--libnautilus-private/nautilus-file.c100
-rw-r--r--libnautilus-private/nautilus-file.h32
-rw-r--r--libnautilus-private/nautilus-tree-view-drag-dest.c2
-rw-r--r--src/nautilus-canvas-view.c1
-rw-r--r--src/nautilus-files-view.c1
-rw-r--r--src/nautilus-list-view.c1
9 files changed, 131 insertions, 29 deletions
diff --git a/libnautilus-private/Makefile.am b/libnautilus-private/Makefile.am
index ea7315bd6..8c37d4db7 100644
--- a/libnautilus-private/Makefile.am
+++ b/libnautilus-private/Makefile.am
@@ -106,8 +106,6 @@ libnautilus_private_la_SOURCES = \
nautilus-file-changes-queue.h \
nautilus-file-conflict-dialog.c \
nautilus-file-conflict-dialog.h \
- nautilus-file-dnd.c \
- nautilus-file-dnd.h \
nautilus-file-operations.c \
nautilus-file-operations.h \
nautilus-file-private.h \
diff --git a/libnautilus-private/nautilus-canvas-dnd.c b/libnautilus-private/nautilus-canvas-dnd.c
index 60ed964a2..c485c9ab2 100644
--- a/libnautilus-private/nautilus-canvas-dnd.c
+++ b/libnautilus-private/nautilus-canvas-dnd.c
@@ -35,7 +35,6 @@
#include "nautilus-canvas-dnd.h"
-#include "nautilus-file-dnd.h"
#include "nautilus-canvas-private.h"
#include "nautilus-global-preferences.h"
#include "nautilus-link.h"
diff --git a/libnautilus-private/nautilus-dnd.h b/libnautilus-private/nautilus-dnd.h
index b73d02e01..35872ae9b 100644
--- a/libnautilus-private/nautilus-dnd.h
+++ b/libnautilus-private/nautilus-dnd.h
@@ -37,26 +37,6 @@
#define NAUTILUS_ICON_DND_XDNDDIRECTSAVE_TYPE "XdndDirectSave0" /* XDS Protocol Type */
#define NAUTILUS_ICON_DND_RAW_TYPE "application/octet-stream"
-/* Item of the drag selection list */
-typedef struct {
- NautilusFile *file;
- char *uri;
- gboolean got_icon_position;
- int icon_x, icon_y;
- int icon_width, icon_height;
-} NautilusDragSelectionItem;
-
-/* Standard Drag & Drop types. */
-typedef enum {
- NAUTILUS_ICON_DND_GNOME_ICON_LIST,
- NAUTILUS_ICON_DND_URI_LIST,
- NAUTILUS_ICON_DND_NETSCAPE_URL,
- NAUTILUS_ICON_DND_TEXT,
- NAUTILUS_ICON_DND_XDNDDIRECTSAVE,
- NAUTILUS_ICON_DND_RAW,
- NAUTILUS_ICON_DND_ROOTWINDOW_DROP
-} NautilusIconDndTargetType;
-
/* drag&drop-related information. */
typedef struct {
GtkTargetList *target_list;
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index cad5142ef..806679988 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -8122,7 +8122,105 @@ nautilus_file_info_providers_done (NautilusFile *file)
nautilus_file_changed (file);
}
-static void
+/* DND */
+
+static gboolean
+nautilus_drag_can_accept_files (NautilusFile *drop_target_item)
+{
+ if (nautilus_file_is_directory (drop_target_item)) {
+ NautilusDirectory *directory;
+ gboolean res;
+
+ /* target is a directory, accept if editable */
+ directory = nautilus_directory_get_for_file (drop_target_item);
+ res = nautilus_directory_is_editable (directory) &&
+ nautilus_file_can_write (drop_target_item);
+ nautilus_directory_unref (directory);
+ return res;
+ }
+
+ if (NAUTILUS_IS_DESKTOP_ICON_FILE (drop_target_item)) {
+ return TRUE;
+ }
+
+ /* Launchers are an acceptable drop target */
+ if (nautilus_file_is_launcher (drop_target_item)) {
+ return TRUE;
+ }
+
+ if (nautilus_is_file_roller_installed () &&
+ nautilus_file_is_archive (drop_target_item)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+gboolean
+nautilus_drag_can_accept_item (NautilusFile *drop_target_item,
+ const char *item_uri)
+{
+ if (nautilus_file_matches_uri (drop_target_item, item_uri)) {
+ /* can't accept itself */
+ return FALSE;
+ }
+
+ return nautilus_drag_can_accept_files (drop_target_item);
+}
+
+gboolean
+nautilus_drag_can_accept_items (NautilusFile *drop_target_item,
+ const GList *items)
+{
+ int max;
+
+ if (drop_target_item == NULL)
+ return FALSE;
+
+ g_assert (NAUTILUS_IS_FILE (drop_target_item));
+
+ /* Iterate through selection checking if item will get accepted by the
+ * drop target. If more than 100 items selected, return an over-optimisic
+ * result
+ */
+ for (max = 100; items != NULL && max >= 0; items = items->next, max--) {
+ if (!nautilus_drag_can_accept_item (drop_target_item,
+ ((NautilusDragSelectionItem *)items->data)->uri)) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+gboolean
+nautilus_drag_can_accept_info (NautilusFile *drop_target_item,
+ NautilusIconDndTargetType drag_type,
+ const GList *items)
+{
+ switch (drag_type) {
+ case NAUTILUS_ICON_DND_GNOME_ICON_LIST:
+ return nautilus_drag_can_accept_items (drop_target_item, items);
+
+ case NAUTILUS_ICON_DND_URI_LIST:
+ case NAUTILUS_ICON_DND_NETSCAPE_URL:
+ case NAUTILUS_ICON_DND_TEXT:
+ return nautilus_drag_can_accept_files (drop_target_item);
+
+ case NAUTILUS_ICON_DND_XDNDDIRECTSAVE:
+ case NAUTILUS_ICON_DND_RAW:
+ return nautilus_drag_can_accept_files (drop_target_item); /* Check if we can accept files at this location */
+
+ case NAUTILUS_ICON_DND_ROOTWINDOW_DROP:
+ return FALSE;
+
+ default:
+ g_assert_not_reached ();
+ return FALSE;
+ }
+}
+
+static void
nautilus_file_info_iface_init (NautilusFileInfoIface *iface)
{
iface->is_gone = nautilus_file_is_gone;
diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h
index 40d060baa..447eb727b 100644
--- a/libnautilus-private/nautilus-file.h
+++ b/libnautilus-private/nautilus-file.h
@@ -82,7 +82,27 @@ typedef enum {
NAUTILUS_FILE_ICON_FLAGS_USE_ONE_EMBLEM = (1<<7)
} NautilusFileIconFlags;
-/* Emblems sometimes displayed for NautilusFiles. Do not localize. */
+/* Standard Drag & Drop types. */
+typedef enum {
+ NAUTILUS_ICON_DND_GNOME_ICON_LIST,
+ NAUTILUS_ICON_DND_URI_LIST,
+ NAUTILUS_ICON_DND_NETSCAPE_URL,
+ NAUTILUS_ICON_DND_TEXT,
+ NAUTILUS_ICON_DND_XDNDDIRECTSAVE,
+ NAUTILUS_ICON_DND_RAW,
+ NAUTILUS_ICON_DND_ROOTWINDOW_DROP
+} NautilusIconDndTargetType;
+
+/* Item of the drag selection list */
+typedef struct {
+ NautilusFile *file;
+ char *uri;
+ gboolean got_icon_position;
+ int icon_x, icon_y;
+ int icon_width, icon_height;
+} NautilusDragSelectionItem;
+
+/* Emblems sometimes displayed for NautilusFiles. Do not localize. */
#define NAUTILUS_FILE_EMBLEM_NAME_SYMBOLIC_LINK "symbolic-link"
#define NAUTILUS_FILE_EMBLEM_NAME_CANT_READ "unreadable"
#define NAUTILUS_FILE_EMBLEM_NAME_CANT_WRITE "readonly"
@@ -458,6 +478,16 @@ GList * nautilus_file_list_filter (GList
GList **failed,
NautilusFileFilterFunc filter_function,
gpointer user_data);
+/* DND */
+gboolean nautilus_drag_can_accept_item (NautilusFile *drop_target_item,
+ const char *item_uri);
+
+gboolean nautilus_drag_can_accept_items (NautilusFile *drop_target_item,
+ const GList *items);
+
+gboolean nautilus_drag_can_accept_info (NautilusFile *drop_target_item,
+ NautilusIconDndTargetType drag_type,
+ const GList *items);
/* Debugging */
void nautilus_file_dump (NautilusFile *file);
diff --git a/libnautilus-private/nautilus-tree-view-drag-dest.c b/libnautilus-private/nautilus-tree-view-drag-dest.c
index 41d1666de..5cadc3217 100644
--- a/libnautilus-private/nautilus-tree-view-drag-dest.c
+++ b/libnautilus-private/nautilus-tree-view-drag-dest.c
@@ -29,7 +29,7 @@
#include "nautilus-tree-view-drag-dest.h"
-#include "nautilus-file-dnd.h"
+#include "nautilus-dnd.h"
#include "nautilus-file-changes-queue.h"
#include "nautilus-global-preferences.h"
#include "nautilus-link.h"
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index 1380d5ea3..db028c6af 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -39,7 +39,6 @@
#include <libnautilus-private/nautilus-clipboard-monitor.h>
#include <libnautilus-private/nautilus-directory.h>
#include <libnautilus-private/nautilus-dnd.h>
-#include <libnautilus-private/nautilus-file-dnd.h>
#include <libnautilus-private/nautilus-file-utilities.h>
#include <libnautilus-private/nautilus-ui-utilities.h>
#include <libnautilus-private/nautilus-global-preferences.h>
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 9f186b9d7..4eb136e14 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -73,7 +73,6 @@
#include <libnautilus-private/nautilus-dnd.h>
#include <libnautilus-private/nautilus-file-attributes.h>
#include <libnautilus-private/nautilus-file-changes-queue.h>
-#include <libnautilus-private/nautilus-file-dnd.h>
#include <libnautilus-private/nautilus-file-operations.h>
#include <libnautilus-private/nautilus-file-utilities.h>
#include <libnautilus-private/nautilus-file-private.h>
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 6f896527c..21b3ef2b7 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -48,7 +48,6 @@
#include <libnautilus-private/nautilus-column-chooser.h>
#include <libnautilus-private/nautilus-column-utilities.h>
#include <libnautilus-private/nautilus-dnd.h>
-#include <libnautilus-private/nautilus-file-dnd.h>
#include <libnautilus-private/nautilus-file-utilities.h>
#include <libnautilus-private/nautilus-ui-utilities.h>
#include <libnautilus-private/nautilus-global-preferences.h>