Search in sources :

Example 16 with Rect2i

use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.

the class RelativeLayout method onDraw.

@Override
public void onDraw(Canvas canvas) {
    for (WidgetInfo element : contents) {
        Rect2i drawRegion = getRegion(element, canvas);
        canvas.drawWidget(element.widget, drawRegion);
    }
    cachedRegions.clear();
}
Also used : Rect2i(org.terasology.math.geom.Rect2i)

Example 17 with Rect2i

use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.

the class RelativeLayout method getRegion.

private Rect2i getRegion(WidgetInfo element, Canvas canvas) {
    Rect2i cachedRegion = cachedRegions.get(element);
    if (cachedRegion != null) {
        return cachedRegion;
    }
    int left = 0;
    int right = canvas.size().x;
    int center = canvas.size().x / 2;
    if (element.layoutHint.getPositionCenterHorizontal() != null) {
        HorizontalInfo info = element.layoutHint.getPositionCenterHorizontal();
        Rect2i targetRegion = getTargetRegion(info.getWidget(), canvas);
        HorizontalAlign align = (info.getTarget() != null) ? info.getTarget() : HorizontalAlign.CENTER;
        center = align.getStart(targetRegion) + info.getOffset();
    }
    if (element.layoutHint.getPositionLeft() != null) {
        HorizontalInfo info = element.layoutHint.getPositionLeft();
        Rect2i targetRegion = getTargetRegion(info.getWidget(), canvas);
        HorizontalAlign align = (info.getTarget() != null) ? info.getTarget() : HorizontalAlign.LEFT;
        left = align.getStart(targetRegion) + info.getOffset();
    }
    if (element.layoutHint.getPositionRight() != null) {
        HorizontalInfo info = element.layoutHint.getPositionRight();
        Rect2i targetRegion = getTargetRegion(info.getWidget(), canvas);
        HorizontalAlign align = (info.getTarget() != null) ? info.getTarget() : HorizontalAlign.RIGHT;
        right = align.getStart(targetRegion) - info.getOffset();
    }
    int top = 0;
    int bottom = canvas.size().y;
    int vcenter = canvas.size().y / 2;
    if (element.layoutHint.getPositionCenterVertical() != null) {
        VerticalInfo info = element.layoutHint.getPositionCenterVertical();
        Rect2i targetRegion = getTargetRegion(info.getWidget(), canvas);
        VerticalAlign align = (info.getTarget() != null) ? info.getTarget() : VerticalAlign.MIDDLE;
        vcenter = align.getStart(targetRegion) + info.getOffset();
    }
    if (element.layoutHint.getPositionTop() != null) {
        VerticalInfo info = element.layoutHint.getPositionTop();
        Rect2i targetRegion = getTargetRegion(info.getWidget(), canvas);
        VerticalAlign align = (info.getTarget() != null) ? info.getTarget() : VerticalAlign.TOP;
        top = align.getStart(targetRegion) + info.getOffset();
    }
    if (element.layoutHint.getPositionBottom() != null) {
        VerticalInfo info = element.layoutHint.getPositionBottom();
        Rect2i targetRegion = getTargetRegion(info.getWidget(), canvas);
        VerticalAlign align = (info.getTarget() != null) ? info.getTarget() : VerticalAlign.BOTTOM;
        bottom = align.getStart(targetRegion) - info.getOffset();
    }
    int width = element.layoutHint.getWidth();
    if (width == 0 && element.layoutHint.isUsingContentWidth()) {
        width = canvas.calculateRestrictedSize(element.widget, new Vector2i(right - left, bottom - top)).x;
    }
    if (width == 0) {
        width = right - left;
    } else {
        if (element.layoutHint.getPositionCenterHorizontal() != null) {
            left = center - width / 2;
        } else if (element.layoutHint.getPositionRight() != null) {
            if (element.layoutHint.getPositionLeft() != null) {
                center = left + (right - left) / 2;
                left = center - width / 2;
            } else {
                left = right - width;
            }
        }
    }
    int height = element.layoutHint.getHeight();
    if (height == 0 && element.layoutHint.isUsingContentHeight()) {
        height = canvas.calculateRestrictedSize(element.widget, new Vector2i(width, bottom - top)).y;
    }
    if (height == 0) {
        height = bottom - top;
    } else {
        if (element.layoutHint.getPositionCenterVertical() != null) {
            top = vcenter - height / 2;
        } else if (element.layoutHint.getPositionBottom() != null) {
            if (element.layoutHint.getPositionTop() != null) {
                vcenter = top + (bottom - top) / 2;
                top = vcenter - height / 2;
            } else {
                top = bottom - height;
            }
        }
    }
    Rect2i region = Rect2i.createFromMinAndSize(left, top, width, height);
    cachedRegions.put(element, region);
    return region;
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) VerticalAlign(org.terasology.rendering.nui.VerticalAlign) HorizontalAlign(org.terasology.rendering.nui.HorizontalAlign) Vector2i(org.terasology.math.geom.Vector2i)

