From 18234ea91a8eec06fc1c43a516ad2f42391e7ecb Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 26 May 2020 01:41:43 -0300 Subject: [PATCH] appDisplay: Use custom function to retrieve item page and position It is important that '_loadApps()' return a sorted list -- adding the same icons at the same positions but in different orders results in a wrong icon grid. Add support for using a custom positioning function, and implement it in AppDisplay. Because FolderView doesn't implement a custom sorting function, the items are still sorted alphabetically. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284 --- js/ui/appDisplay.js | 49 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 01df5afe6..5f9a2df5f 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -305,11 +305,24 @@ var BaseAppView = GObject.registerClass({ this._grid.removeItem(item); } + _getItemPosition(item) { + const { itemsPerPage } = this._grid; + + let iconIndex = this._orderedItems.indexOf(item); + if (iconIndex === -1) + iconIndex = this._orderedItems.length - 1; + + const page = Math.floor(iconIndex / itemsPerPage); + const position = iconIndex % itemsPerPage; + + return [page, position]; + } + _redisplay() { let oldApps = this._orderedItems.slice(); let oldAppIds = oldApps.map(icon => icon.id); - let newApps = this._loadApps().sort(this._compareItems); + let newApps = this._loadApps().sort(this._compareItems.bind(this)); let newAppIds = newApps.map(icon => icon.id); let addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id)); @@ -322,16 +335,9 @@ var BaseAppView = GObject.registerClass({ }); // Add new app icons - const { itemsPerPage } = this._grid; addedApps.forEach(icon => { - let iconIndex = newApps.indexOf(icon); - - this._orderedItems.splice(iconIndex, 0, icon); - this._items.set(icon.id, icon); - - const page = Math.floor(iconIndex / itemsPerPage); - const position = iconIndex % itemsPerPage; - this._grid.addItem(icon, page, position); + const [page, position] = this._getItemPosition(icon, newApps); + this._addItem(icon, page, position); }); this._viewIsReady = true; @@ -754,7 +760,7 @@ class AppDisplay extends BaseAppView { // supposed to be and reinsert it where it's sorted. let oldIdx = this._orderedItems.indexOf(item); this._orderedItems.splice(oldIdx, 1); - let newIdx = Util.insertSorted(this._orderedItems, item, this._compareItems); + let newIdx = Util.insertSorted(this._orderedItems, item, this._compareItems.bind(this)); this._grid.removeItem(item); @@ -770,6 +776,27 @@ class AppDisplay extends BaseAppView { return this._appInfoList; } + _getItemPosition(item) { + return this._pageManager.getAppPosition(item.id); + } + + _compareItems(a, b) { + const [aPage, aPosition] = this._pageManager.getAppPosition(a.id); + const [bPage, bPosition] = this._pageManager.getAppPosition(b.id); + + if (aPage === -1 && bPage === -1) + return a.name.localeCompare(b.name); + else if (aPage === -1) + return 1; + else if (bPage === -1) + return -1; + + if (aPage !== bPage) + return aPage - bPage; + + return aPosition - bPosition; + } + _loadApps() { let appIcons = []; this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {