I’m using a custom layout which inherits from TreeLayout to draw shaded bands. The height of the bands is inconsistent, as shown by the red arrows in this image:
You can see here the bottom band is smaller than the others, causing the globe icon to be outside the band. For other diagrams this is a real problem, as there isn’t enough space to show the link (the links are green:the tiny blob of green you can see below the ‘cog’ nodes):
I need either the bands to be a consistent size, set in code (as all the nodes will have a similar size) or to adequately contain the nodes inside them, preferably with a bit of margin for aesthetics.
Here’s my layout:
function BandedTreeLayout() {
go.TreeLayout.call(this);
this.layerStyle = go.TreeLayout.LayerUniform;
this.sorting = go.TreeLayout.SortingAscending;
}
go.Diagram.inherit(BandedTreeLayout, go.TreeLayout);
BandedTreeLayout.prototype.commitLayers = function(layerRects, offset) {
var bands = this.diagram.findPartForKey("_BANDS");
if (bands) {
var model = this.diagram.model;
bands.location = this.arrangementOrigin.copy().add(offset);
var arr = bands.data.itemArray;
for (var i = 0; i < layerRects.length; i++) {
var itemdata = arr[i];
if (itemdata) {
var size = layerRects[i];
// I've tried various things here, but they only affect the last band...
//size.height = 600;
//size.addMargin(new go.Margin(50));
model.setDataProperty(itemdata, "bounds", size);
}
}
}
if (window.console) console.log('Layers: ' + layerRects.length);
for (var it = this.network.vertexes.iterator; it.next();) {
var v = it.value;
var n = v.node;
if (!n.data.dns) {
continue;
}
if (layerRects[n.data.tierOffset]) {
var pos = v.bounds.position;
pos.y = layerRects[n.data.tierOffset].y;
n.move(pos);
} else {
if (window.console) console.log('Could not find layerRects with offset ' + n.data.tierOffset);
}
}
};
// end BandedTreeLayout
And here’s the bands template (wrapped in a function as it’s called by a couple of different diagrams) with some comments from me about what I’ve tried:
function getBandsTemplate($) {
return $(go.Part, "Position",
new go.Binding("itemArray"),
{
isLayoutPositioned: false,
layerName: "Background",
pickable: false,
selectable: false,
itemTemplate:
$(go.Panel, HORIZONTAL ? "Vertical" : "Horizontal",
new go.Binding("position", "bounds", function(b) {
return b.position;
}),
new go.Binding("desiredSize", "bounds", function (r) {
if (r.size.height < 300) r.size.height = 300; // this does nothing
return r.size;
}),
$(go.Shape,
{ stroke: null, strokeWidth: 0 },
new go.Binding("desiredSize", "bounds", function (r) {
return r.size; // tried various things here to no avail
}),
new go.Binding("fill", "itemIndex", function(i) {
return i % 2 === 0 ? "#FFFFFF" : "#EEEEEE";
}).ofObject())
)
});
}
I’m calling the layout like this, again with additional comments for what I’ve tried:
layout: $(BandedTreeLayout,
{
angle: HORIZONTAL ? 0 : 90,
arrangement: HORIZONTAL ? go.TreeLayout.ArrangementVertical : go.TreeLayout.ArrangementHorizontal,
layerSpacing: 100, // affects all bands, meaning some are too big
nodeSpacing: 100 // does not help this problem
})
Thanks.