@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { canvas.setPart(TREE_NODE); if (model.get().getNodeCount() == 0) { return new Vector2i(); } model.get().setEnumerateExpandedOnly(false); Vector2i result = new Vector2i(); for (int i = 0; i < model.get().getNodeCount(); i++) { Tree<T> node = model.get().getNode(i); Vector2i preferredSize = canvas.getCurrentStyle().getMargin() .grow(itemRenderer.getPreferredSize(node.getValue(), canvas) .addX(node.getDepth() * levelIndent.get())); result.x = Math.max(result.x, preferredSize.x); result.y += preferredSize.y; } model.get().setEnumerateExpandedOnly(true); // Account for the expand/contract button! result.addX(levelIndent.get()); return result; }
@Override public Vector2i getPreferredSize(T value, Canvas canvas) { Font font = canvas.getCurrentStyle().getFont(); String text = getString(value); TextureRegion texture = getTexture(value); if (texture == null) { List<String> lines = TextLineBuilder.getLines(font, text, canvas.size().x); return font.getSize(lines); } else { int iconWidth = marginLeft + texture.getWidth() + marginRight; List<String> lines = TextLineBuilder.getLines(font, text, canvas.size().x - iconWidth); return font.getSize(lines).addX(iconWidth); } }
@Override public void onDraw(Canvas canvas) { canvas.addInteractionRegion(mainListener); Vector2i currentPosition = null; int currentWidth = 0; for (UIList<AbstractContextMenuItem> level : menuWidgets) { if (level.isVisible()) { if (currentPosition == null) { currentPosition = new Vector2i(position); } else { currentPosition.addX(currentWidth); } Rect2i region = Rect2i.createFromMinAndSize(currentPosition, canvas.calculatePreferredSize(level)); double percentageThreshold = 0.9; if (region.maxY() > canvas.getRegion().height() * percentageThreshold) { region = Rect2i.createFromMinAndMax(region.minX(), region.minY() - (region.maxY() - canvas.getRegion().height()) - (int) (canvas.getRegion().height() * (1 - percentageThreshold)), region.maxX(), canvas.getRegion().height()); } currentWidth = canvas.calculatePreferredSize(level).getX() - 8; canvas.drawWidget(level, region); } } }
.grow(itemRenderer.getPreferredSize(node.getValue(), canvas).addX(node.getDepth() * levelIndent.get())) .getY();