diff options
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/io/github/cottonmc/cotton/gui/widget/WSlider.java | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WSlider.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WSlider.java new file mode 100644 index 0000000..ee0ce3a --- /dev/null +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WSlider.java @@ -0,0 +1,122 @@ +package io.github.cottonmc.cotton.gui.widget; + +import io.github.cottonmc.cotton.gui.client.ScreenDrawing; +import net.minecraft.util.Identifier; + +import javax.annotation.Nullable; +import java.util.function.IntConsumer; + +public class WSlider extends WWidget { + private static final int TRACK_WIDTH = 6; + private static final int THUMB_SIZE = 8; + // TODO: Horizontal textures + private static final Identifier TEXTURE = new Identifier("libgui", "textures/widget/slider.png"); + + private final int min, max; + private final int valueRange; + private final Axis axis; + + private int value; + private float valueToCoordRatio, coordToValueRatio; + @Nullable private IntConsumer valueChangeListener = null; + @Nullable private Runnable mouseReleaseListener = null; + private boolean dragging = false; + + public WSlider(int min, int max, Axis axis) { + this.min = min; + this.max = max; + this.valueRange = max - min + 1; + this.axis = axis; + this.value = min; + } + + public WSlider(int max, Axis axis) { + this(0, max, axis); + } + + @Override + public void setSize(int x, int y) { + super.setSize(x, y); + // FIXME: that - and + stuff fixes the rendering but causes range issues (too large for X and too small for Y) + int trackHeight = (axis == Axis.HORIZONTAL ? (x - THUMB_SIZE) : (y + THUMB_SIZE)); + valueToCoordRatio = (float) valueRange / trackHeight; + coordToValueRatio = 1 / valueToCoordRatio; + } + + @Override + public boolean canResize() { + return true; + } + + @Override + public void onMouseDrag(int x, int y, int button) { + // a = mouse coordinate on slider axis, axisWidth = width of slider axis + // ao = axis-opposite mouse coordinate, aoCenter = center of ao's axis + int a = axis == Axis.HORIZONTAL ? x : y; + int axisWidth = axis == Axis.HORIZONTAL ? width : height; + int ao = axis == Axis.HORIZONTAL ? y : x; + int aoCenter = (axis == Axis.HORIZONTAL ? height : width) / 2; + if (dragging || ao >= aoCenter - TRACK_WIDTH / 2 && ao <= aoCenter + TRACK_WIDTH / 2) { + dragging = true; + int pos = axis == Axis.VERTICAL ? (axisWidth - a + THUMB_SIZE / 2) : (a - THUMB_SIZE / 2); + value = min + (int) (valueToCoordRatio * pos); + if (valueChangeListener != null) valueChangeListener.accept(value); + } + } + + @Override + public void onClick(int x, int y, int button) { + onMouseDrag(x, y, button); + onMouseUp(x, y, button); + } + + @Override + public WWidget onMouseUp(int x, int y, int button) { + dragging = false; + if (mouseReleaseListener != null) mouseReleaseListener.run(); + + return super.onMouseUp(x, y, button); + } + + @Override + public void paintBackground(int x, int y) { + float px = 1 / 16f; + if (axis == Axis.VERTICAL) { + int trackX = x + width / 2 - TRACK_WIDTH / 2; + int thumbY = y + height - (int) (coordToValueRatio * (value - min)); + + ScreenDrawing.rect(TEXTURE, trackX, y + 1, TRACK_WIDTH, 1, 0*px, 8*px, 6*px, 9*px, 0xFFFFFFFF); + ScreenDrawing.rect(TEXTURE, trackX, y + 2, TRACK_WIDTH, height - 2, 0*px, 9*px, 6*px, 10*px, 0xFFFFFFFF); + ScreenDrawing.rect(TEXTURE, trackX, y + height, TRACK_WIDTH, 1, 0*px, 10*px, 6*px, 11*px, 0xFFFFFFFF); + + ScreenDrawing.rect(TEXTURE, x + width / 2 - THUMB_SIZE / 2, thumbY, THUMB_SIZE, THUMB_SIZE, 0*px, 0*px, 8*px, 8*px, 0xFFFFFFFF); + } else { + int trackY = y + height / 2 - TRACK_WIDTH / 2; + int thumbX = x + (int) (coordToValueRatio * (value - min)); + + ScreenDrawing.rect(x, trackY, 1, TRACK_WIDTH, 0xFFFF0000); + ScreenDrawing.rect(x + 1, trackY, width - 2, TRACK_WIDTH, 0xFFFF0000); + ScreenDrawing.rect(x + width - 1, trackY, 1, TRACK_WIDTH, 0xFFFF0000); + + ScreenDrawing.rect(thumbX, y + height / 2 - THUMB_SIZE / 2, THUMB_SIZE, THUMB_SIZE, 0xFF00FFFF); + } + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public WSlider setValueChangeListener(@Nullable IntConsumer valueChangeListener) { + this.valueChangeListener = valueChangeListener; + return this; + } + + public WSlider setMouseReleaseListener(@Nullable Runnable mouseReleaseListener) { + this.mouseReleaseListener = mouseReleaseListener; + return this; + } +} |