@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return Vector2i.zero(); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return Vector2i.zero(); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return Vector2i.zero(); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return Vector2i.zero(); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { if (content != null) { return canvas.calculateRestrictedSize(content, sizeHint); } return Vector2i.zero(); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { if (!contents.isEmpty()) { return canvas.calculateRestrictedSize(contents.get(currentTab), sizeHint); } return Vector2i.zero(); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return sectionRegion == null ? Vector2i.zero() : sectionRegion.size(); }
@Override public Vector2i getMaxContentSize(Canvas canvas) { return getPreferredContentSize(canvas, Vector2i.zero()); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { if (isImageExists()) { return images.get(index).getPreferredContentSize(canvas, sizeHint); } return Vector2i.zero(); }
/** * Draws the widget with neither a horizontal or vertical scrollbar. * <p> * If the widget is too large in either axis, it will be cropped * * @param canvas The canvas to use * @param availableSize The available size for the layout */ private void drawWithNeither(Canvas canvas, Vector2i availableSize) { canvas.drawWidget(content, Rect2i.createFromMinAndSize(Vector2i.zero(), availableSize)); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { canvas.setPart(ICON_PART); if (icon != null) { Vector2i iconSize = getIconSize(canvas); int maxHorizontalIcons = sizeHint.x / iconSize.x; int rows = ((maxIcons - 1) / maxHorizontalIcons) + 1; int columns = Math.min(maxIcons, maxHorizontalIcons); return new Vector2i(columns * iconSize.x + (columns - 1) * spacing, rows * iconSize.y + (rows - 1) * spacing); } else { return Vector2i.zero(); } }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { int numSlots = getNumSlots(); if (numSlots == 0 || cells.isEmpty()) { return Vector2i.zero(); } Vector2i cellSize = canvas.calculatePreferredSize(cells.get(0)); if (cellSize.getX() == 0 || cellSize.getY() == 0) { return Vector2i.zero(); } int horizontalCells = Math.min(Math.min(maxHorizontalCells, numSlots), sizeHint.getX() / cellSize.getX()); int verticalCells = ((numSlots - 1) / horizontalCells) + 1; return new Vector2i(horizontalCells * cellSize.x, verticalCells * cellSize.y); }
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { if (image.get() != null) { return image.get().size(); } return Vector2i.zero(); }
@Override public Vector2i calculateRestrictedSize(UIWidget widget, Vector2i sizeRestrictions) { if (widget == null) { return sizeRestrictions; } String family = (widget.getFamily() != null) ? widget.getFamily() : state.family; UISkin skin = (widget.getSkin() != null) ? widget.getSkin() : state.skin; UIStyle elementStyle = skin.getStyleFor(family, widget.getClass(), UIWidget.BASE_PART, widget.getMode()); Rect2i region = applyStyleToSize(Rect2i.createFromMinAndSize(Vector2i.zero(), sizeRestrictions), elementStyle); try (SubRegion ignored = subRegionForWidget(widget, region, false)) { Vector2i preferredSize = widget.getPreferredContentSize(this, elementStyle.getMargin().shrink(sizeRestrictions)); preferredSize = elementStyle.getMargin().grow(preferredSize); return applyStyleToSize(preferredSize, elementStyle); } }
/** * Draw the widget with just a horizontal scrollbar. * <p> * If the content doesn't fit in the vertical axis, it will be cropped * * @param canvas The canvas to draw on * @param availableSize The available size for the layout. Does not include scrollbar size * @param contentSize The size of the widget to draw */ private void drawWithJustHorizontal(Canvas canvas, Vector2i availableSize, Vector2i contentSize) { Rect2i contentRegion = Rect2i.createFromMinAndSize(Vector2i.zero(), availableSize); canvas.addInteractionRegion(scrollListener); horizontalBar.setRange(contentSize.x - contentRegion.width()); int scrollbarHeight = canvas.calculateRestrictedSize(verticalBar, availableSize).y; canvas.drawWidget(horizontalBar, Rect2i.createFromMinAndSize( new Vector2i(0, availableSize.y), new Vector2i(availableSize.x, scrollbarHeight))); try (SubRegion ignored = canvas.subRegion(contentRegion, true)) { canvas.drawWidget(content, Rect2i.createFromMinAndSize(-horizontalBar.getValue(), 0, contentSize.x, availableSize.y)); } }
@Override public void drawWidget(UIWidget element, Rect2i region) { if (element == null || !element.isVisible()) { return; } if (nuiManager.getFocus() == element) { focusDrawn = true; } String family = (element.getFamily() != null) ? element.getFamily() : state.family; UISkin skin = (element.getSkin() != null) ? element.getSkin() : state.skin; UIStyle newStyle = skin.getStyleFor(family, element.getClass(), UIWidget.BASE_PART, element.getMode()); Rect2i regionArea; try (SubRegion ignored = subRegionForWidget(element, region, false)) { regionArea = applyStyleToSize(region, newStyle, calculateMaximumSize(element)); } try (SubRegion ignored = subRegionForWidget(element, regionArea, false)) { if (element.isSkinAppliedByCanvas()) { drawBackground(); try (SubRegion withMargin = subRegionForWidget(element, newStyle.getMargin().shrink(Rect2i.createFromMinAndSize(Vector2i.zero(), regionArea.size())), false)) { drawStyledWidget(element); } } else { drawStyledWidget(element); } } }
/** * Draws this widget with just a vertical scrollbar. * If the content doesn't fit in the horizontal axis, it will be cropped. * * @param canvas The canvas to draw on * @param availableSize The available size for the layout. Does not include scrollbar size * @param contentSize The size of the content */ private void drawWithJustVertical(Canvas canvas, Vector2i availableSize, Vector2i contentSize) { boolean atBottom = verticalBar.getRange() == verticalBar.getValue(); Rect2i contentRegion = Rect2i.createFromMinAndSize(Vector2i.zero(), availableSize); verticalBar.setRange(contentSize.y - contentRegion.height()); if ((stickToBottom && atBottom) || moveToBottomPending) { verticalBar.setValue(verticalBar.getRange()); moveToBottomPending = false; } if (moveToTopPending) { verticalBar.setValue(0); moveToTopPending = false; } canvas.addInteractionRegion(scrollListener); int scrollbarWidth = canvas.calculateRestrictedSize(verticalBar, availableSize).x; canvas.drawWidget(verticalBar, Rect2i.createFromMinAndSize( new Vector2i(availableSize.x, 0), new Vector2i(scrollbarWidth, availableSize.y))); try (SubRegion ignored = canvas.subRegion(contentRegion, true)) { canvas.drawWidget(content, Rect2i.createFromMinAndSize(0, -verticalBar.getValue(), availableSize.x, contentSize.y)); } }
boolean atBottom = verticalBar.getRange() == verticalBar.getValue(); Rect2i contentRegion = Rect2i.createFromMinAndSize(Vector2i.zero(), availableSize);
@Test public void testZoomInAndDrag() throws Exception { zoomableLayout.onDraw(canvas); //zoom in 2x towards left top corner zoomableLayout.zoom(0.5f, 0.5f, new Vector2i(0, 0)); zoomableLayout.onDraw(canvas); //world size halved assertEquals(zoomableLayout.getWindowSize(), new Vector2f(WORLD_WIDTH, WORLD_HEIGHT / 2)); assertEquals(zoomableLayout.getScreenSize(), new Vector2i(CANVAS_WIDTH, CANVAS_HEIGHT)); assertEquals(zoomableLayout.getPixelSize(), new Vector2f(CANVAS_WIDTH / WORLD_WIDTH, CANVAS_HEIGHT / (WORLD_HEIGHT / 2))); verify(canvas).drawWidget(item1, Rect2i.createFromMinAndMax(new Vector2i(ceilToInt(pos1.x), ceilToInt(pos1.y)), new Vector2i(ceilToInt(pos1.x + size1.x), ceilToInt(pos1.y + size1.y)))); verify(canvas).drawWidget(item2, Rect2i.createFromMinAndMax(new Vector2i(ceilToInt(pos2.x), ceilToInt(pos2.y)), new Vector2i(ceilToInt(pos2.x + size2.x), ceilToInt(pos2.y + size2.y)))); verify(canvas).drawWidget(item3, Rect2i.createFromMinAndMax(new Vector2i(ceilToInt(pos3.x), ceilToInt(pos3.y)), new Vector2i(ceilToInt(pos3.x + size3.x), ceilToInt(pos3.y + size3.y)))); //simulate drag to item2 zoomableLayout.setWindowPosition(pos2); zoomableLayout.onDraw(canvas); //item1 out of canvas verify(canvas).drawWidget(item1, Rect2i.createFromMinAndMax(new Vector2i(ceilToInt(pos1.x - pos2.x), ceilToInt(pos1.y - pos2.y)), new Vector2i(ceilToInt(pos1.x + size1.x - pos2.x), ceilToInt(pos1.y + size1.y - pos2.y)))); verify(canvas).drawWidget(item2, Rect2i.createFromMinAndMax(Vector2i.zero(), new Vector2i(ceilToInt(size2.x), ceilToInt(size2.y)))); verify(canvas).drawWidget(item3, Rect2i.createFromMinAndMax(new Vector2i(ceilToInt(pos3.x - pos2.x), ceilToInt(pos3.y - pos2.y)), new Vector2i(ceilToInt(pos3.x + size3.x - pos2.x), ceilToInt(pos3.y + size3.y - pos2.y)))); }