package squidpony.squidgrid.gui.gdx;
import squidpony.squidmath.Coord;
/**
* A container that keeps tracks of the sizes of margins and cells. It is at the
* screen-level, i.e. it is intended to keep track of the full screen, not of a
* nested panel. Given the screen's size and the desired cell size, it computes
* the margins around the usable part of the screen, and hence the position of
* the full-screen SquidPanel ({@code (leftMargin,botMargin)}).
*
* @author smelC
*/
public class ScreenSizeManager {
/** The screen's width, as given at creation time. */
public final int screenWidth;
/** The screen's height, as given at creation time. */
public final int screenHeight;
/** The top margin */
public final int topMargin;
/**
* The bottom margin, which has at most a 1 pixel difference with
* {@link #topMargin}.
*/
public final int botMargin;
/** The left margin */
public final int leftMargin;
/**
* The right margin, which has at most a 1 pixel difference with
* {@link #leftMargin}.
*/
public final int rightMargin;
/** A cell's width, as given at creation time. */
public final int cellWidth;
/** A cell's height, as given at creation time. */
public final int cellHeight;
/** The number of cells, horizontally */
public final int wCells;
/** The number of cells, vertically */
public final int hCells;
/**
* A fresh size manager, for the given screen size and the given cell size.
*
* @param screenWidth
* @param screenHeight
* @param cellWidth
* The desired cell width.
* @param cellHeight
* The desired cell height.
* @throws IllegalStateException
* If a size is negative.
*/
public ScreenSizeManager(int screenWidth, int screenHeight, int cellWidth, int cellHeight) {
this.screenWidth = screenWidth;
if (this.screenWidth < 0)
throw new IllegalStateException("Screen width should not be negative");
this.screenHeight = screenHeight;
if (this.screenHeight < 0)
throw new IllegalStateException("Screen height should not be negative");
if (cellWidth < 0)
throw new IllegalStateException("Cell width should not be negative");
this.cellWidth = cellWidth;
if (cellHeight < 0)
throw new IllegalStateException("Cell height should not be negative");
this.cellHeight = cellHeight;
{
this.wCells = screenWidth / cellWidth;
final int xmargin = screenWidth - (wCells * cellWidth);
assert 0 <= xmargin;
final int xmargindiv2 = xmargin / 2;
if (isEven(xmargin)) {
this.leftMargin = xmargindiv2;
this.rightMargin = xmargindiv2;
} else {
this.leftMargin = xmargindiv2;
this.rightMargin = xmargindiv2 + 1;
}
assert leftMargin + rightMargin == xmargin;
}
{
this.hCells = screenHeight / cellHeight;
final int ymargin = screenHeight - (hCells * cellHeight);
assert 0 <= ymargin;
final int ymargindiv2 = ymargin / 2;
if (isEven(ymargin)) {
this.topMargin = ymargindiv2;
this.botMargin = ymargindiv2;
} else {
this.topMargin = ymargindiv2;
this.botMargin = ymargindiv2 + 1;
}
assert topMargin + botMargin == ymargin;
}
assert leftMargin + (wCells * cellWidth) + rightMargin == screenWidth;
assert botMargin + (hCells * cellHeight) + topMargin == screenHeight;
}
public void log() {
/*
Gdx.app.log(SquidTags.LAYOUT, String.format("Screen size: %dx%d", screenWidth, screenHeight));
Gdx.app.log(SquidTags.LAYOUT,
String.format("Displaying %d cells horizontally and %d cells vertically", wCells, hCells));
Gdx.app.log(SquidTags.LAYOUT,
String.format("Margins (in pixels): left:%d, right:%d, top:%d, bottom:%d", leftMargin,
rightMargin, topMargin, botMargin));
*/
}
public Coord toScreenSize() {
return Coord.get(screenWidth, screenHeight);
}
public ScreenSizeManager changeScreenSize(int x, int y) {
return new ScreenSizeManager(x, y, cellWidth, cellHeight);
}
private static boolean isEven(int i) {
return i % 2 == 0;
}
}