1bbc138ed2
Show a positional indicator where a new favorite will be added and make the favorites re-orderable. Also allow the removal of favorites using drag-and-drop according to the mockups. https://bugzilla.gnome.org/show_bug.cgi?id=634948
136 lines
3.6 KiB
JavaScript
136 lines
3.6 KiB
JavaScript
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
|
|
const Shell = imports.gi.Shell;
|
|
const Lang = imports.lang;
|
|
const Signals = imports.signals;
|
|
const Gettext = imports.gettext.domain('gnome-shell');
|
|
const _ = Gettext.gettext;
|
|
|
|
const Main = imports.ui.main;
|
|
|
|
function AppFavorites() {
|
|
this._init();
|
|
}
|
|
|
|
AppFavorites.prototype = {
|
|
FAVORITE_APPS_KEY: 'favorite-apps',
|
|
|
|
_init: function() {
|
|
this._favorites = {};
|
|
global.settings.connect('changed::' + this.FAVORITE_APPS_KEY, Lang.bind(this, this._onFavsChanged));
|
|
this._reload();
|
|
},
|
|
|
|
_onFavsChanged: function() {
|
|
this._reload();
|
|
this.emit('changed');
|
|
},
|
|
|
|
_reload: function() {
|
|
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
|
let appSys = Shell.AppSystem.get_default();
|
|
let apps = ids.map(function (id) {
|
|
return appSys.get_app(id);
|
|
}).filter(function (app) {
|
|
return app != null;
|
|
});
|
|
this._favorites = {};
|
|
for (let i = 0; i < apps.length; i++) {
|
|
let app = apps[i];
|
|
this._favorites[app.get_id()] = app;
|
|
}
|
|
},
|
|
|
|
_getIds: function() {
|
|
let ret = [];
|
|
for (let id in this._favorites)
|
|
ret.push(id);
|
|
return ret;
|
|
},
|
|
|
|
getFavoriteMap: function() {
|
|
return this._favorites;
|
|
},
|
|
|
|
getFavorites: function() {
|
|
let ret = [];
|
|
for (let id in this._favorites)
|
|
ret.push(this._favorites[id]);
|
|
return ret;
|
|
},
|
|
|
|
isFavorite: function(appId) {
|
|
return appId in this._favorites;
|
|
},
|
|
|
|
_addFavorite: function(appId, pos) {
|
|
if (appId in this._favorites)
|
|
return false;
|
|
|
|
let app = Shell.AppSystem.get_default().get_app(appId);
|
|
|
|
if (!app)
|
|
return false;
|
|
|
|
let ids = this._getIds();
|
|
if (pos == -1)
|
|
ids.push(appId);
|
|
else
|
|
ids.splice(pos, 0, appId);
|
|
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
|
this._favorites[appId] = app;
|
|
return true;
|
|
},
|
|
|
|
addFavoriteAtPos: function(appId, pos) {
|
|
if (!this._addFavorite(appId, pos))
|
|
return;
|
|
|
|
let app = Shell.AppSystem.get_default().get_app(appId);
|
|
|
|
Main.overview.shellInfo.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
|
|
this._removeFavorite(appId);
|
|
}));
|
|
},
|
|
|
|
addFavorite: function(appId) {
|
|
this.addFavoriteAtPos(appId, -1);
|
|
},
|
|
|
|
moveFavoriteToPos: function(appId, pos) {
|
|
this._removeFavorite(appId);
|
|
this._addFavorite(appId, pos);
|
|
},
|
|
|
|
_removeFavorite: function(appId) {
|
|
if (!appId in this._favorites)
|
|
return false;
|
|
|
|
let ids = this._getIds().filter(function (id) { return id != appId; });
|
|
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
|
return true;
|
|
},
|
|
|
|
removeFavorite: function(appId) {
|
|
let ids = this._getIds();
|
|
let pos = ids.indexOf(appId);
|
|
|
|
let app = this._favorites[appId];
|
|
if (!this._removeFavorite(appId))
|
|
return;
|
|
|
|
Main.overview.shellInfo.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
|
Lang.bind(this, function () {
|
|
this._addFavorite(appId, pos);
|
|
}));
|
|
}
|
|
};
|
|
Signals.addSignalMethods(AppFavorites.prototype);
|
|
|
|
var appFavoritesInstance = null;
|
|
function getAppFavorites() {
|
|
if (appFavoritesInstance == null)
|
|
appFavoritesInstance = new AppFavorites();
|
|
return appFavoritesInstance;
|
|
}
|