LongSliderEntry.java 7.3 KB

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