[gnome-shell/wip/fmuellner/appstream-mappings: 6/6] appDisplay/pageManager: Update layout when apps are renamed
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/fmuellner/appstream-mappings: 6/6] appDisplay/pageManager: Update layout when apps are renamed
- Date: Fri, 20 Nov 2020 22:04:59 +0000 (UTC)
commit da50277fbbf21b07dff055818c9829543d64048c
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]