Problematic Slider

As I mentioned yesterday, I am making a small UI library just for the fun of it :slight_smile: 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