As I mentioned yesterday, I am making a small UI library just for the fun of it So far I have buttons, checkboxes, and dropdowns, and I am working on a value slider. However, my value slider acts funky, and the value resets randomly while dragging.
drag() is called by my Input system, and the delta values are usually accurate. ComponentRegion is similar to java.awt.Rectangle, but customized.
Any thoughts or ideas? Please ask if I need to explain something.
Slider class:
package com.digiturtle.ui.components;
import java.util.Collection;
import org.lwjgl.opengl.GL11;
import com.digiturtle.ui.Component;
import com.digiturtle.ui.ComponentRegion;
import com.digiturtle.ui.StaticVBO;
import com.digiturtle.ui.Texture;
import com.digiturtle.ui.Theme;
public class Slider implements Component {
public static int HORIZONTAL = 0, VERTICAL = 1;
private boolean locked = false, down = false;
private int direction;
private float maxValue, value = 0, origX;
private StaticVBO background, slider;
private Texture bgTexture, controlTexture;
private ComponentRegion region;
private int layer;
public Slider(int direction, ComponentRegion region, int layer, float width, float value, Theme theme) {
this(direction, region, layer, width, theme, Theme.SLIDER_GENERIC);
this.value = value;
}
public Slider(int direction, ComponentRegion region, int layer, float width, Theme theme, String target) {
origX = region.x;
this.direction = direction;
maxValue = width;
bgTexture = theme.get(target);
controlTexture = theme.get(target + Theme._CONTROL);
this.region = region;
this.layer = layer;
slider = new StaticVBO(4, controlTexture.getID());
slider.uploadVertices(region);
slider.uploadTextures(0, 0, 1, 1);
background = new StaticVBO(4, bgTexture.getID());
background.uploadVertices(new ComponentRegion(region.x, region.y + (region.height / 2) + 10, width, region.height / 2));
background.uploadTextures(0, 0, 1, 1);
}
@Override
public boolean isLocked() {
return locked;
}
@Override
public void unlock() {
locked = false;
}
@Override
public void lock() {
locked = true;
}
@Override
public float getX() {
return region.x;
}
@Override
public float getY() {
return region.y;
}
@Override
public void setLocation(float x, float y) {
region.x = x;
region.y = y;
}
@Override
public void click(int x, int y) {
}
@Override
public void mouse(int x, int y, boolean down) {
if (down && this.down) {
return; // good
}
if (getRegion().contains(x, y)) {
if (!this.down) {
if (down) {
this.down = true;
}
}
}
this.down = down;
}
@Override
public void key(int keycode) {
}
@Override
public void drag(int dx, int dy, int sx, int sy) {
if (direction == HORIZONTAL) {
value += dx;
value = Math.max(0, value);
value = Math.min(value, maxValue);
setLocation(origX + value, getY());
}
}
@Override
public boolean overlaps(Component component) {
if (getRegion().intersects(component.getRegion())) {
if (component.getLayer() > getLayer()) {
return true;
} else {
return false;
}
}
return false;
}
@Override
public ComponentRegion getRegion() {
return region;
}
@Override
public void render() {
getRegion().debug();
background.render();
if (down) {
GL11.glTranslatef(value, 0, 0);
slider.render();
GL11.glTranslatef(-value, 0, 0);
}
else {
GL11.glColor4f(1, 1, 1, 0.5f);
GL11.glTranslatef(value, 0, 0);
slider.render();
GL11.glTranslatef(-value, 0, 0);
GL11.glColor3f(1, 1, 1);
}
}
@Override
public void update() {
}
@Override
public void addChild(String name, Component component) {
}
@Override
public Collection<Component> getChildren() {
return null;
}
@Override
public int getLayer() {
return layer;
}
@Override
public void setLayer(int layer) {
}
@Override
public boolean handleAllClicks() {
return false;
}
}
CopyableCougar4