iconGrid: Return page and position for drop targets instead of items

Returning a page and a position for the drop target seems more
straightforward than returning an actual grid item in getDropTarget().

With the next commit, this will allow us to throw away drop targets that
are not on the current page.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2348>
This commit is contained in:
Jonas Dreßler 2022-06-24 13:01:16 +02:00 committed by Marge Bot
parent b781b3e9fd
commit 2e6fd8b730
2 changed files with 16 additions and 37 deletions

View File

@ -1172,14 +1172,8 @@ var BaseAppView = GObject.registerClass({
} }
_getDropTarget(x, y, source) { _getDropTarget(x, y, source) {
const { currentPage } = this._grid;
let [item, dragLocation] = this._grid.getDropTarget(x, y);
const [sourcePage, sourcePosition] = this._grid.getItemPosition(source); const [sourcePage, sourcePosition] = this._grid.getItemPosition(source);
const targetPage = currentPage; let [targetPage, targetPosition, dragLocation] = this._grid.getDropTarget(x, y);
let targetPosition = item
? this._grid.getItemPosition(item)[1] : -1;
// In case we're hovering over the edge of an item but the // In case we're hovering over the edge of an item but the
// reflow will happen in the opposite direction (the drag // reflow will happen in the opposite direction (the drag
@ -1212,14 +1206,6 @@ var BaseAppView = GObject.registerClass({
} }
} }
// Append to the page if dragging over empty area
if (dragLocation === IconGrid.DragLocation.EMPTY_SPACE) {
const pageItems =
this._grid.getItemsAtPage(currentPage).filter(c => c.visible);
targetPosition = pageItems.length;
}
return [targetPage, targetPosition, dragLocation]; return [targetPage, targetPosition, dragLocation];
} }

View File

@ -1008,19 +1008,21 @@ var IconGridLayout = GObject.registerClass({
// Out of bounds // Out of bounds
if (page >= this._pages.length) if (page >= this._pages.length)
return [null, DragLocation.INVALID]; return [0, 0, DragLocation.INVALID];
if (isRtl && this._orientation === Clutter.Orientation.HORIZONTAL) if (isRtl && this._orientation === Clutter.Orientation.HORIZONTAL)
page = swap(page, this._pages.length); page = swap(page, this._pages.length);
// Page-relative coordinates from now on // Get page-relative coordinates
let adjX = x;
let adjY = y;
if (this._orientation === Clutter.Orientation.HORIZONTAL) if (this._orientation === Clutter.Orientation.HORIZONTAL)
x %= this._pageWidth; adjX %= this._pageWidth;
else else
y %= this._pageHeight; adjY %= this._pageHeight;
if (x < leftEmptySpace || y < topEmptySpace) if (adjX < leftEmptySpace || adjY < topEmptySpace)
return [null, DragLocation.INVALID]; return [0, 0, DragLocation.INVALID];
const gridWidth = const gridWidth =
childSize * this.columnsPerPage + childSize * this.columnsPerPage +
@ -1029,25 +1031,16 @@ var IconGridLayout = GObject.registerClass({
childSize * this.rowsPerPage + childSize * this.rowsPerPage +
vSpacing * (this.rowsPerPage - 1); vSpacing * (this.rowsPerPage - 1);
if (x > leftEmptySpace + gridWidth || y > topEmptySpace + gridHeight) if (adjX > leftEmptySpace + gridWidth || adjY > topEmptySpace + gridHeight)
return [null, DragLocation.INVALID]; return [0, 0, DragLocation.INVALID];
const halfHSpacing = hSpacing / 2; const halfHSpacing = hSpacing / 2;
const halfVSpacing = vSpacing / 2; const halfVSpacing = vSpacing / 2;
const visibleItems = this._pages[page].visibleChildren; const visibleItems = this._pages[page].visibleChildren;
for (const item of visibleItems) { for (let i = 0; i < visibleItems.length; i++) {
const childBox = item.allocation.copy(); const item = visibleItems[i];
const childBox = item.allocation;
// Page offset
switch (this._orientation) {
case Clutter.Orientation.HORIZONTAL:
childBox.set_origin(childBox.x1 % this._pageWidth, childBox.y1);
break;
case Clutter.Orientation.VERTICAL:
childBox.set_origin(childBox.x1, childBox.y1 % this._pageHeight);
break;
}
// Outside the icon boundaries // Outside the icon boundaries
if (x < childBox.x1 - halfHSpacing || if (x < childBox.x1 - halfHSpacing ||
@ -1072,10 +1065,10 @@ var IconGridLayout = GObject.registerClass({
dragLocation = DragLocation.START_EDGE; dragLocation = DragLocation.START_EDGE;
} }
return [item, dragLocation]; return [page, i, dragLocation];
} }
return [null, DragLocation.EMPTY_SPACE]; return [page, -1, DragLocation.EMPTY_SPACE];
} }
get iconSize() { get iconSize() {