From ffdff07eafc9adfe01f05486970fb86d835ab8d9 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Wed, 23 Sep 2020 16:52:09 -0300 Subject: [PATCH] iconGrid: Add moveItem This new public API moves items without removing and readding them, which allows us to avoid some tricky behavior. Noticeably, following the original design described at 3555550d5, the new IconGridLayout.moveItem() method does not call `layout_changed`. This is done by IconGrid itself, queueing a relayout. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1447 --- js/ui/iconGrid.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js index 12a4aed9b..a6a42b615 100644 --- a/js/ui/iconGrid.js +++ b/js/ui/iconGrid.js @@ -847,6 +847,22 @@ var IconGridLayout = GObject.registerClass({ this.addItem(item); } + /** + * moveItem: + * @param {Clutter.Actor} item: item to move + * @param {int} newPage: new page of the item + * @param {int} newPosition: new page of the item + * + * Moves @item to the grid. @item must be part of the grid. + */ + moveItem(item, newPage, newPosition) { + if (!this._items.has(item)) + throw new Error(`Item ${item} is not part of the IconGridLayout`); + + this._removeItemData(item); + this._addItemToPage(item, newPage, newPosition); + } + /** * removeItem: * @param {Clutter.Actor} item: item to remove from the grid @@ -1422,6 +1438,19 @@ var IconGrid = GObject.registerClass({ this.layout_manager.appendItem(item); } + /** + * moveItem: + * @param {Clutter.Actor} item: item to move + * @param {int} newPage: new page of the item + * @param {int} newPosition: new page of the item + * + * Moves @item to the grid. @item must be part of the grid. + */ + moveItem(item, newPage, newPosition) { + this.layout_manager.moveItem(item, newPage, newPosition); + this.queue_relayout(); + } + /** * removeItem: * @param {Clutter.Actor} item: item to remove from the grid