d1254d9b57
The extension currently assumes that we have the "Activities" button at the left of the top bar. This is currently true, not only in the regular session, but also in GNOME classic where the button is hidden (but still present). However this is about to change: We will stop taking over the button from the apps-menu extension, and instead disable "Activities" from the session mode definition. Prepare for this by adding the places menu before the application menu instead of assuming a hardcoded position. https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/69
148 lines
3.7 KiB
JavaScript
148 lines
3.7 KiB
JavaScript
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
/* exported init enable disable */
|
|
|
|
const { Clutter, GObject, St } = imports.gi;
|
|
|
|
const ExtensionUtils = imports.misc.extensionUtils;
|
|
const Main = imports.ui.main;
|
|
const PanelMenu = imports.ui.panelMenu;
|
|
const PopupMenu = imports.ui.popupMenu;
|
|
|
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
|
const _ = Gettext.gettext;
|
|
const N_ = x => x;
|
|
|
|
const Me = ExtensionUtils.getCurrentExtension();
|
|
const PlaceDisplay = Me.imports.placeDisplay;
|
|
|
|
const PLACE_ICON_SIZE = 16;
|
|
|
|
var PlaceMenuItem = GObject.registerClass(
|
|
class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|
_init(info) {
|
|
super._init();
|
|
this._info = info;
|
|
|
|
this._icon = new St.Icon({
|
|
gicon: info.icon,
|
|
icon_size: PLACE_ICON_SIZE
|
|
});
|
|
this.add_child(this._icon);
|
|
|
|
this._label = new St.Label({ text: info.name, x_expand: true });
|
|
this.add_child(this._label);
|
|
|
|
if (info.isRemovable()) {
|
|
this._ejectIcon = new St.Icon({
|
|
icon_name: 'media-eject-symbolic',
|
|
style_class: 'popup-menu-icon'
|
|
});
|
|
this._ejectButton = new St.Button({ child: this._ejectIcon });
|
|
this._ejectButton.connect('clicked', info.eject.bind(info));
|
|
this.add_child(this._ejectButton);
|
|
}
|
|
|
|
this._changedId = info.connect('changed',
|
|
this._propertiesChanged.bind(this));
|
|
}
|
|
|
|
destroy() {
|
|
if (this._changedId) {
|
|
this._info.disconnect(this._changedId);
|
|
this._changedId = 0;
|
|
}
|
|
|
|
super.destroy();
|
|
}
|
|
|
|
activate(event) {
|
|
this._info.launch(event.get_time());
|
|
|
|
super.activate(event);
|
|
}
|
|
|
|
_propertiesChanged(info) {
|
|
this._icon.gicon = info.icon;
|
|
this._label.text = info.name;
|
|
}
|
|
});
|
|
|
|
const SECTIONS = [
|
|
'special',
|
|
'devices',
|
|
'bookmarks',
|
|
'network'
|
|
];
|
|
|
|
let PlacesMenu = GObject.registerClass(
|
|
class PlacesMenu extends PanelMenu.Button {
|
|
_init() {
|
|
super._init(0.0, _('Places'));
|
|
|
|
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
|
let label = new St.Label({
|
|
text: _('Places'),
|
|
y_expand: true,
|
|
y_align: Clutter.ActorAlign.CENTER
|
|
});
|
|
hbox.add_child(label);
|
|
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
|
this.add_actor(hbox);
|
|
|
|
this.placesManager = new PlaceDisplay.PlacesManager();
|
|
|
|
this._sections = { };
|
|
|
|
for (let i = 0; i < SECTIONS.length; i++) {
|
|
let id = SECTIONS[i];
|
|
this._sections[id] = new PopupMenu.PopupMenuSection();
|
|
this.placesManager.connect(`${id}-updated`, () => {
|
|
this._redisplay(id);
|
|
});
|
|
|
|
this._create(id);
|
|
this.menu.addMenuItem(this._sections[id]);
|
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
|
}
|
|
}
|
|
|
|
_onDestroy() {
|
|
this.placesManager.destroy();
|
|
|
|
super._onDestroy();
|
|
}
|
|
|
|
_redisplay(id) {
|
|
this._sections[id].removeAll();
|
|
this._create(id);
|
|
}
|
|
|
|
_create(id) {
|
|
let places = this.placesManager.get(id);
|
|
|
|
for (let i = 0; i < places.length; i++)
|
|
this._sections[id].addMenuItem(new PlaceMenuItem(places[i]));
|
|
|
|
this._sections[id].actor.visible = places.length > 0;
|
|
}
|
|
});
|
|
|
|
function init() {
|
|
ExtensionUtils.initTranslations();
|
|
}
|
|
|
|
let _indicator;
|
|
|
|
function enable() {
|
|
_indicator = new PlacesMenu;
|
|
|
|
let pos = Main.sessionMode.panel.left.indexOf('appMenu');
|
|
if ('apps-menu' in Main.panel.statusArea)
|
|
pos++;
|
|
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
|
|
}
|
|
|
|
function disable() {
|
|
_indicator.destroy();
|
|
}
|