Ver Fonte

Bug fix regurding the focus to dropdown entries inside sub-categories and multi-element lists.

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel há 5 anos atrás
pai
commit
daea92628e

+ 1 - 1
build.gradle

@@ -141,7 +141,7 @@ curseforge {
                 requiredDependency 'fabric-api'
             }
             mainArtifact(file("${project.buildDir}/libs/${project.archivesBaseName}-${project.version}.jar")) {
-                displayName = "[Fabric 20w12a] ClothConfig2-$project.version"
+                displayName = "[Fabric 20w14a] ClothConfig2-$project.version"
             }
             addArtifact(file("${project.buildDir}/libs/${project.archivesBaseName}-${project.version}-sources.jar"))
             afterEvaluate {

+ 1 - 1
gradle.properties

@@ -2,6 +2,6 @@ minecraft_version=20w12a
 yarn_mappings=20w12a+build.3
 loader_version=0.7.8+build.186
 fabric_version=0.5.4+build.310-1.16
-mod_version=3.3.1-unstable
+mod_version=3.3.2-unstable
 modmenu_version=1.11.0+build.2
 nec_version=1.2.3+1.15.1

+ 6 - 1
src/main/java/me/shedaniel/clothconfig2/ClothConfigInitializer.java

@@ -297,7 +297,7 @@ public class ClothConfigInitializer implements ClientModInitializer {
         ConfigBuilder builder = getConfigBuilder();
         ConfigEntryBuilder entryBuilder = builder.entryBuilder();
         ConfigCategory testing = builder.getOrCreateCategory("category.cloth-config.testing");
-        testing.addEntry(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
+//        testing.addEntry(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
         testing.addEntry(entryBuilder.startKeyCodeField("Cool Key", InputUtil.UNKNOWN_KEYCODE).setDefaultValue(InputUtil.UNKNOWN_KEYCODE).build());
         testing.addEntry(entryBuilder.startModifierKeyCodeField("Cool Modifier Key", ModifierKeyCode.of(InputUtil.Type.KEYSYM.createFromCode(79), Modifier.of(false, true, false))).setDefaultValue(ModifierKeyCode.of(InputUtil.Type.KEYSYM.createFromCode(79), Modifier.of(false, true, false))).build());
         testing.addEntry(entryBuilder.startDoubleList("A list of Doubles", Arrays.asList(1d, 2d, 3d)).setDefaultValue(Arrays.asList(1d, 2d, 3d)).build());
@@ -306,6 +306,11 @@ public class ClothConfigInitializer implements ClientModInitializer {
         SubCategoryBuilder colors = entryBuilder.startSubCategory("Colors").setExpanded(true);
         colors.add(entryBuilder.startColorField("A color field", 0x00ffff).setDefaultValue(0x00ffff).build());
         colors.add(entryBuilder.startColorField("An alpha color field", 0xff00ffff).setDefaultValue(0xff00ffff).setAlphaMode(true).build());
+        colors.add(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
+        colors.add(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
+        colors.add(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
+        colors.add(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
+        colors.add(entryBuilder.startDropdownMenu("lol apple", DropdownMenuBuilder.TopCellElementBuilder.ofItemObject(Items.APPLE), DropdownMenuBuilder.CellCreatorBuilder.ofItemObject()).setDefaultValue(Items.APPLE).setSelections(Registry.ITEM.stream().sorted(Comparator.comparing(Item::toString)).collect(Collectors.toCollection(LinkedHashSet::new))).setSaveConsumer(item -> System.out.println("save this " + item)).build());
         testing.addEntry(colors.build());
         return builder;
     }

+ 1 - 1
src/main/java/me/shedaniel/clothconfig2/gui/ClothConfigScreen.java

@@ -659,7 +659,7 @@ public abstract class ClothConfigScreen extends Screen {
         @Override
         protected void renderItem(R item, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
             if (item instanceof AbstractConfigEntry)
-                ((AbstractConfigEntry) item).updateSelected(isSelected);
+                ((AbstractConfigEntry) item).updateSelected(getFocused() == item);
             super.renderItem(item, index, y, x, entryWidth, entryHeight, mouseX, mouseY, isSelected, delta);
         }
         

+ 14 - 2
src/main/java/me/shedaniel/clothconfig2/gui/entries/AbstractTextFieldListListEntry.java

@@ -43,13 +43,20 @@ public abstract class AbstractTextFieldListListEntry<T, C extends AbstractTextFi
     public static abstract class AbstractTextFieldListCell<T, SELF extends AbstractTextFieldListCell<T, SELF, OUTER_SELF>, OUTER_SELF extends AbstractTextFieldListListEntry<T, SELF, OUTER_SELF>> extends AbstractListListEntry.AbstractListCell<T, SELF, OUTER_SELF> {
         
         protected TextFieldWidget widget;
+        private boolean isSelected;
         
         public AbstractTextFieldListCell(@Nullable T value, OUTER_SELF listListEntry) {
             super(value, listListEntry);
             
             final T finalValue = substituteDefault(value);
             
-            widget = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, 0, 0, 100, 18, "");
+            widget = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, 0, 0, 100, 18, "") {
+                @Override
+                public void render(int mouseX, int mouseY, float delta) {
+                    setFocused(isSelected);
+                    super.render(mouseX, mouseY, delta);
+                }
+            };
             widget.setTextPredicate(this::isValidText);
             widget.setMaxLength(Integer.MAX_VALUE);
             widget.setHasBorder(false);
@@ -61,7 +68,12 @@ public abstract class AbstractTextFieldListListEntry<T, C extends AbstractTextFi
                 }
             });
         }
-        
+    
+        @Override
+        public void updateSelected(boolean isSelected) {
+            this.isSelected = isSelected;
+        }
+    
         /**
          * Allows subclasses to substitute default values.
          *

+ 16 - 19
src/main/java/me/shedaniel/clothconfig2/gui/entries/DropdownBoxEntry.java

@@ -34,6 +34,8 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+import static me.shedaniel.clothconfig2.ClothConfigInitializer.handleScrollingPosition;
+
 @SuppressWarnings("deprecation")
 @Environment(EnvType.CLIENT)
 public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
@@ -78,6 +80,12 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
         selectionElement.render(mouseX, mouseY, delta);
     }
     
+    @Override
+    public void updateSelected(boolean isSelected) {
+        selectionElement.topRenderer.isSelected = isSelected;
+        selectionElement.menu.isSelected = isSelected;
+    }
+    
     @NotNull
     public ImmutableList<T> getSelections() {
         return selectionElement.menu.getSelections();
@@ -204,6 +212,7 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
     public static abstract class DropdownMenuElement<R> extends AbstractParentElement {
         @Deprecated @NotNull private SelectionCellCreator<R> cellCreator;
         @Deprecated @NotNull private DropdownBoxEntry<R> entry;
+        private boolean isSelected;
         
         @NotNull
         public SelectionCellCreator<R> getCellCreator() {
@@ -227,7 +236,7 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
         public abstract int getHeight();
         
         public final boolean isExpanded() {
-            return (getEntry().selectionElement.getFocused() == getEntry().selectionElement.topRenderer || getEntry().selectionElement.getFocused() == getEntry().selectionElement.menu) && getEntry().getFocused() == getEntry().selectionElement && getEntry().getParent().getFocused() == getEntry();
+            return isSelected && this.getEntry().getFocused() == this.getEntry().selectionElement;
         }
         
         @Override
@@ -251,10 +260,6 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
             this.currentElements = Lists.newArrayList();
         }
         
-        public final double clamp(double v) {
-            return MathHelper.clamp(v, -SmoothScrollingSettings.CLAMP_EXTENSION, getMaxScrollPosition() + SmoothScrollingSettings.CLAMP_EXTENSION);
-        }
-        
         public double getMaxScroll() {
             return getCellCreator().getCellHeight() * currentElements.size();
         }
@@ -346,16 +351,9 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
         }
         
         private void updatePosition(float delta) {
-            target = clamp(target);
-            if (target < 0) {
-                target -= target * (1 - ClothConfigInitializer.getBounceBackMultiplier()) * delta / 3;
-            } else if (target > getMaxScrollPosition()) {
-                target = (target - getMaxScrollPosition()) * (1 - (1 - ClothConfigInitializer.getBounceBackMultiplier()) * delta / 3) + getMaxScrollPosition();
-            }
-            if (!Precision.almostEquals(scroll, target, Precision.FLOAT_EPSILON))
-                scroll = (float) Interpolation.expoEase(scroll, target, Math.min((System.currentTimeMillis() - start) / ((double) duration), 1));
-            else
-                scroll = target;
+            double[] target = {this.target};
+            scroll = handleScrollingPosition(target, scroll, getMaxScroll(), delta, start, duration);
+            this.target = target[0];
         }
         
         @Override
@@ -483,7 +481,7 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
         }
         
         public void scrollTo(double value, boolean animated, long duration) {
-            target = clamp(value);
+            target = ClothConfigInitializer.clamp(value, getMaxScrollPosition());
             
             if (animated) {
                 start = System.currentTimeMillis();
@@ -620,6 +618,7 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
     
     public static abstract class SelectionTopCellElement<R> extends AbstractParentElement {
         @Deprecated private DropdownBoxEntry<R> entry;
+        protected boolean isSelected = false;
         
         public abstract R getValue();
         
@@ -672,10 +671,8 @@ public class DropdownBoxEntry<T> extends TooltipListEntry<T> {
             textFieldWidget = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, 0, 0, 148, 18, "") {
                 @Override
                 public void render(int int_1, int int_2, float float_1) {
-                    boolean f = isFocused();
-                    setFocused(DefaultSelectionTopCellElement.this.getParent().getParent().getFocused() == DefaultSelectionTopCellElement.this.getParent() && DefaultSelectionTopCellElement.this.getParent().getFocused() == DefaultSelectionTopCellElement.this.getParent().selectionElement && DefaultSelectionTopCellElement.this.getParent().selectionElement.getFocused() == DefaultSelectionTopCellElement.this && DefaultSelectionTopCellElement.this.getFocused() == this);
+                    setFocused(isSelected && DefaultSelectionTopCellElement.this.getParent().getFocused() == DefaultSelectionTopCellElement.this.getParent().selectionElement && DefaultSelectionTopCellElement.this.getParent().selectionElement.getFocused() == DefaultSelectionTopCellElement.this && DefaultSelectionTopCellElement.this.getFocused() == this);
                     super.render(int_1, int_2, float_1);
-                    setFocused(f);
                 }
                 
                 @Override

+ 27 - 0
src/main/java/me/shedaniel/clothconfig2/gui/entries/MultiElementListEntry.java

@@ -15,6 +15,7 @@ import net.minecraft.sound.SoundEvents;
 import net.minecraft.util.Identifier;
 import org.jetbrains.annotations.ApiStatus;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
@@ -92,6 +93,7 @@ public class MultiElementListEntry<T> extends TooltipListEntry<T> {
             for (AbstractConfigListEntry<?> entry : entries) {
                 entry.render(-1, yy, x + 14, entryWidth - 14, entry.getItemHeight(), mouseX, mouseY, isSelected, delta);
                 yy += entry.getItemHeight();
+                yy += Math.max(0, entry.getMorePossibleHeight());
             }
         }
     }
@@ -123,6 +125,31 @@ public class MultiElementListEntry<T> extends TooltipListEntry<T> {
         }
     }
     
+    @Override
+    public void lateRender(int mouseX, int mouseY, float delta) {
+        if (expanded) {
+            for (AbstractConfigListEntry<?> entry : entries) {
+                entry.lateRender(mouseX, mouseY, delta);
+            }
+        }
+    }
+    
+    @SuppressWarnings("deprecation")
+    @Override
+    public int getMorePossibleHeight() {
+        if (!expanded) return -1;
+        List<Integer> list = new ArrayList<>();
+        int i = 24;
+        for (AbstractConfigListEntry<?> entry : entries) {
+            i += entry.getItemHeight();
+            if (entry.getMorePossibleHeight() >= 0) {
+                list.add(i + entry.getMorePossibleHeight());
+            }
+        }
+        list.add(i);
+        return list.stream().max(Integer::compare).orElse(0) - getItemHeight();
+    }
+    
     @Override
     public List<? extends Element> children() {
         return expanded ? children : Collections.singletonList(widget);

+ 29 - 3
src/main/java/me/shedaniel/clothconfig2/gui/entries/SubCategoryListEntry.java

@@ -14,6 +14,7 @@ import net.minecraft.client.sound.PositionedSoundInstance;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.util.Identifier;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
@@ -67,8 +68,8 @@ public class SubCategoryListEntry extends TooltipListEntry<List<AbstractConfigLi
     }
     
     @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);
+    public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) {
+        super.render(index, y, x, entryWidth, entryHeight, mouseX, mouseY, isHovered, delta);
         widget.rectangle.x = x - 19;
         widget.rectangle.y = y;
         widget.rectangle.width = entryWidth + 19;
@@ -85,7 +86,7 @@ public class SubCategoryListEntry extends TooltipListEntry<List<AbstractConfigLi
         if (expanded) {
             int yy = y + 24;
             for (AbstractConfigListEntry<?> entry : entries) {
-                entry.render(-1, yy, x + 14, entryWidth - 14, entry.getItemHeight(), mouseX, mouseY, isSelected && getFocused() == entry, delta);
+                entry.render(-1, yy, x + 14, entryWidth - 14, entry.getItemHeight(), mouseX, mouseY, isHovered && getFocused() == entry, delta);
                 yy += entry.getItemHeight();
             }
         }
@@ -98,6 +99,31 @@ public class SubCategoryListEntry extends TooltipListEntry<List<AbstractConfigLi
         }
     }
     
+    @Override
+    public void lateRender(int mouseX, int mouseY, float delta) {
+        if (expanded) {
+            for (AbstractConfigListEntry<?> entry : entries) {
+                entry.lateRender(mouseX, mouseY, delta);
+            }
+        }
+    }
+    
+    @SuppressWarnings("deprecation")
+    @Override
+    public int getMorePossibleHeight() {
+        if (!expanded) return -1;
+        List<Integer> list = new ArrayList<>();
+        int i = 24;
+        for (AbstractConfigListEntry<?> entry : entries) {
+            i += entry.getItemHeight();
+            if (entry.getMorePossibleHeight() >= 0) {
+                list.add(i + entry.getMorePossibleHeight());
+            }
+        }
+        list.add(i);
+        return list.stream().max(Integer::compare).orElse(0) - getItemHeight();
+    }
+    
     @Override
     public boolean isMouseInside(int mouseX, int mouseY, int x, int y, int entryWidth, int entryHeight) {
         widget.rectangle.x = x - 15;

+ 2 - 2
src/main/java/me/shedaniel/clothconfig2/gui/entries/TextFieldListEntry.java

@@ -46,11 +46,11 @@ public abstract class TextFieldListEntry<T> extends TooltipListEntry<T> {
         this.textFieldWidget = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, 0, 0, 148, 18, "") {
             @Override
             public void render(int int_1, int int_2, float float_1) {
-                boolean f = isFocused();
+//                boolean f = isFocused();
                 setFocused(isSelected);
                 textFieldPreRender(this);
                 super.render(int_1, int_2, float_1);
-                setFocused(f);
+//                setFocused(f);
             }
             
             @Override

+ 1 - 1
src/main/java/me/shedaniel/clothconfig2/gui/entries/TooltipListEntry.java

@@ -30,7 +30,7 @@ public abstract class TooltipListEntry<T> extends AbstractConfigListEntry<T> {
     }
     
     @Override
-    public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) {
+    public void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) {
         if (isMouseInside(mouseX, mouseY, x, y, entryWidth, entryHeight)) {
             Optional<String[]> tooltip = getTooltip();
             if (tooltip.isPresent() && tooltip.get().length > 0)

+ 1 - 1
src/main/java/me/shedaniel/clothconfig2/gui/widget/DynamicEntryListWidget.java

@@ -495,7 +495,7 @@ public abstract class DynamicEntryListWidget<E extends DynamicEntryListWidget.En
         public Entry() {
         }
         
-        public abstract void render(int var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8, float var9);
+        public abstract void render(int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta);
         
         public boolean isMouseOver(double double_1, double double_2) {
             return Objects.equals(this.parent.getItemAtPosition(double_1, double_2), this);