[gnome-shell/gbsneto/folder-dialog-improvements: 11/20] appDisplay: Popdown folder dialog on DnD



commit 30172b5625023761f0688ec1b79f0eaaa2b1ea44
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Jun 4 22:32:14 2020 -0300

    appDisplay: Popdown folder dialog on DnD
    
    So that we're still able to drag icons out of folders, and to the
    Dash. Wait 600ms (MENU_POPUP_TIMEOUT) before popping it down.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1301

 js/ui/appDisplay.js | 41 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 06c1605bca..5e22b2046d 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -1395,7 +1395,8 @@ var FolderIcon = GObject.registerClass({
         if (this._dialog)
             return;
         if (!this._dialog) {
-            this._dialog = new AppFolderDialog(this, this._folder);
+            this._dialog = new AppFolderDialog(this, this._folder,
+                this._parentView);
             this._parentView.addFolderDialog(this._dialog);
             this._dialog.connect('open-state-changed', (popup, isOpen) => {
                 if (!isOpen)
@@ -1410,7 +1411,7 @@ var AppFolderDialog = GObject.registerClass({
         'open-state-changed': { param_types: [GObject.TYPE_BOOLEAN] },
     },
 }, class AppFolderDialog extends St.Bin {
-    _init(source, folder) {
+    _init(source, folder, appDisplay) {
         super._init({
             visible: false,
             x_expand: true,
@@ -1437,6 +1438,8 @@ var AppFolderDialog = GObject.registerClass({
         this._source = source;
         this._folder = folder;
         this._view = source.view;
+        this._appDisplay = appDisplay;
+        this._delegate = this;
 
         this._isOpen = false;
         this.parentOffset = 0;
@@ -1469,6 +1472,7 @@ var AppFolderDialog = GObject.registerClass({
         this.connect('destroy', this._onDestroy.bind(this));
 
         this._sourceMappedId = 0;
+        this._popdownTimeoutId = 0;
         this._needsZoomAndFade = false;
     }
 
@@ -1680,6 +1684,11 @@ var AppFolderDialog = GObject.registerClass({
             this._source.disconnect(this._sourceMappedId);
             this._sourceMappedId = 0;
         }
+
+        if (this._popdownTimeoutId > 0) {
+            GLib.source_remove(this._popdownTimeoutId);
+            this._popdownTimeoutId = 0;
+        }
     }
 
     vfunc_allocate(box) {
@@ -1736,6 +1745,34 @@ var AppFolderDialog = GObject.registerClass({
         return this.navigate_focus(null, direction, false);
     }
 
+    _withinDialog(x, y) {
+        const childAllocation =
+            Shell.util_get_transformed_allocation(this.child);
+
+        return x > childAllocation.x1 &&
+            x < childAllocation.x2 &&
+            y > childAllocation.y1 &&
+            y < childAllocation.y2;
+    }
+
+    handleDragOver(source, actor, x, y) {
+        if (this._withinDialog(x, y)) {
+            if (this._popdownTimeoutId > 0) {
+                GLib.source_remove(this._popdownTimeoutId);
+                this._popdownTimeoutId = 0;
+            }
+        } else if (this._popdownTimeoutId === 0) {
+            this._popdownTimeoutId =
+                GLib.timeout_add(GLib.PRIORITY_DEFAULT, MENU_POPUP_TIMEOUT, () => {
+                    this._popdownTimeoutId = 0;
+                    this.popdown();
+                    return GLib.SOURCE_REMOVE;
+                });
+        }
+
+        return DND.DragMotionResult.NO_DROP;
+    }
+
     toggle() {
         if (this._isOpen)
             this.popdown();


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