package me.shedaniel.clothconfig2.gui.entries; import com.google.common.collect.Lists; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.SliderWidget; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.Window; import net.minecraft.util.math.MathHelper; import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; public class IntegerSliderEntry extends TooltipListEntry { protected Slider sliderWidget; protected ButtonWidget resetButton; protected AtomicInteger value; private int minimum, maximum; private Consumer saveConsumer; private Supplier defaultValue; private Function textGetter = integer -> String.format("Value: %d", integer); private List widgets; @Deprecated public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, Consumer saveConsumer) { this(fieldName, minimum, maximum, value, "text.cloth-config.reset_value", null, saveConsumer); } @Deprecated public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, String resetButtonKey, Supplier defaultValue, Consumer saveConsumer) { this(fieldName, minimum, maximum, value, resetButtonKey, defaultValue, saveConsumer, null); } @Deprecated public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, String resetButtonKey, Supplier defaultValue, Consumer saveConsumer, Supplier> tooltipSupplier) { this(fieldName, minimum, maximum, value, resetButtonKey, defaultValue, saveConsumer, tooltipSupplier, false); } @Deprecated public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, String resetButtonKey, Supplier defaultValue, Consumer saveConsumer, Supplier> tooltipSupplier, boolean requiresRestart) { super(fieldName, tooltipSupplier, requiresRestart); this.defaultValue = defaultValue; this.value = new AtomicInteger(value); this.saveConsumer = saveConsumer; this.maximum = maximum; this.minimum = minimum; this.sliderWidget = new Slider(0, 0, 152, 20, ((double) this.value.get() - minimum) / Math.abs(maximum - minimum)); this.resetButton = new ButtonWidget(0, 0, MinecraftClient.getInstance().textRenderer.getStringWidth(I18n.translate(resetButtonKey)) + 6, 20, I18n.translate(resetButtonKey), widget -> { sliderWidget.setProgress((MathHelper.clamp(this.defaultValue.get(), minimum, maximum) - minimum) / (double) Math.abs(maximum - minimum)); this.value.set(MathHelper.clamp(this.defaultValue.get(), minimum, maximum)); sliderWidget.updateMessage(); getScreen().setEdited(true, isRequiresRestart()); }); this.sliderWidget.setMessage(textGetter.apply(IntegerSliderEntry.this.value.get())); this.widgets = Lists.newArrayList(sliderWidget, resetButton); } @Override public void save() { if (saveConsumer != null) saveConsumer.accept(getValue()); } public Function getTextGetter() { return textGetter; } public IntegerSliderEntry setTextGetter(Function textGetter) { this.textGetter = textGetter; this.sliderWidget.setMessage(textGetter.apply(IntegerSliderEntry.this.value.get())); return this; } @Override public Integer getValue() { return value.get(); } @Override public Optional getDefaultValue() { return defaultValue == null ? Optional.empty() : Optional.ofNullable(defaultValue.get()); } @Override public List children() { return widgets; } public IntegerSliderEntry setMaximum(int maximum) { this.maximum = maximum; return this; } public IntegerSliderEntry setMinimum(int minimum) { this.minimum = minimum; return this; } @Override public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) { super.render(index, y, x, entryWidth, entryHeight, mouseX, mouseY, isSelected, delta); Window window = MinecraftClient.getInstance().window; this.resetButton.active = isEditable() && getDefaultValue().isPresent() && defaultValue.get().intValue() != value.get(); this.resetButton.y = y; this.sliderWidget.active = isEditable(); this.sliderWidget.y = y; if (MinecraftClient.getInstance().textRenderer.isRightToLeft()) { MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(getFieldName()), window.getScaledWidth() - x - MinecraftClient.getInstance().textRenderer.getStringWidth(I18n.translate(getFieldName())), y + 5, getPreferredTextColor()); this.resetButton.x = x; this.sliderWidget.x = x + resetButton.getWidth() + 1; this.sliderWidget.setWidth(150 - resetButton.getWidth() - 2); } else { MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(getFieldName()), x, y + 5, getPreferredTextColor()); this.resetButton.x = x + entryWidth - resetButton.getWidth(); this.sliderWidget.x = x + entryWidth - 150; this.sliderWidget.setWidth(150 - resetButton.getWidth() - 2); } resetButton.render(mouseX, mouseY, delta); sliderWidget.render(mouseX, mouseY, delta); } private class Slider extends SliderWidget { protected Slider(int int_1, int int_2, int int_3, int int_4, double double_1) { super(int_1, int_2, int_3, int_4, double_1); } @Override public void updateMessage() { setMessage(textGetter.apply(IntegerSliderEntry.this.value.get())); } @Override protected void applyValue() { IntegerSliderEntry.this.value.set((int) (minimum + Math.abs(maximum - minimum) * value)); getScreen().setEdited(true, isRequiresRestart()); } @Override public boolean keyPressed(int int_1, int int_2, int int_3) { if (!isEditable()) return false; return super.keyPressed(int_1, int_2, int_3); } @Override public boolean mouseDragged(double double_1, double double_2, int int_1, double double_3, double double_4) { if (!isEditable()) return false; return super.mouseDragged(double_1, double_2, int_1, double_3, double_4); } public double getProgress() { return value; } public void setProgress(double integer) { this.value = integer; } } }