Files
ReplayModCinematic/src/main/java/eu/crushedpixel/replaymod/gui/elements/GuiNumberInput.java

133 lines
4.1 KiB
Java
Executable File

package eu.crushedpixel.replaymod.gui.elements;
import eu.crushedpixel.replaymod.gui.elements.listeners.NumberValueChangeListener;
import net.minecraft.client.gui.FontRenderer;
import java.util.ArrayList;
import java.util.List;
public class GuiNumberInput extends GuiAdvancedTextField {
private List<NumberValueChangeListener> valueChangeListeners = new ArrayList<NumberValueChangeListener>();
protected Double minimum, maximum;
protected boolean acceptFloats = false;
public GuiNumberInput(FontRenderer fontRenderer,
int xPos, int yPos, int width, Double minimum, Double maximum, Double defaultValue, boolean acceptFloats) {
super(fontRenderer, xPos, yPos, width, 20);
this.minimum = minimum;
this.maximum = maximum;
this.acceptFloats = acceptFloats;
setCursorPositionZero();
if(defaultValue != null) {
setValue(defaultValue);
}
}
public GuiNumberInput(FontRenderer fontRenderer,
int xPos, int yPos, int width, int minimum, int maximum, int defaultValue, boolean acceptFloats) {
this(fontRenderer, xPos, yPos, width, (double) minimum, (double) maximum, (double) defaultValue, acceptFloats);
}
/**
* Sets this GuiNumberInput's value without notifying the listeners.
* @param value The value to set
*/
public void setValueQuietly(double value) {
if(minimum != null && value < minimum) {
setText(acceptFloats ? minimum.toString() : Integer.toString((int) Math.round(minimum)));
} else if(maximum != null && value > maximum) {
setText(acceptFloats ? maximum.toString() : Integer.toString((int) Math.round(maximum)));
} else {
if(acceptFloats) {
setText("" + value);
} else {
setText("" + (int) Math.round(value));
}
}
setCursorPositionZero();
}
public void setValue(double value) {
setValueQuietly(value);
fireValueChangeEvent();
}
public void addValueChangeListener(NumberValueChangeListener listener) {
this.valueChangeListeners.add(listener);
}
private void fireValueChangeEvent() {
double val = acceptFloats ? getPreciseValue() : getIntValue();
for(NumberValueChangeListener listener : valueChangeListeners) {
listener.onValueChange(val);
}
}
@Override
public void writeText(String text) {
String textBefore = getText();
int cursorPositionBefore = getCursorPosition();
try {
super.writeText(text);
double val;
if(acceptFloats) {
val = Double.valueOf(getText());
} else {
val = Integer.valueOf(getText());
}
if(minimum != null && val < minimum) {
setText(acceptFloats ? minimum.toString() : Integer.toString((int) Math.round(minimum)));
} else if(maximum != null && val > maximum) {
setText(acceptFloats ? maximum.toString() : Integer.toString((int) Math.round(maximum)));
}
fireValueChangeEvent();
} catch(NumberFormatException e) {
setText(textBefore);
setCursorPosition(cursorPositionBefore);
}
}
@Override
public void deleteFromCursor(int p_146175_1_) {
super.deleteFromCursor(p_146175_1_);
fireValueChangeEvent();
}
@Override
public void deleteWords(int p_146177_1_) {
super.deleteWords(p_146177_1_);
fireValueChangeEvent();
}
public int getIntValue() {
try {
return Integer.valueOf(getText());
} catch(Exception e) {
return 0;
}
}
public Integer getIntValueNullable() {
try {
return Integer.valueOf(getText());
} catch(Exception e) {
return null;
}
}
public double getPreciseValue() {
try {
return Double.valueOf(getText());
} catch(Exception e) {
return 0d;
}
}
}