You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
3.8 KiB
199 lines
3.8 KiB
package net.tortuga.gui.widgets.layout;
|
|
|
|
|
|
import static org.lwjgl.opengl.GL11.*;
|
|
import net.tortuga.App;
|
|
import net.tortuga.gui.widgets.GuiRoot;
|
|
import net.tortuga.gui.widgets.IRefreshable;
|
|
import net.tortuga.gui.widgets.IWidget;
|
|
import net.tortuga.gui.widgets.Widget;
|
|
import net.tortuga.util.Align;
|
|
|
|
import com.porcupine.coord.Coord;
|
|
import com.porcupine.coord.Vec;
|
|
|
|
|
|
/**
|
|
* Frame for widgets (with shadow and border + background)
|
|
*
|
|
* @author Ondřej Hruška (MightyPork)
|
|
*/
|
|
public class FullWidthLayout extends Widget implements IRefreshable {
|
|
|
|
public int alignH = Align.CENTER;
|
|
public int alignV = Align.CENTER;
|
|
|
|
private Widget child = new Gap(0, 0);
|
|
|
|
|
|
public FullWidthLayout(Widget child) {
|
|
this();
|
|
add(child);
|
|
}
|
|
|
|
|
|
public FullWidthLayout(Widget child, int alignH, int alignV) {
|
|
this();
|
|
add(child);
|
|
this.alignH = alignH;
|
|
this.alignV = alignV;
|
|
}
|
|
|
|
|
|
public FullWidthLayout(int alignH, int alignV) {
|
|
this();
|
|
this.alignH = alignH;
|
|
this.alignV = alignV;
|
|
}
|
|
|
|
|
|
public FullWidthLayout() {
|
|
setMargins(0, 0, 0, 0);
|
|
}
|
|
|
|
|
|
/**
|
|
* Set the primary and only child.
|
|
*/
|
|
@Override
|
|
public void add(Widget child)
|
|
{
|
|
this.child = child;
|
|
setMinWidth(App.inst.getSize().xi());
|
|
child.setMinWidth(App.inst.getSize().xi() - child.getMargins().getHorizontal());
|
|
}
|
|
|
|
|
|
@Override
|
|
public void calcChildSizes()
|
|
{
|
|
child.calcChildSizes();
|
|
|
|
rect.setTo(0, 0, minSize.x, child.getSize().y);
|
|
|
|
//Coord lbPos = rect.getCenter();
|
|
Coord childMove = new Coord();
|
|
Coord sizeC = child.getSize();
|
|
|
|
switch (alignH) {
|
|
case Align.LEFT:
|
|
childMove.x = 0;
|
|
break;
|
|
case Align.RIGHT:
|
|
childMove.x = rect.getSize().x - sizeC.x;
|
|
break;
|
|
case Align.CENTER:
|
|
childMove.x = rect.getSize().x / 2 - sizeC.x / 2;
|
|
break;
|
|
}
|
|
|
|
// switch (alignV) {
|
|
// case Align.TOP:
|
|
// childMove.y = rect.getSize().y - sizeC.y;
|
|
// break;
|
|
// case Align.BOTTOM:
|
|
// childMove.y = 0;
|
|
// break;
|
|
// case Align.CENTER:
|
|
// childMove.y = rect.getSize().y / 2 - sizeC.y / 2;
|
|
// break;
|
|
// }
|
|
|
|
child.rect.add_ip(new Vec(childMove));
|
|
}
|
|
|
|
|
|
@Override
|
|
public Widget onKey(int key, char chr, boolean down)
|
|
{
|
|
if (!isVisible() || !isEnabled()) return null;
|
|
|
|
if (!child.isEnabled() || !child.isVisible()) return null;
|
|
return child.onKey(key, chr, down);
|
|
}
|
|
|
|
|
|
@Override
|
|
public Widget onMouseButton(Coord pos, int button, boolean down)
|
|
{
|
|
if (!isVisible() || !isEnabled()) return null;
|
|
|
|
Coord pos_r = pos.sub(rect.getMin());
|
|
|
|
if (!child.isEnabled() || !child.isVisible()) return null;
|
|
return child.onMouseButton(pos_r, button, down);
|
|
}
|
|
|
|
|
|
@Override
|
|
public Widget onScroll(Coord pos, int scroll)
|
|
{
|
|
if (!isVisible() || !isEnabled()) return null;
|
|
|
|
Coord pos_r = pos.sub(rect.getMin());
|
|
if (!child.isEnabled() || !child.isVisible()) return null;
|
|
return child.onScroll(pos_r, scroll);
|
|
}
|
|
|
|
|
|
@Override
|
|
public void handleStaticInputs(Coord pos)
|
|
{
|
|
if (!isVisible() || !isEnabled()) return;
|
|
|
|
Coord pos_r = pos.sub(rect.getMin());
|
|
|
|
if (!child.isEnabled() || !child.isVisible()) return;
|
|
child.handleStaticInputs(pos_r);
|
|
}
|
|
|
|
|
|
@Override
|
|
public void render(Coord mouse)
|
|
{
|
|
if (!isVisible()) return;
|
|
|
|
glPushMatrix();
|
|
glPushAttrib(GL_ENABLE_BIT);
|
|
|
|
glTranslated(rect.x1(), rect.y1(), 2);
|
|
child.render(mouse.sub(rect.getMin()));
|
|
|
|
glPopAttrib();
|
|
glPopMatrix();
|
|
}
|
|
|
|
|
|
public FullWidthLayout setAlignH(int align)
|
|
{
|
|
alignH = align;
|
|
return this;
|
|
}
|
|
|
|
|
|
public FullWidthLayout setAlignV(int align)
|
|
{
|
|
alignV = align;
|
|
return this;
|
|
}
|
|
|
|
|
|
@Override
|
|
public IWidget setGuiRoot(GuiRoot guiContainer)
|
|
{
|
|
super.setGuiRoot(guiContainer);
|
|
child.setGuiRoot(guiContainer);
|
|
|
|
guiContainer.scheduleRefresh(this);
|
|
return this;
|
|
}
|
|
|
|
|
|
@Override
|
|
public void refresh()
|
|
{
|
|
setMinWidth(App.inst.getSize().xi());
|
|
child.setMinWidth(App.inst.getSize().xi() - child.getMargins().getHorizontal());
|
|
calcChildSizes();
|
|
}
|
|
}
|
|
|