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/603
This commit is contained in:
parent
6da23c8d4d
commit
79f9391c00
@ -339,6 +339,9 @@ var AllView = class AllView extends BaseAppView {
|
|||||||
Main.queueDeferredWork(this._redisplayWorkId);
|
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;
|
this._nEventBlockerInhibits = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,6 +678,58 @@ var AllView = class AllView extends BaseAppView {
|
|||||||
this.folderIcons[i].adaptToSize(availWidth, availHeight);
|
this.folderIcons[i].adaptToSize(availWidth, availHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_handleDragOvershoot(dragEvent) {
|
||||||
|
let [gridX, gridY] = this.actor.get_transformed_position();
|
||||||
|
let [gridWidth, gridHeight] = this.actor.get_transformed_size();
|
||||||
|
let gridBottom = gridY + gridHeight;
|
||||||
|
|
||||||
|
// Within the grid boundaries, or already animating
|
||||||
|
if (dragEvent.y > gridY && dragEvent.y < gridBottom ||
|
||||||
|
Tweener.isTweening(this._adjustment)) {
|
||||||
|
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) {
|
||||||
|
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)
|
||||||
|
this._handleDragOvershoot(dragEvent);
|
||||||
|
|
||||||
|
return DND.DragMotionResult.CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDragEnd() {
|
||||||
|
if (this._dragMonitor) {
|
||||||
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
|
this._dragMonitor = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inhibitEventBlocker() {
|
inhibitEventBlocker() {
|
||||||
this._nEventBlockerInhibits++;
|
this._nEventBlockerInhibits++;
|
||||||
this._eventBlocker.visible = this._nEventBlockerInhibits == 0;
|
this._eventBlocker.visible = this._nEventBlockerInhibits == 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user