[gnome-shell/gbsneto/icon-grid-dnd: 40/47] allView: Remove icon from folder when dropping outside



commit e505c7a31db1e38672768a96f67ae45925ce1005
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Jun 29 01:26:08 2019 -0300

    allView: Remove icon from folder when dropping outside
    
    When dropping an app icon to outside the folder, remove the
    app from that folder. GNOME Shell is already smart enough
    to figure out the setting changes and update the icons.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/603

 js/ui/appDisplay.js | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index b6bc5d3d2..2f04ceefb 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -690,6 +690,35 @@ var AllView = class AllView extends BaseAppView {
         }
     }
 
+    _canDropAt(source) {
+        if (!(source instanceof AppIcon))
+            return false;
+
+        if (!global.settings.is_writable('favorite-apps'))
+            return false;
+
+        if (!(source.parentView instanceof FolderView))
+            return false;
+
+        return true;
+    }
+
+    handleDragOver(source, actor, x, y, time) {
+        if (!this._canDropAt(source))
+            return DND.DragMotionResult.NO_DROP;
+
+        return DND.DragMotionResult.MOVE_DROP;
+    }
+
+    acceptDrop(source, actor, x, y, time) {
+        if (!this._canDropAt(source))
+            return false;
+
+        source.parentView.folderIcon.removeApp(source.app);
+
+        return true;
+    }
+
     inhibitEventBlocker() {
         this._nEventBlockerInhibits++;
         this._eventBlocker.visible = this._nEventBlockerInhibits == 0;
@@ -1380,6 +1409,22 @@ var FolderIcon = class FolderIcon {
             this.view.adaptToSize(width, height);
         this._popupInvalidated = true;
     }
+
+    removeApp(app) {
+        let folderApps = this._folder.get_strv('apps');
+        let index = folderApps.indexOf(app.id);
+        if (index < 0)
+            return false;
+
+        folderApps.splice(index, 1);
+
+        this._folder.set_strv('apps', folderApps);
+
+        if (this._popup)
+            this._popup.popdown();
+
+        return true;
+    }
 };
 Signals.addSignalMethods(FolderIcon.prototype);
 


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