IntegerSliderEntry.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package me.shedaniel.clothconfig2.gui.entries;
  2. import com.google.common.collect.Lists;
  3. import net.minecraft.client.MinecraftClient;
  4. import net.minecraft.client.gui.Element;
  5. import net.minecraft.client.gui.widget.ButtonWidget;
  6. import net.minecraft.client.gui.widget.SliderWidget;
  7. import net.minecraft.client.resource.language.I18n;
  8. import net.minecraft.client.util.Window;
  9. import net.minecraft.util.math.MathHelper;
  10. import java.util.List;
  11. import java.util.Optional;
  12. import java.util.concurrent.atomic.AtomicInteger;
  13. import java.util.function.Consumer;
  14. import java.util.function.Function;
  15. import java.util.function.Supplier;
  16. public class IntegerSliderEntry extends TooltipListEntry<Integer> {
  17. protected Slider sliderWidget;
  18. protected ButtonWidget resetButton;
  19. protected AtomicInteger value;
  20. private int minimum, maximum;
  21. private Consumer<Integer> saveConsumer;
  22. private Supplier<Integer> defaultValue;
  23. private Function<Integer, String> textGetter = integer -> String.format("Value: %d", integer);
  24. private List<Element> widgets;
  25. @Deprecated
  26. public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, Consumer<Integer> saveConsumer) {
  27. this(fieldName, minimum, maximum, value, "text.cloth-config.reset_value", null, saveConsumer);
  28. }
  29. @Deprecated
  30. public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, String resetButtonKey, Supplier<Integer> defaultValue, Consumer<Integer> saveConsumer) {
  31. this(fieldName, minimum, maximum, value, resetButtonKey, defaultValue, saveConsumer, null);
  32. }
  33. @Deprecated
  34. public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, String resetButtonKey, Supplier<Integer> defaultValue, Consumer<Integer> saveConsumer, Supplier<Optional<String[]>> tooltipSupplier) {
  35. this(fieldName, minimum, maximum, value, resetButtonKey, defaultValue, saveConsumer, tooltipSupplier, false);
  36. }
  37. @Deprecated
  38. public IntegerSliderEntry(String fieldName, int minimum, int maximum, int value, String resetButtonKey, Supplier<Integer> defaultValue, Consumer<Integer> saveConsumer, Supplier<Optional<String[]>> tooltipSupplier, boolean requiresRestart) {
  39. super(fieldName, tooltipSupplier, requiresRestart);
  40. this.defaultValue = defaultValue;
  41. this.value = new AtomicInteger(value);
  42. this.saveConsumer = saveConsumer;
  43. this.maximum = maximum;
  44. this.minimum = minimum;
  45. this.sliderWidget = new Slider(0, 0, 152, 20, ((double) this.value.get() - minimum) / Math.abs(maximum - minimum));
  46. this.resetButton = new ButtonWidget(0, 0, MinecraftClient.getInstance().textRenderer.getStringWidth(I18n.translate(resetButtonKey)) + 6, 20, I18n.translate(resetButtonKey), widget -> {
  47. sliderWidget.setProgress((MathHelper.clamp(this.defaultValue.get(), minimum, maximum) - minimum) / (double) Math.abs(maximum - minimum));
  48. this.value.set(MathHelper.clamp(this.defaultValue.get(), minimum, maximum));
  49. sliderWidget.updateMessage();
  50. getScreen().setEdited(true, isRequiresRestart());
  51. });
  52. this.sliderWidget.setMessage(textGetter.apply(IntegerSliderEntry.this.value.get()));
  53. this.widgets = Lists.newArrayList(sliderWidget, resetButton);
  54. }
  55. @Override
  56. public void save() {
  57. if (saveConsumer != null)
  58. saveConsumer.accept(getValue());
  59. }
  60. public Function<Integer, String> getTextGetter() {
  61. return textGetter;
  62. }
  63. public IntegerSliderEntry setTextGetter(Function<Integer, String> textGetter) {
  64. this.textGetter = textGetter;
  65. this.sliderWidget.setMessage(textGetter.apply(IntegerSliderEntry.this.value.get()));
  66. return this;
  67. }
  68. @Override
  69. public Integer getValue() {
  70. return value.get();
  71. }
  72. @Override
  73. public Optional<Integer> getDefaultValue() {
  74. return defaultValue == null ? Optional.empty() : Optional.ofNullable(defaultValue.get());
  75. }
  76. @Override
  77. public List<? extends Element> children() {
  78. return widgets;
  79. }
  80. public IntegerSliderEntry setMaximum(int maximum) {
  81. this.maximum = maximum;
  82. return this;
  83. }
  84. public IntegerSliderEntry setMinimum(int minimum) {
  85. this.minimum = minimum;
  86. return this;
  87. }
  88. @Override
  89. public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
  90. super.render(index, y, x, entryWidth, entryHeight, mouseX, mouseY, isSelected, delta);
  91. Window window = MinecraftClient.getInstance().window;
  92. this.resetButton.active = isEditable() && getDefaultValue().isPresent() && defaultValue.get().intValue() != value.get();
  93. this.resetButton.y = y;
  94. this.sliderWidget.active = isEditable();
  95. this.sliderWidget.y = y;
  96. if (MinecraftClient.getInstance().textRenderer.isRightToLeft()) {
  97. MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(getFieldName()), window.getScaledWidth() - x - MinecraftClient.getInstance().textRenderer.getStringWidth(I18n.translate(getFieldName())), y + 5, getPreferredTextColor());
  98. this.resetButton.x = x;
  99. this.sliderWidget.x = x + resetButton.getWidth() + 1;
  100. this.sliderWidget.setWidth(150 - resetButton.getWidth() - 2);
  101. } else {
  102. MinecraftClient.getInstance().textRenderer.drawWithShadow(I18n.translate(getFieldName()), x, y + 5, getPreferredTextColor());
  103. this.resetButton.x = x + entryWidth - resetButton.getWidth();
  104. this.sliderWidget.x = x + entryWidth - 150;
  105. this.sliderWidget.setWidth(150 - resetButton.getWidth() - 2);
  106. }
  107. resetButton.render(mouseX, mouseY, delta);
  108. sliderWidget.render(mouseX, mouseY, delta);
  109. }
  110. private class Slider extends SliderWidget {
  111. protected Slider(int int_1, int int_2, int int_3, int int_4, double double_1) {
  112. super(int_1, int_2, int_3, int_4, double_1);
  113. }
  114. @Override
  115. public void updateMessage() {
  116. setMessage(textGetter.apply(IntegerSliderEntry.this.value.get()));
  117. }
  118. @Override
  119. protected void applyValue() {
  120. IntegerSliderEntry.this.value.set((int) (minimum + Math.abs(maximum - minimum) * value));
  121. getScreen().setEdited(true, isRequiresRestart());
  122. }
  123. @Override
  124. public boolean keyPressed(int int_1, int int_2, int int_3) {
  125. if (!isEditable())
  126. return false;
  127. return super.keyPressed(int_1, int_2, int_3);
  128. }
  129. @Override
  130. public boolean mouseDragged(double double_1, double double_2, int int_1, double double_3, double double_4) {
  131. if (!isEditable())
  132. return false;
  133. return super.mouseDragged(double_1, double_2, int_1, double_3, double_4);
  134. }
  135. public double getProgress() {
  136. return value;
  137. }
  138. public void setProgress(double integer) {
  139. this.value = integer;
  140. }
  141. }
  142. }