203 lines
5.3 KiB
Java
203 lines
5.3 KiB
Java
package speiger.src.coreengine.rendering.gui.components;
|
|
|
|
import java.util.function.IntFunction;
|
|
|
|
import speiger.src.coreengine.math.MathUtils;
|
|
import speiger.src.coreengine.math.misc.Facing;
|
|
import speiger.src.coreengine.rendering.gui.GuiComponent;
|
|
import speiger.src.coreengine.rendering.gui.base.IButtonComponent;
|
|
import speiger.src.coreengine.rendering.gui.helper.UIShapes;
|
|
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrains;
|
|
import speiger.src.coreengine.rendering.gui.renderer.buffer.RenderBuffer;
|
|
|
|
public class SliderComponent extends GuiComponent implements IButtonComponent
|
|
{
|
|
TextComponent text = new TextComponent();
|
|
protected int color;
|
|
protected boolean vertical = false;
|
|
|
|
protected int min;
|
|
protected int max;
|
|
protected int value;
|
|
int scrollEffect;
|
|
IntFunction<String> textBuilder;
|
|
protected RenderBuffer buffer;
|
|
|
|
public SliderComponent(int min, int max, int value, int color, IntFunction<String> textBuilder)
|
|
{
|
|
this(0F, 0F, 0F, 0F, min, max, value, color, textBuilder);
|
|
}
|
|
|
|
public SliderComponent(float x, float y, float width, float height, int min, int max, int value, int color, IntFunction<String> textBuilder)
|
|
{
|
|
super(x, y, width, height);
|
|
this.min = min;
|
|
this.max = max;
|
|
this.value = MathUtils.clamp(min, max, value);
|
|
this.color = color;
|
|
this.textBuilder = textBuilder;
|
|
updateText(false);
|
|
}
|
|
|
|
@Override
|
|
public void init()
|
|
{
|
|
text.setTextScale(0.35F);
|
|
addChild(text, Constrains.parent());
|
|
createArrow();
|
|
}
|
|
|
|
protected void createArrow()
|
|
{
|
|
if(getGui() == null)
|
|
{
|
|
return;
|
|
}
|
|
if(buffer == null)
|
|
{
|
|
addCloseListener(buffer = getRenderer().createBuffer());
|
|
}
|
|
buffer.clear();
|
|
UIShapes.createArrow(buffer, 12F, 12F, color, vertical ? Facing.EAST : Facing.SOUTH);
|
|
}
|
|
|
|
public TextComponent getText()
|
|
{
|
|
return text;
|
|
}
|
|
|
|
public SliderComponent updateText(boolean notifyListeners)
|
|
{
|
|
if(textBuilder != null)
|
|
{
|
|
text.setText(textBuilder.apply(value));
|
|
}
|
|
if(notifyListeners)
|
|
{
|
|
notifyListeners(LISTENER_USER_ACTION);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public SliderComponent setColor(int color)
|
|
{
|
|
if(this.color != color)
|
|
{
|
|
this.color = color;
|
|
createArrow();
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public SliderComponent setValue(int value)
|
|
{
|
|
int lastValue = this.value;
|
|
this.value = MathUtils.clamp(min, max, value);
|
|
if(lastValue != value)
|
|
{
|
|
updateText(true);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public SliderComponent addValue(int value)
|
|
{
|
|
return setValue(this.value + value);
|
|
}
|
|
|
|
public SliderComponent setScrollEffect(int scrollEffect)
|
|
{
|
|
this.scrollEffect = scrollEffect;
|
|
return this;
|
|
}
|
|
|
|
public SliderComponent setVertical(boolean vertical)
|
|
{
|
|
if(this.vertical != vertical)
|
|
{
|
|
this.vertical = vertical;
|
|
createArrow();
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public int getValue()
|
|
{
|
|
return value;
|
|
}
|
|
|
|
public float getPercentalValue()
|
|
{
|
|
return ((float)(value - min) / (float)(max - min));
|
|
}
|
|
|
|
@Override
|
|
public boolean renderSelf(int mouseX, int mouseY, float particalTicks)
|
|
{
|
|
float brightness = getActiveBrightness();
|
|
float minX = getBox().getMinX(5F);
|
|
float minY = getBox().getMinY(2F);
|
|
float maxX = getBox().getMaxX(-5F);
|
|
float maxY = getBox().getMaxY(-2F);
|
|
float scale = 0.6F * getBox().getScale();
|
|
if(vertical)
|
|
{
|
|
float extra = (((float)(value - min) / (float)(max - min)) * (getBox().getMaxY(-3F) - getBox().getMinY(3F))) + getBox().getMinY(3F);
|
|
float left = getBox().getMinX(2F);
|
|
getRenderer().setBrightness(brightness).drawQuad(minX, minY, maxX, maxY, color).setBrightness(brightness * 0.7F).drawFrame(minX, minY, maxX, maxY, 0.001F, color);
|
|
getRenderer().setBrightness(brightness * 0.5F).translate(left, extra, 0.002F).scale(scale).drawBuffers(buffer, maxX - minX, maxX - minX).setBrightness(brightness).unscale(scale).translate(-left, -extra, -0.002F);
|
|
}
|
|
else
|
|
{
|
|
float extra = (((float)(value - min) / (float)(max - min)) * (getBox().getMaxX(-6F) - getBox().getMinX(6F))) + getBox().getMinX(6F);
|
|
float top = getBox().getMinY();
|
|
getRenderer().setBrightness(brightness).drawQuad(minX, minY, maxX, maxY, color).setBrightness(brightness * 0.7F).drawFrame(minX, minY, maxX, maxY, 0.001F, color);
|
|
getRenderer().setBrightness(brightness * 0.5F).translate(extra, top, 0.002F).scale(scale).drawBuffers(buffer, maxX - minX, maxX - minX).setBrightness(brightness).unscale(scale).translate(-extra, -top, -0.002F);
|
|
}
|
|
getRenderer().setBrightness(getBrightness(mouseX, mouseY));
|
|
renderChildren(mouseX, mouseY, particalTicks);
|
|
getRenderer().setBrightness(1F);
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean onClick(int button, int mouseX, int mouseY)
|
|
{
|
|
updateScroll(mouseX, mouseY);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onDrag(int mouseX, int mouseY)
|
|
{
|
|
updateScroll(mouseX, mouseY);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onScroll(int scroll, int mouseX, int mouseY)
|
|
{
|
|
if(scrollEffect != 0)
|
|
{
|
|
int newValue = MathUtils.clamp(min, max, value + (scroll * scrollEffect));
|
|
if(newValue != value)
|
|
{
|
|
value = newValue;
|
|
updateText(true);
|
|
}
|
|
}
|
|
return scrollEffect != 0;
|
|
}
|
|
|
|
public void updateScroll(int mouseX, int mouseY)
|
|
{
|
|
float pos = vertical ? (mouseY - getBox().getMinY(2F)) / getBox().getHeight(-5F) : (mouseX - getBox().getMinX(5F)) / getBox().getWidth(-11F);
|
|
int newValue = min + (int)(MathUtils.clamp(0F, 1F, pos) * (max - min));
|
|
if(newValue != value)
|
|
{
|
|
value = newValue;
|
|
updateText(true);
|
|
}
|
|
}
|
|
}
|