package gminers.glasspane.component.numeric; import gminers.glasspane.component.ColorablePaneComponent; import gminers.glasspane.component.Focusable; import gminers.glasspane.component.button.PaneButton; import java.text.NumberFormat; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.ToString; import lombok.experimental.FieldDefaults; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; @FieldDefaults(level = AccessLevel.PROTECTED) @ToString @Getter @Setter @Deprecated /** * @deprecated Hard to use, doesn't work well. */ public class PaneSpinner extends ColorablePaneComponent implements Focusable { public static final NumberFormat DEFAULT_FORMAT = NumberFormat.getInstance(); static { DEFAULT_FORMAT.setGroupingUsed(true); } float value = 0; float maximum = Float.POSITIVE_INFINITY; float minimum = Float.NEGATIVE_INFINITY; float increment = 1; NumberFormat format = (NumberFormat) DEFAULT_FORMAT.clone(); @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) float lagValue = 0; FontRenderer renderer = Minecraft.getMinecraft().fontRendererObj; public PaneSpinner() { setClipToSize(true); } public PaneSpinner(final float value) { this.value = value; } public PaneSpinner(final float value, final float minimum, final float maximum) { this.value = value; this.minimum = minimum; this.maximum = maximum; } @Override protected void doTick() { if (Float.isNaN(lagValue)) { lagValue = 0f; } if (lagValue < value) { lagValue += getAdjustment(value, lagValue); } else if (lagValue > value) { lagValue -= getAdjustment(lagValue, value); } } protected float getAdjustment(final float big, final float small) { final float diff = (big - small); return (float) (diff > 0.01 ? (diff * 0.45) : diff); } @Override protected void keyPressed(final char keyChar, final int keyCode) { int direction; switch (keyCode) { case Keyboard.KEY_UP: { direction = 1; break; } case Keyboard.KEY_DOWN: { direction = -1; break; } default: return; } int dist = 1; final boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); final boolean ctrl = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); if (shift) { dist *= 10; } if (ctrl) { dist *= 10; } value = Math.max(minimum, Math.min(value + ((dist * direction) * increment), maximum)); } @Override protected void mouseWheel(final int mouseX, final int mouseY, final int distance) { if (withinBounds(mouseX, mouseY)) { int dist = 1; final boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); final boolean ctrl = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); if (shift) { dist *= 10; } if (ctrl) { dist *= 10; } value = Math.max(minimum, Math.min(value + ((dist * Math.signum(distance)) * increment), maximum)); } } @Override protected void doRender(final int mouseX, final int mouseY, final float partialTicks) { // bind the widgets Minecraft.getMinecraft().renderEngine.bindTexture(RESOURCE); // u and v, for convenient changing final int u = 0; final int v = 0; // set color GL11.glColor3f(0.6f, 0.6f, 0.6f); PaneButton.renderStretchyTexturedRect(0, 0, u, v, width, height, 220, 40); // if we're focused, draw a blue border over the normal black one GL11.glTranslatef(0, 0, 0.001f); if (getParent() != null) { if (getParent().getFocusedComponent() == this) { final int fv = 200; PaneButton.renderStretchyTexturedRect(0, 0, u, fv, width, height, 220, 40); } } final float dist = (float) (Math.abs(lagValue / increment) - Math.floor(Math.abs(lagValue / increment))); final float next = (int) Math.ceil(lagValue / increment) * increment; final float cur = (int) Math.floor(lagValue / increment) * increment; final String textCur = format.format(isClipToSize() ? cur : value); final String textNex = format.format(next); // if we're caught up, do a simple render // also use clipToSize as an 'animation' flag if (!isClipToSize() || next == cur) { renderer.drawStringWithShadow(textCur, (width - 3) - renderer.getStringWidth(textCur), 2, color); } else { GL11.glPushMatrix(); if (next <= 0) { GL11.glTranslatef(0, (height - 2) * (1.0f - dist), 0); } else { GL11.glTranslatef(0, (height - 2) * dist, 0); } renderer.drawStringWithShadow(textNex, (width - 3) - renderer.getStringWidth(textNex), -8, color); renderer.drawStringWithShadow(textCur, (width - 3) - renderer.getStringWidth(textCur), 2, color); GL11.glPopMatrix(); } } }