[gnome-shell/wip/fmuellner/appstream-mappings: 3/3] appDisplay/pageManager: Update layout when apps are renamed




commit 204b45a594b87fce5f143ac476d0ade86035d30d
Author: Florian Müllner <fmuellner gnome org>
Date:   Thu Nov 19 04:04:14 2020 +0100

    appDisplay/pageManager: Update layout when apps are renamed
    
    Now that the app picker uses custom, user-defined positioning, it
    makes sense to pick up renamed app IDs like we do for favorites.

 js/ui/appDisplay.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 322aa3cd7a..c07a162a60 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -1,8 +1,8 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 /* exported AppDisplay, AppSearchProvider */
 
-const { Clutter, Gio, GLib, GObject, Graphene, Meta,
-    Pango, Shell, St } = imports.gi;
+const { AppStreamGlib: AppStream, Clutter, Gio, GLib, GObject, Graphene,
+    Meta, Pango, Shell, St } = imports.gi;
 const Signals = imports.signals;
 
 const AppFavorites = imports.ui.appFavorites;
@@ -19,6 +19,8 @@ const SwipeTracker = imports.ui.swipeTracker;
 const Params = imports.misc.params;
 const SystemActions = imports.misc.systemActions;
 
+Gio._promisify(AppStream.Store.prototype, 'load_async', 'load_finish');
+
 var MENU_POPUP_TIMEOUT = 600;
 var POPDOWN_DIALOG_TIMEOUT = 500;
 
@@ -867,6 +869,52 @@ var PageManager = GObject.registerClass({
 
         global.settings.connect('changed::app-picker-layout',
             this._loadPages.bind(this));
+
+        this._appDataStore = new AppStream.Store();
+        this._appDataStore.connect('changed',
+            this._updateAppIds.bind(this));
+        this._loadAppDataStore();
+    }
+
+    async _loadAppDataStore() {
+        try {
+            const loadFlags =
+                AppStream.StoreLoadFlags.APP_INFO_SYSTEM |
+                AppStream.StoreLoadFlags.APP_INFO_USER |
+                AppStream.StoreLoadFlags.FLATPAK_SYSTEM |
+                AppStream.StoreLoadFlags.FLATPAK_USER |
+                AppStream.StoreLoadFlags.APPDATA |
+                AppStream.StoreLoadFlags.DESKTOP;
+            // emits ::changed if successful
+            await this._appDataStore.load_async(loadFlags, null);
+        } catch (e) {
+            log('Failed to load AppData store: %s'.format(e.message));
+        }
+    }
+
+    _updateAppIds() {
+        const store = this._appDataStore;
+
+        let updated = false;
+        for (let pageIndex = 0; pageIndex < this._pages.length; pageIndex++) {
+            const pageData = this._pages[pageIndex];
+
+            for (const appId of Object.keys(pageData)) {
+                const appData =
+                    store.get_app_by_id_with_fallbacks(appId) ||
+                    store.get_app_by_provide(AppStream.ProvideKind.ID, appId);
+                const newId = appData?.get_id();
+
+                if (newId && newId !== appId) {
+                    pageData[newId] = pageData[appId];
+                    delete pageData[appId];
+                    updated = true;
+                }
+            }
+        }
+
+        if (updated)
+            this.pages = this._pages;
     }
 
     _loadPages() {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]