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
This commit is contained in:
Georges Basile Stavracas Neto 2020-05-26 01:41:43 -03:00 committed by Florian Müllner
parent e3f3297cba
commit 18234ea91a

View File

@ -305,11 +305,24 @@ var BaseAppView = GObject.registerClass({
this._grid.removeItem(item); 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() { _redisplay() {
let oldApps = this._orderedItems.slice(); let oldApps = this._orderedItems.slice();
let oldAppIds = oldApps.map(icon => icon.id); 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 newAppIds = newApps.map(icon => icon.id);
let addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id)); let addedApps = newApps.filter(icon => !oldAppIds.includes(icon.id));
@ -322,16 +335,9 @@ var BaseAppView = GObject.registerClass({
}); });
// Add new app icons // Add new app icons
const { itemsPerPage } = this._grid;
addedApps.forEach(icon => { addedApps.forEach(icon => {
let iconIndex = newApps.indexOf(icon); const [page, position] = this._getItemPosition(icon, newApps);
this._addItem(icon, page, position);
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);
}); });
this._viewIsReady = true; this._viewIsReady = true;
@ -754,7 +760,7 @@ class AppDisplay extends BaseAppView {
// supposed to be and reinsert it where it's sorted. // supposed to be and reinsert it where it's sorted.
let oldIdx = this._orderedItems.indexOf(item); let oldIdx = this._orderedItems.indexOf(item);
this._orderedItems.splice(oldIdx, 1); 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); this._grid.removeItem(item);
@ -770,6 +776,27 @@ class AppDisplay extends BaseAppView {
return this._appInfoList; 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() { _loadApps() {
let appIcons = []; let appIcons = [];
this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => { this._appInfoList = Shell.AppSystem.get_default().get_installed().filter(appInfo => {