Move GUI framework to subproject
This commit is contained in:
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "jGui"]
|
||||||
|
path = jGui
|
||||||
|
url = https://github.com/ReplayMod/jGui
|
||||||
@@ -60,6 +60,8 @@ dependencies {
|
|||||||
|
|
||||||
compile 'org.aspectj:aspectjrt:1.8.2'
|
compile 'org.aspectj:aspectjrt:1.8.2'
|
||||||
|
|
||||||
|
compile project(':jGui')
|
||||||
|
|
||||||
// you may put jars on which you depend on in ./libs
|
// you may put jars on which you depend on in ./libs
|
||||||
// or you may define them like so..
|
// or you may define them like so..
|
||||||
//compile "some.group:artifact:version:classifier"
|
//compile "some.group:artifact:version:classifier"
|
||||||
|
|||||||
1
jGui
Submodule
1
jGui
Submodule
Submodule jGui added at 74f8c2197f
1
settings.gradle
Normal file
1
settings.gradle
Normal file
@@ -0,0 +1 @@
|
|||||||
|
include 'jGui'
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui;
|
|
||||||
|
|
||||||
import net.minecraft.client.renderer.texture.ITextureObject;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public interface GuiRenderer {
|
|
||||||
|
|
||||||
ReadablePoint getOpenGlOffset();
|
|
||||||
|
|
||||||
ReadableDimension getSize();
|
|
||||||
|
|
||||||
void setDrawingArea(int x, int y, int width, int height);
|
|
||||||
|
|
||||||
void bindTexture(ResourceLocation location);
|
|
||||||
|
|
||||||
void bindTexture(ITextureObject texture);
|
|
||||||
|
|
||||||
void drawTexturedRect(int x, int y, int u, int v, int width, int height);
|
|
||||||
|
|
||||||
void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight);
|
|
||||||
|
|
||||||
void drawRect(int x, int y, int width, int height, int color);
|
|
||||||
|
|
||||||
void drawRect(int x, int y, int width, int height, ReadableColor color);
|
|
||||||
|
|
||||||
void drawRect(int x, int y, int width, int height, int topLeftColor, int topRightColor, int bottomLeftColor, int bottomRightColor);
|
|
||||||
|
|
||||||
void drawRect(int x, int y, int width, int height, ReadableColor topLeftColor, ReadableColor topRightColor, ReadableColor bottomLeftColor, ReadableColor bottomRightColor);
|
|
||||||
|
|
||||||
int drawString(int x, int y, int color, String text);
|
|
||||||
|
|
||||||
int drawString(int x, int y, ReadableColor color, String text);
|
|
||||||
|
|
||||||
int drawCenteredString(int x, int y, int color, String text);
|
|
||||||
|
|
||||||
int drawCenteredString(int x, int y, ReadableColor color, String text);
|
|
||||||
|
|
||||||
int drawString(int x, int y, int color, String text, boolean shadow);
|
|
||||||
|
|
||||||
int drawString(int x, int y, ReadableColor color, String text, boolean shadow);
|
|
||||||
|
|
||||||
int drawCenteredString(int x, int y, int color, String text, boolean shadow);
|
|
||||||
|
|
||||||
int drawCenteredString(int x, int y, ReadableColor color, String text, boolean shadow);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui;
|
|
||||||
|
|
||||||
import lombok.NonNull;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.gui.Gui;
|
|
||||||
import net.minecraft.client.gui.ScaledResolution;
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
|
||||||
import net.minecraft.client.renderer.Tessellator;
|
|
||||||
import net.minecraft.client.renderer.WorldRenderer;
|
|
||||||
import net.minecraft.client.renderer.texture.ITextureObject;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
import org.lwjgl.util.Color;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
import static net.minecraft.client.renderer.GlStateManager.*;
|
|
||||||
import static org.lwjgl.opengl.GL11.*;
|
|
||||||
|
|
||||||
public class MinecraftGuiRenderer implements GuiRenderer {
|
|
||||||
|
|
||||||
private final Gui gui = new Gui();
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final ScaledResolution size;
|
|
||||||
|
|
||||||
public MinecraftGuiRenderer(ScaledResolution size) {
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadablePoint getOpenGlOffset() {
|
|
||||||
return new Point(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getSize() {
|
|
||||||
return new ReadableDimension() {
|
|
||||||
@Override
|
|
||||||
public int getWidth() {
|
|
||||||
return size.getScaledWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return size.getScaledHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getSize(WritableDimension dest) {
|
|
||||||
dest.setSize(getWidth(), getHeight());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setDrawingArea(int x, int y, int width, int height) {
|
|
||||||
// glScissor origin is bottom left corner whereas otherwise it's top left
|
|
||||||
y = size.getScaledHeight() - y - height;
|
|
||||||
|
|
||||||
int f = size.getScaleFactor();
|
|
||||||
GL11.glScissor(x * f, y * f, width * f, height * f);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void bindTexture(ResourceLocation location) {
|
|
||||||
Minecraft.getMinecraft().getTextureManager().bindTexture(location);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void bindTexture(ITextureObject texture) {
|
|
||||||
GlStateManager.bindTexture(texture.getGlTextureId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawTexturedRect(int x, int y, int u, int v, int width, int height) {
|
|
||||||
gui.drawTexturedModalRect(x, y, u, v, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight) {
|
|
||||||
GlStateManager.color(1, 1, 1);
|
|
||||||
Gui.drawScaledCustomSizeModalRect(x, y, u, v, uWidth, vHeight, width, height, textureWidth, textureHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, int color) {
|
|
||||||
Gui.drawRect(x, y, x + width, y + height, color);
|
|
||||||
GlStateManager.color(1, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, ReadableColor color) {
|
|
||||||
drawRect(x, y, width, height, color(color));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, int topLeftColor, int topRightColor, int bottomLeftColor, int bottomRightColor) {
|
|
||||||
drawRect(x, y, width, height, color(topLeftColor), color(topRightColor), color(bottomLeftColor), color(bottomRightColor));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, ReadableColor tl, ReadableColor tr, ReadableColor bl, ReadableColor br) {
|
|
||||||
disableTexture2D();
|
|
||||||
enableBlend();
|
|
||||||
disableAlpha();
|
|
||||||
tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
||||||
shadeModel(GL_SMOOTH);
|
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
|
||||||
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
||||||
renderer.startDrawingQuads();
|
|
||||||
renderer.setColorRGBA(bl.getRed(), bl.getGreen(), bl.getBlue(), bl.getAlpha());
|
|
||||||
renderer.addVertex(x, y + height, 0);
|
|
||||||
renderer.setColorRGBA(br.getRed(), br.getGreen(), br.getBlue(), br.getAlpha());
|
|
||||||
renderer.addVertex(x + width, y + height, 0);
|
|
||||||
renderer.setColorRGBA(tr.getRed(), tr.getGreen(), tr.getBlue(), tr.getAlpha());
|
|
||||||
renderer.addVertex(x + width, y, 0);
|
|
||||||
renderer.setColorRGBA(tl.getRed(), tl.getGreen(), tl.getBlue(), tl.getAlpha());
|
|
||||||
renderer.addVertex(x, y, 0);
|
|
||||||
tessellator.draw();
|
|
||||||
shadeModel(GL_FLAT);
|
|
||||||
disableBlend();
|
|
||||||
enableAlpha();
|
|
||||||
enableTexture2D();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, int color, String text) {
|
|
||||||
return drawString(x, y, color, text, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, ReadableColor color, String text) {
|
|
||||||
return drawString(x, y, color(color), text);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, int color, String text) {
|
|
||||||
return drawCenteredString(x, y, color, text, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, ReadableColor color, String text) {
|
|
||||||
return drawCenteredString(x, y, color(color), text);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, int color, String text, boolean shadow) {
|
|
||||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
|
|
||||||
int ret = shadow ? fontRenderer.drawStringWithShadow(text, x, y, color) : fontRenderer.drawString(text, x, y, color);
|
|
||||||
GlStateManager.color(1, 1, 1);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, ReadableColor color, String text, boolean shadow) {
|
|
||||||
return drawString(x, y, color(color), text, shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, int color, String text, boolean shadow) {
|
|
||||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
|
|
||||||
x-=fontRenderer.getStringWidth(text) / 2;
|
|
||||||
return drawString(x, y, color, text, shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, ReadableColor color, String text, boolean shadow) {
|
|
||||||
return drawCenteredString(x, y, color(color), text, shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int color(ReadableColor color) {
|
|
||||||
return color.getAlpha() << 24
|
|
||||||
| color.getRed() << 16
|
|
||||||
| color.getGreen() << 8
|
|
||||||
| color.getBlue();
|
|
||||||
}
|
|
||||||
|
|
||||||
private ReadableColor color(int color) {
|
|
||||||
return new Color((color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff, (color >> 24) & 0xff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui;
|
|
||||||
|
|
||||||
import lombok.NonNull;
|
|
||||||
import net.minecraft.client.renderer.texture.ITextureObject;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
public class OffsetGuiRenderer implements GuiRenderer {
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final GuiRenderer renderer;
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final ReadablePoint position;
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
private final ReadableDimension size;
|
|
||||||
|
|
||||||
private final boolean strict;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new strict offset gui renderer with the same settings as the supplied one.
|
|
||||||
* @see #OffsetGuiRenderer(GuiRenderer, ReadablePoint, ReadableDimension, boolean)
|
|
||||||
* @param renderer The renderer to copy from
|
|
||||||
*/
|
|
||||||
public OffsetGuiRenderer(OffsetGuiRenderer renderer) {
|
|
||||||
this(renderer.renderer, renderer.position, renderer.size, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent
|
|
||||||
* renderer with coordinates offset by the specified position.
|
|
||||||
* This also ensures that drawing happens within the specified bounds.
|
|
||||||
* @param renderer The parent renderer
|
|
||||||
* @param position The position of this renderer within the parent (used as is, not copied)
|
|
||||||
* @param size The size of the drawable area (used as is, not copied)
|
|
||||||
*/
|
|
||||||
public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size) {
|
|
||||||
this(renderer, position, size, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent
|
|
||||||
* renderer with coordinates offset by the specified position.
|
|
||||||
* If strict is {@code true}, this also ensures that drawing happens within the specified bounds.
|
|
||||||
* @param renderer The parent renderer
|
|
||||||
* @param position The position of this renderer within the parent (used as is, not copied)
|
|
||||||
* @param size The size of the drawable area (used as is, not copied)
|
|
||||||
* @param strict Whether drawing should be forced to be within the drawable area
|
|
||||||
*/
|
|
||||||
public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size, boolean strict) {
|
|
||||||
this.renderer = renderer;
|
|
||||||
this.position = position;
|
|
||||||
this.size = size;
|
|
||||||
this.strict = strict;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadablePoint getOpenGlOffset() {
|
|
||||||
ReadablePoint parentOffset = renderer.getOpenGlOffset();
|
|
||||||
return new Point(parentOffset.getX() + position.getX(), parentOffset.getY() + position.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getSize() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setDrawingArea(int x, int y, int width, int height) {
|
|
||||||
if (!strict) {
|
|
||||||
renderer.setDrawingArea(x + position.getX(), y + position.getY(), width, height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int x2 = x + width;
|
|
||||||
int y2 = y + height;
|
|
||||||
// Convert and clamp top and left border
|
|
||||||
x = Math.max(0, x + position.getX());
|
|
||||||
y = Math.max(0, y + position.getY());
|
|
||||||
// Clamp and convert bottom and right border
|
|
||||||
x2 = Math.min(x2, size.getWidth()) + position.getX();
|
|
||||||
y2 = Math.min(y2, size.getHeight()) + position.getY();
|
|
||||||
// Make sure bottom and top / right and left aren't flipped
|
|
||||||
x2 = Math.max(x2, x);
|
|
||||||
y2 = Math.max(y2, y);
|
|
||||||
// Pass to parent
|
|
||||||
renderer.setDrawingArea(x, y, x2 - x, y2 - y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startUsing() {
|
|
||||||
GL11.glPushAttrib(GL11.GL_SCISSOR_BIT);
|
|
||||||
GL11.glEnable(GL11.GL_SCISSOR_TEST);
|
|
||||||
setDrawingArea(0, 0, size.getWidth(), size.getHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopUsing() {
|
|
||||||
GL11.glPopAttrib();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void bindTexture(ResourceLocation location) {
|
|
||||||
renderer.bindTexture(location);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void bindTexture(ITextureObject texture) {
|
|
||||||
renderer.bindTexture(texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawTexturedRect(int x, int y, int u, int v, int width, int height) {
|
|
||||||
renderer.drawTexturedRect(x + position.getX(), y + position.getY(), u, v, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int uWidth, int vHeight, int textureWidth, int textureHeight) {
|
|
||||||
renderer.drawTexturedRect(x + position.getX(), y + position.getY(), u, v, width, height, uWidth, vHeight, textureWidth, textureHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, int color) {
|
|
||||||
renderer.drawRect(x + position.getX(), y + position.getY(), width, height, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, ReadableColor color) {
|
|
||||||
renderer.drawRect(x + position.getX(), y + position.getY(), width, height, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, int topLeftColor, int topRightColor, int bottomLeftColor, int bottomRightColor) {
|
|
||||||
renderer.drawRect(x + position.getX(), y + position.getY(), width, height, topLeftColor, topRightColor, bottomLeftColor, bottomRightColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawRect(int x, int y, int width, int height, ReadableColor topLeftColor, ReadableColor topRightColor, ReadableColor bottomLeftColor, ReadableColor bottomRightColor) {
|
|
||||||
renderer.drawRect(x + position.getX(), y + position.getY(), width, height, topLeftColor, topRightColor, bottomLeftColor, bottomRightColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, int color, String text) {
|
|
||||||
return renderer.drawString(x + position.getX(), y + position.getY(), color, text) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, ReadableColor color, String text) {
|
|
||||||
return renderer.drawString(x + position.getX(), y + position.getY(), color, text) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, int color, String text) {
|
|
||||||
return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, ReadableColor color, String text) {
|
|
||||||
return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, int color, String text, boolean shadow) {
|
|
||||||
return renderer.drawString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawString(int x, int y, ReadableColor color, String text, boolean shadow) {
|
|
||||||
return renderer.drawString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, int color, String text, boolean shadow) {
|
|
||||||
return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int drawCenteredString(int x, int y, ReadableColor color, String text, boolean shadow) {
|
|
||||||
return renderer.drawCenteredString(x + position.getX(), y + position.getY(), color, text, shadow) - position.getX();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import net.minecraft.crash.CrashReport;
|
|
||||||
import net.minecraft.crash.CrashReportCategory;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class RenderInfo {
|
|
||||||
public final float partialTick;
|
|
||||||
public final int mouseX;
|
|
||||||
public final int mouseY;
|
|
||||||
public final int layer;
|
|
||||||
|
|
||||||
public RenderInfo offsetMouse(int minusX, int minusY) {
|
|
||||||
return new RenderInfo(partialTick, mouseX - minusX, mouseY - minusY, layer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RenderInfo layer(int layer) {
|
|
||||||
return this.layer == layer ? this : new RenderInfo(partialTick, mouseX, mouseY, layer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addTo(CrashReport crashReport) {
|
|
||||||
CrashReportCategory category = crashReport.makeCategory("Render info details");
|
|
||||||
category.addCrashSection("Partial Tick", partialTick);
|
|
||||||
category.addCrashSection("Mouse X", mouseX);
|
|
||||||
category.addCrashSection("Mouse Y", mouseY);
|
|
||||||
category.addCrashSection("Layer", layer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.element.IGuiClickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiClickableContainer<T extends AbstractGuiClickableContainer<T>>
|
|
||||||
extends AbstractGuiContainer<T> implements Clickable, IGuiClickable<T> {
|
|
||||||
private Runnable onClick;
|
|
||||||
private ReadableDimension size;
|
|
||||||
|
|
||||||
public AbstractGuiClickableContainer() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiClickableContainer(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
Point pos = new Point(position);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMouseHovering(pos) && isEnabled()) {
|
|
||||||
onClick();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMouseHovering(ReadablePoint pos) {
|
|
||||||
return pos.getX() > 0 && pos.getY() > 0
|
|
||||||
&& pos.getX() < size.getWidth() && pos.getY() < size.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onClick() {
|
|
||||||
if (onClick != null) {
|
|
||||||
onClick.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onClick(Runnable onClick) {
|
|
||||||
this.onClick = onClick;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,271 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.google.common.collect.Ordering;
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.OffsetGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.element.AbstractComposedGuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.ComposedGuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.Layout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.LayoutData;
|
|
||||||
import net.minecraft.crash.CrashReport;
|
|
||||||
import net.minecraft.crash.CrashReportCategory;
|
|
||||||
import net.minecraft.util.ReportedException;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiContainer<T extends AbstractGuiContainer<T>>
|
|
||||||
extends AbstractComposedGuiElement<T> implements GuiContainer<T> {
|
|
||||||
|
|
||||||
private static final Layout DEFAULT_LAYOUT = new HorizontalLayout();
|
|
||||||
|
|
||||||
private final Map<GuiElement, LayoutData> elements = new LinkedHashMap<GuiElement, LayoutData>();
|
|
||||||
|
|
||||||
private Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> layedOutElements;
|
|
||||||
|
|
||||||
private Layout layout = DEFAULT_LAYOUT;
|
|
||||||
|
|
||||||
private ReadableColor backgroundColor;
|
|
||||||
|
|
||||||
public AbstractGuiContainer() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiContainer(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setLayout(Layout layout) {
|
|
||||||
this.layout = layout;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Layout getLayout() {
|
|
||||||
return layout;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void convertFor(GuiElement element, Point point) {
|
|
||||||
checkState(layedOutElements != null, "Cannot convert position unless rendered at least once.");
|
|
||||||
Pair<ReadablePoint, ReadableDimension> pair = layedOutElements.get(element);
|
|
||||||
checkState(pair != null, "Element " + element + " not part of " + this);
|
|
||||||
ReadablePoint pos = pair.getKey();
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, point);
|
|
||||||
}
|
|
||||||
point.translate(-pos.getX(), -pos.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<GuiElement> getChildren() {
|
|
||||||
return Collections.unmodifiableCollection(elements.keySet());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<GuiElement, LayoutData> getElements() {
|
|
||||||
return Collections.unmodifiableMap(elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T addElements(LayoutData layoutData, GuiElement... elements) {
|
|
||||||
if (layoutData == null) {
|
|
||||||
layoutData = LayoutData.NONE;
|
|
||||||
}
|
|
||||||
for (GuiElement element : elements) {
|
|
||||||
this.elements.put(element, layoutData);
|
|
||||||
element.setContainer(this);
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T removeElement(GuiElement element) {
|
|
||||||
if (elements.remove(element) != null) {
|
|
||||||
element.setContainer(null);
|
|
||||||
if (layedOutElements != null) {
|
|
||||||
layedOutElements.remove(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
try {
|
|
||||||
layedOutElements = layout.layOut(this, size);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Gui Layout");
|
|
||||||
renderInfo.addTo(crashReport);
|
|
||||||
CrashReportCategory category = crashReport.makeCategory("Gui container details");
|
|
||||||
category.addCrashSectionCallable("Container", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Layout", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return layout;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
throw new ReportedException(crashReport);
|
|
||||||
}
|
|
||||||
if (backgroundColor != null && renderInfo.getLayer() == 0) {
|
|
||||||
renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), backgroundColor);
|
|
||||||
}
|
|
||||||
for (final Map.Entry<GuiElement, Pair<ReadablePoint, ReadableDimension>> e : layedOutElements.entrySet()) {
|
|
||||||
GuiElement element = e.getKey();
|
|
||||||
boolean strict;
|
|
||||||
if (element instanceof ComposedGuiElement) {
|
|
||||||
if (((ComposedGuiElement) element).getMaxLayer() < renderInfo.layer) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
strict = renderInfo.layer == 0;
|
|
||||||
} else {
|
|
||||||
if (element.getLayer() != renderInfo.layer) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
strict = true;
|
|
||||||
}
|
|
||||||
final ReadablePoint ePosition = e.getValue().getLeft();
|
|
||||||
final ReadableDimension eSize = e.getValue().getRight();
|
|
||||||
try {
|
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize, strict);
|
|
||||||
eRenderer.startUsing();
|
|
||||||
e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY())
|
|
||||||
.layer(renderInfo.getLayer() - e.getKey().getLayer()));
|
|
||||||
eRenderer.stopUsing();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui");
|
|
||||||
renderInfo.addTo(crashReport);
|
|
||||||
CrashReportCategory category = crashReport.makeCategory("Gui container details");
|
|
||||||
category.addCrashSectionCallable("Container", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSection("Width", size.getWidth());
|
|
||||||
category.addCrashSection("Height", size.getHeight());
|
|
||||||
category.addCrashSectionCallable("Layout", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return layout;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category = crashReport.makeCategory("Gui element details");
|
|
||||||
category.addCrashSectionCallable("Element", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return e.getKey();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Position", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return ePosition;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Size", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return eSize;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (e.getKey() instanceof GuiContainer) {
|
|
||||||
category.addCrashSectionCallable("Layout", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return ((GuiContainer) e.getKey()).getLayout();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
throw new ReportedException(crashReport);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
return layout.calcMinSize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T sortElements() {
|
|
||||||
sortElements(new Comparator<GuiElement>() {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Override
|
|
||||||
public int compare(GuiElement o1, GuiElement o2) {
|
|
||||||
if (o1 instanceof Comparable && o2 instanceof Comparable) {
|
|
||||||
return ((Comparable) o1).compareTo(o2);
|
|
||||||
}
|
|
||||||
return o1.hashCode() - o2.hashCode();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T sortElements(final Comparator<GuiElement> comparator) {
|
|
||||||
Ordering<Map.Entry<GuiElement, LayoutData>> ordering = new Ordering<Map.Entry<GuiElement, LayoutData>>() {
|
|
||||||
@Override
|
|
||||||
public int compare(Map.Entry<GuiElement, LayoutData> left, Map.Entry<GuiElement, LayoutData> right) {
|
|
||||||
return comparator.compare(left.getKey(), right.getKey());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (!ordering.isOrdered(elements.entrySet())) {
|
|
||||||
ImmutableList<Map.Entry<GuiElement, LayoutData>> sorted = ordering.immutableSortedCopy(elements.entrySet());
|
|
||||||
elements.clear();
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> entry : sorted) {
|
|
||||||
elements.put(entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableColor getBackgroundColor() {
|
|
||||||
return backgroundColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setBackgroundColor(ReadableColor backgroundColor) {
|
|
||||||
this.backgroundColor = backgroundColor;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,253 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.MinecraftGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.OffsetGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.function.*;
|
|
||||||
import eu.crushedpixel.replaymod.utils.MouseUtils;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.client.gui.ScaledResolution;
|
|
||||||
import net.minecraft.crash.CrashReport;
|
|
||||||
import net.minecraft.crash.CrashReportCategory;
|
|
||||||
import net.minecraft.util.ReportedException;
|
|
||||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
||||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
|
||||||
import org.lwjgl.input.Mouse;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiOverlay<T extends AbstractGuiOverlay<T>> extends AbstractGuiContainer<T> {
|
|
||||||
|
|
||||||
private final UserInputGuiScreen userInputGuiScreen = new UserInputGuiScreen();
|
|
||||||
private final EventHandler eventHandler = new EventHandler();
|
|
||||||
private boolean visible;
|
|
||||||
private Dimension screenSize;
|
|
||||||
private boolean mouseVisible;
|
|
||||||
|
|
||||||
public boolean isVisible() {
|
|
||||||
return visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVisible(boolean visible) {
|
|
||||||
if (this.visible != visible) {
|
|
||||||
if (visible) {
|
|
||||||
forEach(Loadable.class).load();
|
|
||||||
MinecraftForge.EVENT_BUS.register(eventHandler);
|
|
||||||
} else {
|
|
||||||
forEach(Closeable.class).close();
|
|
||||||
MinecraftForge.EVENT_BUS.unregister(eventHandler);
|
|
||||||
}
|
|
||||||
updateUserInputGui();
|
|
||||||
}
|
|
||||||
this.visible = visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isMouseVisible() {
|
|
||||||
return mouseVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMouseVisible(boolean mouseVisible) {
|
|
||||||
this.mouseVisible = mouseVisible;
|
|
||||||
updateUserInputGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateUserInputGui() {
|
|
||||||
Minecraft mc = getMinecraft();
|
|
||||||
if (visible) {
|
|
||||||
if (mouseVisible) {
|
|
||||||
if (mc.currentScreen != userInputGuiScreen) {
|
|
||||||
mc.displayGuiScreen(userInputGuiScreen);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (mc.currentScreen == userInputGuiScreen) {
|
|
||||||
mc.displayGuiScreen(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
if (mouseVisible && renderInfo.layer == getMaxLayer()) {
|
|
||||||
final GuiElement tooltip = forEach(GuiElement.class).getTooltip(renderInfo);
|
|
||||||
if (tooltip != null) {
|
|
||||||
final ReadableDimension tooltipSize = tooltip.getMinSize();
|
|
||||||
int x, y;
|
|
||||||
if (renderInfo.mouseX + 8 + tooltipSize.getWidth() < screenSize.getWidth()) {
|
|
||||||
x = renderInfo.mouseX + 8;
|
|
||||||
} else {
|
|
||||||
x = screenSize.getWidth() - tooltipSize.getWidth() - 1;
|
|
||||||
}
|
|
||||||
if (renderInfo.mouseY + 8 + tooltipSize.getHeight() < screenSize.getHeight()) {
|
|
||||||
y = renderInfo.mouseY + 8;
|
|
||||||
} else {
|
|
||||||
y = screenSize.getHeight() - tooltipSize.getHeight() - 1;
|
|
||||||
}
|
|
||||||
final ReadablePoint position = new Point(x, y);
|
|
||||||
try {
|
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, position, tooltipSize);
|
|
||||||
tooltip.draw(eRenderer, tooltipSize, renderInfo);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui Tooltip");
|
|
||||||
renderInfo.addTo(crashReport);
|
|
||||||
CrashReportCategory category = crashReport.makeCategory("Gui container details");
|
|
||||||
category.addCrashSectionCallable("Container", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSection("Width", size.getWidth());
|
|
||||||
category.addCrashSection("Height", size.getHeight());
|
|
||||||
category = crashReport.makeCategory("Tooltip details");
|
|
||||||
category.addCrashSectionCallable("Element", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return tooltip;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Position", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Size", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return tooltipSize;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
throw new ReportedException(crashReport);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMinSize() {
|
|
||||||
return screenSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMaxSize() {
|
|
||||||
return screenSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class EventHandler {
|
|
||||||
private MinecraftGuiRenderer renderer;
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public void renderOverlay(RenderGameOverlayEvent.Post event) {
|
|
||||||
if (event.type == RenderGameOverlayEvent.ElementType.ALL) {
|
|
||||||
updateRenderer();
|
|
||||||
int layers = getMaxLayer();
|
|
||||||
int mouseX = -1, mouseY = -1;
|
|
||||||
if (mouseVisible) {
|
|
||||||
Point mouse = MouseUtils.getMousePos();
|
|
||||||
mouseX = mouse.getX();
|
|
||||||
mouseY = mouse.getY();
|
|
||||||
}
|
|
||||||
for (int layer = 0; layer <= layers; layer++) {
|
|
||||||
draw(renderer, screenSize, new RenderInfo(event.partialTicks, mouseX, mouseY, layer));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public void tickOverlay(TickEvent.ClientTickEvent event) {
|
|
||||||
if (event.phase == TickEvent.Phase.START) {
|
|
||||||
forEach(Tickable.class).tick();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateRenderer() {
|
|
||||||
Minecraft mc = getMinecraft();
|
|
||||||
ScaledResolution res = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
|
|
||||||
if (screenSize == null
|
|
||||||
|| screenSize.getWidth() != res.getScaledWidth()
|
|
||||||
|| screenSize.getHeight() != res.getScaledHeight()) {
|
|
||||||
screenSize = new Dimension(res.getScaledWidth(), res.getScaledHeight());
|
|
||||||
renderer = new MinecraftGuiRenderer(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class UserInputGuiScreen extends net.minecraft.client.gui.GuiScreen {
|
|
||||||
|
|
||||||
{
|
|
||||||
allowUserInput = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void keyTyped(char typedChar, int keyCode) throws IOException {
|
|
||||||
forEach(Typeable.class).typeKey(MouseUtils.getMousePos(), keyCode, typedChar, isCtrlKeyDown(), isShiftKeyDown());
|
|
||||||
super.keyTyped(typedChar, keyCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
|
|
||||||
forEach(Clickable.class).mouseClick(new Point(mouseX, mouseY), mouseButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseReleased(int mouseX, int mouseY, int mouseButton) {
|
|
||||||
forEach(Draggable.class).mouseRelease(new Point(mouseX, mouseY), mouseButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) {
|
|
||||||
forEach(Draggable.class).mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateScreen() {
|
|
||||||
forEach(Tickable.class).tick();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handleMouseInput() throws IOException {
|
|
||||||
super.handleMouseInput();
|
|
||||||
if (Mouse.hasWheel() && Mouse.getEventDWheel() != 0) {
|
|
||||||
forEach(Scrollable.class).scroll(MouseUtils.getMousePos(), Mouse.getEventDWheel());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onGuiClosed() {
|
|
||||||
mouseVisible = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.MinecraftGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.OffsetGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiLabel;
|
|
||||||
import de.johni0702.minecraft.gui.function.*;
|
|
||||||
import eu.crushedpixel.replaymod.utils.MouseUtils;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import net.minecraft.client.gui.ScaledResolution;
|
|
||||||
import net.minecraft.crash.CrashReport;
|
|
||||||
import net.minecraft.crash.CrashReportCategory;
|
|
||||||
import net.minecraft.util.ReportedException;
|
|
||||||
import org.lwjgl.input.Keyboard;
|
|
||||||
import org.lwjgl.input.Mouse;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiScreen<T extends AbstractGuiScreen<T>> extends AbstractGuiContainer<T> {
|
|
||||||
|
|
||||||
private final MinecraftGuiScreen wrapped = new MinecraftGuiScreen();
|
|
||||||
|
|
||||||
private Dimension screenSize;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private boolean drawBackground = true;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private boolean enabledRepeatedKeyEvents = true;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private GuiLabel title;
|
|
||||||
|
|
||||||
public net.minecraft.client.gui.GuiScreen toMinecraft() {
|
|
||||||
return wrapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
if (renderInfo.layer == 0) {
|
|
||||||
if (drawBackground) {
|
|
||||||
wrapped.drawDefaultBackground();
|
|
||||||
}
|
|
||||||
if (title != null) {
|
|
||||||
ReadableDimension titleSize = title.getMinSize();
|
|
||||||
int x = screenSize.getWidth() / 2 - titleSize.getWidth() / 2;
|
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, new Point(x, 10), new Dimension(0, 0));
|
|
||||||
title.draw(eRenderer, titleSize, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
if (renderInfo.layer == getMaxLayer()) {
|
|
||||||
final GuiElement tooltip = forEach(GuiElement.class).getTooltip(renderInfo);
|
|
||||||
if (tooltip != null) {
|
|
||||||
final ReadableDimension tooltipSize = tooltip.getMinSize();
|
|
||||||
int x, y;
|
|
||||||
if (renderInfo.mouseX + 8 + tooltipSize.getWidth() < screenSize.getWidth()) {
|
|
||||||
x = renderInfo.mouseX + 8;
|
|
||||||
} else {
|
|
||||||
x = screenSize.getWidth() - tooltipSize.getWidth() - 1;
|
|
||||||
}
|
|
||||||
if (renderInfo.mouseY + 8 + tooltipSize.getHeight() < screenSize.getHeight()) {
|
|
||||||
y = renderInfo.mouseY + 8;
|
|
||||||
} else {
|
|
||||||
y = screenSize.getHeight() - tooltipSize.getHeight() - 1;
|
|
||||||
}
|
|
||||||
final ReadablePoint position = new Point(x, y);
|
|
||||||
try {
|
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, position, tooltipSize);
|
|
||||||
tooltip.draw(eRenderer, tooltipSize, renderInfo);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui Tooltip");
|
|
||||||
renderInfo.addTo(crashReport);
|
|
||||||
CrashReportCategory category = crashReport.makeCategory("Gui container details");
|
|
||||||
category.addCrashSectionCallable("Container", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSection("Width", size.getWidth());
|
|
||||||
category.addCrashSection("Height", size.getHeight());
|
|
||||||
category = crashReport.makeCategory("Tooltip details");
|
|
||||||
category.addCrashSectionCallable("Element", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return tooltip;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Position", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Size", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return tooltipSize;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
throw new ReportedException(crashReport);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMinSize() {
|
|
||||||
return screenSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMaxSize() {
|
|
||||||
return screenSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEnabledRepeatedKeyEvents(boolean enableRepeatKeyEvents) {
|
|
||||||
this.enabledRepeatedKeyEvents = enableRepeatKeyEvents;
|
|
||||||
if (wrapped.active) {
|
|
||||||
Keyboard.enableRepeatEvents(enableRepeatKeyEvents);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void display() {
|
|
||||||
getMinecraft().displayGuiScreen(toMinecraft());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class MinecraftGuiScreen extends net.minecraft.client.gui.GuiScreen {
|
|
||||||
private MinecraftGuiRenderer renderer;
|
|
||||||
private boolean active;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
|
|
||||||
int layers = getMaxLayer();
|
|
||||||
for (int layer = 0; layer <= layers; layer++) {
|
|
||||||
draw(renderer, screenSize, new RenderInfo(partialTicks, mouseX, mouseY, layer));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void keyTyped(char typedChar, int keyCode) throws IOException {
|
|
||||||
forEach(Typeable.class).typeKey(MouseUtils.getMousePos(), keyCode, typedChar, isCtrlKeyDown(), isShiftKeyDown());
|
|
||||||
super.keyTyped(typedChar, keyCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
|
|
||||||
forEach(Clickable.class).mouseClick(new Point(mouseX, mouseY), mouseButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseReleased(int mouseX, int mouseY, int mouseButton) {
|
|
||||||
forEach(Draggable.class).mouseRelease(new Point(mouseX, mouseY), mouseButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void mouseClickMove(int mouseX, int mouseY, int mouseButton, long timeSinceLastClick) {
|
|
||||||
forEach(Draggable.class).mouseDrag(new Point(mouseX, mouseY), mouseButton, timeSinceLastClick);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateScreen() {
|
|
||||||
forEach(Tickable.class).tick();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handleMouseInput() throws IOException {
|
|
||||||
super.handleMouseInput();
|
|
||||||
if (Mouse.hasWheel() && Mouse.getEventDWheel() != 0) {
|
|
||||||
forEach(Scrollable.class).scroll(MouseUtils.getMousePos(), Mouse.getEventDWheel());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onGuiClosed() {
|
|
||||||
forEach(Closeable.class).close();
|
|
||||||
active = false;
|
|
||||||
if (enabledRepeatedKeyEvents) {
|
|
||||||
Keyboard.enableRepeatEvents(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initGui() {
|
|
||||||
active = false;
|
|
||||||
if (enabledRepeatedKeyEvents) {
|
|
||||||
Keyboard.enableRepeatEvents(true);
|
|
||||||
}
|
|
||||||
screenSize = new Dimension(width, height);
|
|
||||||
renderer = new MinecraftGuiRenderer(new ScaledResolution(mc, mc.displayWidth, mc.displayHeight));
|
|
||||||
forEach(Loadable.class).load();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T getWrapper() {
|
|
||||||
return AbstractGuiScreen.this.getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.OffsetGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.function.Scrollable;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiScrollable<T extends AbstractGuiScrollable<T>> extends AbstractGuiContainer<T>
|
|
||||||
implements Scrollable {
|
|
||||||
private int offsetX, offsetY;
|
|
||||||
private final ReadablePoint negativeOffset = new ReadablePoint() {
|
|
||||||
@Override
|
|
||||||
public int getX() {
|
|
||||||
return -offsetX;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getY() {
|
|
||||||
return -offsetY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getLocation(WritablePoint dest) {
|
|
||||||
dest.setLocation(getX(), getY());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private Direction scrollDirection = Direction.VERTICAL;
|
|
||||||
|
|
||||||
protected ReadableDimension lastRenderSize;
|
|
||||||
|
|
||||||
public AbstractGuiScrollable() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiScrollable(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void convertFor(GuiElement element, Point point) {
|
|
||||||
super.convertFor(element, point);
|
|
||||||
if (point.getX() > 0 && point.getX() < lastRenderSize.getWidth()
|
|
||||||
&& point.getY() > 0 && point.getY() < lastRenderSize.getHeight()) {
|
|
||||||
point.translate(offsetX, offsetY);
|
|
||||||
} else {
|
|
||||||
point.setLocation(Integer.MIN_VALUE, Integer.MIN_VALUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
lastRenderSize = size;
|
|
||||||
size = super.calcMinSize();
|
|
||||||
size = new Dimension(Math.max(width, size.getWidth()), Math.max(height, size.getHeight()));
|
|
||||||
renderInfo = renderInfo.offsetMouse(-offsetX, -offsetY);
|
|
||||||
|
|
||||||
OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, negativeOffset, size);
|
|
||||||
offsetRenderer.startUsing();
|
|
||||||
super.draw(offsetRenderer, size, renderInfo);
|
|
||||||
offsetRenderer.stopUsing();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean scroll(ReadablePoint mousePosition, int dWheel) {
|
|
||||||
Point mouse = new Point(mousePosition);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, mouse);
|
|
||||||
}
|
|
||||||
if (mouse.getX() > 0 && mouse.getY() > 0
|
|
||||||
&& mouse.getX() < lastRenderSize.getWidth() && mouse.getY() < lastRenderSize.getHeight()) {
|
|
||||||
// Reduce scrolling speed but make sure it is never rounded to 0
|
|
||||||
dWheel = (int) Math.copySign(Math.ceil(Math.abs(dWheel) / 4.0), dWheel);
|
|
||||||
if (scrollDirection == Direction.HORIZONTAL) {
|
|
||||||
scrollX(dWheel);
|
|
||||||
} else {
|
|
||||||
scrollY(dWheel);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getOffsetX() {
|
|
||||||
return offsetX;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setOffsetX(int offsetX) {
|
|
||||||
this.offsetX = offsetX;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getOffsetY() {
|
|
||||||
return offsetY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setOffsetY(int offsetY) {
|
|
||||||
this.offsetY = offsetY;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Direction getScrollDirection() {
|
|
||||||
return scrollDirection;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setScrollDirection(Direction scrollDirection) {
|
|
||||||
this.scrollDirection = scrollDirection;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T scrollX(int dPixel) {
|
|
||||||
offsetX = Math.max(0, Math.min(super.calcMinSize().getWidth() - lastRenderSize.getWidth(), offsetX - dPixel));
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T scrollY(int dPixel) {
|
|
||||||
offsetY = Math.max(0, Math.min(super.calcMinSize().getHeight() - lastRenderSize.getHeight(), offsetY - dPixel));
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Direction {
|
|
||||||
VERTICAL, HORIZONTAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,205 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.function.Draggable;
|
|
||||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.VerticalLayout;
|
|
||||||
import lombok.Getter;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
import static de.johni0702.minecraft.gui.utils.Colors.TRANSPARENT;
|
|
||||||
import static org.lwjgl.util.ReadableColor.BLACK;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiVerticalList<T extends AbstractGuiVerticalList<T>> extends AbstractGuiScrollable<T>
|
|
||||||
implements Draggable {
|
|
||||||
public static final ReadableColor BACKGROUND = new Color(0, 0, 0, 150);
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final VerticalLayout listLayout = new VerticalLayout().setSpacing(3);
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GuiPanel listPanel = new GuiPanel(this).setLayout(listLayout);
|
|
||||||
|
|
||||||
{
|
|
||||||
setLayout(new CustomLayout<T>() {
|
|
||||||
@Override
|
|
||||||
protected void layout(T container, int width, int height) {
|
|
||||||
pos(listPanel, width / 2 - width(listPanel) / 2, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
final ReadableDimension panelSize = listPanel.getMinSize();
|
|
||||||
return new ReadableDimension() {
|
|
||||||
@Override
|
|
||||||
public int getWidth() {
|
|
||||||
return panelSize.getWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return panelSize.getHeight() + 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getSize(WritableDimension dest) {
|
|
||||||
dest.setSize(getWidth(), getHeight());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean drawShadow, drawSlider;
|
|
||||||
|
|
||||||
private ReadablePoint lastMousePos;
|
|
||||||
private boolean draggingSlider;
|
|
||||||
|
|
||||||
public AbstractGuiVerticalList() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiVerticalList(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
if (drawShadow) {
|
|
||||||
renderer.drawRect(0, 0, width, height, BACKGROUND);
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
renderer.drawRect(0, 0, width, 4, BLACK, BLACK, TRANSPARENT, TRANSPARENT);
|
|
||||||
renderer.drawRect(0, height - 4, width, 4, TRANSPARENT, TRANSPARENT, BLACK, BLACK);
|
|
||||||
} else {
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (drawSlider) {
|
|
||||||
ReadableDimension contentSize = listPanel.calcMinSize();
|
|
||||||
int contentHeight = contentSize.getHeight() + 10;
|
|
||||||
if (contentHeight > height) {
|
|
||||||
int sliderX = width / 2 + contentSize.getWidth() / 2 + 3;
|
|
||||||
renderer.drawRect(sliderX, 0, 6, height, BLACK); // Draw slider background
|
|
||||||
int sliderY = getOffsetY() * height / contentHeight;
|
|
||||||
int sliderSize = height * height / contentHeight;
|
|
||||||
// Draw slider, with shadows
|
|
||||||
renderer.drawRect(sliderX, sliderY, 6, sliderSize, Color.LTGREY); // Slider
|
|
||||||
renderer.drawRect(sliderX + 5, sliderY, 1, sliderSize, Color.GREY); // Right shadow
|
|
||||||
renderer.drawRect(sliderX, sliderY + sliderSize - 1, 6, 1, Color.GREY); // Bottom shadow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
position = convert(position);
|
|
||||||
if (isOnThis(position)) {
|
|
||||||
if (isOnSliderBar(position)) {
|
|
||||||
draggingSlider = true;
|
|
||||||
}
|
|
||||||
lastMousePos = position;
|
|
||||||
// We must not return true here
|
|
||||||
// because if we did, non of our children were able to process click events at all
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) {
|
|
||||||
position = convert(position);
|
|
||||||
if (lastMousePos != null) {
|
|
||||||
int dPixel = lastMousePos.getY() - position.getY();
|
|
||||||
if (draggingSlider) {
|
|
||||||
int contentHeight = listPanel.calcMinSize().getHeight();
|
|
||||||
int renderHeight = lastRenderSize.getHeight();
|
|
||||||
scrollY(dPixel * (contentHeight + renderHeight) / renderHeight);
|
|
||||||
} else {
|
|
||||||
scrollY(-dPixel);
|
|
||||||
}
|
|
||||||
lastMousePos = position;
|
|
||||||
// Returning false on purpose, see #mouseClick
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseRelease(ReadablePoint position, int button) {
|
|
||||||
if (lastMousePos != null) {
|
|
||||||
lastMousePos = null;
|
|
||||||
draggingSlider = false;
|
|
||||||
// Returning false on purpose, see #mouseClick
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ReadablePoint convert(ReadablePoint readablePoint) {
|
|
||||||
if (getContainer() != null) {
|
|
||||||
Point point = new Point(readablePoint);
|
|
||||||
getContainer().convertFor(this, point);
|
|
||||||
return point;
|
|
||||||
}
|
|
||||||
return readablePoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isOnThis(ReadablePoint point) {
|
|
||||||
return point.getX() > 0 && point.getY() > 0
|
|
||||||
&& point.getX() < lastRenderSize.getWidth() && point.getY() < lastRenderSize.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isOnSliderBar(ReadablePoint point) {
|
|
||||||
if (!drawSlider) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int sliderX = lastRenderSize.getWidth() / 2 + listPanel.calcMinSize().getWidth() / 2 + 3;
|
|
||||||
return sliderX <= point.getX() && point.getX() < sliderX + 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isOnBackground(ReadablePoint point) {
|
|
||||||
int width = lastRenderSize.getWidth();
|
|
||||||
int listPanelWidth = listPanel.calcMinSize().getWidth();
|
|
||||||
return point.getX() < width / 2 - listPanelWidth / 2
|
|
||||||
|| width / 2 + listPanelWidth / 2 + (drawSlider ? 6 : 0) < point.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean doesDrawSlider() {
|
|
||||||
return drawSlider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setDrawSlider(boolean drawSlider) {
|
|
||||||
this.drawSlider = drawSlider;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean doesDrawShadow() {
|
|
||||||
return drawShadow;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setDrawShadow(boolean drawShadow) {
|
|
||||||
this.drawShadow = drawShadow;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
public class GuiClickable extends AbstractGuiClickableContainer<GuiClickable> {
|
|
||||||
|
|
||||||
public GuiClickable() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiClickable(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiClickable getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.element.ComposedGuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.layout.Layout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.LayoutData;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface GuiContainer<T extends GuiContainer<T>> extends ComposedGuiElement<T> {
|
|
||||||
|
|
||||||
T setLayout(Layout layout);
|
|
||||||
Layout getLayout();
|
|
||||||
|
|
||||||
void convertFor(GuiElement element, Point point);
|
|
||||||
|
|
||||||
Map<GuiElement, LayoutData> getElements();
|
|
||||||
T addElements(LayoutData layoutData, GuiElement...elements);
|
|
||||||
T removeElement(GuiElement element);
|
|
||||||
T sortElements();
|
|
||||||
T sortElements(Comparator<GuiElement> comparator);
|
|
||||||
|
|
||||||
ReadableColor getBackgroundColor();
|
|
||||||
T setBackgroundColor(ReadableColor backgroundColor);
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
public class GuiOverlay extends AbstractGuiOverlay<GuiOverlay> {
|
|
||||||
@Override
|
|
||||||
protected GuiOverlay getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.layout.Layout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.LayoutData;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Singular;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class GuiPanel extends AbstractGuiContainer<GuiPanel> {
|
|
||||||
|
|
||||||
public GuiPanel() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiPanel(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Builder
|
|
||||||
GuiPanel(Layout layout, int width , int height, @Singular("with") Map<GuiElement, LayoutData> withElements) {
|
|
||||||
setLayout(layout);
|
|
||||||
if (width != 0 || height != 0) {
|
|
||||||
setSize(width, height);
|
|
||||||
}
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> e : withElements.entrySet()) {
|
|
||||||
addElements(e.getValue(), e.getKey());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiPanel getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
public class GuiScreen extends AbstractGuiScreen<GuiScreen> {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static AbstractGuiScreen from(net.minecraft.client.gui.GuiScreen minecraft) {
|
|
||||||
if (!(minecraft instanceof AbstractGuiScreen.MinecraftGuiScreen)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return ((AbstractGuiScreen.MinecraftGuiScreen) minecraft).getWrapper();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static GuiScreen wrap(final net.minecraft.client.gui.GuiScreen minecraft) {
|
|
||||||
return new GuiScreen() {
|
|
||||||
@Override
|
|
||||||
public net.minecraft.client.gui.GuiScreen toMinecraft() {
|
|
||||||
return minecraft;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiScreen getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
public class GuiScrollable extends AbstractGuiScrollable<GuiScrollable> {
|
|
||||||
@Override
|
|
||||||
protected GuiScrollable getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.container;
|
|
||||||
|
|
||||||
public class GuiVerticalList extends AbstractGuiVerticalList<GuiVerticalList> {
|
|
||||||
public GuiVerticalList() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiVerticalList(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiVerticalList getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
import com.google.common.collect.Ordering;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import net.minecraft.crash.CrashReport;
|
|
||||||
import net.minecraft.crash.CrashReportCategory;
|
|
||||||
import net.minecraft.util.ReportedException;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.lang.reflect.InvocationHandler;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.lang.reflect.Proxy;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
|
|
||||||
public abstract class AbstractComposedGuiElement<T extends AbstractComposedGuiElement<T>>
|
|
||||||
extends AbstractGuiElement<T> implements ComposedGuiElement<T> {
|
|
||||||
public AbstractComposedGuiElement() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractComposedGuiElement(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxLayer() {
|
|
||||||
return getLayer() + Ordering.natural().max(Iterables.concat(Collections.singleton(0),
|
|
||||||
Iterables.transform(getChildren(), new Function<GuiElement, Integer>() {
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public Integer apply(GuiElement e) {
|
|
||||||
return e instanceof ComposedGuiElement ? ((ComposedGuiElement) e).getMaxLayer() : e.getLayer();
|
|
||||||
}
|
|
||||||
})));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <C> C forEach(final Class<C> ofType) {
|
|
||||||
int maxLayer = getMaxLayer();
|
|
||||||
final List<C> layers = new ArrayList<C>(maxLayer + 1);
|
|
||||||
for (int i = maxLayer; i >= 0; i--) {
|
|
||||||
layers.add(forEach(i, ofType));
|
|
||||||
}
|
|
||||||
return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() {
|
|
||||||
@Override
|
|
||||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
||||||
boolean isGetter = method.getName().startsWith("get");
|
|
||||||
Object handled = method.getReturnType().equals(boolean.class) ? false : null;
|
|
||||||
for (final C layer : layers) {
|
|
||||||
handled = method.invoke(layer, args);
|
|
||||||
if (handled != null) {
|
|
||||||
if (handled instanceof Boolean) {
|
|
||||||
if (Boolean.TRUE.equals(handled)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (isGetter) {
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <C> C forEach(final int layer, final Class<C> ofType) {
|
|
||||||
return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
||||||
boolean isGetter = method.getName().startsWith("get");
|
|
||||||
Object handled = method.getReturnType().equals(boolean.class) ? false : null;
|
|
||||||
final AbstractComposedGuiElement self = AbstractComposedGuiElement.this;
|
|
||||||
if (ofType.isInstance(self) && self.getLayer() == layer) {
|
|
||||||
try {
|
|
||||||
handled = method.invoke(self, args);
|
|
||||||
} catch (Exception e) {
|
|
||||||
CrashReport crash = CrashReport.makeCrashReport(e, "Calling Gui method");
|
|
||||||
CrashReportCategory category = crash.makeCategory("Gui");
|
|
||||||
category.addCrashSection("Method", method);
|
|
||||||
category.addCrashSectionCallable("ComposedElement", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Element", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
throw new ReportedException(crash);
|
|
||||||
}
|
|
||||||
if (handled != null) {
|
|
||||||
if (handled instanceof Boolean) {
|
|
||||||
if (Boolean.TRUE.equals(handled)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (isGetter) {
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (final GuiElement element : getChildren()) {
|
|
||||||
try {
|
|
||||||
if (element instanceof ComposedGuiElement) {
|
|
||||||
ComposedGuiElement composed = (ComposedGuiElement) element;
|
|
||||||
if (layer <= composed.getMaxLayer()) {
|
|
||||||
Object elementProxy = composed.forEach(layer - composed.getLayer(), ofType);
|
|
||||||
handled = method.invoke(elementProxy, args);
|
|
||||||
}
|
|
||||||
} else if (ofType.isInstance(element) && element.getLayer() == layer) {
|
|
||||||
handled = method.invoke(element, args);
|
|
||||||
}
|
|
||||||
if (handled != null) {
|
|
||||||
if (handled instanceof Boolean) {
|
|
||||||
if (Boolean.TRUE.equals(handled)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (isGetter) {
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
CrashReport crash = CrashReport.makeCrashReport(e, "Calling Gui method");
|
|
||||||
CrashReportCategory category = crash.makeCategory("Gui");
|
|
||||||
category.addCrashSection("Method", method);
|
|
||||||
category.addCrashSectionCallable("ComposedElement", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
category.addCrashSectionCallable("Element", new Callable() {
|
|
||||||
@Override
|
|
||||||
public Object call() throws Exception {
|
|
||||||
return element;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
throw new ReportedException(crash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiButton<T extends AbstractGuiButton<T>> extends AbstractGuiClickable<T> implements Clickable, IGuiButton<T> {
|
|
||||||
protected static final ResourceLocation BUTTON_SOUND = new ResourceLocation("gui.button.press");
|
|
||||||
protected static final ResourceLocation WIDGETS_TEXTURE = new ResourceLocation("textures/gui/widgets.png");
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private String label;
|
|
||||||
|
|
||||||
public AbstractGuiButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiButton(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
|
|
||||||
renderer.bindTexture(WIDGETS_TEXTURE);
|
|
||||||
GlStateManager.color(1, 1, 1, 1);
|
|
||||||
|
|
||||||
byte texture = 1;
|
|
||||||
int color = 0xe0e0e0;
|
|
||||||
if (!isEnabled()) {
|
|
||||||
texture = 0;
|
|
||||||
color = 0xa0a0a0;
|
|
||||||
} else if (isMouseHovering(new Point(renderInfo.mouseX, renderInfo.mouseY))) {
|
|
||||||
texture = 2;
|
|
||||||
color = 0xffffa0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GlStateManager.enableBlend();
|
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
||||||
GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
int textureY = 46 + texture * 20;
|
|
||||||
int halfWidth = size.getWidth() / 2;
|
|
||||||
|
|
||||||
renderer.drawTexturedRect(0, 0, 0, textureY, halfWidth, size.getHeight());
|
|
||||||
renderer.drawTexturedRect(halfWidth, 0, 200 - halfWidth, textureY, halfWidth, size.getHeight());
|
|
||||||
renderer.drawCenteredString(halfWidth, (size.getHeight() - 8) / 2, color, label, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
return new Dimension(fontRenderer.getStringWidth(label), 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick() {
|
|
||||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
|
|
||||||
super.onClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setLabel(String label) {
|
|
||||||
this.label = label;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nLabel(String label, Object... args) {
|
|
||||||
return setLabel(I18n.format(label, args));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.Color;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiCheckbox<T extends AbstractGuiCheckbox<T>>
|
|
||||||
extends AbstractGuiClickable<T> implements IGuiCheckbox<T> {
|
|
||||||
protected static final ResourceLocation BUTTON_SOUND = new ResourceLocation("gui.button.press");
|
|
||||||
protected static final ReadableColor BOX_BACKGROUND_COLOR = new Color(46, 46, 46);
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private String label;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private boolean checked;
|
|
||||||
|
|
||||||
public AbstractGuiCheckbox() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiCheckbox(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
|
|
||||||
int color = 0xe0e0e0;
|
|
||||||
if (!isEnabled()) {
|
|
||||||
color = 0xa0a0a0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int boxSize = size.getHeight();
|
|
||||||
renderer.drawRect(0, 0, boxSize, boxSize, ReadableColor.BLACK);
|
|
||||||
renderer.drawRect(1, 1, boxSize - 2, boxSize - 2, BOX_BACKGROUND_COLOR);
|
|
||||||
|
|
||||||
if(isChecked()) {
|
|
||||||
renderer.drawCenteredString(boxSize / 2 + 1, 1, color, "x", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer.drawString(boxSize + 2, 2, color, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int height = fontRenderer.FONT_HEIGHT + 2;
|
|
||||||
int width = height + 2 + fontRenderer.getStringWidth(label);
|
|
||||||
return new Dimension(width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMaxSize() {
|
|
||||||
return getMinSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick() {
|
|
||||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
|
|
||||||
setChecked(!isChecked());
|
|
||||||
super.onClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setLabel(String label) {
|
|
||||||
this.label = label;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nLabel(String label, Object... args) {
|
|
||||||
return setLabel(I18n.format(label, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setChecked(boolean checked) {
|
|
||||||
this.checked = checked;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiClickable<T extends AbstractGuiClickable<T>> extends AbstractGuiElement<T> implements Clickable, IGuiClickable<T> {
|
|
||||||
private Runnable onClick;
|
|
||||||
private ReadableDimension size;
|
|
||||||
|
|
||||||
public AbstractGuiClickable() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiClickable(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
Point pos = new Point(position);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMouseHovering(pos) && isEnabled()) {
|
|
||||||
onClick();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMouseHovering(ReadablePoint pos) {
|
|
||||||
return pos.getX() > 0 && pos.getY() > 0
|
|
||||||
&& pos.getX() < size.getWidth() && pos.getY() < size.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onClick() {
|
|
||||||
if (onClick != null) {
|
|
||||||
onClick.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onClick(Runnable onClick) {
|
|
||||||
this.onClick = onClick;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiElement<T extends AbstractGuiElement<T>> implements GuiElement<T> {
|
|
||||||
protected static final ResourceLocation TEXTURE = new ResourceLocation("guiapi", "gui.png");
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Minecraft minecraft = Minecraft.getMinecraft();
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private GuiContainer container;
|
|
||||||
|
|
||||||
private GuiElement tooltip;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private boolean enabled = true;
|
|
||||||
|
|
||||||
protected Dimension minSize, maxSize;
|
|
||||||
|
|
||||||
public AbstractGuiElement() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiElement(GuiContainer container) {
|
|
||||||
container.addElements(null, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract T getThis();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setEnabled(boolean enabled) {
|
|
||||||
this.enabled = enabled;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setEnabled() {
|
|
||||||
return setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setDisabled() {
|
|
||||||
return setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GuiElement getTooltip(RenderInfo renderInfo) {
|
|
||||||
if (tooltip != null) {
|
|
||||||
Point mouse = new Point(renderInfo.mouseX, renderInfo.mouseY);
|
|
||||||
if (container != null) {
|
|
||||||
container.convertFor(this, mouse);
|
|
||||||
}
|
|
||||||
ReadableDimension size = getMinSize();
|
|
||||||
if (mouse.getX() > 0
|
|
||||||
&& mouse.getY() > 0
|
|
||||||
&& mouse.getX() < size.getWidth()
|
|
||||||
&& mouse.getY() < size.getHeight()) {
|
|
||||||
return tooltip;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTooltip(GuiElement tooltip) {
|
|
||||||
this.tooltip = tooltip;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setContainer(GuiContainer container) {
|
|
||||||
this.container = container;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setMinSize(ReadableDimension minSize) {
|
|
||||||
this.minSize = new Dimension(minSize);
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setMaxSize(ReadableDimension maxSize) {
|
|
||||||
this.maxSize = new Dimension(maxSize);
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setSize(ReadableDimension size) {
|
|
||||||
setMinSize(size);
|
|
||||||
return setMaxSize(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setSize(int width, int height) {
|
|
||||||
return setSize(new Dimension(width, height));
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setWidth(int width) {
|
|
||||||
if (minSize == null) {
|
|
||||||
minSize = new Dimension(width, 0);
|
|
||||||
} else {
|
|
||||||
minSize.setWidth(width);
|
|
||||||
}
|
|
||||||
if (maxSize == null) {
|
|
||||||
maxSize = new Dimension(width, Integer.MAX_VALUE);
|
|
||||||
} else {
|
|
||||||
maxSize.setWidth(width);
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setHeight(int height) {
|
|
||||||
if (minSize == null) {
|
|
||||||
minSize = new Dimension(0, height);
|
|
||||||
} else {
|
|
||||||
minSize.setHeight(height);
|
|
||||||
}
|
|
||||||
if (maxSize == null) {
|
|
||||||
maxSize = new Dimension(Integer.MAX_VALUE, height);
|
|
||||||
} else {
|
|
||||||
maxSize.setHeight(height);
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getLayer() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMinSize() {
|
|
||||||
ReadableDimension calcSize = calcMinSize();
|
|
||||||
if (minSize == null) {
|
|
||||||
return calcSize;
|
|
||||||
} else {
|
|
||||||
if (minSize.getWidth() >= calcSize.getWidth() && minSize.getHeight() >= calcSize.getHeight()) {
|
|
||||||
return minSize;
|
|
||||||
} else {
|
|
||||||
return new Dimension(
|
|
||||||
Math.max(calcSize.getWidth(), minSize.getWidth()),
|
|
||||||
Math.max(calcSize.getHeight(), minSize.getHeight())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract ReadableDimension calcMinSize();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMaxSize() {
|
|
||||||
return maxSize == null ? new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE) : maxSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import net.minecraft.client.renderer.texture.DynamicTexture;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiImage<T extends AbstractGuiImage<T>>
|
|
||||||
extends AbstractGuiElement<T> implements IGuiImage<T> {
|
|
||||||
private DynamicTexture texture;
|
|
||||||
private ResourceLocation resourceLocation;
|
|
||||||
private int u, v;
|
|
||||||
private int uWidth, vHeight;
|
|
||||||
private int textureWidth, textureHeight;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reference to the copied image to prevent it from being garbage collected
|
|
||||||
* and subsequently releasing the OpenGL texture.
|
|
||||||
*/
|
|
||||||
private AbstractGuiImage<T> copyOf;
|
|
||||||
|
|
||||||
public AbstractGuiImage() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiImage(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiImage(AbstractGuiImage<T> copyOf) {
|
|
||||||
this.texture = copyOf.texture;
|
|
||||||
this.resourceLocation = copyOf.resourceLocation;
|
|
||||||
this.u = copyOf.u;
|
|
||||||
this.v = copyOf.v;
|
|
||||||
this.uWidth = copyOf.uWidth;
|
|
||||||
this.vHeight = copyOf.vHeight;
|
|
||||||
this.textureWidth = copyOf.textureWidth;
|
|
||||||
this.textureHeight = copyOf.textureHeight;
|
|
||||||
this.copyOf = copyOf;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
if (texture != null) {
|
|
||||||
renderer.bindTexture(texture);
|
|
||||||
} else {
|
|
||||||
renderer.bindTexture(resourceLocation);
|
|
||||||
}
|
|
||||||
int w = size.getWidth();
|
|
||||||
int h = size.getHeight();
|
|
||||||
renderer.drawTexturedRect(0, 0, u, v, w, h, uWidth, vHeight, textureWidth, textureHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void finalize() throws Throwable {
|
|
||||||
super.finalize();
|
|
||||||
if (texture != null && copyOf == null) {
|
|
||||||
getMinecraft().addScheduledTask(new Finalizer(texture));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexture(BufferedImage img) {
|
|
||||||
Preconditions.checkState(copyOf == null, "Cannot change texture of copy.");
|
|
||||||
resourceLocation = null;
|
|
||||||
if (texture != null) {
|
|
||||||
texture.deleteGlTexture();
|
|
||||||
}
|
|
||||||
texture = new DynamicTexture(img);
|
|
||||||
textureWidth = uWidth = img.getWidth();
|
|
||||||
textureHeight = vHeight = img.getHeight();
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexture(ResourceLocation resourceLocation) {
|
|
||||||
Preconditions.checkState(copyOf == null, "Cannot change texture of copy.");
|
|
||||||
if (texture != null) {
|
|
||||||
texture.deleteGlTexture();
|
|
||||||
texture = null;
|
|
||||||
}
|
|
||||||
this.resourceLocation = resourceLocation;
|
|
||||||
textureWidth = textureHeight = 256;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexture(ResourceLocation resourceLocation, int u, int v, int width, int height) {
|
|
||||||
setTexture(resourceLocation);
|
|
||||||
setUV(u, v);
|
|
||||||
setUVSize(width, height);
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setU(int u) {
|
|
||||||
this.u = u;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setV(int v) {
|
|
||||||
this.v = v;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setUV(int u, int v) {
|
|
||||||
setU(u);
|
|
||||||
return setV(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setUWidth(int width) {
|
|
||||||
this.uWidth = width;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setVHeight(int height) {
|
|
||||||
this.vHeight = height;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setUVSize(int width, int height) {
|
|
||||||
setUWidth(width);
|
|
||||||
return setVHeight(height);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We use a static class here in order to prevent the inner class from keeping the outer class
|
|
||||||
* alive after finalization when still unloading the texture.
|
|
||||||
*/
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
private static final class Finalizer implements Runnable {
|
|
||||||
private final DynamicTexture texture;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
texture.deleteGlTexture();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiLabel<T extends AbstractGuiLabel<T>> extends AbstractGuiElement<T> implements IGuiLabel<T> {
|
|
||||||
@Getter
|
|
||||||
private String text = "";
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadableColor color = ReadableColor.WHITE, disabledColor = ReadableColor.GREY;
|
|
||||||
|
|
||||||
public AbstractGuiLabel() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiLabel(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<String> lines = fontRenderer.listFormattedStringToWidth(text, size.getWidth());
|
|
||||||
int y = 0;
|
|
||||||
for (String line : lines) {
|
|
||||||
renderer.drawString(0, y, isEnabled() ? color : disabledColor, line);
|
|
||||||
y+=fontRenderer.FONT_HEIGHT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
return new Dimension(fontRenderer.getStringWidth(text), fontRenderer.FONT_HEIGHT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMaxSize() {
|
|
||||||
return getMinSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setText(String text) {
|
|
||||||
this.text = text;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nText(String text, Object... args) {
|
|
||||||
return setText(I18n.format(text, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setColor(ReadableColor color) {
|
|
||||||
this.color = color;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setDisabledColor(ReadableColor disabledColor) {
|
|
||||||
this.disabledColor = disabledColor;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
// TODO: This is suboptimal e.g. if there are trailing zeros, they stay (should be fixed after TextField is done w/o MC)
|
|
||||||
public abstract class AbstractGuiNumberField<T extends AbstractGuiNumberField<T>>
|
|
||||||
extends AbstractGuiTextField<T> implements IGuiNumberField<T> {
|
|
||||||
|
|
||||||
private int precision;
|
|
||||||
private volatile Pattern precisionPattern;
|
|
||||||
|
|
||||||
public AbstractGuiNumberField() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiNumberField(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
setValue(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setText(String text) {
|
|
||||||
if (!isTextValid(text)) {
|
|
||||||
throw new IllegalArgumentException(text + " is not a valid number!");
|
|
||||||
}
|
|
||||||
return super.setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
|
||||||
private boolean isTextValid(String text) {
|
|
||||||
try {
|
|
||||||
if (precision == 0) {
|
|
||||||
Integer.parseInt(text);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
Double.parseDouble(text);
|
|
||||||
return precisionPattern.matcher(text).matches();
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onTextChanged(String from) {
|
|
||||||
if (isTextValid(getText())) {
|
|
||||||
super.onTextChanged(from);
|
|
||||||
} else {
|
|
||||||
setText(from);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte getByte() {
|
|
||||||
return Byte.parseByte(getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public short getShort() {
|
|
||||||
return Short.parseShort(getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getInteger() {
|
|
||||||
return Integer.parseInt(getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getLong() {
|
|
||||||
return Long.parseLong(getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getFloat() {
|
|
||||||
return Float.parseFloat(getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getDouble() {
|
|
||||||
return Double.parseDouble(getText());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setValue(int value) {
|
|
||||||
setText(Integer.toString(value));
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setValue(double value) {
|
|
||||||
setText(String.format("%." + precision + "f", value));
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setPrecision(int precision) {
|
|
||||||
Preconditions.checkArgument(precision >= 0, "precision must not be negative");
|
|
||||||
precisionPattern = Pattern.compile(String.format("-?[0-9]*+((\\.[0-9]{0,%d})?)||(\\.)?", precision));
|
|
||||||
this.precision = precision;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiPasswordField<T extends AbstractGuiPasswordField<T>> extends AbstractGuiTextField<T> {
|
|
||||||
public AbstractGuiPasswordField() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiPasswordField(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
String text = getText();
|
|
||||||
setText(StringUtils.repeat('*', text.length()));
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
setText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,189 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Draggable;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
// TODO: Currently assumes a height of 20
|
|
||||||
public abstract class AbstractGuiSlider<T extends AbstractGuiSlider<T>> extends AbstractGuiElement<T> implements Clickable, Draggable, IGuiSlider<T> {
|
|
||||||
private Runnable onValueChanged;
|
|
||||||
private ReadableDimension size;
|
|
||||||
|
|
||||||
private int value;
|
|
||||||
private int steps;
|
|
||||||
|
|
||||||
private String text = "";
|
|
||||||
|
|
||||||
private boolean dragging;
|
|
||||||
|
|
||||||
public AbstractGuiSlider() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiSlider(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
Point pos = new Point(position);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMouseHovering(pos) && isEnabled()) {
|
|
||||||
updateValue(pos);
|
|
||||||
dragging = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall) {
|
|
||||||
if (dragging) {
|
|
||||||
Point pos = new Point(position);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, pos);
|
|
||||||
}
|
|
||||||
updateValue(pos);
|
|
||||||
}
|
|
||||||
return dragging;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseRelease(ReadablePoint position, int button) {
|
|
||||||
if (dragging) {
|
|
||||||
dragging = false;
|
|
||||||
Point pos = new Point(position);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, pos);
|
|
||||||
}
|
|
||||||
updateValue(pos);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMouseHovering(ReadablePoint pos) {
|
|
||||||
return pos.getX() > 0 && pos.getY() > 0
|
|
||||||
&& pos.getX() < size.getWidth() && pos.getY() < size.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
|
|
||||||
renderer.bindTexture(GuiButton.WIDGETS_TEXTURE);
|
|
||||||
|
|
||||||
// Draw background
|
|
||||||
renderer.drawTexturedRect(0, 0, 0, 46, width / 2, height);
|
|
||||||
renderer.drawTexturedRect(width / 2, 0, 200 - width / 2, 46, width / 2, height);
|
|
||||||
|
|
||||||
// Draw slider
|
|
||||||
int sliderX = (width - 8) * value / steps;
|
|
||||||
renderer.drawTexturedRect(sliderX, 0, 0, 66, 4, 20);
|
|
||||||
renderer.drawTexturedRect(sliderX + 4, 0, 196, 66, 4, 20);
|
|
||||||
|
|
||||||
// Draw text
|
|
||||||
int color = 0xe0e0e0;
|
|
||||||
if (!isEnabled()) {
|
|
||||||
color = 0xa0a0a0;
|
|
||||||
} else if (isMouseHovering(new Point(renderInfo.mouseX, renderInfo.mouseY))) {
|
|
||||||
color = 0xffffa0;
|
|
||||||
}
|
|
||||||
renderer.drawCenteredString(width / 2, height / 2 - 4, color, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateValue(ReadablePoint position) {
|
|
||||||
if (size == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int width = size.getWidth() - 8;
|
|
||||||
int pos = Math.max(0, Math.min(width, position.getX() - 4));
|
|
||||||
setValue(steps * pos / width);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onValueChanged() {
|
|
||||||
if (onValueChanged != null) {
|
|
||||||
onValueChanged.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setText(String text) {
|
|
||||||
this.text = text;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nText(String text, Object... args) {
|
|
||||||
return setText(I18n.format(text, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setValue(int value) {
|
|
||||||
this.value = value;
|
|
||||||
onValueChanged();
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSteps() {
|
|
||||||
return steps;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setSteps(int steps) {
|
|
||||||
this.steps = steps;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onValueChanged(Runnable runnable) {
|
|
||||||
this.onValueChanged = runnable;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,602 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import com.google.common.base.Strings;
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Focusable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Tickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Typeable;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
|
||||||
import net.minecraft.client.renderer.Tessellator;
|
|
||||||
import net.minecraft.client.renderer.WorldRenderer;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import net.minecraft.util.ChatAllowedCharacters;
|
|
||||||
import org.lwjgl.input.Keyboard;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
import static net.minecraft.client.renderer.GlStateManager.*;
|
|
||||||
import static net.minecraft.client.renderer.GlStateManager.disableColorLogic;
|
|
||||||
import static net.minecraft.client.renderer.GlStateManager.enableTexture2D;
|
|
||||||
import static net.minecraft.util.MathHelper.clamp_int;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiTextField<T extends AbstractGuiTextField<T>>
|
|
||||||
extends AbstractGuiElement<T> implements Clickable, Tickable, Typeable, IGuiTextField<T> {
|
|
||||||
private static final ReadableColor BORDER_COLOR = new Color(160, 160, 160);
|
|
||||||
private static final ReadableColor CURSOR_COLOR = new Color(240, 240, 240);
|
|
||||||
private static final int BORDER = 4;
|
|
||||||
|
|
||||||
// Focus
|
|
||||||
@Getter
|
|
||||||
private boolean focused;
|
|
||||||
@Getter
|
|
||||||
private Focusable next, previous;
|
|
||||||
|
|
||||||
// Content
|
|
||||||
@Getter
|
|
||||||
private int maxLength = 32;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@NonNull
|
|
||||||
private String text = "";
|
|
||||||
|
|
||||||
private int cursorPos;
|
|
||||||
private int selectionPos;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private String hint;
|
|
||||||
|
|
||||||
// Rendering
|
|
||||||
private int currentOffset;
|
|
||||||
private int blinkCursorTick;
|
|
||||||
public ReadableColor textColorEnabled = new Color(224, 224, 224);
|
|
||||||
public ReadableColor textColorDisabled = new Color(112, 112, 112);
|
|
||||||
private ReadableDimension size = new Dimension(0, 0); // Size of last render
|
|
||||||
|
|
||||||
private Consumer<String> textChanged;
|
|
||||||
private Runnable onEnter;
|
|
||||||
|
|
||||||
public AbstractGuiTextField() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiTextField(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setText(String text) {
|
|
||||||
if (text.length() > maxLength) {
|
|
||||||
this.text = text.substring(0, maxLength);
|
|
||||||
} else {
|
|
||||||
this.text = text;
|
|
||||||
}
|
|
||||||
selectionPos = cursorPos = text.length();
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nText(@NonNull String text, @NonNull Object... args) {
|
|
||||||
return setText(I18n.format(text, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setMaxLength(int maxLength) {
|
|
||||||
Preconditions.checkArgument(maxLength >= 0, "maxLength must not be negative");
|
|
||||||
this.maxLength = maxLength;
|
|
||||||
if (text.length() > maxLength) {
|
|
||||||
setText(text);
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deleteText(int from, int to) {
|
|
||||||
Preconditions.checkArgument(from <= to, "from must not be greater than to");
|
|
||||||
Preconditions.checkArgument(from >= 0, "from must be greater than zero");
|
|
||||||
Preconditions.checkArgument(to < text.length(), "to must be less than test.length()");
|
|
||||||
|
|
||||||
String deleted = text.substring(from, to + 1);
|
|
||||||
text = text.substring(0, from) + text.substring(to + 1);
|
|
||||||
return deleted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSelectionFrom() {
|
|
||||||
return cursorPos > selectionPos ? selectionPos : cursorPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSelectionTo() {
|
|
||||||
return cursorPos > selectionPos ? cursorPos : selectionPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSelectedText() {
|
|
||||||
return text.substring(getSelectionFrom(), getSelectionTo());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deleteSelectedText() {
|
|
||||||
if (cursorPos == selectionPos) {
|
|
||||||
return ""; // Nothing selected
|
|
||||||
}
|
|
||||||
int from = getSelectionFrom();
|
|
||||||
String deleted = deleteText(from, getSelectionTo() - 1);
|
|
||||||
cursorPos = selectionPos = from;
|
|
||||||
updateCurrentOffset();
|
|
||||||
return deleted;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update current text offset to make sure the cursor is always visible.
|
|
||||||
*/
|
|
||||||
private void updateCurrentOffset() {
|
|
||||||
currentOffset = Math.min(currentOffset, cursorPos);
|
|
||||||
String line = text.substring(currentOffset, cursorPos);
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int currentWidth = fontRenderer.getStringWidth(line);
|
|
||||||
if (currentWidth > size.getWidth() - 2*BORDER) {
|
|
||||||
currentOffset = cursorPos - fontRenderer.trimStringToWidth(line, size.getWidth() - 2*BORDER, true).length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T writeText(String append) {
|
|
||||||
for (char c : append.toCharArray()) {
|
|
||||||
writeChar(c);
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T writeChar(char c) {
|
|
||||||
if (!ChatAllowedCharacters.isAllowedCharacter(c)) {
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteSelectedText();
|
|
||||||
|
|
||||||
if (text.length() >= maxLength) {
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
text = text.substring(0, cursorPos) + c + text.substring(cursorPos);
|
|
||||||
selectionPos = ++cursorPos;
|
|
||||||
|
|
||||||
updateCurrentOffset();
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T deleteNextChar() {
|
|
||||||
if (cursorPos < text.length()) {
|
|
||||||
text = text.substring(0, cursorPos) + text.substring(cursorPos + 1);
|
|
||||||
}
|
|
||||||
selectionPos = cursorPos;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the amount of characters to the next word (excluding).
|
|
||||||
* If this is the last word in the line, return the amount of characters remaining to till the end.
|
|
||||||
* Everything except the Space character is considered part of a word.
|
|
||||||
* @return Length in characters
|
|
||||||
*/
|
|
||||||
protected int getNextWordLength() {
|
|
||||||
int length = 0;
|
|
||||||
boolean inWord = true;
|
|
||||||
for (int i = cursorPos; i < text.length(); i++) {
|
|
||||||
if (inWord) {
|
|
||||||
if (text.charAt(i) == ' ') {
|
|
||||||
inWord = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (text.charAt(i) != ' ') {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deleteNextWord() {
|
|
||||||
int worldLength = getNextWordLength();
|
|
||||||
if (worldLength > 0) {
|
|
||||||
return deleteText(cursorPos, cursorPos + worldLength);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T deletePreviousChar() {
|
|
||||||
if (cursorPos > 0) {
|
|
||||||
text = text.substring(0, cursorPos - 1) + text.substring(cursorPos);
|
|
||||||
selectionPos = --cursorPos;
|
|
||||||
updateCurrentOffset();
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the amount of characters to the previous word (including).
|
|
||||||
* If this is the first word in the line, return the amount of characters till the start.
|
|
||||||
* Everything except the Space character is considered part of a word.
|
|
||||||
* @return Length in characters
|
|
||||||
*/
|
|
||||||
protected int getPreviousWordLength() {
|
|
||||||
int length = 0;
|
|
||||||
boolean inWord = false;
|
|
||||||
for (int i = cursorPos - 1; i >= 0; i--) {
|
|
||||||
if (inWord) {
|
|
||||||
if (text.charAt(i) == ' ') {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (text.charAt(i) != ' ') {
|
|
||||||
inWord = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String deletePreviousWord() {
|
|
||||||
int worldLength = getPreviousWordLength();
|
|
||||||
String deleted = "";
|
|
||||||
if (worldLength > 0) {
|
|
||||||
deleted = deleteText(cursorPos - worldLength, cursorPos);
|
|
||||||
selectionPos = cursorPos -= worldLength;
|
|
||||||
updateCurrentOffset();
|
|
||||||
}
|
|
||||||
return deleted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setCursorPosition(int pos) {
|
|
||||||
Preconditions.checkArgument(pos >= 0 && pos <= text.length());
|
|
||||||
selectionPos = cursorPos = pos;
|
|
||||||
updateCurrentOffset();
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inverts all colors on the screen.
|
|
||||||
* @param guiRenderer The GUI Renderer
|
|
||||||
* @param right Right border of the inverted rectangle
|
|
||||||
* @param bottom Bottom border of the inverted rectangle
|
|
||||||
* @param left Left border of the inverted rectangle
|
|
||||||
* @param top Top border of the inverted rectangle
|
|
||||||
*/
|
|
||||||
private void invertColors(GuiRenderer guiRenderer, int right, int bottom, int left, int top) {
|
|
||||||
int x = guiRenderer.getOpenGlOffset().getX();
|
|
||||||
int y = guiRenderer.getOpenGlOffset().getY();
|
|
||||||
right+=x;
|
|
||||||
left+=x;
|
|
||||||
bottom+=y;
|
|
||||||
top+=y;
|
|
||||||
|
|
||||||
color(0, 0, 255, 255);
|
|
||||||
disableTexture2D();
|
|
||||||
enableColorLogic();
|
|
||||||
colorLogicOp(GL11.GL_OR_REVERSE);
|
|
||||||
|
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
|
||||||
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
||||||
renderer.startDrawingQuads();
|
|
||||||
renderer.addVertex(right, top, 0);
|
|
||||||
renderer.addVertex(left, top, 0);
|
|
||||||
renderer.addVertex(left, bottom, 0);
|
|
||||||
renderer.addVertex(right, bottom, 0);
|
|
||||||
tessellator.draw();
|
|
||||||
|
|
||||||
disableColorLogic();
|
|
||||||
enableTexture2D();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, (Point) (position = new Point(position)));
|
|
||||||
}
|
|
||||||
boolean hovering = isMouseHovering(position);
|
|
||||||
|
|
||||||
if (hovering && isFocused() && button == 0) {
|
|
||||||
int mouseX = position.getX() - BORDER;
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
String text = this.text.substring(currentOffset);
|
|
||||||
int textX = fontRenderer.trimStringToWidth(text, mouseX).length() + currentOffset;
|
|
||||||
setCursorPosition(textX);
|
|
||||||
}
|
|
||||||
|
|
||||||
setFocused(hovering);
|
|
||||||
return hovering;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMouseHovering(ReadablePoint pos) {
|
|
||||||
return pos.getX() > 0 && pos.getY() > 0
|
|
||||||
&& pos.getX() < size.getWidth() && pos.getY() < size.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setFocused(boolean isFocused) {
|
|
||||||
if (isFocused && !this.focused) {
|
|
||||||
this.blinkCursorTick = 0; // Restart blinking to indicate successful focus
|
|
||||||
}
|
|
||||||
this.focused = isFocused;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setNext(Focusable next) {
|
|
||||||
this.next = next;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setPrevious(Focusable previous) {
|
|
||||||
this.previous = previous;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
int width = size.getWidth(), height = size.getHeight();
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int posY = height / 2 - fontRenderer.FONT_HEIGHT / 2;
|
|
||||||
|
|
||||||
// Draw black rect once pixel smaller than gray rect
|
|
||||||
renderer.drawRect(0, 0, width, height, BORDER_COLOR);
|
|
||||||
renderer.drawRect(1, 1, width - 2, height - 2, ReadableColor.BLACK);
|
|
||||||
|
|
||||||
if (text.isEmpty() && !isFocused() && !Strings.isNullOrEmpty(hint)) {
|
|
||||||
// Draw hint
|
|
||||||
String text = fontRenderer.trimStringToWidth(hint, width - 2*BORDER);
|
|
||||||
renderer.drawString(BORDER, posY, textColorDisabled, text);
|
|
||||||
} else {
|
|
||||||
// Draw text
|
|
||||||
String renderText = text.substring(currentOffset);
|
|
||||||
renderText = fontRenderer.trimStringToWidth(renderText, width - 2*BORDER);
|
|
||||||
ReadableColor color = isEnabled() ? textColorEnabled : textColorDisabled;
|
|
||||||
int lineEnd = renderer.drawString(BORDER, height / 2 - fontRenderer.FONT_HEIGHT / 2, color, renderText);
|
|
||||||
|
|
||||||
// Draw selection
|
|
||||||
int from = getSelectionFrom();
|
|
||||||
int to = getSelectionTo();
|
|
||||||
String leftStr = text.substring(0, clamp_int(from - currentOffset, 0, text.length()));
|
|
||||||
String rightStr = text.substring(clamp_int(to - currentOffset, 0, text.length()));
|
|
||||||
int left = BORDER + fontRenderer.getStringWidth(leftStr);
|
|
||||||
int right = lineEnd - fontRenderer.getStringWidth(rightStr) - 1;
|
|
||||||
invertColors(renderer, right, height - 2, left, 2);
|
|
||||||
|
|
||||||
// Draw cursor
|
|
||||||
if (blinkCursorTick / 6 % 2 == 0 && focused) {
|
|
||||||
String beforeCursor = text.substring(0, cursorPos - currentOffset);
|
|
||||||
int posX = BORDER + fontRenderer.getStringWidth(beforeCursor);
|
|
||||||
if (cursorPos == text.length()) {
|
|
||||||
renderer.drawString(posX, posY, CURSOR_COLOR, "_", true);
|
|
||||||
} else {
|
|
||||||
renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.FONT_HEIGHT, CURSOR_COLOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) {
|
|
||||||
if (!this.focused) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keyCode == Keyboard.KEY_TAB) {
|
|
||||||
Focusable other = shiftDown ? previous : next;
|
|
||||||
if (other != null) {
|
|
||||||
setFocused(false);
|
|
||||||
other.setFocused(true);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keyCode == Keyboard.KEY_RETURN) {
|
|
||||||
onEnter();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
String textBefore = text;
|
|
||||||
try {
|
|
||||||
if (GuiScreen.isCtrlKeyDown()) {
|
|
||||||
switch (keyCode) {
|
|
||||||
case Keyboard.KEY_A: // Select all
|
|
||||||
cursorPos = 0;
|
|
||||||
selectionPos = text.length();
|
|
||||||
updateCurrentOffset();
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_C: // Copy
|
|
||||||
GuiScreen.setClipboardString(getSelectedText());
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_V: // Paste
|
|
||||||
if (isEnabled()) {
|
|
||||||
writeText(GuiScreen.getClipboardString());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_X: // Cut
|
|
||||||
if (isEnabled()) {
|
|
||||||
GuiScreen.setClipboardString(deleteSelectedText());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean words = GuiScreen.isCtrlKeyDown();
|
|
||||||
boolean select = GuiScreen.isShiftKeyDown();
|
|
||||||
switch (keyCode) {
|
|
||||||
case Keyboard.KEY_HOME:
|
|
||||||
cursorPos = 0;
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_END:
|
|
||||||
cursorPos = text.length();
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_LEFT:
|
|
||||||
if (cursorPos != 0) {
|
|
||||||
if (words) {
|
|
||||||
cursorPos -= getPreviousWordLength();
|
|
||||||
} else {
|
|
||||||
cursorPos--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_RIGHT:
|
|
||||||
if (cursorPos != text.length()) {
|
|
||||||
if (words) {
|
|
||||||
cursorPos += getNextWordLength();
|
|
||||||
} else {
|
|
||||||
cursorPos++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_BACK:
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (getSelectedText().length() > 0) {
|
|
||||||
deleteSelectedText();
|
|
||||||
} else if (words) {
|
|
||||||
deletePreviousWord();
|
|
||||||
} else {
|
|
||||||
deletePreviousChar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_DELETE:
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (getSelectedText().length() > 0) {
|
|
||||||
deleteSelectedText();
|
|
||||||
} else if (words) {
|
|
||||||
deleteNextWord();
|
|
||||||
} else {
|
|
||||||
deleteNextChar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (keyChar == '\r') {
|
|
||||||
keyChar = '\n';
|
|
||||||
}
|
|
||||||
writeChar(keyChar);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateCurrentOffset();
|
|
||||||
|
|
||||||
if (!select) {
|
|
||||||
selectionPos = cursorPos;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} finally {
|
|
||||||
if (!textBefore.equals(text)) {
|
|
||||||
onTextChanged(textBefore);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
blinkCursorTick++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the user presses the Enter/Return key while this text field is focused.
|
|
||||||
*/
|
|
||||||
protected void onEnter() {
|
|
||||||
if (onEnter != null) {
|
|
||||||
onEnter.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the text has changed due to user input.
|
|
||||||
*/
|
|
||||||
protected void onTextChanged(String from) {
|
|
||||||
if (textChanged != null) {
|
|
||||||
textChanged.consume(from);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onEnter(Runnable onEnter) {
|
|
||||||
this.onEnter = onEnter;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onTextChanged(Consumer<String> textChanged) {
|
|
||||||
this.textChanged = textChanged;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setHint(String hint) {
|
|
||||||
this.hint = hint;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nHint(String hint, Object... args) {
|
|
||||||
return setHint(I18n.format(hint));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableColor getTextColor() {
|
|
||||||
return textColorEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTextColor(ReadableColor textColor) {
|
|
||||||
this.textColorEnabled = textColor;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTextColorDisabled(ReadableColor textColorDisabled) {
|
|
||||||
this.textColorDisabled = textColorDisabled;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,218 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.audio.PositionedSoundRecord;
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
|
|
||||||
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiTexturedButton<T extends AbstractGuiTexturedButton<T>> extends AbstractGuiClickable<T> implements Clickable, IGuiTexturedButton<T> {
|
|
||||||
protected static final ResourceLocation BUTTON_SOUND = new ResourceLocation("gui.button.press");
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ResourceLocation texture;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadableDimension textureSize = new ReadableDimension() {
|
|
||||||
@Override
|
|
||||||
public int getWidth() {
|
|
||||||
return getMaxSize().getWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getHeight() {
|
|
||||||
return getMaxSize().getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getSize(WritableDimension dest) {
|
|
||||||
getMaxSize().getSize(dest);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadableDimension textureTotalSize;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadablePoint textureNormal;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadablePoint textureHover;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadablePoint textureDisabled;
|
|
||||||
|
|
||||||
public AbstractGuiTexturedButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiTexturedButton(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
|
|
||||||
renderer.bindTexture(texture);
|
|
||||||
|
|
||||||
ReadablePoint texture = textureNormal;
|
|
||||||
if (!isEnabled()) {
|
|
||||||
texture = textureDisabled;
|
|
||||||
} else if (isMouseHovering(new Point(renderInfo.mouseX, renderInfo.mouseY))) {
|
|
||||||
texture = textureHover;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture == null) { // Button is disabled but we have no texture for that
|
|
||||||
GlStateManager.color(0.5f, 0.5f, 0.5f, 1);
|
|
||||||
texture = textureNormal;
|
|
||||||
}
|
|
||||||
|
|
||||||
GlStateManager.enableBlend();
|
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 1, 0);
|
|
||||||
GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
renderer.drawTexturedRect(0, 0, texture.getX(), texture.getY(), size.getWidth(), size.getHeight(),
|
|
||||||
textureSize.getWidth(), textureSize.getHeight(),
|
|
||||||
textureTotalSize.getWidth(), textureTotalSize.getHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick() {
|
|
||||||
getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F));
|
|
||||||
super.onClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexture(ResourceLocation resourceLocation, int size) {
|
|
||||||
return setTexture(resourceLocation, size, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexture(ResourceLocation resourceLocation, int width, int height) {
|
|
||||||
this.texture = resourceLocation;
|
|
||||||
this.textureTotalSize = new Dimension(width, height);
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTextureSize(int size) {
|
|
||||||
return setTextureSize(size, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTextureSize(int width, int height) {
|
|
||||||
this.textureSize = new Dimension(width, height);
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePosH(final int x, final int y) {
|
|
||||||
return setTexturePosH(new Point(x, y));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePosV(final int x, final int y) {
|
|
||||||
return setTexturePosV(new Point(x, y));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePosH(final ReadablePoint pos) {
|
|
||||||
this.textureNormal = pos;
|
|
||||||
this.textureHover = new ReadablePoint() {
|
|
||||||
@Override
|
|
||||||
public int getX() {
|
|
||||||
return pos.getX() + textureSize.getWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getY() {
|
|
||||||
return pos.getY();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getLocation(WritablePoint dest) {
|
|
||||||
dest.setLocation(getX(), getY());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePosV(final ReadablePoint pos) {
|
|
||||||
this.textureNormal = pos;
|
|
||||||
this.textureHover = new ReadablePoint() {
|
|
||||||
@Override
|
|
||||||
public int getX() {
|
|
||||||
return pos.getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getY() {
|
|
||||||
return pos.getY() + textureSize.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getLocation(WritablePoint dest) {
|
|
||||||
dest.setLocation(getX(), getY());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePos(int normalX, int normalY, int hoverX, int hoverY) {
|
|
||||||
return setTexturePos(new Point(normalX, normalY), new Point(hoverX, hoverY));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePos(ReadablePoint normal, ReadablePoint hover) {
|
|
||||||
this.textureNormal = normal;
|
|
||||||
this.textureHover = hover;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePos(int normalX, int normalY, int hoverX, int hoverY, int disabledX, int disabledY) {
|
|
||||||
return setTexturePos(new Point(normalX, normalY), new Point(hoverX, hoverY), new Point(disabledX, disabledY));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTexturePos(ReadablePoint normal, ReadablePoint hover, ReadablePoint disabled) {
|
|
||||||
this.textureDisabled = disabled;
|
|
||||||
return setTexturePos(normal, hover);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import lombok.Getter;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiToggleButton<V, T extends AbstractGuiToggleButton<V, T>>
|
|
||||||
extends AbstractGuiButton<T> implements IGuiToggleButton<V,T> {
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private int selected;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private V[] values;
|
|
||||||
|
|
||||||
public AbstractGuiToggleButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiToggleButton(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
String orgLabel = getLabel();
|
|
||||||
setLabel(orgLabel + ": " + values[selected]);
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
setLabel(orgLabel);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick() {
|
|
||||||
selected = (selected + 1) % values.length;
|
|
||||||
super.onClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setValues(V... values) {
|
|
||||||
this.values = values;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setSelected(int selected) {
|
|
||||||
this.selected = selected;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public V getSelectedValue() {
|
|
||||||
return values[selected];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import eu.crushedpixel.replaymod.utils.StringUtils;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import org.lwjgl.util.Color;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiTooltip<T extends AbstractGuiTooltip<T>> extends AbstractGuiElement<T> {
|
|
||||||
private static final int LINE_SPACING = 3;
|
|
||||||
private static final ReadableColor BACKGROUND_COLOR = new Color(16, 0, 16, 240);
|
|
||||||
private static final ReadableColor BORDER_LIGHT = new Color(80, 0, 255, 80);
|
|
||||||
private static final ReadableColor BORDER_DARK = new Color(40, 0, 127, 80);
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private String[] text = {};
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private ReadableColor color = ReadableColor.WHITE;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
|
|
||||||
// Draw background
|
|
||||||
renderer.drawRect(1, 0, width - 2, height, BACKGROUND_COLOR); // Top to bottom
|
|
||||||
renderer.drawRect(0, 1, 1, height - 2, BACKGROUND_COLOR); // Left pixel row
|
|
||||||
renderer.drawRect(width - 1, 1, 1, height - 2, BACKGROUND_COLOR); // Right pixel row
|
|
||||||
|
|
||||||
// Draw the border, it gets darker from top to bottom
|
|
||||||
renderer.drawRect(1, 1, width - 2, 1, BORDER_LIGHT); // Top border
|
|
||||||
renderer.drawRect(1, height - 2, width - 2, 1, BORDER_DARK); // Bottom border
|
|
||||||
renderer.drawRect(1, 2, 1, height - 4, BORDER_LIGHT, BORDER_LIGHT, BORDER_DARK, BORDER_DARK); // Left border
|
|
||||||
renderer.drawRect(width - 2, 2, 1, height - 4, BORDER_LIGHT, BORDER_LIGHT, BORDER_DARK, BORDER_DARK); // Right border
|
|
||||||
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int y = LINE_SPACING + 1;
|
|
||||||
for (String line : text) {
|
|
||||||
renderer.drawString(LINE_SPACING + 1, y, color, line, true);
|
|
||||||
y += fontRenderer.FONT_HEIGHT + LINE_SPACING;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int height = 1 + LINE_SPACING + text.length * (fontRenderer.FONT_HEIGHT + LINE_SPACING);
|
|
||||||
int width = 0;
|
|
||||||
for (String line : text) {
|
|
||||||
int w = fontRenderer.getStringWidth(line);
|
|
||||||
if (w > width) {
|
|
||||||
width = w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
width+=4 * 2;
|
|
||||||
return new Dimension(width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension getMaxSize() {
|
|
||||||
return getMinSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setText(String[]text) {
|
|
||||||
this.text = text;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setText(String text) {
|
|
||||||
return setText(StringUtils.splitStringInMultipleRows(text, 250));
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setI18nText(String text, Object... args) {
|
|
||||||
return setText(I18n.format(text, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setColor(ReadableColor color) {
|
|
||||||
this.color = color;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
public interface ComposedGuiElement<T extends ComposedGuiElement<T>> extends GuiElement<T> {
|
|
||||||
Collection<GuiElement> getChildren();
|
|
||||||
|
|
||||||
<C> C forEach(Class<C> ofType);
|
|
||||||
<C> C forEach(int layer, Class<C> ofType);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the highest layer this element or any of its children take part in.
|
|
||||||
* Events will be called for this composed gui element for all layers between
|
|
||||||
* layer 0 (inclusive) and the returned maximum layer (inclusive).
|
|
||||||
* @return Highest layer relevant to this element
|
|
||||||
*/
|
|
||||||
int getMaxLayer();
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiButton extends AbstractGuiButton<GuiButton> {
|
|
||||||
public GuiButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiButton(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiButton getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiCheckbox extends AbstractGuiCheckbox<GuiCheckbox> {
|
|
||||||
public GuiCheckbox() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiCheckbox(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiCheckbox getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public interface GuiElement<T extends GuiElement<T>> {
|
|
||||||
|
|
||||||
Minecraft getMinecraft();
|
|
||||||
|
|
||||||
GuiContainer getContainer();
|
|
||||||
T setContainer(GuiContainer container);
|
|
||||||
|
|
||||||
void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo);
|
|
||||||
|
|
||||||
ReadableDimension getMinSize();
|
|
||||||
ReadableDimension getMaxSize();
|
|
||||||
|
|
||||||
T setMaxSize(ReadableDimension maxSize);
|
|
||||||
|
|
||||||
boolean isEnabled();
|
|
||||||
T setEnabled(boolean enabled);
|
|
||||||
T setEnabled();
|
|
||||||
T setDisabled();
|
|
||||||
|
|
||||||
GuiElement getTooltip(RenderInfo renderInfo);
|
|
||||||
T setTooltip(GuiElement tooltip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the layer this element takes part in.
|
|
||||||
* The standard layer is layer 0. Event handlers will be called for this layer.
|
|
||||||
* @return The layer of this element
|
|
||||||
*/
|
|
||||||
int getLayer();
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiImage extends AbstractGuiImage<GuiImage> {
|
|
||||||
public GuiImage() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiImage(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiImage(GuiImage copyOf) {
|
|
||||||
super(copyOf);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiImage getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiLabel extends AbstractGuiLabel<GuiLabel> {
|
|
||||||
public GuiLabel() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiLabel(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiLabel getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiNumberField extends AbstractGuiNumberField<GuiNumberField> {
|
|
||||||
public GuiNumberField() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiNumberField(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiNumberField getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiPasswordField extends AbstractGuiPasswordField<GuiPasswordField> {
|
|
||||||
public GuiPasswordField() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiPasswordField(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiPasswordField getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiSlider extends AbstractGuiSlider<GuiSlider> {
|
|
||||||
public GuiSlider() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiSlider(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiSlider getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiTextField extends AbstractGuiTextField<GuiTextField> {
|
|
||||||
public GuiTextField() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiTextField(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiTextField getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiTexturedButton extends AbstractGuiTexturedButton<GuiTexturedButton> {
|
|
||||||
public GuiTexturedButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiTexturedButton(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiTexturedButton getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiToggleButton<V> extends AbstractGuiToggleButton<V, GuiToggleButton<V>> {
|
|
||||||
public GuiToggleButton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiToggleButton(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiToggleButton<V> getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public class GuiTooltip extends AbstractGuiTooltip<GuiTooltip> {
|
|
||||||
@Override
|
|
||||||
protected GuiTooltip getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public interface IGuiButton<T extends IGuiButton<T>> extends IGuiClickable<T> {
|
|
||||||
T setLabel(String label);
|
|
||||||
|
|
||||||
T setI18nLabel(String label, Object... args);
|
|
||||||
|
|
||||||
String getLabel();
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public interface IGuiCheckbox<T extends IGuiCheckbox<T>> extends IGuiClickable<T> {
|
|
||||||
T setLabel(String label);
|
|
||||||
|
|
||||||
T setI18nLabel(String label, Object... args);
|
|
||||||
|
|
||||||
T setChecked(boolean checked);
|
|
||||||
|
|
||||||
String getLabel();
|
|
||||||
|
|
||||||
boolean isChecked();
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public interface IGuiClickable<T extends IGuiClickable<T>> extends GuiElement<T> {
|
|
||||||
T onClick(Runnable onClick);
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
|
|
||||||
public interface IGuiImage<T extends IGuiImage<T>> extends GuiElement<T> {
|
|
||||||
T setTexture(BufferedImage img);
|
|
||||||
T setTexture(ResourceLocation resourceLocation);
|
|
||||||
T setTexture(ResourceLocation resourceLocation, int u, int v, int width, int height);
|
|
||||||
|
|
||||||
T setU(int u);
|
|
||||||
T setV(int v);
|
|
||||||
T setUV(int u, int v);
|
|
||||||
|
|
||||||
T setUWidth(int width);
|
|
||||||
T setVHeight(int height);
|
|
||||||
T setUVSize(int width, int height);
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
|
|
||||||
public interface IGuiLabel<T extends IGuiLabel<T>> extends GuiElement<T> {
|
|
||||||
T setText(String text);
|
|
||||||
|
|
||||||
T setI18nText(String text, Object... args);
|
|
||||||
|
|
||||||
T setColor(ReadableColor color);
|
|
||||||
|
|
||||||
T setDisabledColor(ReadableColor disabledColor);
|
|
||||||
|
|
||||||
String getText();
|
|
||||||
|
|
||||||
ReadableColor getColor();
|
|
||||||
|
|
||||||
ReadableColor getDisabledColor();
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public interface IGuiNumberField<T extends IGuiNumberField<T>> extends IGuiTextField<T> {
|
|
||||||
byte getByte();
|
|
||||||
short getShort();
|
|
||||||
int getInteger();
|
|
||||||
long getLong();
|
|
||||||
float getFloat();
|
|
||||||
double getDouble();
|
|
||||||
|
|
||||||
T setValue(int value);
|
|
||||||
T setValue(double value);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the amount of digits allowed after the decimal point.
|
|
||||||
* A value of {@code 0} is equal to integer precision.
|
|
||||||
* Negative values are not allowed.
|
|
||||||
* @param precision Number of digits allowed
|
|
||||||
*/
|
|
||||||
T setPrecision(int precision);
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public interface IGuiSlider<T extends IGuiSlider<T>> extends GuiElement<T> {
|
|
||||||
T setText(String text);
|
|
||||||
T setI18nText(String text, Object... args);
|
|
||||||
|
|
||||||
T setValue(int value);
|
|
||||||
int getValue();
|
|
||||||
|
|
||||||
int getSteps();
|
|
||||||
T setSteps(int steps);
|
|
||||||
|
|
||||||
T onValueChanged(Runnable runnable);
|
|
||||||
}
|
|
||||||
@@ -1,166 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.function.Focusable;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
|
||||||
import lombok.NonNull;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
|
|
||||||
public interface IGuiTextField<T extends IGuiTextField<T>> extends GuiElement<T>, Focusable<T> {
|
|
||||||
/**
|
|
||||||
* Set the text to the specified string.
|
|
||||||
* If the string is longer than {@link #getMaxLength()} it is truncated from the end.
|
|
||||||
* This method positions the cursor at the end of the text and removes any selections.
|
|
||||||
* @param text The new text
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
*/
|
|
||||||
@NonNull T setText(@NonNull String text);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the text to the specified string.
|
|
||||||
* If the string is longer than {@link #getMaxLength()} it is truncated from the end.
|
|
||||||
* This method positions the cursor at the end of the text and removes any selections.
|
|
||||||
* @param text The language key for the new text
|
|
||||||
* @param args The arguments used in translating the language key
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
*/
|
|
||||||
@NonNull T setI18nText(@NonNull String text, @NonNull Object... args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the whole text in this text field.
|
|
||||||
* @return The text, may be empty
|
|
||||||
*/
|
|
||||||
@NonNull String getText();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the maximum allowed length of the text in this text field.
|
|
||||||
* @return Maximum number of characters
|
|
||||||
*/
|
|
||||||
int getMaxLength();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the maximum allowed length of the text in this text field.
|
|
||||||
* If the current test is longer than the new limit, it is truncated from the end (the cursor and selection
|
|
||||||
* are reset in that process, see {@link #setText(String)}).
|
|
||||||
* @param maxLength Maximum number of characters
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
* @throws IllegalArgumentException When {@code maxLength} is negative
|
|
||||||
*/
|
|
||||||
T setMaxLength(int maxLength);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes the text between {@code from} and {@code to} (inclusive).
|
|
||||||
* @param from Index at which to start
|
|
||||||
* @param to Index to which to delete
|
|
||||||
* @return The deleted text
|
|
||||||
* @throws IllegalArgumentException If {@code from} is greater than {@code to} or either is out of bounds
|
|
||||||
*/
|
|
||||||
@NonNull String deleteText(int from, int to);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the index at which the selection starts (inclusive)
|
|
||||||
* @return Index of first character
|
|
||||||
*/
|
|
||||||
int getSelectionFrom();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the index at which the selection ends (exclusive)
|
|
||||||
* @return Index after the last character
|
|
||||||
*/
|
|
||||||
int getSelectionTo();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the selected text.
|
|
||||||
* @return The selected text
|
|
||||||
*/
|
|
||||||
@NonNull String getSelectedText();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete the selected text. Positions the cursor at the beginning of the selection and clears the selection.
|
|
||||||
* @return The deleted text
|
|
||||||
*/
|
|
||||||
@NonNull String deleteSelectedText();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends the specified string to this text field character by character.
|
|
||||||
* Excess characters are ignored.
|
|
||||||
* @param append String to append
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
* @see #writeChar(char)
|
|
||||||
*/
|
|
||||||
@NonNull T writeText(@NonNull String append);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends the specified character to this text field replacing the current selection (if any).
|
|
||||||
* This does nothing if the maximum character limit is reached.
|
|
||||||
* @param c Character to append
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
*/
|
|
||||||
@NonNull T writeChar(char c);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete the nex character (if any).
|
|
||||||
* Clears the selection.
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
*/
|
|
||||||
T deleteNextChar();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete everything from the cursor (inclusive) to the beginning of the next word (exclusive).
|
|
||||||
* If there are no more words, delete everything until the end of the line.
|
|
||||||
* @return The deleted text
|
|
||||||
*/
|
|
||||||
String deleteNextWord();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete the previous character (if any).
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
*/
|
|
||||||
@NonNull T deletePreviousChar();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete everything from cursor to the first character of the previous word (or the start of the line).
|
|
||||||
* @return The deleted text
|
|
||||||
*/
|
|
||||||
@NonNull String deletePreviousWord();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the cursor position.
|
|
||||||
* @param pos Position of the cursor
|
|
||||||
* @return {@code this} for chaining
|
|
||||||
* @throws IllegalArgumentException If {@code pos} < 0 or pos > length
|
|
||||||
*/
|
|
||||||
@NonNull T setCursorPosition(int pos);
|
|
||||||
|
|
||||||
T onEnter(Runnable onEnter);
|
|
||||||
T onTextChanged(Consumer<String> textChanged);
|
|
||||||
|
|
||||||
String getHint();
|
|
||||||
T setHint(String hint);
|
|
||||||
T setI18nHint(String hint, Object... args);
|
|
||||||
|
|
||||||
ReadableColor getTextColor();
|
|
||||||
T setTextColor(ReadableColor textColor);
|
|
||||||
T setTextColorDisabled(ReadableColor textColorDisabled);
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public interface IGuiTexturedButton<T extends IGuiTexturedButton<T>> extends IGuiClickable<T> {
|
|
||||||
ResourceLocation getTexture();
|
|
||||||
ReadableDimension getTextureTotalSize();
|
|
||||||
T setTexture(ResourceLocation resourceLocation, int size);
|
|
||||||
T setTexture(ResourceLocation resourceLocation, int width, int height);
|
|
||||||
|
|
||||||
ReadableDimension getTextureSize();
|
|
||||||
T setTextureSize(int size);
|
|
||||||
T setTextureSize(int width, int height);
|
|
||||||
|
|
||||||
ReadablePoint getTextureNormal();
|
|
||||||
ReadablePoint getTextureHover();
|
|
||||||
ReadablePoint getTextureDisabled();
|
|
||||||
T setTexturePosH(int x, int y);
|
|
||||||
T setTexturePosV(int x, int y);
|
|
||||||
T setTexturePosH(ReadablePoint pos);
|
|
||||||
T setTexturePosV(ReadablePoint pos);
|
|
||||||
T setTexturePos(int normalX, int normalY, int hoverX, int hoverY);
|
|
||||||
T setTexturePos(ReadablePoint normal, ReadablePoint hover);
|
|
||||||
T setTexturePos(int normalX, int normalY, int hoverX, int hoverY, int disabledX, int disabledY);
|
|
||||||
T setTexturePos(ReadablePoint normal, ReadablePoint hover, ReadablePoint disabled);
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
|
||||||
|
|
||||||
public interface IGuiToggleButton<V, T extends IGuiToggleButton<V, T>> extends IGuiButton<T> {
|
|
||||||
T setValues(V[] values);
|
|
||||||
|
|
||||||
T setSelected(int selected);
|
|
||||||
|
|
||||||
V getSelectedValue();
|
|
||||||
|
|
||||||
int getSelected();
|
|
||||||
|
|
||||||
V[] getValues();
|
|
||||||
}
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.OffsetGuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiPanel;
|
|
||||||
import de.johni0702.minecraft.gui.element.AbstractComposedGuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.AbstractGuiClickable;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import de.johni0702.minecraft.gui.layout.VerticalLayout;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiDropdownMenu<V, T extends AbstractGuiDropdownMenu<V, T>>
|
|
||||||
extends AbstractComposedGuiElement<T> implements IGuiDropdownMenu<V,T>, Clickable {
|
|
||||||
private static final ReadableColor OUTLINE_COLOR = new Color(160, 160, 160);
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private int selected;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private V[] values;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private boolean opened;
|
|
||||||
|
|
||||||
private Consumer<Integer> onSelection;
|
|
||||||
|
|
||||||
private GuiPanel dropdown;
|
|
||||||
|
|
||||||
private ReadableDimension size;
|
|
||||||
|
|
||||||
public AbstractGuiDropdownMenu() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiDropdownMenu(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxLayer() {
|
|
||||||
return opened ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReadableDimension calcMinSize() {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int maxWidth = 0;
|
|
||||||
for (V value : values) {
|
|
||||||
int width = fontRenderer.getStringWidth(value.toString());
|
|
||||||
if (width > maxWidth) {
|
|
||||||
maxWidth = width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new Dimension(11 + maxWidth + fontRenderer.FONT_HEIGHT, fontRenderer.FONT_HEIGHT + 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
if (renderInfo.layer == 0) {
|
|
||||||
this.size = size;
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
|
|
||||||
// Draw box
|
|
||||||
renderer.drawRect(0, 0, width, height, OUTLINE_COLOR);
|
|
||||||
renderer.drawRect(1, 1, width - 2, height - 2, ReadableColor.BLACK);
|
|
||||||
renderer.drawRect(width - height, 0, 1, height, OUTLINE_COLOR);
|
|
||||||
|
|
||||||
// Draw triangle
|
|
||||||
int base = height - 6;
|
|
||||||
int tHeight = base / 2;
|
|
||||||
int x = width - 3 - base / 2;
|
|
||||||
int y = height / 2 - 2;
|
|
||||||
for (int layer = tHeight; layer > 0; layer--) {
|
|
||||||
renderer.drawRect(x - layer, y + (tHeight - layer), layer * 2 - 1, 1, OUTLINE_COLOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderer.drawString(3, height / 2 - fontRenderer.FONT_HEIGHT / 2, ReadableColor.WHITE, getSelectedValue().toString());
|
|
||||||
} else if (renderInfo.layer == 1) {
|
|
||||||
ReadablePoint offsetPoint = new Point(0, size.getHeight());
|
|
||||||
ReadableDimension offsetSize = new Dimension(size.getWidth(), (fontRenderer.FONT_HEIGHT + 5) * values.length);
|
|
||||||
OffsetGuiRenderer offsetRenderer = new OffsetGuiRenderer(renderer, offsetPoint, offsetSize);
|
|
||||||
offsetRenderer.startUsing();
|
|
||||||
try {
|
|
||||||
dropdown.draw(offsetRenderer, offsetSize, renderInfo.offsetMouse(0, offsetPoint.getY()).layer(0));
|
|
||||||
} finally {
|
|
||||||
offsetRenderer.stopUsing();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setValues(V... values) {
|
|
||||||
this.values = values;
|
|
||||||
dropdown = new GuiPanel(){
|
|
||||||
@Override
|
|
||||||
public void convertFor(GuiElement element, Point point) {
|
|
||||||
super.convertFor(element, point);
|
|
||||||
point.translate(0, -size.getHeight());
|
|
||||||
AbstractGuiDropdownMenu parent = AbstractGuiDropdownMenu.this;
|
|
||||||
if (parent.getContainer() != null) {
|
|
||||||
parent.getContainer().convertFor(parent, point);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.setLayout(new VerticalLayout());
|
|
||||||
for (V value : values) {
|
|
||||||
dropdown.addElements(null, new DropdownEntry(value));
|
|
||||||
}
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setSelected(int selected) {
|
|
||||||
this.selected = selected;
|
|
||||||
onSelection(selected);
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setSelected(V value) {
|
|
||||||
for (int i = 0; i < values.length; i++) {
|
|
||||||
if (values[i].equals(value)) {
|
|
||||||
return setSelected(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("The value " + value + " is not in this dropdown menu.");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public V getSelectedValue() {
|
|
||||||
return values[selected];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setOpened(boolean opened) {
|
|
||||||
this.opened = opened;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<GuiElement> getChildren() {
|
|
||||||
return opened ? Collections.<GuiElement>singletonList(dropdown) : Collections.<GuiElement>emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onSelection(Consumer<Integer> consumer) {
|
|
||||||
this.onSelection = consumer;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onSelection(Integer value) {
|
|
||||||
if (onSelection != null) {
|
|
||||||
onSelection.consume(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
Point pos = new Point(position);
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (isMouseHovering(pos)) {
|
|
||||||
setOpened(!isOpened());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMouseHovering(ReadablePoint pos) {
|
|
||||||
return pos.getX() > 0 && pos.getY() > 0
|
|
||||||
&& pos.getX() < size.getWidth() && pos.getY() < size.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
private class DropdownEntry extends AbstractGuiClickable<DropdownEntry> {
|
|
||||||
private final V value;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected DropdownEntry getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, getMinecraft().fontRendererObj.FONT_HEIGHT + 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
|
|
||||||
renderer.drawRect(0, 0, width, height, OUTLINE_COLOR);
|
|
||||||
renderer.drawRect(1, 0, width - 2, height - 1, ReadableColor.BLACK);
|
|
||||||
renderer.drawString(3, 2, ReadableColor.WHITE, value.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
boolean result = super.mouseClick(position, button);
|
|
||||||
setOpened(false);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onClick() {
|
|
||||||
setSelected(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.AbstractGuiElement;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.resources.I18n;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiProgressBar<T extends AbstractGuiProgressBar<T>> extends AbstractGuiElement<T> implements IGuiProgressBar<T> {
|
|
||||||
private static final int BORDER = 2;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private float progress;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private String label = "%d%%";
|
|
||||||
|
|
||||||
public AbstractGuiProgressBar() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiProgressBar(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setProgress(float progress) {
|
|
||||||
this.progress = progress;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setLabel(String label) {
|
|
||||||
this.label = label;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setI18nLabel(String label) {
|
|
||||||
return setLabel(I18n.format(label));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
int barTotalWidth = width - 2 * BORDER;
|
|
||||||
int barDoneWidth = (int) (barTotalWidth * progress);
|
|
||||||
|
|
||||||
renderer.drawRect(0, 0, width, height, ReadableColor.BLACK); // Border
|
|
||||||
renderer.drawRect(BORDER, BORDER, barTotalWidth, height - 2 * BORDER, ReadableColor.WHITE); // Background
|
|
||||||
renderer.drawRect(BORDER, BORDER, barDoneWidth, height - 2 * BORDER, ReadableColor.GREY); // Progress
|
|
||||||
|
|
||||||
String text = String.format(label, (int)(progress * 100));
|
|
||||||
renderer.drawCenteredString(width / 2, size.getHeight() / 2 - fontRenderer.FONT_HEIGHT / 2, ReadableColor.BLACK, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,218 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.AbstractGuiVerticalList;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiPanel;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiLabel;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Closeable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Loadable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Tickable;
|
|
||||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.VerticalLayout;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Colors;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiResourceLoadingList
|
|
||||||
<T extends AbstractGuiResourceLoadingList<T, U>, U extends GuiElement<U> & Comparable<U>>
|
|
||||||
extends AbstractGuiVerticalList<T> implements Tickable, Loadable, Closeable {
|
|
||||||
private static final String[] LOADING_TEXT = {"Ooo", "oOo", "ooO", "oOo"};
|
|
||||||
private final GuiLabel loadingElement = new GuiLabel();
|
|
||||||
private final GuiPanel resourcesPanel = new GuiPanel(getListPanel()).setLayout(new VerticalLayout());
|
|
||||||
|
|
||||||
private Consumer<Consumer<Supplier<U>>> onLoad;
|
|
||||||
private Runnable onSelectionChanged;
|
|
||||||
private Thread loaderThread;
|
|
||||||
private Queue<Runnable> resourcesQueue = new ConcurrentLinkedQueue<>();
|
|
||||||
private int tick;
|
|
||||||
|
|
||||||
private Element selected;
|
|
||||||
|
|
||||||
public AbstractGuiResourceLoadingList() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiResourceLoadingList(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
loadingElement.setText(LOADING_TEXT[tick++ / 5 % LOADING_TEXT.length]);
|
|
||||||
Runnable resource;
|
|
||||||
while ((resource = resourcesQueue.poll()) != null) {
|
|
||||||
resource.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void load() {
|
|
||||||
// Stop current loading
|
|
||||||
if (loaderThread != null) {
|
|
||||||
loaderThread.interrupt();
|
|
||||||
try {
|
|
||||||
loaderThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear list
|
|
||||||
resourcesQueue.clear();
|
|
||||||
for (GuiElement element : new ArrayList<>(resourcesPanel.getChildren())) {
|
|
||||||
resourcesPanel.removeElement(element);
|
|
||||||
}
|
|
||||||
selected = null;
|
|
||||||
onSelectionChanged();
|
|
||||||
|
|
||||||
// Load new data
|
|
||||||
loaderThread = new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
getListPanel().addElements(new VerticalLayout.Data(0.5), loadingElement);
|
|
||||||
try {
|
|
||||||
onLoad.consume(new Consumer<Supplier<U>>() {
|
|
||||||
@Override
|
|
||||||
public void consume(final Supplier<U> obj) {
|
|
||||||
resourcesQueue.offer(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
resourcesPanel.addElements(null, new Element(obj.get()));
|
|
||||||
resourcesPanel.sortElements();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
resourcesQueue.offer(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
getListPanel().removeElement(loadingElement);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
getListPanel().addElements(new VerticalLayout.Data(0.5), loadingElement);
|
|
||||||
loaderThread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() {
|
|
||||||
loaderThread.interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
public T onLoad(Consumer<Consumer<Supplier<U>>> function) {
|
|
||||||
this.onLoad = function;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onSelectionChanged() {
|
|
||||||
if (onSelectionChanged != null) {
|
|
||||||
onSelectionChanged.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public T onSelectionChanged(Runnable onSelectionChanged) {
|
|
||||||
this.onSelectionChanged = onSelectionChanged;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public U getSelected() {
|
|
||||||
return selected == null ? null : selected.resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Element extends GuiPanel implements Clickable, Comparable<Element> {
|
|
||||||
private final U resource;
|
|
||||||
private ReadableDimension size;
|
|
||||||
|
|
||||||
public Element(final U resource) {
|
|
||||||
this.resource = resource;
|
|
||||||
addElements(null, resource);
|
|
||||||
setLayout(new CustomLayout<GuiPanel>() {
|
|
||||||
@Override
|
|
||||||
protected void layout(GuiPanel container, int width, int height) {
|
|
||||||
pos(resource, 2, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
ReadableDimension size = resource.getMinSize();
|
|
||||||
return new Dimension(size.getWidth() + 4, size.getHeight() + 4);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
if (selected == this) {
|
|
||||||
// Draw selection
|
|
||||||
int w = size.getWidth();
|
|
||||||
int h = size.getHeight();
|
|
||||||
// Black background
|
|
||||||
renderer.drawRect(0, 0, w, h, Colors.BLACK);
|
|
||||||
// Light gray border
|
|
||||||
renderer.drawRect(0, 0, w, 1, Colors.LIGHT_GRAY); // Top
|
|
||||||
renderer.drawRect(0, h - 1, w, 1, Colors.LIGHT_GRAY); // Bottom
|
|
||||||
renderer.drawRect(0, 0, 1, h, Colors.LIGHT_GRAY); // Left
|
|
||||||
renderer.drawRect(w - 1, 0, 1, h, Colors.LIGHT_GRAY); // Right
|
|
||||||
}
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
Point point = new Point(position);
|
|
||||||
getContainer().convertFor(this, point);
|
|
||||||
if (point.getX() > 0 && point.getX() < size.getWidth()
|
|
||||||
&& point.getY() > 0 && point.getY() < size.getHeight()) {
|
|
||||||
if (selected != this) {
|
|
||||||
selected = this;
|
|
||||||
onSelectionChanged();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(Element o) {
|
|
||||||
return resource.compareTo(o.resource);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,679 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.AbstractGuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Focusable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Tickable;
|
|
||||||
import de.johni0702.minecraft.gui.function.Typeable;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
|
||||||
import net.minecraft.client.renderer.Tessellator;
|
|
||||||
import net.minecraft.client.renderer.WorldRenderer;
|
|
||||||
import net.minecraft.util.ChatAllowedCharacters;
|
|
||||||
import org.lwjgl.input.Keyboard;
|
|
||||||
import org.lwjgl.opengl.GL11;
|
|
||||||
import org.lwjgl.util.Color;
|
|
||||||
import org.lwjgl.util.*;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import static net.minecraft.client.renderer.GlStateManager.*;
|
|
||||||
import static net.minecraft.util.MathHelper.clamp_int;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiTextArea<T extends AbstractGuiTextArea<T>>
|
|
||||||
extends AbstractGuiElement<T> implements Clickable, Typeable, Tickable, IGuiTextArea<T> {
|
|
||||||
private static final ReadableColor BACKGROUND_COLOR = new Color(160, 160, 160);
|
|
||||||
private static final ReadableColor CURSOR_COLOR = new Color(240, 240, 240);
|
|
||||||
private static final int BORDER = 4;
|
|
||||||
private static final int LINE_SPACING = 2;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private boolean focused;
|
|
||||||
@Getter
|
|
||||||
private Focusable next, previous;
|
|
||||||
|
|
||||||
// Content
|
|
||||||
@Getter
|
|
||||||
private int maxTextWidth = -1;
|
|
||||||
@Getter
|
|
||||||
private int maxTextHeight = -1;
|
|
||||||
@Getter
|
|
||||||
private int maxCharCount = -1;
|
|
||||||
|
|
||||||
private String[] text = {""};
|
|
||||||
private int cursorX;
|
|
||||||
private int cursorY;
|
|
||||||
private int selectionX;
|
|
||||||
private int selectionY;
|
|
||||||
|
|
||||||
// Rendering
|
|
||||||
private int currentXOffset;
|
|
||||||
private int currentYOffset;
|
|
||||||
private int blinkCursorTick;
|
|
||||||
public ReadableColor textColorEnabled = new Color(224, 224, 224);
|
|
||||||
public ReadableColor textColorDisabled = new Color(112, 112, 112);
|
|
||||||
private ReadableDimension size = new Dimension(0, 0); // Size of last render
|
|
||||||
|
|
||||||
public AbstractGuiTextArea() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiTextArea(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setText(String[] lines) {
|
|
||||||
if (lines.length > maxTextHeight) {
|
|
||||||
lines = Arrays.copyOf(lines, maxTextHeight);
|
|
||||||
}
|
|
||||||
this.text = lines;
|
|
||||||
for (int i = 0; i < lines.length; i++) {
|
|
||||||
if (lines[i].length() > maxTextWidth) {
|
|
||||||
lines[i] = lines[i].substring(0, maxTextWidth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] getText() {
|
|
||||||
return this.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getText(int fromX, int fromY, int toX, int toY) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
if (fromY == toY) {
|
|
||||||
sb.append(text[fromY].substring(fromX, toX));
|
|
||||||
} else {
|
|
||||||
sb.append(text[fromY].substring(fromX)).append('\n');
|
|
||||||
for (int y = fromY + 1; y < toY; y++) {
|
|
||||||
sb.append(text[y]).append('\n');
|
|
||||||
}
|
|
||||||
sb.append(text[toY].substring(0, toX));
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteText(int fromX, int fromY, int toX, int toY) {
|
|
||||||
String[] newText = new String[text.length - (toY - fromY)];
|
|
||||||
if (fromY > 0) {
|
|
||||||
System.arraycopy(text, 0, newText, 0, fromY);
|
|
||||||
}
|
|
||||||
|
|
||||||
newText[fromY] = text[fromY].substring(0, fromX) + text[toY].substring(toX);
|
|
||||||
|
|
||||||
if (toY + 1 < text.length) {
|
|
||||||
System.arraycopy(text, toY + 1, newText, fromY + 1, text.length - toY - 1);
|
|
||||||
}
|
|
||||||
text = newText;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSelectionFromX() {
|
|
||||||
if (cursorY == selectionY) {
|
|
||||||
return cursorX > selectionX ? selectionX : cursorX;
|
|
||||||
}
|
|
||||||
return cursorY > selectionY ? selectionX : cursorX;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSelectionToX() {
|
|
||||||
if (cursorY == selectionY) {
|
|
||||||
return cursorX > selectionX ? cursorX : selectionX;
|
|
||||||
}
|
|
||||||
return cursorY > selectionY ? cursorX : selectionX;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSelectionFromY() {
|
|
||||||
return cursorY > selectionY ? selectionY : cursorY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getSelectionToY() {
|
|
||||||
return cursorY > selectionY ? cursorY : selectionY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSelectedText() {
|
|
||||||
if (cursorX == selectionX && cursorY == selectionY) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
int fromX = getSelectionFromX();
|
|
||||||
int fromY = getSelectionFromY();
|
|
||||||
int toX = getSelectionToX();
|
|
||||||
int toY = getSelectionToY();
|
|
||||||
return getText(fromX, fromY, toX, toY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void deleteSelectedText() {
|
|
||||||
if (cursorX == selectionX && cursorY == selectionY) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int fromX = getSelectionFromX();
|
|
||||||
int fromY = getSelectionFromY();
|
|
||||||
int toX = getSelectionToX();
|
|
||||||
int toY = getSelectionToY();
|
|
||||||
deleteText(fromX, fromY, toX, toY);
|
|
||||||
cursorX = selectionX = fromX;
|
|
||||||
cursorY = selectionY = fromY;
|
|
||||||
updateCurrentXOffset();
|
|
||||||
updateCurrentYOffset();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateCurrentXOffset() {
|
|
||||||
currentXOffset = Math.min(currentXOffset, cursorX);
|
|
||||||
String line = text[cursorY].substring(currentXOffset, cursorX);
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int currentWidth = fontRenderer.getStringWidth(line);
|
|
||||||
if (currentWidth > size.getWidth() - BORDER * 2) {
|
|
||||||
currentXOffset = cursorX - fontRenderer.trimStringToWidth(line, size.getWidth() - BORDER * 2, true).length();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateCurrentYOffset() {
|
|
||||||
currentYOffset = Math.min(currentYOffset, cursorY);
|
|
||||||
int lineHeight = getMinecraft().fontRendererObj.FONT_HEIGHT + LINE_SPACING;
|
|
||||||
int contentHeight = size.getHeight() - BORDER * 2;
|
|
||||||
int maxLines = contentHeight / lineHeight;
|
|
||||||
if (cursorY - currentYOffset >= maxLines) {
|
|
||||||
currentYOffset = cursorY - maxLines + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String cutSelectedText() {
|
|
||||||
String selection = getSelectedText();
|
|
||||||
deleteSelectedText();
|
|
||||||
return selection;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeText(String append) {
|
|
||||||
for (char c : append.toCharArray()) {
|
|
||||||
writeChar(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeChar(char c) {
|
|
||||||
if (!ChatAllowedCharacters.isAllowedCharacter(c) && c != '\n') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int totalCharCount = 0;
|
|
||||||
for(String line : text) {
|
|
||||||
totalCharCount += line.length();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(maxCharCount > 0 && totalCharCount-(getSelectedText().length()) >= maxCharCount) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteSelectedText();
|
|
||||||
|
|
||||||
if (c == '\n') {
|
|
||||||
if (text.length >= maxTextHeight) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String[] newText = new String[text.length + 1];
|
|
||||||
if (cursorY > 0) {
|
|
||||||
System.arraycopy(text, 0, newText, 0, cursorY);
|
|
||||||
}
|
|
||||||
|
|
||||||
newText[cursorY] = text[cursorY].substring(0, cursorX);
|
|
||||||
newText[cursorY + 1] = text[cursorY].substring(cursorX);
|
|
||||||
|
|
||||||
if (cursorY + 1 < text.length) {
|
|
||||||
System.arraycopy(text, cursorY + 1, newText, cursorY + 2, text.length - cursorY - 1);
|
|
||||||
}
|
|
||||||
text = newText;
|
|
||||||
selectionX = cursorX = 0;
|
|
||||||
selectionY = ++cursorY;
|
|
||||||
updateCurrentYOffset();
|
|
||||||
} else {
|
|
||||||
String line = text[cursorY];
|
|
||||||
if (line.length() >= maxTextWidth) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
line = line.substring(0, cursorX) + c + line.substring(cursorX);
|
|
||||||
text[cursorY] = line;
|
|
||||||
selectionX = ++cursorX;
|
|
||||||
}
|
|
||||||
updateCurrentXOffset();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteNextChar() {
|
|
||||||
String line = text[cursorY];
|
|
||||||
if (cursorX < line.length()) {
|
|
||||||
line = line.substring(0, cursorX) + line.substring(cursorX + 1);
|
|
||||||
text[cursorY] = line;
|
|
||||||
} else if (cursorY + 1 < text.length) {
|
|
||||||
deleteText(cursorX, cursorY, 0, cursorY + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getNextWordLength() {
|
|
||||||
int length = 0;
|
|
||||||
String line = text[cursorY];
|
|
||||||
boolean inWord = true;
|
|
||||||
for (int i = cursorX; i < line.length(); i++) {
|
|
||||||
if (inWord) {
|
|
||||||
if (line.charAt(i) == ' ') {
|
|
||||||
inWord = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (line.charAt(i) != ' ') {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteNextWord() {
|
|
||||||
int worldLength = getNextWordLength();
|
|
||||||
if (worldLength == 0) {
|
|
||||||
deleteNextChar();
|
|
||||||
} else {
|
|
||||||
deleteText(cursorX, cursorY, cursorX + worldLength, cursorY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deletePreviousChar() {
|
|
||||||
if (cursorX > 0) {
|
|
||||||
String line = text[cursorY];
|
|
||||||
line = line.substring(0, cursorX - 1) + line.substring(cursorX);
|
|
||||||
selectionX = --cursorX;
|
|
||||||
text[cursorY] = line;
|
|
||||||
} else if (cursorY > 0) {
|
|
||||||
int fromX = text[cursorY - 1].length();
|
|
||||||
deleteText(fromX, cursorY - 1, cursorX, cursorY);
|
|
||||||
selectionX = cursorX = fromX;
|
|
||||||
selectionY = --cursorY;
|
|
||||||
}
|
|
||||||
updateCurrentXOffset();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getPreviousWordLength() {
|
|
||||||
int length = 0;
|
|
||||||
String line = text[cursorY];
|
|
||||||
boolean inWord = false;
|
|
||||||
for (int i = cursorX - 1; i >= 0; i--) {
|
|
||||||
if (inWord) {
|
|
||||||
if (line.charAt(i) == ' ') {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (line.charAt(i) != ' ') {
|
|
||||||
inWord = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
length++;
|
|
||||||
}
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deletePreviousWord() {
|
|
||||||
int worldLength = getPreviousWordLength();
|
|
||||||
if (worldLength == 0) {
|
|
||||||
deletePreviousChar();
|
|
||||||
} else {
|
|
||||||
deleteText(cursorX, cursorY, cursorX - worldLength, cursorY);
|
|
||||||
selectionX = cursorX -= worldLength;
|
|
||||||
updateCurrentXOffset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCursorPosition(int x, int y) {
|
|
||||||
selectionY = cursorY = clamp_int(y, 0, text.length - 1);
|
|
||||||
selectionX = cursorX = clamp_int(x, 0, text[cursorY].length());
|
|
||||||
updateCurrentXOffset();
|
|
||||||
updateCurrentYOffset();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void invertColors(GuiRenderer guiRenderer, int right, int bottom, int left, int top) {
|
|
||||||
int x = guiRenderer.getOpenGlOffset().getX();
|
|
||||||
int y = guiRenderer.getOpenGlOffset().getY();
|
|
||||||
right+=x;
|
|
||||||
left+=x;
|
|
||||||
bottom+=y;
|
|
||||||
top+=y;
|
|
||||||
|
|
||||||
color(0, 0, 255, 255);
|
|
||||||
disableTexture2D();
|
|
||||||
enableColorLogic();
|
|
||||||
colorLogicOp(GL11.GL_OR_REVERSE);
|
|
||||||
|
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
|
||||||
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
||||||
renderer.startDrawingQuads();
|
|
||||||
renderer.addVertex(right, top, 0);
|
|
||||||
renderer.addVertex(left, top, 0);
|
|
||||||
renderer.addVertex(left, bottom, 0);
|
|
||||||
renderer.addVertex(right, bottom, 0);
|
|
||||||
tessellator.draw();
|
|
||||||
|
|
||||||
disableColorLogic();
|
|
||||||
enableTexture2D();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
if (getContainer() != null) {
|
|
||||||
getContainer().convertFor(this, (Point) (position = new Point(position)));
|
|
||||||
}
|
|
||||||
boolean hovering = isMouseHovering(position);
|
|
||||||
|
|
||||||
if (hovering && isFocused() && button == 0) {
|
|
||||||
int mouseX = position.getX() - BORDER;
|
|
||||||
int mouseY = position.getY() - BORDER;
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int textY = clamp_int(mouseY / (fontRenderer.FONT_HEIGHT + LINE_SPACING) + currentYOffset, 0, text.length - 1);
|
|
||||||
if (cursorY != textY) {
|
|
||||||
currentXOffset = 0;
|
|
||||||
}
|
|
||||||
String line = text[textY].substring(currentXOffset);
|
|
||||||
int textX = fontRenderer.trimStringToWidth(line, mouseX).length() + currentXOffset;
|
|
||||||
setCursorPosition(textX, textY);
|
|
||||||
}
|
|
||||||
|
|
||||||
setFocused(hovering);
|
|
||||||
return hovering;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMouseHovering(ReadablePoint pos) {
|
|
||||||
return pos.getX() > 0 && pos.getY() > 0
|
|
||||||
&& pos.getX() < size.getWidth() && pos.getY() < size.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setFocused(boolean isFocused) {
|
|
||||||
if (isFocused && !this.focused) {
|
|
||||||
this.blinkCursorTick = 0; // Restart blinking to indicate successful focus
|
|
||||||
}
|
|
||||||
this.focused = isFocused;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setNext(Focusable next) {
|
|
||||||
this.next = next;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setPrevious(Focusable previous) {
|
|
||||||
this.previous = previous;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
FontRenderer fontRenderer = getMinecraft().fontRendererObj;
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
|
|
||||||
// Draw black rect once pixel smaller than gray rect
|
|
||||||
renderer.drawRect(0, 0, width, height, BACKGROUND_COLOR);
|
|
||||||
renderer.drawRect(1, 1, width - 2, height - 2, ReadableColor.BLACK);
|
|
||||||
|
|
||||||
ReadableColor textColor = isEnabled() ? textColorEnabled : textColorDisabled;
|
|
||||||
|
|
||||||
int lineHeight = fontRenderer.FONT_HEIGHT + LINE_SPACING;
|
|
||||||
int contentHeight = height - BORDER * 2;
|
|
||||||
int maxLines = contentHeight / lineHeight;
|
|
||||||
int contentWidth = width - BORDER * 2;
|
|
||||||
|
|
||||||
// Draw lines
|
|
||||||
for (int i = 0; i < maxLines && i + currentYOffset < text.length; i++) {
|
|
||||||
int lineY = i + currentYOffset;
|
|
||||||
String line = text[lineY];
|
|
||||||
int leftTrimmed = 0;
|
|
||||||
if (lineY == cursorY) {
|
|
||||||
line = line.substring(currentXOffset);
|
|
||||||
leftTrimmed = currentXOffset;
|
|
||||||
}
|
|
||||||
line = fontRenderer.trimStringToWidth(line, contentWidth);
|
|
||||||
|
|
||||||
// Draw line
|
|
||||||
int posY = BORDER + i * lineHeight;
|
|
||||||
int lineEnd = renderer.drawString(BORDER, posY, textColor, line, true);
|
|
||||||
|
|
||||||
// Draw selection
|
|
||||||
int fromX = getSelectionFromX();
|
|
||||||
int fromY = getSelectionFromY();
|
|
||||||
int toX = getSelectionToX();
|
|
||||||
int toY = getSelectionToY();
|
|
||||||
if (lineY > fromY && lineY < toY) { // Whole line selected
|
|
||||||
invertColors(renderer, lineEnd, posY - 1 + lineHeight, BORDER, posY - 1);
|
|
||||||
} else if (lineY == fromY && lineY == toY) { // Part of line selected
|
|
||||||
String leftStr = line.substring(0, clamp_int(fromX - leftTrimmed, 0, line.length()));
|
|
||||||
String rightStr = line.substring(clamp_int(toX - leftTrimmed, 0, line.length()));
|
|
||||||
int left = BORDER + fontRenderer.getStringWidth(leftStr);
|
|
||||||
int right = lineEnd - fontRenderer.getStringWidth(rightStr) - 1;
|
|
||||||
invertColors(renderer, right, posY - 1 + lineHeight, left, posY - 1);
|
|
||||||
} else if (lineY == fromY) { // End of line selected
|
|
||||||
String rightStr = line.substring(clamp_int(fromX - leftTrimmed, 0, line.length()));
|
|
||||||
invertColors(renderer, lineEnd, posY - 1 + lineHeight, lineEnd - fontRenderer.getStringWidth(rightStr), posY - 1);
|
|
||||||
} else if (lineY == toY) { // Beginning of line selected
|
|
||||||
String leftStr = line.substring(0, clamp_int(toX - leftTrimmed, 0, line.length()));
|
|
||||||
int right = BORDER + fontRenderer.getStringWidth(leftStr);
|
|
||||||
invertColors(renderer, right, posY - 1 + lineHeight, BORDER, posY - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw cursor
|
|
||||||
if (lineY == cursorY && blinkCursorTick / 6 % 2 == 0 && focused) {
|
|
||||||
String beforeCursor = line.substring(0, cursorX - leftTrimmed);
|
|
||||||
int posX = BORDER + fontRenderer.getStringWidth(beforeCursor);
|
|
||||||
if (cursorX == text[lineY].length()) {
|
|
||||||
renderer.drawString(posX, posY, CURSOR_COLOR, "_", true);
|
|
||||||
} else {
|
|
||||||
renderer.drawRect(posX, posY - 1, 1, 1 + fontRenderer.FONT_HEIGHT, CURSOR_COLOR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown) {
|
|
||||||
if (keyCode == Keyboard.KEY_TAB) {
|
|
||||||
Focusable other = shiftDown ? previous : next;
|
|
||||||
if (other != null) {
|
|
||||||
setFocused(false);
|
|
||||||
other.setFocused(true);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.focused) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GuiScreen.isCtrlKeyDown()) {
|
|
||||||
switch (keyCode) {
|
|
||||||
case Keyboard.KEY_A: // Select all
|
|
||||||
cursorX = cursorY = 0;
|
|
||||||
selectionY = text.length - 1;
|
|
||||||
selectionX = text[selectionY].length();
|
|
||||||
updateCurrentXOffset();
|
|
||||||
updateCurrentYOffset();
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_C: // Copy
|
|
||||||
GuiScreen.setClipboardString(getSelectedText());
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_V: // Paste
|
|
||||||
if (isEnabled()) {
|
|
||||||
writeText(GuiScreen.getClipboardString());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_X: // Cut
|
|
||||||
if (isEnabled()) {
|
|
||||||
GuiScreen.setClipboardString(cutSelectedText());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean words = GuiScreen.isCtrlKeyDown();
|
|
||||||
boolean select = GuiScreen.isShiftKeyDown();
|
|
||||||
switch (keyCode) {
|
|
||||||
case Keyboard.KEY_HOME:
|
|
||||||
cursorX = 0;
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_END:
|
|
||||||
cursorX = text[cursorY].length();
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_LEFT:
|
|
||||||
if (cursorX == 0) {
|
|
||||||
if (cursorY > 0) {
|
|
||||||
cursorY--;
|
|
||||||
cursorX = text[cursorY].length();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (words) {
|
|
||||||
cursorX -= getPreviousWordLength();
|
|
||||||
} else {
|
|
||||||
cursorX--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_RIGHT:
|
|
||||||
if (cursorX == text[cursorY].length()) {
|
|
||||||
if (cursorY < text.length - 1) {
|
|
||||||
cursorY++;
|
|
||||||
cursorX = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (words) {
|
|
||||||
cursorX += getNextWordLength();
|
|
||||||
} else {
|
|
||||||
cursorX++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_UP:
|
|
||||||
if (cursorY > 0) {
|
|
||||||
cursorY--;
|
|
||||||
cursorX = Math.min(cursorX, text[cursorY].length());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_DOWN:
|
|
||||||
if (cursorY + 1 < text.length) {
|
|
||||||
cursorY++;
|
|
||||||
cursorX = Math.min(cursorX, text[cursorY].length());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Keyboard.KEY_BACK:
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (getSelectedText().length() > 0) {
|
|
||||||
deleteSelectedText();
|
|
||||||
} else if (words) {
|
|
||||||
deletePreviousWord();
|
|
||||||
} else {
|
|
||||||
deletePreviousChar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case Keyboard.KEY_DELETE:
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (getSelectedText().length() > 0) {
|
|
||||||
deleteSelectedText();
|
|
||||||
} else if (words) {
|
|
||||||
deleteNextWord();
|
|
||||||
} else {
|
|
||||||
deleteNextChar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
if (isEnabled()) {
|
|
||||||
if (keyChar == '\r') {
|
|
||||||
keyChar = '\n';
|
|
||||||
}
|
|
||||||
writeChar(keyChar);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateCurrentXOffset();
|
|
||||||
updateCurrentYOffset();
|
|
||||||
|
|
||||||
if (!select) {
|
|
||||||
selectionX = cursorX;
|
|
||||||
selectionY = cursorY;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
blinkCursorTick++;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setMaxTextWidth(int maxTextWidth) {
|
|
||||||
this.maxTextWidth = maxTextWidth;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setMaxTextHeight(int maxTextHeight) {
|
|
||||||
this.maxTextHeight = maxTextHeight;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setMaxCharCount(int maxCharCount) {
|
|
||||||
this.maxCharCount = maxCharCount;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTextColor(ReadableColor textColor) {
|
|
||||||
this.textColorEnabled = textColor;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setTextColorDisabled(ReadableColor textColorDisabled) {
|
|
||||||
this.textColorDisabled = textColorDisabled;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,257 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.AbstractGuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiTooltip;
|
|
||||||
import de.johni0702.minecraft.gui.function.Clickable;
|
|
||||||
import net.minecraft.util.MathHelper;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiTimeline<T extends AbstractGuiTimeline<T>> extends AbstractGuiElement<T> implements IGuiTimeline<T>, Clickable {
|
|
||||||
protected static final int TEXTURE_WIDTH = 64;
|
|
||||||
protected static final int TEXTURE_HEIGHT = 22;
|
|
||||||
|
|
||||||
protected static final int TEXTURE_X = 0;
|
|
||||||
protected static final int TEXTURE_Y = 16;
|
|
||||||
|
|
||||||
protected static final int BORDER_LEFT = 4;
|
|
||||||
protected static final int BORDER_RIGHT = 4;
|
|
||||||
protected static final int BORDER_TOP = 4;
|
|
||||||
protected static final int BORDER_BOTTOM = 3;
|
|
||||||
protected static final int BODY_WIDTH = TEXTURE_WIDTH - BORDER_LEFT - BORDER_RIGHT;
|
|
||||||
protected static final int BODY_HEIGHT = TEXTURE_HEIGHT - BORDER_TOP - BORDER_BOTTOM;
|
|
||||||
|
|
||||||
private OnClick onClick;
|
|
||||||
|
|
||||||
private int length;
|
|
||||||
private int cursorPosition;
|
|
||||||
private double zoom = 1;
|
|
||||||
private int offset;
|
|
||||||
|
|
||||||
private ReadableDimension size;
|
|
||||||
|
|
||||||
public AbstractGuiTimeline() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public AbstractGuiTimeline(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
setTooltip(new GuiTooltip(){
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
setText(getTooltipText(renderInfo));
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
}
|
|
||||||
}.setText("00:00"));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getTooltipText(RenderInfo renderInfo) {
|
|
||||||
int ms = getTimeAt(renderInfo.mouseX, renderInfo.mouseY);
|
|
||||||
int s = ms / 1000 % 60;
|
|
||||||
int m = ms / 1000 / 60;
|
|
||||||
return String.format("%02d:%02d", m, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
this.size = size;
|
|
||||||
|
|
||||||
int width = size.getWidth();
|
|
||||||
int height = size.getHeight();
|
|
||||||
|
|
||||||
// We have to increase the border size as there is one pixel row which is part of the border while drawing
|
|
||||||
// but isn't during position calculations due to shadows
|
|
||||||
int BORDER_LEFT = GuiTimeline.BORDER_LEFT + 1;
|
|
||||||
int BODY_WIDTH = GuiTimeline.BODY_WIDTH - 1;
|
|
||||||
|
|
||||||
renderer.bindTexture(TEXTURE);
|
|
||||||
|
|
||||||
// Left and right borders
|
|
||||||
for (int pass = 0; pass < 2; pass++) {
|
|
||||||
int x = pass == 0 ? 0 : width - BORDER_RIGHT;
|
|
||||||
int textureX = pass == 0 ? TEXTURE_X : TEXTURE_X + TEXTURE_WIDTH - BORDER_RIGHT;
|
|
||||||
// Border
|
|
||||||
for (int y = BORDER_TOP; y < height - BORDER_BOTTOM; y += BODY_HEIGHT) {
|
|
||||||
int segmentHeight = Math.min(BODY_HEIGHT, height - BORDER_BOTTOM - y);
|
|
||||||
renderer.drawTexturedRect(x, y, textureX, TEXTURE_Y + BORDER_TOP, BORDER_LEFT, segmentHeight);
|
|
||||||
}
|
|
||||||
// Top corner
|
|
||||||
renderer.drawTexturedRect(x, 0, textureX, TEXTURE_Y, BORDER_LEFT, BORDER_TOP);
|
|
||||||
// Bottom corner
|
|
||||||
renderer.drawTexturedRect(x, height - BORDER_BOTTOM, textureX, TEXTURE_Y + TEXTURE_HEIGHT - BORDER_BOTTOM,
|
|
||||||
BORDER_LEFT, BORDER_BOTTOM);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int x = BORDER_LEFT; x < width - BORDER_RIGHT; x += BODY_WIDTH) {
|
|
||||||
int segmentWidth = Math.min(BODY_WIDTH, width - BORDER_RIGHT - x);
|
|
||||||
int textureX = TEXTURE_X + BORDER_LEFT;
|
|
||||||
|
|
||||||
// Content
|
|
||||||
for (int y = BORDER_TOP; y < height - BORDER_BOTTOM; y += BODY_HEIGHT) {
|
|
||||||
int segmentHeight = Math.min(BODY_HEIGHT, height - BORDER_BOTTOM - y);
|
|
||||||
renderer.drawTexturedRect(x, y, textureX, TEXTURE_Y + BORDER_TOP, segmentWidth, segmentHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Top border
|
|
||||||
renderer.drawTexturedRect(x, 0, textureX, TEXTURE_Y, segmentWidth, BORDER_TOP);
|
|
||||||
// Bottom border
|
|
||||||
renderer.drawTexturedRect(x, height - BORDER_BOTTOM, textureX, TEXTURE_Y + TEXTURE_HEIGHT - BORDER_BOTTOM,
|
|
||||||
segmentWidth, BORDER_BOTTOM);
|
|
||||||
}
|
|
||||||
|
|
||||||
drawTimelineCursor(renderer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws the timeline cursor.
|
|
||||||
* This is separate from the main draw method so subclasses can repaint the cursor
|
|
||||||
* in case it got drawn over by other elements.
|
|
||||||
* @param renderer Gui renderer used to draw the cursor
|
|
||||||
* @param size Size of the drawable area
|
|
||||||
*/
|
|
||||||
protected void drawTimelineCursor(GuiRenderer renderer, ReadableDimension size) {
|
|
||||||
int height = size.getHeight();
|
|
||||||
renderer.bindTexture(TEXTURE);
|
|
||||||
|
|
||||||
int visibleLength = (int) (length * zoom);
|
|
||||||
int cursor = MathHelper.clamp_int(cursorPosition, offset, offset + visibleLength);
|
|
||||||
double positionInVisible = cursor - offset;
|
|
||||||
double fractionOfVisible = positionInVisible / visibleLength;
|
|
||||||
int cursorX = (int) (BORDER_LEFT + fractionOfVisible * (size.getWidth() - BORDER_LEFT - BORDER_RIGHT));
|
|
||||||
|
|
||||||
// Pin
|
|
||||||
renderer.drawTexturedRect(cursorX - 2, BORDER_TOP - 1, 64, 0, 5, 4);
|
|
||||||
// Needle
|
|
||||||
for (int y = BORDER_TOP - 1; y < height - BORDER_BOTTOM; y += 11) {
|
|
||||||
int segmentHeight = Math.min(11, height - BORDER_BOTTOM - y);
|
|
||||||
renderer.drawTexturedRect(cursorX - 2, y, 64, 4, 5, segmentHeight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the time which the mouse is at.
|
|
||||||
* @param mouseX X coordinate of the mouse
|
|
||||||
* @param mouseY Y coordinate of the mouse
|
|
||||||
* @return The time or -1 if the mouse isn't on the timeline
|
|
||||||
*/
|
|
||||||
protected int getTimeAt(int mouseX, int mouseY) {
|
|
||||||
if (size == null) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
Point mouse = new Point(mouseX, mouseY);
|
|
||||||
getContainer().convertFor(this, mouse);
|
|
||||||
mouseX = mouse.getX();
|
|
||||||
mouseY = mouse.getY();
|
|
||||||
|
|
||||||
if (mouseX < 0 || mouseY < 0
|
|
||||||
|| mouseX > size.getWidth() || mouseY > size.getHeight()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int width = size.getWidth();
|
|
||||||
int bodyWidth = width - BORDER_LEFT - BORDER_RIGHT;
|
|
||||||
double segmentLength = length * zoom;
|
|
||||||
double segmentTime = segmentLength * (mouseX - BORDER_LEFT) / bodyWidth;
|
|
||||||
return Math.min(Math.max((int) Math.round(offset + segmentTime), 0), length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onClick(int time) {
|
|
||||||
if (onClick != null) {
|
|
||||||
onClick.run(time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize() {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setLength(int length) {
|
|
||||||
this.length = length;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getLength() {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setCursorPosition(int position) {
|
|
||||||
this.cursorPosition = position;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCursorPosition() {
|
|
||||||
return cursorPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setZoom(double zoom) {
|
|
||||||
this.zoom = zoom;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double getZoom() {
|
|
||||||
return zoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T setOffset(int offset) {
|
|
||||||
this.offset = offset;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getOffset() {
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public T onClick(OnClick onClick) {
|
|
||||||
this.onClick = onClick;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClick(ReadablePoint position, int button) {
|
|
||||||
int time = getTimeAt(position.getX(), position.getY());
|
|
||||||
if (time != -1) {
|
|
||||||
onClick(time);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiDropdownMenu<V> extends AbstractGuiDropdownMenu<V, GuiDropdownMenu<V>> {
|
|
||||||
|
|
||||||
public GuiDropdownMenu() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiDropdownMenu(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiDropdownMenu<V> getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiProgressBar extends AbstractGuiProgressBar<GuiProgressBar> {
|
|
||||||
public GuiProgressBar() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiProgressBar(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiProgressBar getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
|
|
||||||
public class GuiResourceLoadingList<U extends GuiElement<U> & Comparable<U>>
|
|
||||||
extends AbstractGuiResourceLoadingList<GuiResourceLoadingList<U>, U> {
|
|
||||||
public GuiResourceLoadingList() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiResourceLoadingList(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiResourceLoadingList<U> getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiTextArea extends AbstractGuiTextArea<GuiTextArea> {
|
|
||||||
public GuiTextArea() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiTextArea(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiTextArea getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
|
|
||||||
public class GuiTimeline extends AbstractGuiTimeline<GuiTimeline> {
|
|
||||||
public GuiTimeline() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiTimeline(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiTimeline getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
|
||||||
|
|
||||||
public interface IGuiDropdownMenu<V, T extends IGuiDropdownMenu<V, T>> extends GuiElement<T> {
|
|
||||||
T setValues(V... values);
|
|
||||||
|
|
||||||
T setSelected(int selected);
|
|
||||||
|
|
||||||
T setSelected(V value);
|
|
||||||
|
|
||||||
V getSelectedValue();
|
|
||||||
|
|
||||||
T setOpened(boolean opened);
|
|
||||||
|
|
||||||
int getSelected();
|
|
||||||
|
|
||||||
V[] getValues();
|
|
||||||
|
|
||||||
boolean isOpened();
|
|
||||||
|
|
||||||
T onSelection(Consumer<Integer> consumer);
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
|
|
||||||
public interface IGuiProgressBar<T extends IGuiProgressBar<T>> extends GuiElement<T> {
|
|
||||||
T setProgress(float progress);
|
|
||||||
|
|
||||||
T setLabel(String label);
|
|
||||||
|
|
||||||
T setI18nLabel(String label);
|
|
||||||
|
|
||||||
float getProgress();
|
|
||||||
|
|
||||||
String getLabel();
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.function.Focusable;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
|
|
||||||
public interface IGuiTextArea<T extends IGuiTextArea<T>> extends GuiElement<T>,Focusable {
|
|
||||||
void setText(String[] lines);
|
|
||||||
|
|
||||||
String[] getText();
|
|
||||||
|
|
||||||
String getText(int fromX, int fromY, int toX, int toY);
|
|
||||||
|
|
||||||
int getSelectionFromX();
|
|
||||||
|
|
||||||
int getSelectionToX();
|
|
||||||
|
|
||||||
int getSelectionFromY();
|
|
||||||
|
|
||||||
int getSelectionToY();
|
|
||||||
|
|
||||||
String getSelectedText();
|
|
||||||
|
|
||||||
void deleteSelectedText();
|
|
||||||
|
|
||||||
String cutSelectedText();
|
|
||||||
|
|
||||||
void writeText(String append);
|
|
||||||
|
|
||||||
void writeChar(char c);
|
|
||||||
|
|
||||||
void setCursorPosition(int x, int y);
|
|
||||||
|
|
||||||
T setMaxTextWidth(int maxTextWidth);
|
|
||||||
|
|
||||||
T setMaxTextHeight(int maxTextHeight);
|
|
||||||
|
|
||||||
T setMaxCharCount(int maxCharCount);
|
|
||||||
|
|
||||||
T setTextColor(ReadableColor textColor);
|
|
||||||
|
|
||||||
T setTextColorDisabled(ReadableColor textColorDisabled);
|
|
||||||
|
|
||||||
int getMaxTextWidth();
|
|
||||||
|
|
||||||
int getMaxTextHeight();
|
|
||||||
|
|
||||||
int getMaxCharCount();
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.element.advanced;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
|
|
||||||
public interface IGuiTimeline<T extends IGuiTimeline<T>> extends GuiElement<T> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the total length of the timeline.
|
|
||||||
* @param length length in milliseconds, must be > 0
|
|
||||||
* @return {@code this}, for chaining
|
|
||||||
*/
|
|
||||||
T setLength(int length);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the total length of the timeline.
|
|
||||||
* @return The total length in millisconds
|
|
||||||
*/
|
|
||||||
int getLength();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current position of the cursor. Should be between 0 and {@link #getLength()}.
|
|
||||||
* @param position Position of the cursor in milliseconds
|
|
||||||
* @return {@code this}, for chaining
|
|
||||||
*/
|
|
||||||
T setCursorPosition(int position);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the current position of the cursor. Should be between 0 and {@link #getLength()}.
|
|
||||||
* @return cursor position in milliseconds
|
|
||||||
*/
|
|
||||||
int getCursorPosition();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the zoom of this timeline. 1/10 allows the user to see 1/10 of the total length.
|
|
||||||
* @param zoom The zoom factor. Must be between 1 (inclusive) and 0 (exclusive)
|
|
||||||
* @return {@code this}, for chaining
|
|
||||||
*/
|
|
||||||
T setZoom(double zoom);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the zoom of this timeline. 1/10 allows the user to see 1/10 of the total length.
|
|
||||||
* @return The zoom factor. Must be between 1 (inclusive) and 0 (exclusive)
|
|
||||||
*/
|
|
||||||
double getZoom();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the position of the timeline which should be shown.
|
|
||||||
* The left side of the timeline will start at this offset.
|
|
||||||
* @param offset The offset in milliseconds
|
|
||||||
* @return {@code this}, for chaining
|
|
||||||
*/
|
|
||||||
T setOffset(int offset);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the position of the timeline which should be shown.
|
|
||||||
* The left side of the timeline will start at this offset.
|
|
||||||
* @return The offset in milliseconds
|
|
||||||
*/
|
|
||||||
int getOffset();
|
|
||||||
|
|
||||||
T onClick(OnClick onClick);
|
|
||||||
|
|
||||||
interface OnClick {
|
|
||||||
void run(int time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public interface Clickable {
|
|
||||||
boolean mouseClick(ReadablePoint position, int button);
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
public interface Closeable {
|
|
||||||
void close();
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public interface Draggable extends Clickable {
|
|
||||||
boolean mouseDrag(ReadablePoint position, int button, long timeSinceLastCall);
|
|
||||||
boolean mouseRelease(ReadablePoint position, int button);
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
public interface Focusable<T extends Focusable<T>> {
|
|
||||||
|
|
||||||
boolean isFocused();
|
|
||||||
T setFocused(boolean focused);
|
|
||||||
|
|
||||||
Focusable getNext();
|
|
||||||
T setNext(Focusable next);
|
|
||||||
|
|
||||||
Focusable getPrevious();
|
|
||||||
T setPrevious(Focusable previous);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
public interface Loadable {
|
|
||||||
void load();
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public interface Scrollable {
|
|
||||||
/**
|
|
||||||
* Called when the user scrolled.
|
|
||||||
* @param mousePosition Global position of the mouse.
|
|
||||||
* @param dWheel Wheel movement (positive is upwards, negative is downwards)
|
|
||||||
* @return {@code true} if this event should be consumed,
|
|
||||||
* {@code false} if it should be delivered to other elements as well
|
|
||||||
*/
|
|
||||||
boolean scroll(ReadablePoint mousePosition, int dWheel);
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
public interface Tickable {
|
|
||||||
void tick();
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.function;
|
|
||||||
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
public interface Typeable {
|
|
||||||
boolean typeKey(ReadablePoint mousePosition, int keyCode, char keyChar, boolean ctrlDown, boolean shiftDown);
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public abstract class CustomLayout<T extends GuiContainer<T>> implements Layout {
|
|
||||||
private final Layout parent;
|
|
||||||
private Map<GuiElement, Pair<Point, Dimension>> result = new LinkedHashMap<>();
|
|
||||||
|
|
||||||
public CustomLayout() {
|
|
||||||
this(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CustomLayout(Layout parent) {
|
|
||||||
this.parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> layOut(GuiContainer container, ReadableDimension size) {
|
|
||||||
result.clear();
|
|
||||||
if (parent == null) {
|
|
||||||
Collection<GuiElement> elements = container.getChildren();
|
|
||||||
for (GuiElement element : elements) {
|
|
||||||
result.put(element, Pair.of(new Point(0, 0), new Dimension(element.getMinSize())));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> elements = parent.layOut(container, size);
|
|
||||||
for (Map.Entry<GuiElement, Pair<ReadablePoint, ReadableDimension>> entry : elements.entrySet()) {
|
|
||||||
Pair<ReadablePoint, ReadableDimension> pair = entry.getValue();
|
|
||||||
result.put(entry.getKey(), Pair.of(new Point(pair.getLeft()), new Dimension(pair.getRight())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
layout((T) container, size.getWidth(), size.getHeight());
|
|
||||||
|
|
||||||
return (Map) result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Pair<Point, Dimension> entry(GuiElement element) {
|
|
||||||
return result.get(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void set(GuiElement element, int x, int y, int width, int height) {
|
|
||||||
Pair<Point, Dimension> entry = entry(element);
|
|
||||||
entry.getLeft().setLocation(x, y);
|
|
||||||
entry.getRight().setSize(width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void pos(GuiElement element, int x, int y) {
|
|
||||||
entry(element).getLeft().setLocation(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void size(GuiElement element, ReadableDimension size) {
|
|
||||||
size.getSize(entry(element).getRight());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void size(GuiElement element, int width, int height) {
|
|
||||||
entry(element).getRight().setSize(width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void x(GuiElement element, int x) {
|
|
||||||
entry(element).getLeft().setX(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void y(GuiElement element, int y) {
|
|
||||||
entry(element).getLeft().setY(y);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void width(GuiElement element, int width) {
|
|
||||||
entry(element).getRight().setWidth(width);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void height(GuiElement element, int height) {
|
|
||||||
entry(element).getRight().setHeight(height);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int x(GuiElement element) {
|
|
||||||
return entry(element).getLeft().getX();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int y(GuiElement element) {
|
|
||||||
return entry(element).getLeft().getY();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int width(GuiElement element) {
|
|
||||||
return entry(element).getRight().getWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int height(GuiElement element) {
|
|
||||||
return entry(element).getRight().getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void layout(T container, int width, int height);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
return new Dimension(0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class GridLayout implements Layout {
|
|
||||||
private static final Data DEFAULT_DATA = new Data();
|
|
||||||
|
|
||||||
@Accessors(chain = true)
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private int columns;
|
|
||||||
|
|
||||||
@Accessors(chain = true)
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private int spacingX, spacingY;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> layOut(GuiContainer<?> container, ReadableDimension size) {
|
|
||||||
Preconditions.checkState(columns != 0, "Columns may not be 0.");
|
|
||||||
int elements = container.getElements().size();
|
|
||||||
int rows = (elements - 1 + columns) / columns;
|
|
||||||
if (rows < 1) {
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
int cellWidth = (size.getWidth() + spacingX) / columns - spacingX;
|
|
||||||
int cellHeight = (size.getHeight() + spacingY) / rows - spacingY;
|
|
||||||
Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> map = new LinkedHashMap<>();
|
|
||||||
Iterator<Map.Entry<GuiElement, LayoutData>> iter = container.getElements().entrySet().iterator();
|
|
||||||
for (int i = 0; i < rows; i++) {
|
|
||||||
for (int j = 0; j < columns; j++) {
|
|
||||||
if (!iter.hasNext()) {
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
int x = j * (cellWidth + spacingX);
|
|
||||||
int y = i * (cellHeight + spacingY);
|
|
||||||
|
|
||||||
Map.Entry<GuiElement, LayoutData> entry = iter.next();
|
|
||||||
GuiElement element = entry.getKey();
|
|
||||||
Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA;
|
|
||||||
Dimension elementSize = new Dimension(element.getMinSize());
|
|
||||||
ReadableDimension elementMaxSize = element.getMaxSize();
|
|
||||||
elementSize.setWidth(Math.min(cellWidth, elementMaxSize.getWidth()));
|
|
||||||
elementSize.setHeight(Math.min(cellHeight, elementMaxSize.getHeight()));
|
|
||||||
|
|
||||||
int remainingWidth = cellWidth - elementSize.getWidth();
|
|
||||||
int remainingHeight = cellHeight - elementSize.getHeight();
|
|
||||||
x += (int) (data.alignmentX * remainingWidth);
|
|
||||||
y += (int) (data.alignmentY * remainingHeight);
|
|
||||||
map.put(element, Pair.<ReadablePoint, ReadableDimension>of(new Point(x, y), elementSize));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
Preconditions.checkState(columns != 0, "Columns may not be 0.");
|
|
||||||
int maxWidth = 0, maxHeight = 0;
|
|
||||||
int elements = 0;
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> entry : container.getElements().entrySet()) {
|
|
||||||
GuiElement element = entry.getKey();
|
|
||||||
ReadableDimension minSize = element.getMinSize();
|
|
||||||
int width = minSize.getWidth();
|
|
||||||
if (width > maxWidth) {
|
|
||||||
maxWidth = width;
|
|
||||||
}
|
|
||||||
int height = minSize.getHeight();
|
|
||||||
if (height > maxHeight) {
|
|
||||||
maxHeight = height;
|
|
||||||
}
|
|
||||||
elements++;
|
|
||||||
}
|
|
||||||
int rows = (elements - 1 + columns) / columns;
|
|
||||||
int totalWidth = maxWidth * columns;
|
|
||||||
int totalHeight = maxHeight * rows;
|
|
||||||
if (elements > 0) {
|
|
||||||
totalWidth+=spacingX * (columns - 1);
|
|
||||||
}
|
|
||||||
if (elements > columns) {
|
|
||||||
totalHeight+=spacingY * (rows - 1);
|
|
||||||
}
|
|
||||||
return new Dimension(totalWidth, totalHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@lombok.Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
public static class Data implements LayoutData {
|
|
||||||
private double alignmentX, alignmentY;
|
|
||||||
|
|
||||||
public Data() {
|
|
||||||
this(0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class HorizontalLayout implements Layout {
|
|
||||||
private static final Data DEFAULT_DATA = new Data(0);
|
|
||||||
|
|
||||||
private final Alignment alignment;
|
|
||||||
|
|
||||||
@Accessors(chain = true)
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private int spacing;
|
|
||||||
|
|
||||||
public HorizontalLayout() {
|
|
||||||
this(Alignment.LEFT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public HorizontalLayout(Alignment alignment) {
|
|
||||||
this.alignment = alignment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> layOut(GuiContainer<?> container, ReadableDimension size) {
|
|
||||||
int x = 0;
|
|
||||||
int spacing = 0;
|
|
||||||
Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> map = new LinkedHashMap<>();
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> entry : container.getElements().entrySet()) {
|
|
||||||
x += spacing;
|
|
||||||
spacing = this.spacing;
|
|
||||||
|
|
||||||
GuiElement element = entry.getKey();
|
|
||||||
Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA;
|
|
||||||
Dimension elementSize = new Dimension(element.getMinSize());
|
|
||||||
ReadableDimension elementMaxSize = element.getMaxSize();
|
|
||||||
elementSize.setWidth(Math.min(size.getWidth() - x, Math.min(elementSize.getWidth(), elementMaxSize.getWidth())));
|
|
||||||
elementSize.setHeight(Math.min(size.getHeight(), elementMaxSize.getHeight()));
|
|
||||||
int remainingHeight = size.getHeight() - elementSize.getHeight();
|
|
||||||
int y = (int) (data.alignment * remainingHeight);
|
|
||||||
map.put(element, Pair.<ReadablePoint, ReadableDimension>of(new Point(x, y), elementSize));
|
|
||||||
x += elementSize.getWidth();
|
|
||||||
}
|
|
||||||
if (alignment != Alignment.LEFT) {
|
|
||||||
int remaining = size.getWidth() - x;
|
|
||||||
if (alignment == Alignment.CENTER) {
|
|
||||||
remaining /= 2;
|
|
||||||
}
|
|
||||||
for (Pair<ReadablePoint, ReadableDimension> pair : map.values()) {
|
|
||||||
((Point) pair.getLeft()).translate(remaining, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
int maxHeight = 0;
|
|
||||||
int width = 0;
|
|
||||||
int spacing = 0;
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> entry : container.getElements().entrySet()) {
|
|
||||||
width += spacing;
|
|
||||||
spacing = this.spacing;
|
|
||||||
|
|
||||||
GuiElement element = entry.getKey();
|
|
||||||
ReadableDimension minSize = element.getMinSize();
|
|
||||||
int height = minSize.getHeight();
|
|
||||||
if (height > maxHeight) {
|
|
||||||
maxHeight = height;
|
|
||||||
}
|
|
||||||
width += minSize.getWidth();
|
|
||||||
}
|
|
||||||
return new Dimension(width, maxHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@lombok.Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
public static class Data implements LayoutData {
|
|
||||||
private double alignment;
|
|
||||||
|
|
||||||
public Data() {
|
|
||||||
this(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Alignment {
|
|
||||||
LEFT, RIGHT, CENTER
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface Layout {
|
|
||||||
|
|
||||||
Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> layOut(GuiContainer<?> container, ReadableDimension size);
|
|
||||||
|
|
||||||
ReadableDimension calcMinSize(GuiContainer<?> container);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
public interface LayoutData {
|
|
||||||
LayoutData NONE = VoidLayoutData.INSTANCE;
|
|
||||||
}
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.Point;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
import org.lwjgl.util.ReadablePoint;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class VerticalLayout implements Layout {
|
|
||||||
private static final Data DEFAULT_DATA = new Data(0);
|
|
||||||
|
|
||||||
private final Alignment alignment;
|
|
||||||
|
|
||||||
@Accessors(chain = true)
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
private int spacing;
|
|
||||||
|
|
||||||
public VerticalLayout() {
|
|
||||||
this(Alignment.TOP);
|
|
||||||
}
|
|
||||||
|
|
||||||
public VerticalLayout(Alignment alignment) {
|
|
||||||
this.alignment = alignment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> layOut(GuiContainer<?> container, ReadableDimension size) {
|
|
||||||
int y = 0;
|
|
||||||
int spacing = 0;
|
|
||||||
Map<GuiElement, Pair<ReadablePoint, ReadableDimension>> map = new LinkedHashMap<>();
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> entry : container.getElements().entrySet()) {
|
|
||||||
y += spacing;
|
|
||||||
spacing = this.spacing;
|
|
||||||
|
|
||||||
GuiElement element = entry.getKey();
|
|
||||||
Data data = entry.getValue() instanceof Data ? (Data) entry.getValue() : DEFAULT_DATA;
|
|
||||||
Dimension elementSize = new Dimension(element.getMinSize());
|
|
||||||
ReadableDimension elementMaxSize = element.getMaxSize();
|
|
||||||
elementSize.setHeight(Math.min(size.getHeight() - y, Math.min(elementSize.getHeight(), elementMaxSize.getHeight())));
|
|
||||||
elementSize.setWidth(Math.min(size.getWidth(), element.getMaxSize().getWidth()));
|
|
||||||
int remainingWidth = size.getWidth() - elementSize.getWidth();
|
|
||||||
int x = (int) (data.alignment * remainingWidth);
|
|
||||||
map.put(element, Pair.<ReadablePoint, ReadableDimension>of(new Point(x, y), elementSize));
|
|
||||||
y += elementSize.getHeight();
|
|
||||||
}
|
|
||||||
if (alignment != Alignment.TOP) {
|
|
||||||
int remaining = size.getHeight() - y;
|
|
||||||
if (alignment == Alignment.CENTER) {
|
|
||||||
remaining /= 2;
|
|
||||||
}
|
|
||||||
for (Pair<ReadablePoint, ReadableDimension> pair : map.values()) {
|
|
||||||
((Point) pair.getLeft()).translate(0, remaining);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
int maxWidth = 0;
|
|
||||||
int height = 0;
|
|
||||||
int spacing = 0;
|
|
||||||
for (Map.Entry<GuiElement, LayoutData> entry : container.getElements().entrySet()) {
|
|
||||||
height += spacing;
|
|
||||||
spacing = this.spacing;
|
|
||||||
|
|
||||||
GuiElement element = entry.getKey();
|
|
||||||
ReadableDimension minSize = element.getMinSize();
|
|
||||||
int width = minSize.getWidth();
|
|
||||||
if (width > maxWidth) {
|
|
||||||
maxWidth = width;
|
|
||||||
}
|
|
||||||
height += minSize.getHeight();
|
|
||||||
}
|
|
||||||
return new Dimension(maxWidth, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
@lombok.Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
public static class Data implements LayoutData {
|
|
||||||
private double alignment;
|
|
||||||
|
|
||||||
public Data() {
|
|
||||||
this(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Alignment {
|
|
||||||
TOP, BOTTOM, CENTER
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.layout;
|
|
||||||
|
|
||||||
import lombok.AccessLevel;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
|
||||||
public class VoidLayoutData implements LayoutData {
|
|
||||||
public static final VoidLayoutData INSTANCE = new VoidLayoutData();
|
|
||||||
}
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.popup;
|
|
||||||
|
|
||||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
|
||||||
import de.johni0702.minecraft.gui.RenderInfo;
|
|
||||||
import de.johni0702.minecraft.gui.container.AbstractGuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiPanel;
|
|
||||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.Layout;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
import org.lwjgl.util.ReadableDimension;
|
|
||||||
|
|
||||||
import java.lang.reflect.InvocationHandler;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.lang.reflect.Proxy;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public abstract class AbstractGuiPopup<T extends AbstractGuiPopup<T>> extends AbstractGuiContainer<T> {
|
|
||||||
private final GuiPanel popupContainer = new GuiPanel(this){
|
|
||||||
private final int u0 = 0;
|
|
||||||
private final int v0 = 39;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) {
|
|
||||||
if (renderInfo.getLayer() == 0) {
|
|
||||||
renderer.bindTexture(TEXTURE);
|
|
||||||
int w = size.getWidth();
|
|
||||||
int h = size.getHeight();
|
|
||||||
|
|
||||||
// Corners
|
|
||||||
renderer.drawTexturedRect(0, 0, u0, v0, 5, 5); // Top left
|
|
||||||
renderer.drawTexturedRect(w - 5, 0, u0 + 12, v0, 5, 5); // Top right
|
|
||||||
renderer.drawTexturedRect(0, h - 5, u0, v0 + 12, 5, 5); // Bottom left
|
|
||||||
renderer.drawTexturedRect(w - 5, h - 5, u0 + 12, v0 + 12, 5, 5); // Bottom right
|
|
||||||
|
|
||||||
// Top and bottom edge
|
|
||||||
for (int x = 5; x < w - 5; x += 5) {
|
|
||||||
int rx = Math.min(5, w - 5 - x);
|
|
||||||
renderer.drawTexturedRect(x, 0, u0 + 6, v0, rx, 5); // Top
|
|
||||||
renderer.drawTexturedRect(x, h - 5, u0 + 6, v0 + 12, rx, 5); // Bottom
|
|
||||||
}
|
|
||||||
|
|
||||||
// Left and right edge
|
|
||||||
for (int y = 5; y < w - 5; y += 5) {
|
|
||||||
int ry = Math.min(5, h - 5 - y);
|
|
||||||
renderer.drawTexturedRect(0, y, u0, v0 + 6, 5, ry); // Left
|
|
||||||
renderer.drawTexturedRect(w - 5, y, u0 + 12, v0 + 6, 5, ry); // Right
|
|
||||||
}
|
|
||||||
|
|
||||||
// Center
|
|
||||||
for (int x = 5; x < w - 5; x += 5) {
|
|
||||||
for (int y = 5; y < w - 5; y += 5) {
|
|
||||||
int rx = Math.min(5, w - 5 - x);
|
|
||||||
int ry = Math.min(5, h - 5 - y);
|
|
||||||
renderer.drawTexturedRect(x, y, u0 + 6, v0 + 6, rx, ry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
super.draw(renderer, size, renderInfo);
|
|
||||||
}
|
|
||||||
}.setLayout(new CustomLayout<GuiPanel>() {
|
|
||||||
@Override
|
|
||||||
protected void layout(GuiPanel container, int width, int height) {
|
|
||||||
pos(popup, 10, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReadableDimension calcMinSize(GuiContainer<?> container) {
|
|
||||||
ReadableDimension size = popup.calcMinSize();
|
|
||||||
return new Dimension(size.getWidth() + 20, size.getHeight() + 20);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
protected final GuiPanel popup = new GuiPanel(popupContainer);
|
|
||||||
|
|
||||||
private int layer;
|
|
||||||
|
|
||||||
{
|
|
||||||
setLayout(new CustomLayout<T>() {
|
|
||||||
@Override
|
|
||||||
protected void layout(T container, int width, int height) {
|
|
||||||
pos(popupContainer, width / 2 - width(popupContainer) / 2, height / 2 - height(popupContainer) / 2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private Layout originalLayout;
|
|
||||||
|
|
||||||
private final GuiContainer container;
|
|
||||||
|
|
||||||
public AbstractGuiPopup(GuiContainer container) {
|
|
||||||
while (container.getContainer() != null) {
|
|
||||||
container = container.getContainer();
|
|
||||||
}
|
|
||||||
this.container = container;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void open() {
|
|
||||||
setLayer(container.getMaxLayer() + 1);
|
|
||||||
container.addElements(null, this);
|
|
||||||
container.setLayout(new CustomLayout(originalLayout = container.getLayout()) {
|
|
||||||
@Override
|
|
||||||
protected void layout(GuiContainer container, int width, int height) {
|
|
||||||
pos(AbstractGuiPopup.this, 0, 0);
|
|
||||||
size(AbstractGuiPopup.this, width, height);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void close() {
|
|
||||||
getContainer().setLayout(originalLayout);
|
|
||||||
getContainer().removeElement(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public T setLayer(int layer) {
|
|
||||||
this.layer = layer;
|
|
||||||
return getThis();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getLayer() {
|
|
||||||
return layer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <C> C forEach(int layer, final Class<C> ofType) {
|
|
||||||
final C realProxy = super.forEach(layer, ofType);
|
|
||||||
if (layer >= 0) {
|
|
||||||
return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() {
|
|
||||||
@Override
|
|
||||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
||||||
if (method.getReturnType().equals(boolean.class)) {
|
|
||||||
method.invoke(forEachChild(ofType), args);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return method.invoke(realProxy, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return realProxy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private <C> C forEachChild(final Class<C> ofType) {
|
|
||||||
int maxLayer = getMaxLayer();
|
|
||||||
final List<C> layers = new ArrayList<C>(maxLayer + 1);
|
|
||||||
for (int i = maxLayer; i >= 0; i--) {
|
|
||||||
layers.add(super.forEach(i, ofType));
|
|
||||||
}
|
|
||||||
return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() {
|
|
||||||
@Override
|
|
||||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
|
||||||
boolean isGetter = method.getName().startsWith("get");
|
|
||||||
Object handled = method.getReturnType().equals(boolean.class) ? false : null;
|
|
||||||
for (final C layer : layers) {
|
|
||||||
handled = method.invoke(layer, args);
|
|
||||||
if (handled != null) {
|
|
||||||
if (handled instanceof Boolean) {
|
|
||||||
if (Boolean.TRUE.equals(handled)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (isGetter) {
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return handled;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.popup;
|
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
|
||||||
import com.google.common.util.concurrent.SettableFuture;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
|
||||||
import de.johni0702.minecraft.gui.container.GuiPanel;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiButton;
|
|
||||||
import de.johni0702.minecraft.gui.element.GuiElement;
|
|
||||||
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
|
|
||||||
import de.johni0702.minecraft.gui.layout.VerticalLayout;
|
|
||||||
import de.johni0702.minecraft.gui.utils.Colors;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
import org.lwjgl.util.Dimension;
|
|
||||||
|
|
||||||
public class GuiYesNoPopup extends AbstractGuiPopup<GuiYesNoPopup> {
|
|
||||||
public static GuiYesNoPopup open(GuiContainer container, GuiElement... info) {
|
|
||||||
GuiYesNoPopup popup = new GuiYesNoPopup(container).setBackgroundColor(Colors.DARK_TRANSPARENT);
|
|
||||||
popup.getInfo().addElements(new VerticalLayout.Data(0.5), info);
|
|
||||||
popup.open();
|
|
||||||
return popup;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final SettableFuture<Boolean> future = SettableFuture.create();
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GuiButton yesButton = new GuiButton().setSize(150, 20).onClick(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
close();
|
|
||||||
future.set(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GuiButton noButton = new GuiButton().setSize(150, 20).onClick(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
close();
|
|
||||||
future.set(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GuiPanel info = new GuiPanel().setMinSize(new Dimension(320, 50))
|
|
||||||
.setLayout(new VerticalLayout(VerticalLayout.Alignment.TOP).setSpacing(2));
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final GuiPanel buttons = new GuiPanel()
|
|
||||||
.setLayout(new HorizontalLayout(HorizontalLayout.Alignment.CENTER).setSpacing(5))
|
|
||||||
.addElements(new HorizontalLayout.Data(0.5), yesButton, noButton);
|
|
||||||
|
|
||||||
{
|
|
||||||
popup.setLayout(new VerticalLayout().setSpacing(10))
|
|
||||||
.addElements(new VerticalLayout.Data(0.5), info, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@Accessors(chain = true)
|
|
||||||
private int layer;
|
|
||||||
|
|
||||||
public GuiYesNoPopup(GuiContainer container) {
|
|
||||||
super(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiYesNoPopup setYesLabel(String label) {
|
|
||||||
yesButton.setLabel(label);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiYesNoPopup setNoLabel(String label) {
|
|
||||||
noButton.setLabel(label);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiYesNoPopup setYesI18nLabel(String label, Object...args) {
|
|
||||||
yesButton.setI18nLabel(label, args);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public GuiYesNoPopup setNoI18nLabel(String label, Object...args) {
|
|
||||||
noButton.setI18nLabel(label, args);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ListenableFuture<Boolean> getFuture() {
|
|
||||||
return future;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiYesNoPopup getThis() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.utils;
|
|
||||||
|
|
||||||
import org.lwjgl.util.Color;
|
|
||||||
import org.lwjgl.util.ReadableColor;
|
|
||||||
|
|
||||||
public interface Colors extends ReadableColor {
|
|
||||||
ReadableColor TRANSPARENT = new Color(0, 0, 0, 0);
|
|
||||||
ReadableColor LIGHT_TRANSPARENT = new Color(0, 0, 0, 64);
|
|
||||||
ReadableColor HALF_TRANSPARENT = new Color(0, 0, 0, 128);
|
|
||||||
ReadableColor DARK_TRANSPARENT = new Color(0, 0, 0, 192);
|
|
||||||
ReadableColor LIGHT_GRAY = new Color(192, 192, 192);
|
|
||||||
ReadableColor DARK_RED = new Color(170, 0, 0);
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.utils;
|
|
||||||
|
|
||||||
public interface Consumer<T> {
|
|
||||||
void consume(T obj);
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2015 johni0702
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.johni0702.minecraft.gui.utils;
|
|
||||||
|
|
||||||
public class Consumers {
|
|
||||||
public static <U> Consumer<U> from(final Runnable runnable) {
|
|
||||||
return new Consumer<U>() {
|
|
||||||
@Override
|
|
||||||
public void consume(U obj) {
|
|
||||||
runnable.run();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user