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();
}
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;
}
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();
}
}
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();
}
}
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++;
}
}
Aggregations