package openmods.gui.component;
import net.minecraft.client.Minecraft;
import net.minecraft.util.MathHelper;
import openmods.api.IValueReceiver;
import openmods.gui.listener.IValueChangedListener;
import org.lwjgl.opengl.GL11;
public class GuiComponentSlider extends BaseComponent implements IValueReceiver<Integer> {
private static final int HANDLE_SIZE = 8;
private int width;
private int min;
private int max;
private int value;
private double stepSize;
private boolean showValue = true;
private IValueChangedListener<Integer> listener;
public GuiComponentSlider(int x, int y, int width, int min, int max, int initialValue, boolean showValue) {
this(x, y, width, min, max, initialValue);
this.showValue = showValue;
}
public GuiComponentSlider(int x, int y, int width, int min, int max, int initialValue) {
super(x, y);
this.width = width;
this.min = min;
this.max = max;
this.value = initialValue;
int steps = max - min + 1;
this.stepSize = (double)(width - 2 * HANDLE_SIZE / 2 - 2) / (double)steps;
}
@Override
public void render(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) {
GL11.glColor4f(1, 1, 1, 1);
int left = offsetX + x;
int top = offsetY + y;
int barStartX = left + 1;
bindComponentsSheet();
drawTexturedModalRect(left, top, 0, 70, 1, getHeight());
GL11.glPushMatrix();
GL11.glTranslated(left + 1, top, 0);
GL11.glScaled(getWidth() - 2, 1, 1);
drawTexturedModalRect(0, 0, 1, 70, 1, getHeight());
GL11.glPopMatrix();
drawTexturedModalRect(left + getWidth() - 1, top, 2, 70, 1, getHeight());
int handleX = (int)Math.floor(barStartX + stepSize * (value - min + 1));
drawTexturedModalRect(handleX, top + 1, 3, 70, 9, 10);
if (showValue) {
String label = formatValue(value);
int strWidth = minecraft.fontRenderer.getStringWidth(label);
minecraft.fontRenderer.drawString(label, handleX + 4 - (strWidth / 2), top + 15, 4210752);
}
}
@Override
public void renderOverlay(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) {}
@Override
public void mouseDrag(int mouseX, int mouseY, int button, long time) {
super.mouseDrag(mouseX, mouseY, button, time);
if (button == 0) {
int offX = mouseX - HANDLE_SIZE / 2;
if (offX < 0) return;
final int newValue = min + MathHelper.floor_double(offX / stepSize);
final int boundedValue = Math.max(min, Math.min(max, newValue));
if (boundedValue != value) {
value = boundedValue;
if (listener != null) listener.valueChanged(value);
}
}
}
public String formatValue(int value) {
return Integer.toString(value);
}
@Override
public int getWidth() {
return width;
}
@Override
public int getHeight() {
return 12;
}
public int getValue() {
return value;
}
@Override
public void setValue(Integer value) {
this.value = value;
}
public void setListener(IValueChangedListener<Integer> listener) {
this.listener = listener;
}
}