[gnome-shell/gbsneto/icon-grid-part2: 6/10] allView: Switch pages when dragging above or below the grid
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gbsneto/icon-grid-part2: 6/10] allView: Switch pages when dragging above or below the grid
- Date: Thu, 8 Aug 2019 00:58:13 +0000 (UTC)
commit bea22634c80b9190086ee4758ee4f977a5c4e2da
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Fri Jun 28 20:48:22 2019 -0300
allView: Switch pages when dragging above or below the grid
This is necessary for being able to drag application icons
to folders in different pages.
Add a drag motion handler to AllView and handle overshoots
when dragging. Only handle it when dragging from AllView.
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/664
js/ui/appDisplay.js | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index de9e168d93..4e4b68207b 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -335,6 +335,9 @@ var AllView = class AllView extends BaseAppView {
Main.queueDeferredWork(this._redisplayWorkId);
});
+ Main.overview.connect('item-drag-begin', this._onDragBegin.bind(this));
+ Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
+
this._nEventBlockerInhibits = 0;
}
@@ -679,6 +682,61 @@ var AllView = class AllView extends BaseAppView {
this.folderIcons[i].adaptToSize(availWidth, availHeight);
}
+ _handleDragOvershoot(dragEvent) {
+ let [, gridY] = this.actor.get_transformed_position();
+ let [, gridHeight] = this.actor.get_transformed_size();
+ let gridBottom = gridY + gridHeight;
+
+ // Within the grid boundaries, or already animating
+ if (dragEvent.y > gridY && dragEvent.y < gridBottom ||
+ this._adjustment.get_transition('value') != null) {
+ return;
+ }
+
+ // Moving above the grid
+ let currentY = this._adjustment.value;
+ if (dragEvent.y <= gridY && currentY > 0) {
+ this.goToPage(this._grid.currentPage - 1);
+ return;
+ }
+
+ // Moving below the grid
+ let maxY = this._adjustment.upper - this._adjustment.page_size;
+ if (dragEvent.y >= gridBottom && currentY < maxY) {
+ this.goToPage(this._grid.currentPage + 1);
+ return;
+ }
+ }
+
+ _onDragBegin() {
+ this._dragMonitor = {
+ dragMotion: this._onDragMotion.bind(this)
+ };
+ DND.addDragMonitor(this._dragMonitor);
+ }
+
+ _onDragMotion(dragEvent) {
+ if (!(dragEvent.source instanceof AppIcon))
+ return DND.DragMotionResult.CONTINUE;
+
+ 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 (this._grid.contains(appIcon.actor))
+ this._handleDragOvershoot(dragEvent);
+
+ return DND.DragMotionResult.CONTINUE;
+ }
+
+ _onDragEnd() {
+ if (this._dragMonitor) {
+ DND.removeDragMonitor(this._dragMonitor);
+ this._dragMonitor = null;
+ }
+ }
+
inhibitEventBlocker() {
this._nEventBlockerInhibits++;
this._eventBlocker.visible = this._nEventBlockerInhibits == 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]