[gnome-shell/gbsneto/custom-icon-positions: 21/30] appDisplay: Add placeholder when moving from folder dialog



commit 0bb34fefbd5ec4e67c0874906c0f64067bbc3615
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Tue Jun 23 12:05:27 2020 -0300

    appDisplay: Add placeholder when moving from folder dialog
    
    When moving an icon from a folder dialog, the app grid doesn't
    really have an icon to move around.
    
    Add a placeholder icon and hijack it in the various places.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284

 js/ui/appDisplay.js | 46 ++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 42 insertions(+), 4 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 536e86d614..24b0a9b310 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -633,6 +633,7 @@ class AppDisplay extends BaseAppView {
         this._delayedMoveId = 0;
         this._targetDropPosition = null;
         this._nudgedItem = null;
+        this._placeholder = null;
 
         Main.overview.connect('hidden', () => this.goToPage(0));
 
@@ -720,17 +721,42 @@ class AppDisplay extends BaseAppView {
         this._pageManager.pages = pages;
     }
 
+    _ensurePlaceholder(source) {
+        if (this._placeholder)
+            return;
+
+        const appSys = Shell.AppSystem.get_default();
+        const app = appSys.lookup_app(source.id);
+
+        this._placeholder = new AppIcon(app, {
+            isDraggable: global.settings.is_writable('favorite-apps'),
+        });
+        this._placeholder.scaleAndFade();
+        this._redisplay();
+    }
+
+    _removePlaceholder() {
+        if (this._placeholder) {
+            this._placeholder.undoScaleAndFade();
+            this._placeholder = null;
+            this._redisplay();
+        }
+    }
+
     getAppInfos() {
         return this._appInfoList;
     }
 
     _getItemPosition(item) {
+        if (item === this._placeholder)
+            return this._grid.getItemPosition(item);
+
         return this._pageManager.getAppPosition(item.id);
     }
 
     _compareItems(a, b) {
-        const [aPage, aPosition] = this._pageManager.getAppPosition(a.id);
-        const [bPage, bPosition] = this._pageManager.getAppPosition(b.id);
+        const [aPage, aPosition] = this._getItemPosition(a);
+        const [bPage, bPosition] = this._getItemPosition(b);
 
         if (aPage === -1 && bPage === -1)
             return a.name.localeCompare(b.name);
@@ -808,6 +834,10 @@ class AppDisplay extends BaseAppView {
             appIcons.push(icon);
         });
 
+        // At last, if there's a placeholder available, add it
+        if (this._placeholder)
+            appIcons.push(this._placeholder);
+
         return appIcons;
     }
 
@@ -952,7 +982,7 @@ class AppDisplay extends BaseAppView {
         if (!success)
             return;
 
-        const { source } = dragEvent;
+        const source = this._placeholder ? this._placeholder : dragEvent.source;
         const [item, dragLocation] = this._getDropTarget(x, y);
 
         // Dragging over invalid parts of the grid cancels the timeout
@@ -1040,11 +1070,18 @@ class AppDisplay extends BaseAppView {
             '[gnome-shell] this._lastOvershootTimeoutId');
     }
 
-    _onDragBegin() {
+    _onDragBegin(_overview, source) {
         this._dragMonitor = {
             dragMotion: this._onDragMotion.bind(this),
         };
         DND.addDragMonitor(this._dragMonitor);
+
+        // When dragging from a folder dialog, the dragged app icon doesn't
+        // exist in AppDisplay. We work around that by adding a placeholder
+        // icon that is either destroyed on cancel, or becomes the effective
+        // new icon when dropped.
+        if (_getViewFromIcon(source) instanceof FolderView)
+            this._ensurePlaceholder(source);
     }
 
     _onDragMotion(dragEvent) {
@@ -1072,6 +1109,7 @@ class AppDisplay extends BaseAppView {
 
         this._resetOvershoot();
         this._removeNudge();
+        this._removePlaceholder();
     }
 
     _onDragCancelled(_overview, source) {


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