[gnome-shell/gbsneto/custom-icon-positions: 11/28] appDisplay: Use custom function to retrieve item page and position
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gbsneto/custom-icon-positions: 11/28] appDisplay: Use custom function to retrieve item page and position
- Date: Thu, 16 Jul 2020 14:52:37 +0000 (UTC)
commit 7598896ffd36c78c97c9b55deb67947ee3b82aea
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Tue May 26 01:41:43 2020 -0300
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 3d0ab0b3e5..7cfbd9fac0 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 => {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]