Fix ModList screen selection getting out of sync. Closes #10855

This commit is contained in:
LexManos 2026-07-21 15:55:37 -07:00
parent 278bdfc132
commit 88bb2217e5
No known key found for this signature in database
GPG key ID: 6E90061A7AE1F652
2 changed files with 24 additions and 11 deletions

View file

@ -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

View file

@ -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<ModListWidget.ModEntry> {
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<ModEntry> {
private final IModInfo modInfo;
private final ModListScreen parent;
@ -92,14 +100,15 @@ public class ModListWidget extends ObjectSelectionList<ModListWidget.ModEntry> {
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;
}