From 0dd430f2f47193d9c9b2b946a14356ababecda7a Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 2 Jul 2019 17:41:15 -0300 Subject: [PATCH] appDisplay: Add moveItem() This is a handy function to implement changing an icon's position in the grid. WIP: better commit message https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/603 --- js/ui/appDisplay.js | 22 ++++++++++++++++++++++ js/ui/iconGrid.js | 16 ++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 9ad947fbc..3459ab5af 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -163,6 +163,28 @@ class BaseAppView { this.emit('view-loaded'); } + moveItem(item, newPosition) { + let itemIndex = this._allItems.indexOf(item); + + if (itemIndex == -1) { + log('Trying to move item %s that is not in this app view'.format(item.id)); + return; + } + + let visibleItems = this._allItems.filter(item => item.actor.visible); + let visibleIndex = visibleItems.indexOf(item); + if (newPosition > visibleIndex) + newPosition -= 1; + + // Remove from the old position + this._allItems.splice(itemIndex, 1); + + let realPosition = this._grid.moveItem(item, newPosition); + this._allItems.splice(realPosition, 0, item); + + return realPosition; + } + _selectAppInternal(id) { if (this._items[id]) this._items[id].actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js index 7f5abed01..1020d835e 100644 --- a/js/ui/iconGrid.js +++ b/js/ui/iconGrid.js @@ -695,6 +695,22 @@ var IconGrid = GObject.registerClass({ this.add_actor(item.actor); } + moveItem(item, newPosition) { + if (!this.contains(item.actor)) { + log('Cannot move item not contained by the IconGrid'); + return; + } + + let children = this.get_children(); + let visibleChildren = children.filter(c => c.is_visible()); + let visibleChildAtPosition = visibleChildren[newPosition]; + let realPosition = children.indexOf(visibleChildAtPosition); + + this.set_child_at_index(item.actor, realPosition); + + return realPosition; + } + removeItem(item) { this.remove_child(item.actor); }