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:
Giovanni Campagna 2010-06-22 23:02:26 +02:00 committed by Dan Winship
parent d2902cb70f
commit 5a7201ef4d
4 changed files with 48 additions and 41 deletions

View File

@ -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 \

View File

@ -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
View 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');
}
};

View File

@ -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);