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:
parent
e3f3297cba
commit
18234ea91a
@ -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 => {
|
||||||
|
Loading…
Reference in New Issue
Block a user