112 lines
3.2 KiB
JavaScript
112 lines
3.2 KiB
JavaScript
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
|
|
const GMenu = imports.gi.GMenu;
|
|
const Lang = imports.lang;
|
|
const Shell = imports.gi.Shell;
|
|
const St = imports.gi.St;
|
|
|
|
const Main = imports.ui.main;
|
|
const PanelMenu = imports.ui.panelMenu;
|
|
const PopupMenu = imports.ui.popupMenu;
|
|
|
|
const ICON_SIZE = 28;
|
|
let appsys = Shell.AppSystem.get_default();
|
|
|
|
function AppMenuItem() {
|
|
this._init.apply(this, arguments);
|
|
}
|
|
|
|
AppMenuItem.prototype = {
|
|
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
|
|
|
|
_init: function (app, params) {
|
|
PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params);
|
|
|
|
this._app = app;
|
|
this.label = new St.Label({ text: app.get_name() });
|
|
this.addActor(this.label);
|
|
this._icon = app.create_icon_texture(ICON_SIZE);
|
|
this.addActor(this._icon, { expand: false });
|
|
},
|
|
|
|
activate: function (event) {
|
|
this._app.activate_full(-1, event.get_time());
|
|
|
|
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
|
|
}
|
|
|
|
};
|
|
|
|
function ApplicationsButton() {
|
|
this._init();
|
|
}
|
|
|
|
ApplicationsButton.prototype = {
|
|
__proto__: PanelMenu.SystemStatusButton.prototype,
|
|
|
|
_init: function() {
|
|
PanelMenu.SystemStatusButton.prototype._init.call(this, 'start-here');
|
|
this._display();
|
|
appsys.connect('installed-changed', Lang.bind(this, this.reDisplay));
|
|
},
|
|
|
|
reDisplay : function() {
|
|
this._clearAll();
|
|
this._display();
|
|
},
|
|
|
|
_clearAll : function() {
|
|
this.menu.removeAll();
|
|
},
|
|
|
|
// Recursively load a GMenuTreeDirectory; we could put this in ShellAppSystem too
|
|
// (taken from js/ui/appDisplay.js in core shell)
|
|
_loadCategory: function(dir, menu) {
|
|
var iter = dir.iter();
|
|
var nextType;
|
|
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
|
if (nextType == GMenu.TreeItemType.ENTRY) {
|
|
var entry = iter.get_entry();
|
|
var app = appsys.lookup_app_by_tree_entry(entry);
|
|
if (!entry.get_app_info().get_nodisplay())
|
|
menu.addMenuItem(new AppMenuItem(app));
|
|
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
|
this._loadCategory(iter.get_directory(), menu);
|
|
}
|
|
}
|
|
},
|
|
|
|
_display : function() {
|
|
let tree = appsys.get_tree();
|
|
let root = tree.get_root_directory();
|
|
|
|
let iter = root.iter();
|
|
let nextType;
|
|
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
|
if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
|
let dir = iter.get_directory();
|
|
let item = new PopupMenu.PopupSubMenuMenuItem(dir.get_name());
|
|
this._loadCategory(dir, item.menu);
|
|
this.menu.addMenuItem(item);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
let appsMenuButton;
|
|
|
|
function enable() {
|
|
appsMenuButton = new ApplicationsButton();
|
|
Main.panel._leftBox.insert_actor(appsMenuButton.actor, 1);
|
|
Main.panel._leftBox.child_set(appsMenuButton.actor, { y_fill : true } );
|
|
Main.panel._menus.addMenu(appsMenuButton.menu);
|
|
}
|
|
|
|
function disable() {
|
|
appsMenuButton.destroy();
|
|
}
|
|
|
|
function init() {
|
|
/* do nothing */
|
|
}
|