The coding style of using double quotes for translatable strings and single quotes otherwise is unnecessarily complex and cannot be enforced with an eslint rule. Simply use single quotes consistently for all strings. https://gitlab.gnome.org/GNOME/gnome-shell-extensions/merge_requests/57
147 lines
3.7 KiB
JavaScript
147 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 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 ExtensionUtils = imports.misc.extensionUtils;
|
|
const Me = ExtensionUtils.getCurrentExtension();
|
|
const PlaceDisplay = Me.imports.placeDisplay;
|
|
|
|
const PLACE_ICON_SIZE = 16;
|
|
|
|
class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|
constructor(info) {
|
|
super();
|
|
this._info = info;
|
|
|
|
this._icon = new St.Icon({
|
|
gicon: info.icon,
|
|
icon_size: PLACE_ICON_SIZE
|
|
});
|
|
this.actor.add_child(this._icon);
|
|
|
|
this._label = new St.Label({ text: info.name, x_expand: true });
|
|
this.actor.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.actor.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 = 1;
|
|
if ('apps-menu' in Main.panel.statusArea)
|
|
pos = 2;
|
|
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
|
|
}
|
|
|
|
function disable() {
|
|
_indicator.destroy();
|
|
}
|