1d7c2b1c26
This allows us to automatically adjust the "spacing" property of the layout manager whenever the CSS changes.
90 lines
2.8 KiB
JavaScript
90 lines
2.8 KiB
JavaScript
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
const Lang = imports.lang;
|
|
const Clutter = imports.gi.Clutter;
|
|
const St = imports.gi.St;
|
|
|
|
function connectLayoutManager(layoutManager, styleChanged) {
|
|
let widget, styleChangedId;
|
|
|
|
function _styleChanged() {
|
|
let themeNode = widget.get_theme_node();
|
|
styleChanged(themeNode, widget);
|
|
}
|
|
|
|
function actorChanged() {
|
|
if (widget) {
|
|
widget.disconnect(styleChangedId);
|
|
styleChangedId = 0;
|
|
}
|
|
|
|
let actor = layoutManager.get_actor();
|
|
if (actor && actor instanceof St.Widget) {
|
|
widget = actor;
|
|
styleChangedId = widget.connect('style-changed', _styleChanged);
|
|
_styleChanged();
|
|
}
|
|
}
|
|
|
|
layoutManager.connect('notify::actor', actorChanged);
|
|
return layoutManager;
|
|
}
|
|
|
|
function connectSpacing(layoutManager) {
|
|
return connectLayoutManager(layoutManager, function(themeNode, widget) {
|
|
layoutManager.spacing = themeNode.get_length('spacing');
|
|
});
|
|
}
|
|
|
|
const CenterLayout = new Lang.Class({
|
|
Name: 'CenterLayout',
|
|
Extends: Clutter.BoxLayout,
|
|
|
|
vfunc_allocate: function(container, box, flags) {
|
|
let rtl = container.get_text_direction() == Clutter.TextDirection.RTL;
|
|
|
|
let availWidth = box.x2 - box.x1;
|
|
let availHeight = box.y2 - box.y1;
|
|
|
|
// Assume that these are the first three widgets and they are all visible.
|
|
let [left, center, right] = container.get_children();
|
|
|
|
// Only support horizontal layouts for now.
|
|
let [leftMinWidth, leftNaturalWidth] = left.get_preferred_width(availWidth);
|
|
let [centerMinWidth, centerNaturalWidth] = center.get_preferred_width(availWidth);
|
|
let [rightMinWidth, rightNaturalWidth] = right.get_preferred_width(availWidth);
|
|
|
|
let sideWidth = (availWidth - centerNaturalWidth) / 2;
|
|
|
|
let childBox = new Clutter.ActorBox();
|
|
childBox.y1 = box.y1;
|
|
childBox.y2 = box.y1 + availHeight;
|
|
|
|
let leftSide = Math.min(Math.floor(sideWidth), leftNaturalWidth);
|
|
if (rtl) {
|
|
childBox.x1 = availWidth - leftSide;
|
|
childBox.x2 = availWidth;
|
|
} else {
|
|
childBox.x1 = 0;
|
|
childBox.x2 = leftSide;
|
|
}
|
|
childBox.x1 += box.x1;
|
|
left.allocate(childBox, flags);
|
|
|
|
childBox.x1 = box.x1 + Math.ceil(sideWidth);
|
|
childBox.x2 = childBox.x1 + centerNaturalWidth;
|
|
center.allocate(childBox, flags);
|
|
|
|
let rightSide = Math.min(Math.floor(sideWidth), rightNaturalWidth);
|
|
if (rtl) {
|
|
childBox.x1 = 0;
|
|
childBox.x2 = rightSide;
|
|
} else {
|
|
childBox.x1 = availWidth - rightSide;
|
|
childBox.x2 = availWidth;
|
|
}
|
|
childBox.x1 += box.x1;
|
|
right.allocate(childBox, flags);
|
|
}
|
|
});
|