[polari/wip/fmuellner/drop-target: 78/82] pasteManager: Handle file drops



commit 4e9177070031c7608517cd3281f4fc4c6986900f
Author: Florian Müllner <fmuellner gnome org>
Date:   Fri Feb 12 03:13:01 2016 +0100

    pasteManager: Handle file drops

 src/pasteManager.js |   60 ++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 50 insertions(+), 10 deletions(-)
---
diff --git a/src/pasteManager.js b/src/pasteManager.js
index b591524..15f6a5a 100644
--- a/src/pasteManager.js
+++ b/src/pasteManager.js
@@ -19,6 +19,16 @@ const DndTargetType = {
     IMAGE: 3,
 };
 
+function _getTargetForContentType(contentType) {
+    if (Gio.content_type_is_a(contentType, 'text/plain'))
+        return DndTargetType.TEXT;
+    else if (Gio.content_type_is_a(contentType, 'image/*'))
+        return DndTargetType.IMAGE;
+    else
+       return 0;
+}
+
+
 const PasteManager = new Lang.Class({
     Name: 'PasteManager',
 
@@ -35,9 +45,48 @@ const PasteManager = new Lang.Class({
             Utils.gpaste(content, title, callback);
         } else if (content instanceof GdkPixbuf.Pixbuf) {
             Utils.imgurPaste(content, title, callback);
+        } else if (content.query_info_async) {
+            this._pasteFile(content, title, callback);
         } else {
             throw new Error('Unhandled content type');
         }
+    },
+
+    _pasteFile: function(file, title, callback) {
+        file.query_info_async(Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+                              Gio.FileQueryInfoFlags.NONE,
+                              GLib.PRIORITY_DEFAULT, null,
+                              Lang.bind(this, this._onFileQueryFinish, title, callback));
+    },
+
+    _onFileQueryFinish: function(file, res, title, callback) {
+        let fileInfo = null;
+        try {
+            fileInfo = file.query_info_finish(res);
+        } catch(e) {
+            return;
+        }
+
+        let contentType = fileInfo.get_content_type();
+        let targetType = _getTargetForContentType(contentType);
+
+        if (targetType == DndTargetType.TEXT) {
+            file.load_contents_async(null, Lang.bind(this,
+                function(f, res) {
+                    let [, contents, ,] = f.load_contents_finish(res);
+                    Utils.gpaste(contents.toString(), title, callback);
+                }));
+        } else if (targetType == DndTargetType.IMAGE) {
+            file.read_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this,
+                function(f, res) {
+                    let stream = f.read_finish(res);
+                    GdkPixbuf.Pixbuf.new_from_stream_async(stream, null,
+                        Lang.bind(this, function(stream, res) {
+                            let pixbuf = GdkPixbuf.Pixbuf.new_from_stream_finish(res);
+                            Utils.imgurPaste(pixbuf, title, callback);
+                        }));
+                }));
+        }
     }
 });
 
@@ -153,15 +202,6 @@ const DropTargetIface = new Lang.Interface({
         }
     },
 
-    _getTargetForContentType: function(contentType) {
-        if (Gio.content_type_is_a(contentType, 'text/plain'))
-            return DndTargetType.TEXT;
-        else if (Gio.content_type_is_a(contentType, 'image/*'))
-            return DndTargetType.IMAGE;
-        else
-           return 0;
-    },
-
     _lookupFileInfo: function(file, callback) {
         file.query_info_async(Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
                               Gio.FileQueryInfoFlags.NONE,
@@ -177,7 +217,7 @@ const DropTargetIface = new Lang.Interface({
                 }
 
                 let contentType = fileInfo.get_content_type();
-                callback(this._getTargetForContentType(contentType));
+                callback(_getTargetForContentType(contentType));
             }))
     }
 });


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