Example 18 with Rect2i

use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.

the class UIList method onDraw.

@Override
public void onDraw(Canvas canvas) {
    updateItemListeners();
    canvas.setPart("item");
    boolean enabled = isEnabled();
    Border margin = canvas.getCurrentStyle().getMargin();
    int yOffset = 0;
    for (int i = 0; i < list.get().size(); ++i) {
        T item = list.get().get(i);
        Vector2i preferredSize = margin.grow(itemRenderer.getPreferredSize(item, canvas));
        Rect2i itemRegion = Rect2i.createFromMinAndSize(0, yOffset, canvas.size().x, preferredSize.y);
        ItemInteractionListener listener = itemListeners.get(i);
        if (enabled) {
            if (Objects.equals(item, selection.get())) {
                canvas.setMode(ACTIVE_MODE);
            } else if (listener.isMouseOver()) {
                canvas.setMode(HOVER_MODE);
            } else {
                canvas.setMode(DEFAULT_MODE);
            }
            if (isInteractive()) {
                canvas.addInteractionRegion(listener, itemRenderer.getTooltip(item), itemRegion);
            }
        } else {
            canvas.setMode(DISABLED_MODE);
        }
        canvas.drawBackground(itemRegion);
        itemRenderer.draw(item, canvas, margin.shrink(itemRegion));
        yOffset += preferredSize.getY();
    }
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) Vector2i(org.terasology.math.geom.Vector2i) Border(org.terasology.math.Border)

Example 19 with Rect2i

use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.

the class UIScrollingText method onDraw.

/**
 * Handles how this {@code UIScrollingText} is drawn.
 * This is called every frame.
 *
 * @param canvas The {@link Canvas} on which this {@code UIScrollingText} is drawn
 */
@Override
public void onDraw(Canvas canvas) {
    if (isScrolling) {
        updateYValues(canvas);
    }
    Font font = canvas.getCurrentStyle().getFont();
    int w = canvas.size().x / 2;
    boolean finished = true;
    for (Entry<String, Integer> entry : textY.entrySet()) {
        int y = entry.getValue();
        // ignores offsets
        if (y >= -offsetTop && y <= canvas.size().y - offsetBottom + font.getHeight(entry.getKey())) {
            String line = entry.getKey();
            Rect2i coords = Rect2i.createFromMinAndSize(w - font.getWidth(line) / 2, y, font.getWidth(line), font.getHeight(line));
            canvas.drawText(entry.getKey(), coords);
        }
        if (y >= -offsetTop) {
            finished = false;
        }
    }
    if (finished && autoReset) {
        resetScrolling();
    }
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) Font(org.terasology.rendering.assets.font.Font)

Example 20 with Rect2i

use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.

the class UIText method drawSelection.

/**
 * Draws the selection indication which indicates that a certain part of the text is selected.
 *
 * @param canvas The canvas on which the widget resides
 */
