[gnome-shell/gbsneto/icon-grid-dnd: 117/117] folderView: Allow moving to specific position



commit 4037d28ac32d8d483e5281a8b31bec24ea313dd6
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Fri Jul 5 11:05:29 2019 -0300

    folderView: Allow moving to specific position
    
    As of now, the only way to add an app icon to a folder is
    by dragging it to the folder icon itself. Even though we
    allow opening the folder popup when hovering the icon,
    dropping an app icon there wouldn't work.
    
    Make the folder view add the app icon to it's GSettings
    key (which will trigger _redisplay() and will show the
    new icon) when dropping to a specific position.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/603

 js/ui/appDisplay.js | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index cc09a0129..e01799f67 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -1367,6 +1367,7 @@ var FolderView = class FolderView extends BaseAppView {
         let scrollableContainer = new St.BoxLayout({ vertical: true, reactive: true });
         scrollableContainer.add_actor(this._grid);
         this.actor.add_actor(scrollableContainer);
+        this.actor._delegate = this;
 
         let action = new Clutter.PanAction({ interpolate: true });
         action.connect('pan', this._onPan.bind(this));
@@ -1454,13 +1455,28 @@ var FolderView = class FolderView extends BaseAppView {
         [x, y] = this._transformToGridCoordinates(x, y);
 
         let [index, dragLocation] = this.canDropAt(x, y);
-        let sourceIndex = this._allItems.indexOf(source);
         let success = index != -1;
 
         source.undoScaleAndFade();
 
-        if (success)
-            this.moveItem(source, index);
+        if (success) {
+            // If we're dragging from another folder, remove from the old folder
+            if (source.view != this &&
+                (source instanceof AppIcon) &&
+                (source.view instanceof FolderView)) {
+                source.view.removeApp(source.app);
+            }
+
+            // If the new app icon is not in this folder yet, add it; otherwise,
+            // just move the icon to the new position
+            let folderApps = this._folder.get_strv('apps');
+            if (!folderApps.includes(source.id)) {
+                folderApps.splice(index, 0, source.id);
+                this._folder.set_strv('apps', folderApps);
+            } else {
+                this.moveItem(source, index);
+            }
+        }
 
         this.removeNudges();
         return success;


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