summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2019-07-04 16:03:20 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2019-08-02 16:33:04 -0300
commit87a76a5757519207ddf0aa334345a405a3ddeb45 (patch)
tree46cfdbcb9c4d1abca3352b6ed471847579a48b93
parent717ec0f8a4667b024c8c8344cc4e905b8fb76a71 (diff)
downloadgnome-shell-gbsneto/icon-grid-dnd.tar.gz
appDisplay: Close popup when dragginggbsneto/icon-grid-dnd
When a drag starts inside a folder, and the cursor moves to outside it, close the currently opened folder popup. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/603
-rw-r--r--js/ui/appDisplay.js39
1 files changed, 35 insertions, 4 deletions
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 7e9b558e5..4bf87d004 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -431,6 +431,7 @@ var AllView = class AllView extends BaseAppView {
Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
this._nEventBlockerInhibits = 0;
+ this._popdownId = 0;
}
_refilterApps() {
@@ -864,6 +865,25 @@ var AllView = class AllView extends BaseAppView {
}
}
+ _schedulePopdown() {
+ if (this._popdownId > 0)
+ return;
+
+ this._popdownId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, () => {
+ if (this._currentPopup)
+ this._currentPopup.popdown();
+ this._popdownId = 0;
+ return GLib.SOURCE_REMOVE;
+ });
+ }
+
+ _unschedulePopdown() {
+ if (this._popdownId > 0) {
+ GLib.source_remove(this._popdownId);
+ this._popdownId = 0;
+ }
+ }
+
_onDragBegin() {
this._dragMonitor = {
dragMotion: this._onDragMotion.bind(this)
@@ -874,11 +894,22 @@ var AllView = class AllView extends BaseAppView {
_onDragMotion(dragEvent) {
let appIcon = dragEvent.source;
- // Handle the drag overshoot. When dragging to above the
- // icon grid, move to the page above; when dragging below,
- // move to the page below.
- if (appIcon.view == this)
+ // When dragging from a folder, don't nudge items; instead,
+ // prevent DND entirely by returning NO_DROP
+ if (this._currentPopup) {
+ if (dragEvent.targetActor == this._grid ||
+ this._grid.contains(dragEvent.targetActor)) {
+ this._schedulePopdown();
+ return DND.DragMotionResult.NO_DROP;
+ } else {
+ this._unschedulePopdown();
+ }
+ } else {
+ // Handle the drag overshoot. When dragging to above the
+ // icon grid, move to the page above; when dragging below,
+ // move to the page below.
this._handleDragOvershoot(dragEvent);
+ }
if (dragEvent.targetActor != this._grid)
this.removeNudges();