protected void drawSelection(Canvas canvas) {
    Font font = canvas.getCurrentStyle().getFont();
    String currentText = getText();
    int start = Math.min(getCursorPosition(), selectionStart);
    int end = Math.max(getCursorPosition(), selectionStart);
    Color textColor = canvas.getCurrentStyle().getTextColor();
    int canvasWidth = (multiline) ? canvas.size().x : Integer.MAX_VALUE;
    // TODO: Support different text alignments
    List<String> rawLinesAfterCursor = TextLineBuilder.getLines(font, currentText, Integer.MAX_VALUE);
    int currentChar = 0;
    int lineOffset = 0;
    for (int lineIndex = 0; lineIndex < rawLinesAfterCursor.size() && currentChar <= end; ++lineIndex) {
        String line = rawLinesAfterCursor.get(lineIndex);
        List<String> innerLines = TextLineBuilder.getLines(font, line, canvasWidth);
        for (int innerLineIndex = 0; innerLineIndex < innerLines.size() && currentChar <= end; ++innerLineIndex) {
            String innerLine = innerLines.get(innerLineIndex);
            String selectionString;
            int offsetX = 0;
            if (currentChar + innerLine.length() < start) {
                selectionString = "";
            } else if (currentChar < start) {
                offsetX = font.getWidth(innerLine.substring(0, start - currentChar));
                selectionString = innerLine.substring(start - currentChar, Math.min(end - currentChar, innerLine.length()));
            } else if (currentChar + innerLine.length() >= end) {
                selectionString = innerLine.substring(0, end - currentChar);
            } else {
                selectionString = innerLine;
            }
            if (!selectionString.isEmpty()) {
                int selectionWidth = font.getWidth(selectionString);
                Vector2i selectionTopLeft = new Vector2i(offsetX, (lineOffset) * font.getLineHeight());
                Rect2i region = Rect2i.createFromMinAndSize(selectionTopLeft.x, selectionTopLeft.y, selectionWidth, font.getLineHeight());
                canvas.drawTexture(cursorTexture, region, textColor);
                canvas.drawTextRaw(FontUnderline.strip(FontColor.stripColor(selectionString)), font, textColor.inverse(), region);
            }
            currentChar += innerLine.length();
            lineOffset++;
        }
        currentChar++;
    }
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) FontColor(org.terasology.rendering.FontColor) Color(org.terasology.rendering.nui.Color) Vector2i(org.terasology.math.geom.Vector2i) Font(org.terasology.rendering.assets.font.Font)

Aggregations

Rect2i (org.terasology.math.geom.Rect2i)59 Vector2i (org.terasology.math.geom.Vector2i)13 SubRegion (org.terasology.rendering.nui.SubRegion)8 BaseVector2i (org.terasology.math.geom.BaseVector2i)7 Font (org.terasology.rendering.assets.font.Font)5 LayoutHint (org.terasology.rendering.nui.LayoutHint)5 SurfaceHeightFacet (org.terasology.world.generation.facets.SurfaceHeightFacet)4 ByteBuffer (java.nio.ByteBuffer)3 List (java.util.List)3 Color (org.terasology.rendering.nui.Color)3 BufferedImage (java.awt.image.BufferedImage)2 Test (org.junit.Test)2 UIWidget (org.terasology.rendering.nui.UIWidget)2 FallbackParagraphRenderStyle (org.terasology.rendering.nui.widgets.browser.ui.style.FallbackParagraphRenderStyle)2 ParagraphRenderStyle (org.terasology.rendering.nui.widgets.browser.ui.style.ParagraphRenderStyle)2 Maps (com.google.common.collect.Maps)1 Sets (com.google.common.collect.Sets)1 TIntList (gnu.trove.list.TIntList)1 Graphics2D (java.awt.Graphics2D)1 DataBufferInt (java.awt.image.DataBufferInt)1