Resolve cyclic dependency on StatusMenu
Solved by splitting the base class (PanelMenuButton) in a separate module, ui.panelMenu, which is meant to hold also other reusable button classes. https://bugzilla.gnome.org/show_bug.cgi?id=621705
This commit is contained in:
parent
d2902cb70f
commit
5a7201ef4d
@ -23,6 +23,7 @@ dist_jsui_DATA = \
|
|||||||
notificationDaemon.js \
|
notificationDaemon.js \
|
||||||
overview.js \
|
overview.js \
|
||||||
panel.js \
|
panel.js \
|
||||||
|
panelMenu.js \
|
||||||
placeDisplay.js \
|
placeDisplay.js \
|
||||||
popupMenu.js \
|
popupMenu.js \
|
||||||
runDialog.js \
|
runDialog.js \
|
||||||
|
@ -21,6 +21,8 @@ const BoxPointer = imports.ui.boxpointer;
|
|||||||
const Calendar = imports.ui.calendar;
|
const Calendar = imports.ui.calendar;
|
||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
|
const StatusMenu = imports.ui.statusMenu;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
@ -176,38 +178,6 @@ TextShadower.prototype = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function PanelMenuButton(menuAlignment) {
|
|
||||||
this._init(menuAlignment);
|
|
||||||
}
|
|
||||||
|
|
||||||
PanelMenuButton.prototype = {
|
|
||||||
_init: function(menuAlignment) {
|
|
||||||
this.actor = new St.Bin({ style_class: 'panel-button',
|
|
||||||
reactive: true,
|
|
||||||
x_fill: true,
|
|
||||||
y_fill: false,
|
|
||||||
track_hover: true });
|
|
||||||
this.actor._delegate = this;
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
|
||||||
this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, /* FIXME */ 0);
|
|
||||||
this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
|
||||||
Main.chrome.addActor(this.menu.actor, { visibleInOverview: true,
|
|
||||||
affectsStruts: false });
|
|
||||||
this.menu.actor.hide();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onButtonPress: function(actor, event) {
|
|
||||||
this.menu.toggle();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onOpenStateChanged: function(menu, open) {
|
|
||||||
if (open)
|
|
||||||
this.actor.add_style_pseudo_class('pressed');
|
|
||||||
else
|
|
||||||
this.actor.remove_style_pseudo_class('pressed');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AppMenuButton:
|
* AppMenuButton:
|
||||||
*
|
*
|
||||||
@ -221,10 +191,10 @@ function AppMenuButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AppMenuButton.prototype = {
|
AppMenuButton.prototype = {
|
||||||
__proto__: PanelMenuButton.prototype,
|
__proto__: PanelMenu.Button.prototype,
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
PanelMenuButton.prototype._init.call(this, St.Align.START);
|
PanelMenu.Button.prototype._init.call(this, St.Align.START);
|
||||||
this._metaDisplay = global.screen.get_display();
|
this._metaDisplay = global.screen.get_display();
|
||||||
|
|
||||||
this._focusedApp = null;
|
this._focusedApp = null;
|
||||||
@ -510,10 +480,10 @@ function ClockButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ClockButton.prototype = {
|
ClockButton.prototype = {
|
||||||
__proto__: PanelMenuButton.prototype,
|
__proto__: PanelMenu.Button.prototype,
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
PanelMenuButton.prototype._init.call(this, St.Align.START);
|
PanelMenu.Button.prototype._init.call(this, St.Align.START);
|
||||||
this.menu.addAction(_("Preferences"), Lang.bind(this, this._onPrefs));
|
this.menu.addAction(_("Preferences"), Lang.bind(this, this._onPrefs));
|
||||||
|
|
||||||
this._clock = new St.Label();
|
this._clock = new St.Label();
|
||||||
@ -847,9 +817,6 @@ Panel.prototype = {
|
|||||||
}));
|
}));
|
||||||
this._traymanager.manage_stage(global.stage);
|
this._traymanager.manage_stage(global.stage);
|
||||||
|
|
||||||
// We need to do this here to avoid a circular import with
|
|
||||||
// prototype dependencies.
|
|
||||||
let StatusMenu = imports.ui.statusMenu;
|
|
||||||
this._statusmenu = new StatusMenu.StatusMenuButton();
|
this._statusmenu = new StatusMenu.StatusMenuButton();
|
||||||
this._menus.addMenu(this._statusmenu.menu);
|
this._menus.addMenu(this._statusmenu.menu);
|
||||||
this._rightBox.add(this._statusmenu.actor);
|
this._rightBox.add(this._statusmenu.actor);
|
||||||
|
38
js/ui/panelMenu.js
Normal file
38
js/ui/panelMenu.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
const St = imports.gi.St;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
function Button(menuAlignment) {
|
||||||
|
this._init(menuAlignment);
|
||||||
|
}
|
||||||
|
|
||||||
|
Button.prototype = {
|
||||||
|
_init: function(menuAlignment) {
|
||||||
|
this.actor = new St.Bin({ style_class: 'panel-button',
|
||||||
|
reactive: true,
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: false,
|
||||||
|
track_hover: true });
|
||||||
|
this.actor._delegate = this;
|
||||||
|
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||||
|
this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, /* FIXME */ 0);
|
||||||
|
this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
|
||||||
|
Main.chrome.addActor(this.menu.actor, { visibleInOverview: true,
|
||||||
|
affectsStruts: false });
|
||||||
|
this.menu.actor.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onButtonPress: function(actor, event) {
|
||||||
|
this.menu.toggle();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onOpenStateChanged: function(menu, open) {
|
||||||
|
if (open)
|
||||||
|
this.actor.add_style_pseudo_class('pressed');
|
||||||
|
else
|
||||||
|
this.actor.remove_style_pseudo_class('pressed');
|
||||||
|
}
|
||||||
|
};
|
@ -11,6 +11,7 @@ const _ = Gettext.gettext;
|
|||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
// Adapted from gdm/gui/user-switch-applet/applet.c
|
// Adapted from gdm/gui/user-switch-applet/applet.c
|
||||||
@ -23,10 +24,10 @@ function StatusMenuButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StatusMenuButton.prototype = {
|
StatusMenuButton.prototype = {
|
||||||
__proto__: Panel.PanelMenuButton.prototype,
|
__proto__: PanelMenu.Button.prototype,
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
Panel.PanelMenuButton.prototype._init.call(this, St.Align.START);
|
PanelMenu.Button.prototype._init.call(this, St.Align.START);
|
||||||
let box = new St.BoxLayout({ name: 'panelStatusMenu' });
|
let box = new St.BoxLayout({ name: 'panelStatusMenu' });
|
||||||
this.actor.set_child(box);
|
this.actor.set_child(box);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user