panel: allow padding around panel buttons to shrink

for narrow screens (eg, portrait orientation)

https://bugzilla.gnome.org/show_bug.cgi?id=651299
This commit is contained in:
Dan Winship 2011-06-09 11:50:24 -04:00
parent ab67c0f8b0
commit ae00f86887
6 changed files with 114 additions and 28 deletions

View File

@ -339,7 +339,8 @@ StTooltip StLabel {
} }
.panel-button { .panel-button {
padding: 0px 12px; -natural-hpadding: 12px;
-minimum-hpadding: 6px;
font-weight: bold; font-weight: bold;
color: #ccc; color: #ccc;
transition-duration: 100; transition-duration: 100;

View File

@ -60,7 +60,7 @@ DateMenuButton.prototype = {
PanelMenu.Button.prototype._init.call(this, menuAlignment); PanelMenu.Button.prototype._init.call(this, menuAlignment);
this._clock = new St.Label(); this._clock = new St.Label();
this.actor.set_child(this._clock); this.actor.add_actor(this._clock);
hbox = new St.BoxLayout({name: 'calendarArea' }); hbox = new St.BoxLayout({name: 'calendarArea' });
this.menu.addActor(hbox); this.menu.addActor(hbox);

View File

@ -249,7 +249,7 @@ AppMenuButton.prototype = {
this._targetApp = null; this._targetApp = null;
let bin = new St.Bin({ name: 'appMenu' }); let bin = new St.Bin({ name: 'appMenu' });
this.actor.set_child(bin); this.actor.add_actor(bin);
this.actor.reactive = false; this.actor.reactive = false;
this._targetIsCurrent = false; this._targetIsCurrent = false;
@ -564,10 +564,10 @@ ActivitiesButton.prototype = {
PanelMenu.Button.prototype._init.call(this, 0.0); PanelMenu.Button.prototype._init.call(this, 0.0);
let container = new Shell.GenericContainer(); let container = new Shell.GenericContainer();
container.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
container.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight)); container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight));
container.connect('allocate', Lang.bind(this, this._allocate)); container.connect('allocate', Lang.bind(this, this._containerAllocate));
this.actor.child = container; this.actor.add_actor(container);
this.actor.name = 'panelActivities'; this.actor.name = 'panelActivities';
/* Translators: If there is no suitable word for "Activities" /* Translators: If there is no suitable word for "Activities"
@ -599,15 +599,15 @@ ActivitiesButton.prototype = {
this._xdndTimeOut = 0; this._xdndTimeOut = 0;
}, },
_getPreferredWidth: function(actor, forHeight, alloc) { _containerGetPreferredWidth: function(actor, forHeight, alloc) {
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_width(forHeight); [alloc.min_size, alloc.natural_size] = this._label.get_preferred_width(forHeight);
}, },
_getPreferredHeight: function(actor, forWidth, alloc) { _containerGetPreferredHeight: function(actor, forWidth, alloc) {
[alloc.min_size, alloc.natural_size] = this._label.get_preferred_height(forWidth); [alloc.min_size, alloc.natural_size] = this._label.get_preferred_height(forWidth);
}, },
_allocate: function(actor, box, flags) { _containerAllocate: function(actor, box, flags) {
this._label.allocate(box, flags); this._label.allocate(box, flags);
// The hot corner needs to be outside any padding/alignment // The hot corner needs to be outside any padding/alignment
@ -1102,16 +1102,17 @@ Panel.prototype = {
} }
icon.height = PANEL_ICON_SIZE; icon.height = PANEL_ICON_SIZE;
let bin = new St.Bin({ style_class: 'panel-button' }); let buttonBox = new PanelMenu.ButtonBox();
bin.child = icon; let box = buttonBox.actor;
box.add_actor(icon);
this._insertStatusItem(bin, this._status_area_order.indexOf(role)); this._insertStatusItem(box, this._status_area_order.indexOf(role));
}, },
_onTrayIconRemoved: function(o, icon) { _onTrayIconRemoved: function(o, icon) {
let bin = icon.get_parent(); let box = icon.get_parent();
if (bin && bin instanceof St.Bin) if (box && box._delegate instanceof PanelMenu.ButtonBox)
bin.destroy(); box.destroy();
}, },
}; };

View File

@ -2,26 +2,110 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang;
const PopupMenu = imports.ui.popupMenu;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu;
function ButtonBox(params) {
this._init.apply(this, arguments);
};
ButtonBox.prototype = {
_init: function(params) {
params = Params.parse(params, { style_class: 'panel-button' }, true);
this.actor = new Shell.GenericContainer(params);
this.actor._delegate = this;
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged));
this._minHPadding = this._natHPadding = 0.0;
},
_onStyleChanged: function(actor) {
let themeNode = actor.get_theme_node();
this._minHPadding = themeNode.get_length('-minimum-hpadding');
this._natHPadding = themeNode.get_length('-natural-hpadding');
},
_getPreferredWidth: function(actor, forHeight, alloc) {
let children = actor.get_children();
let child = children.length > 0 ? children[0] : null;
if (child) {
[alloc.min_size, alloc.natural_size] = child.get_preferred_width(-1);
} else {
alloc.min_size = alloc.natural_size = 0;
}
alloc.min_size += 2 * this._minHPadding;
alloc.natural_size += 2 * this._natHPadding;
},
_getPreferredHeight: function(actor, forWidth, alloc) {
let children = actor.get_children();
let child = children.length > 0 ? children[0] : null;
if (child) {
[alloc.min_size, alloc.natural_size] = child.get_preferred_height(-1);
} else {
alloc.min_size = alloc.natural_size = 0;
}
},
_allocate: function(actor, box, flags) {
let children = actor.get_children();
if (children.length == 0)
return;
let child = children[0];
let [minWidth, natWidth] = child.get_preferred_width(-1);
let [minHeight, natHeight] = child.get_preferred_height(-1);
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
let childBox = new Clutter.ActorBox();
if (natWidth + 2 * this._natHPadding <= availWidth) {
childBox.x1 = this._natHPadding;
childBox.x2 = availWidth - this._natHPadding;
} else {
childBox.x1 = this._minHPadding;
childBox.x2 = availWidth - this._minHPadding;
}
if (natHeight <= availHeight) {
childBox.y1 = Math.floor((availHeight - natHeight) / 2);
childBox.y2 = childBox.y1 + natHeight;
} else {
childBox.y1 = 0;
childBox.y2 = availHeight;
}
child.allocate(childBox, flags);
},
}
function Button(menuAlignment) { function Button(menuAlignment) {
this._init(menuAlignment); this._init(menuAlignment);
} }
Button.prototype = { Button.prototype = {
__proto__: ButtonBox.prototype,
_init: function(menuAlignment) { _init: function(menuAlignment) {
this.actor = new St.Bin({ style_class: 'panel-button', ButtonBox.prototype._init.call(this, { reactive: true,
reactive: true,
can_focus: true, can_focus: true,
x_fill: true,
y_fill: false,
track_hover: true }); track_hover: true });
this.actor._delegate = this;
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress)); this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP); this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP);
@ -112,7 +196,7 @@ SystemStatusButton.prototype = {
this._iconActor = new St.Icon({ icon_name: iconName, this._iconActor = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC, icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon' }); style_class: 'system-status-icon' });
this.actor.set_child(this._iconActor); this.actor.add_actor(this._iconActor);
this.actor.add_style_class_name('panel-status-button'); this.actor.add_style_class_name('panel-status-button');
this.setTooltip(tooltipText); this.setTooltip(tooltipText);
}, },

View File

@ -52,7 +52,7 @@ XKBIndicator.prototype = {
this._container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth)); this._container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
this._container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight)); this._container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight));
this._container.connect('allocate', Lang.bind(this, this._containerAllocate)); this._container.connect('allocate', Lang.bind(this, this._containerAllocate));
this.actor.set_child(this._container); this.actor.add_actor(this._container);
this.actor.add_style_class_name('panel-status-button'); this.actor.add_style_class_name('panel-status-button');
this._iconActor = new St.Icon({ icon_name: 'keyboard', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' }); this._iconActor = new St.Icon({ icon_name: 'keyboard', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });

View File

@ -364,7 +364,7 @@ UserMenuButton.prototype = {
_init: function() { _init: function() {
PanelMenu.Button.prototype._init.call(this, 0.0); PanelMenu.Button.prototype._init.call(this, 0.0);
let box = new St.BoxLayout({ name: 'panelUserMenu' }); let box = new St.BoxLayout({ name: 'panelUserMenu' });
this.actor.set_child(box); this.actor.add_actor(box);
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });