/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. ******************************************************************************/ package com.badlogic.gdx.scenes.scene2d.ui; import com.esotericsoftware.tablelayout.BaseTableLayout; import com.esotericsoftware.tablelayout.Cell; import com.esotericsoftware.tablelayout.Toolkit; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer; import com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer10; import com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer20; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.ui.TableToolkit.DebugRect; import com.badlogic.gdx.scenes.scene2d.utils.Layout; import com.badlogic.gdx.utils.Array; /** * The libgdx implementation to apply a table layout. * * @author Nathan Sweet */ class TableLayout extends BaseTableLayout<Actor, Table, TableLayout, TableToolkit> { Array<DebugRect> debugRects; private ImmediateModeRenderer debugRenderer; boolean round = true; public TableLayout() { super((TableToolkit) Toolkit.instance); } public void layout() { Table table = getTable(); float width = table.getWidth(); float height = table.getHeight(); super.layout(0, 0, width, height); java.util.List<Cell> cells = getCells(); if (round) { for (int i = 0, n = cells.size(); i < n; i++) { Cell c = cells.get(i); if (c.getIgnore()) continue; float widgetWidth = Math.round(c.getWidgetWidth()); float widgetHeight = Math.round(c.getWidgetHeight()); float widgetX = Math.round(c.getWidgetX()); float widgetY = height - Math.round(c.getWidgetY()) - widgetHeight; c.setWidgetX(widgetX); c.setWidgetY(widgetY); c.setWidgetWidth(widgetWidth); c.setWidgetHeight(widgetHeight); Actor actor = (Actor) c.getWidget(); if (actor != null) { actor.setX(widgetX); actor.setY(widgetY); if (actor.getWidth() != widgetWidth || actor.getHeight() != widgetHeight) { actor.setWidth(widgetWidth); actor.setHeight(widgetHeight); if (actor instanceof Layout) ((Layout) actor).invalidate(); } } } } else { for (int i = 0, n = cells.size(); i < n; i++) { Cell c = cells.get(i); if (c.getIgnore()) continue; float widgetWidth = c.getWidgetWidth(); float widgetHeight = c.getWidgetHeight(); float widgetX = c.getWidgetX(); float widgetY = height - c.getWidgetY() - widgetHeight; c.setWidgetX(widgetX); c.setWidgetY(widgetY); c.setWidgetWidth(widgetWidth); c.setWidgetHeight(widgetHeight); Actor actor = (Actor) c.getWidget(); if (actor != null) { actor.setX(widgetX); actor.setY(widgetY); if (actor.getWidth() != widgetWidth || actor.getHeight() != widgetHeight) { actor.setWidth(widgetWidth); actor.setHeight(widgetHeight); if (actor instanceof Layout) ((Layout) actor).invalidate(); } } } } // Validate children separately from sizing actors to ensure actors without a cell are validated. Array<Actor> children = table.getChildren(); for (int i = 0, n = children.size; i < n; i++) { Actor child = children.get(i); if (child instanceof Layout) ((Layout) child).validate(); } } /** Invalides the layout of this widget and every parent widget to the root of the hierarchy. */ public void invalidateHierarchy() { super.invalidate(); getTable().invalidateHierarchy(); } private void toStageCoordinates(Actor actor, Vector2 point) { point.x += actor.getX(); point.y += actor.getY(); toStageCoordinates(actor.getParent(), point); } public void drawDebug(SpriteBatch batch) { if (getDebug() == Debug.none || debugRects == null) return; if (debugRenderer == null) { if (Gdx.graphics.isGL20Available()) debugRenderer = new ImmediateModeRenderer20(64, false, true, 0); else debugRenderer = new ImmediateModeRenderer10(64); } float x = 0, y = 0; Actor parent = getTable(); while (parent != null) { if (parent instanceof Group) { x += parent.getX(); y += parent.getY(); } parent = parent.getParent(); } debugRenderer.begin(batch.getProjectionMatrix(), GL10.GL_LINES); for (int i = 0, n = debugRects.size; i < n; i++) { DebugRect rect = debugRects.get(i); float x1 = x + rect.x; float y1 = y + rect.y - rect.height; float x2 = x1 + rect.width; float y2 = y1 + rect.height; float r = rect.type == Debug.cell ? 1 : 0; float g = rect.type == Debug.widget ? 1 : 0; float b = rect.type == Debug.table ? 1 : 0; debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x1, y1, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x1, y2, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x1, y2, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x2, y2, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x2, y2, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x2, y1, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x2, y1, 0); debugRenderer.color(r, g, b, 1); debugRenderer.vertex(x1, y1, 0); if (debugRenderer.getNumVertices() == 64) { debugRenderer.end(); debugRenderer.begin(batch.getProjectionMatrix(), GL10.GL_LINES); } } debugRenderer.end(); } }