package io.github.minecraftgui.models.components; import io.github.minecraftgui.controllers.Mouse; import io.github.minecraftgui.models.attributes.AttributeDouble; import io.github.minecraftgui.models.attributes.AttributeVariableDouble; import io.github.minecraftgui.models.attributes.Position; import io.github.minecraftgui.models.listeners.OnMouseButtonDownListener; import io.github.minecraftgui.models.shapes.Rectangle; import io.github.minecraftgui.models.shapes.RectangleColor; /** * Created by Samuel on 2015-11-16. */ public abstract class Slider extends ComponentValuable<Double> { protected final AttributeDouble relativeButtonAttribute; protected final ProgressBar progressBar; protected final Component button; public Slider(String id, Class<? extends Rectangle> shape, ProgressBar progressBar, Component button) { super(id, shape); this.relativeButtonAttribute = new AttributeDouble(0.0); this.progressBar = progressBar; this.add(this.progressBar); this.progressBar.getShape().getWidth(State.NORMAL).setAttribute(getAttributeWidth()); this.progressBar.getShape().getHeight(State.NORMAL).setAttribute(getAttributeHeight()); this.add(button); this.button = button; } public Component getButton() { return button; } public ProgressBar getProgressBar() { return progressBar; } public void setBarPercentage(double percentage){ progressBar.setBarPercentage(percentage); valueChanged(); } public double getBarPercentage() { return progressBar.getBarPercentage(); } @Override public Double getValue() { return getBarPercentage(); } @Override public void setValue(Double value) { setBarPercentage(value); } public static class Horizontal extends Slider{ public Horizontal(String id, Class<? extends Rectangle> shape, Class<? extends Rectangle> progressShape, Component button) { super(id, shape, new ProgressBar.Horizontal("", RectangleColor.class, progressShape), button); this.getProgressBar().addOnMouseButtonDownListener(new OnMouseButtonDownListener() { @Override public void onMouseButtonDown(Component component, Mouse mouse, Mouse.Button button) { if (button == Mouse.Button.LEFT) { Position x = getPositionX(); double xLoc = mouse.getX() - x.getRelative(); setBarPercentage(xLoc / getWidth()); } } }); this.button.addOnMouseButtonDownListener(new OnMouseButtonDownListener() { @Override public void onMouseButtonDown(Component component, Mouse mouse, Mouse.Button button) { if (button == Mouse.Button.LEFT) { Position x = component.getPositionX(); double xLoc = x.getRelative() - (mouse.getXLastUpdate() - mouse.getX()); setBarPercentage(xLoc / component.getParent().getWidth()); } } }); } @Override public void setBarPercentage(double percentage){ if(this.getBarPercentage() != percentage) { super.setBarPercentage(percentage); Position x = button.getPositionX(); ((AttributeVariableDouble) x.getRelative(State.NORMAL)).setAttribute(new AttributeDouble(this.getWidth() * getBarPercentage())); } } @Override public void update(long updateId) { super.update(updateId); Position x = button.getPositionX(); ((AttributeVariableDouble)x.getRelative(State.NORMAL)).setAttribute(new AttributeDouble(this.getWidth() * getBarPercentage())); } } public static class Vertical extends Slider{ public Vertical(String id, Class<? extends Rectangle> shape, Class<? extends Rectangle> progressShape, Component button) { super(id, shape, new ProgressBar.Vertical("", RectangleColor.class, progressShape), button); this.getProgressBar().addOnMouseButtonDownListener(new OnMouseButtonDownListener() { @Override public void onMouseButtonDown(Component component, Mouse mouse, Mouse.Button button) { if (button == Mouse.Button.LEFT) { Position y = getPositionY(); double yLoc = mouse.getY() - y.getRelative(); setBarPercentage(yLoc / getHeight()); } } }); this.button.addOnMouseButtonDownListener(new OnMouseButtonDownListener() { @Override public void onMouseButtonDown(Component component, Mouse mouse, Mouse.Button button) { if (button == Mouse.Button.LEFT) { Position y = component.getPositionY(); double yLoc = y.getRelative() - (mouse.getYLastUpdate() - mouse.getY()); setBarPercentage(yLoc / component.getParent().getHeight()); } } }); } @Override public void setBarPercentage(double percentage){ if(this.getBarPercentage() != percentage) { super.setBarPercentage(percentage); Position y = button.getPositionY(); y.getRelative(State.NORMAL).setValue(button.getParent().getHeight() * getBarPercentage()); } } @Override public void update(long updateId) { super.update(updateId); Position y = button.getPositionY(); ((AttributeVariableDouble)y.getRelative(State.NORMAL)).setAttribute(new AttributeDouble(button.getParent().getHeight() * getBarPercentage())); } } }