diff --git a/src/main/java/net/minecraftforge/client/gui/ModListScreen.java b/src/main/java/net/minecraftforge/client/gui/ModListScreen.java index 303aeaaa50..098a95a2e1 100644 --- a/src/main/java/net/minecraftforge/client/gui/ModListScreen.java +++ b/src/main/java/net/minecraftforge/client/gui/ModListScreen.java @@ -23,6 +23,7 @@ import net.minecraftforge.client.gui.widget.ModListWidget; import net.minecraftforge.client.gui.widget.ScrollPanel; import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; import org.apache.maven.artifact.versioning.ComparableVersion; +import org.jspecify.annotations.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ActiveTextCollector; @@ -299,8 +300,6 @@ public class ModListScreen extends Screen { @Override public void tick() { - modList.setSelected(selected); - if (!search.getValue().equals(lastFilterText)) { reloadMods(); sorted = false; @@ -311,11 +310,11 @@ public class ModListScreen extends Screen { mods.sort(sortType); modList.refreshList(); if (selected != null) { - selected = modList.children().stream() + final var newSelected = modList.children().stream() .filter(e -> e.getInfo() == selected.getInfo()) .findFirst() .orElse(null); - updateCache(); + this.modList.setSelected(newSelected); } sorted = true; } @@ -365,8 +364,14 @@ public class ModListScreen extends Screen { } public void setSelected(ModListWidget.ModEntry entry) { - this.selected = entry == this.selected ? null : entry; - updateCache(); + if (this.selected != entry) { + this.selected = entry; + updateCache(); + } + } + + public ModListWidget.@Nullable ModEntry getSelected() { + return this.selected; } record Logo(Identifier texture, Size2i size) {} @@ -473,7 +478,6 @@ public class ModListScreen extends Screen { ModListWidget.ModEntry selected = this.selected; this.init(width, height); this.search.setValue(s); - this.selected = selected; if (!this.search.getValue().isEmpty()) reloadMods(); @@ -481,7 +485,7 @@ public class ModListScreen extends Screen { if (sort != SortType.NORMAL) resortMods(sort); - updateCache(); + this.modList.setSelected(selected); } @Override diff --git a/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java b/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java index 062af04bbe..a55edd14cf 100644 --- a/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java +++ b/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java @@ -5,6 +5,8 @@ package net.minecraftforge.client.gui.widget; +import org.jspecify.annotations.Nullable; + import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.ObjectSelectionList; @@ -60,6 +62,12 @@ public class ModListWidget extends ObjectSelectionList { parent.buildModList(this::addEntry, mod->new ModEntry(mod, this.parent)); } + @Override + public void setSelected(final @Nullable ModEntry selected) { + parent.setSelected(selected); + super.setSelected(selected); + } + public class ModEntry extends ObjectSelectionList.Entry { private final IModInfo modInfo; private final ModListScreen parent; @@ -92,14 +100,15 @@ public class ModListWidget extends ObjectSelectionList { guiGraphics.pose().pushMatrix(); guiGraphics.blit(RenderPipelines.GUI_TEXTURED, VERSION_CHECK_ICONS, getX() + width - 12 - barOffset, top + entryHeight / 4, vercheck.status().getSheetOffset() * 8, (vercheck.status().isAnimated() && ((System.currentTimeMillis() / 800 & 1)) == 1) ? 8 : 0, 8, 8, 64, 16); guiGraphics.pose().popMatrix(); - } } @Override public boolean mouseClicked(MouseButtonEvent info, boolean recent) { - parent.setSelected(this); - ModListWidget.this.setSelected(this); + if (this.parent.getSelected() == this) + ModListWidget.this.setSelected(null); + else + ModListWidget.this.setSelected(this); return false; }