From 49596dcacc09c3d2417da67385406a0cadca43e5 Mon Sep 17 00:00:00 2001 From: tterrag Date: Tue, 17 Dec 2019 20:58:26 -0500 Subject: [PATCH] Mod list GUI detail pass - Make padding consistent on all elements - Properly horizontally center the "Search" text - Update and resize forge/mcp logos - Enable linear filtering on logo rendering by default - Can be disabled with the "logoBlur" mods.toml property --- .../fml/loading/moddiscovery/ModInfo.java | 10 ++ .../{GuiModList.java => ModListScreen.java} | 91 +++++++++++------- ...GuiSlotModList.java => ModListWidget.java} | 14 +-- src/main/resources/forge_logo.png | Bin 1112 -> 11237 bytes src/main/resources/mcplogo.png | Bin 3926 -> 18770 bytes 5 files changed, 71 insertions(+), 44 deletions(-) rename src/main/java/net/minecraftforge/fml/client/gui/{GuiModList.java => ModListScreen.java} (83%) rename src/main/java/net/minecraftforge/fml/client/gui/{GuiSlotModList.java => ModListWidget.java} (90%) diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java index 910e81710..420e709da 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModInfo.java @@ -51,6 +51,7 @@ public class ModInfo implements IModInfo private final String displayName; private final String description; private final Optional logoFile; + private final boolean logoBlur; private final URL updateJSONURL; private final List dependencies; private final Map properties; @@ -81,6 +82,10 @@ public class ModInfo implements IModInfo tmp = this.owningFile.getConfig().getOptional("logoFile"); } this.logoFile = tmp; + this.logoBlur = modConfig.getOptional("logoBlur"). + orElseGet(() -> Optional.ofNullable(this.owningFile). + flatMap(f -> f.getConfig().getOptional("logoBlur")). + orElse(true)); this.updateJSONURL = modConfig.getOptional("updateJSONURL").map(StringUtils::toURL).orElse(null); if (owningFile != null) { @@ -151,6 +156,11 @@ public class ModInfo implements IModInfo return this.logoFile; } + public boolean getLogoBlur() + { + return this.logoBlur; + } + /** * This is no longer used. The Mods List GUI currently directly checks whether there is an EntryPoint registered. */ diff --git a/src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java b/src/main/java/net/minecraftforge/fml/client/gui/ModListScreen.java similarity index 83% rename from src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java rename to src/main/java/net/minecraftforge/fml/client/gui/ModListScreen.java index f0886e6f7..1314b3871 100644 --- a/src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java +++ b/src/main/java/net/minecraftforge/fml/client/gui/ModListScreen.java @@ -30,8 +30,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; -import net.minecraft.util.Util; -import net.minecraftforge.fml.loading.FMLPaths; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,17 +39,18 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.client.gui.widget.list.ExtendedList; +import net.minecraft.client.gui.RenderComponentsUtil; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.gui.RenderComponentsUtil; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.client.gui.widget.list.ExtendedList; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.NativeImage; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Util; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; @@ -65,13 +64,14 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.VersionChecker; import net.minecraftforge.fml.client.ConfigGuiHandler; import net.minecraftforge.fml.client.config.GuiUtils; +import net.minecraftforge.fml.loading.FMLPaths; import net.minecraftforge.fml.loading.StringUtils; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; import net.minecraftforge.fml.packs.ModFileResourcePack; import net.minecraftforge.fml.packs.ResourcePackLoader; import net.minecraftforge.forgespi.language.IModInfo; -public class GuiModList extends Screen +public class ModListScreen extends Screen { private static String stripControlCodes(String value) { return net.minecraft.util.StringUtils.stripControlCodes(value); } private static final Logger LOGGER = LogManager.getLogger(); @@ -95,11 +95,13 @@ public class GuiModList extends Screen } } + private static final int PADDING = 6; + private Screen mainMenu; - private GuiSlotModList modList; + private ModListWidget modList; private InfoPanel modInfo; - private GuiSlotModList.ModEntry selected = null; + private ModListWidget.ModEntry selected = null; private int listWidth; private List mods; private final List unsortedMods; @@ -117,7 +119,7 @@ public class GuiModList extends Screen /** * @param mainMenu */ - public GuiModList(Screen mainMenu) + public ModListScreen(Screen mainMenu) { super(new TranslationTextComponent("fml.menu.mods.title")); this.mainMenu = mainMenu; @@ -132,7 +134,7 @@ public class GuiModList extends Screen InfoPanel(Minecraft mcIn, int widthIn, int heightIn, int topIn) { - super(mcIn, widthIn, heightIn, topIn, modList.getRight() + 10); + super(mcIn, widthIn, heightIn, topIn, modList.getRight() + PADDING); } void setInfo(List lines, ResourceLocation logoPath, Size2i logoDims) @@ -164,7 +166,7 @@ public class GuiModList extends Screen int maxTextLength = this.width - 12; if (maxTextLength >= 0) { - ret.addAll(RenderComponentsUtil.splitText(chat, maxTextLength, GuiModList.this.font, false, true)); + ret.addAll(RenderComponentsUtil.splitText(chat, maxTextLength, ModListScreen.this.font, false, true)); } } return ret; @@ -195,8 +197,8 @@ public class GuiModList extends Screen RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); // Draw the logo image inscribed in a rectangle with width entryWidth (minus some padding) and height 50 int headerHeight = 50; - GuiUtils.drawInscribedRect(left, relativeY, width - 5, headerHeight, logoDims.width, logoDims.height, false, true); - relativeY += headerHeight; + GuiUtils.drawInscribedRect(left + PADDING, relativeY, width - (PADDING * 2), headerHeight, logoDims.width, logoDims.height, false, true); + relativeY += headerHeight + PADDING; } for (ITextComponent line : lines) @@ -204,7 +206,7 @@ public class GuiModList extends Screen if (line != null) { RenderSystem.enableBlend(); - GuiModList.this.font.drawStringWithShadow(line.getFormattedText(), left + 4, relativeY, 0xFFFFFF); + ModListScreen.this.font.drawStringWithShadow(line.getFormattedText(), left + PADDING, relativeY, 0xFFFFFF); RenderSystem.disableAlphaTest(); RenderSystem.disableBlend(); } @@ -213,7 +215,7 @@ public class GuiModList extends Screen final ITextComponent component = findTextLine(mouseX, mouseY); if (component!=null) { - GuiModList.this.renderComponentHoverEffect(component, mouseX, mouseY); + ModListScreen.this.renderComponentHoverEffect(component, mouseX, mouseY); } } @@ -236,7 +238,7 @@ public class GuiModList extends Screen for (ITextComponent part : line) { if (!(part instanceof StringTextComponent)) continue; - k += GuiModList.this.font.getStringWidth(((StringTextComponent)part).getText()); + k += ModListScreen.this.font.getStringWidth(((StringTextComponent)part).getText()); if (k >= mouseX) { return part; @@ -250,7 +252,7 @@ public class GuiModList extends Screen public boolean mouseClicked(final double mouseX, final double mouseY, final int button) { final ITextComponent component = findTextLine((int) mouseX, (int) mouseY); if (component != null) { - GuiModList.this.handleComponentClicked(component); + ModListScreen.this.handleComponentClicked(component); return true; } return super.mouseClicked(mouseX, mouseY, button); @@ -271,22 +273,28 @@ public class GuiModList extends Screen } listWidth = Math.max(Math.min(listWidth, width/3), 100); listWidth += listWidth % numButtons != 0 ? (numButtons - listWidth % numButtons) : 0; - this.modList = new GuiSlotModList(this, listWidth); - this.modList.setLeftPos(6); - - int modInfoWidth = this.width - this.listWidth - 20; - this.modInfo = new InfoPanel(this.minecraft, modInfoWidth, this.height - 40, 10); + int modInfoWidth = this.width - this.listWidth - (PADDING * 3); int doneButtonWidth = Math.min(modInfoWidth, 200); - this.addButton(new Button(((modList.getWidth() + 8 + this.width - doneButtonWidth) / 2), this.height - 24, doneButtonWidth, 20, - I18n.format("gui.done"), b -> GuiModList.this.minecraft.displayGuiScreen(GuiModList.this.mainMenu))); - this.addButton(this.openModsFolderButton = new Button(6, this.height - 24, this.listWidth, 20, + int y = this.height - 20 - PADDING; + this.addButton(new Button(((listWidth + PADDING + this.width - doneButtonWidth) / 2), y, doneButtonWidth, 20, + I18n.format("gui.done"), b -> ModListScreen.this.minecraft.displayGuiScreen(ModListScreen.this.mainMenu))); + this.addButton(this.openModsFolderButton = new Button(6, y, this.listWidth, 20, I18n.format("fml.menu.mods.openmodsfolder"), b -> Util.getOSType().openFile(FMLPaths.MODSDIR.get().toFile()))); - this.addButton(this.configButton = new Button(6, this.height - 48, this.listWidth, 20, - I18n.format("fml.menu.mods.config"), b -> GuiModList.this.displayModConfig())); + y -= 20 + PADDING; + this.addButton(this.configButton = new Button(6, y, this.listWidth, 20, + I18n.format("fml.menu.mods.config"), b -> ModListScreen.this.displayModConfig())); this.configButton.active = false; - search = new TextFieldWidget(getFontRenderer(), 8, modList.getBottom() + 17, listWidth - 4, 14, I18n.format("fml.menu.mods.search")); + y -= 14 + PADDING + 1; + search = new TextFieldWidget(getFontRenderer(), PADDING + 1, y, listWidth - 2, 14, I18n.format("fml.menu.mods.search")); + + int fullButtonHeight = PADDING + 20 + PADDING; + this.modList = new ModListWidget(this, listWidth, fullButtonHeight, search.y - getFontRenderer().FONT_HEIGHT - PADDING); + this.modList.setLeftPos(6); + + this.modInfo = new InfoPanel(this.minecraft, modInfoWidth, this.height - PADDING - fullButtonHeight, PADDING); + children.add(search); children.add(modList); children.add(modInfo); @@ -294,12 +302,12 @@ public class GuiModList extends Screen search.setCanLoseFocus(true); final int width = listWidth / numButtons; - int x = 6, y = 10; - addButton(SortType.NORMAL.button = new Button(x, y, width - buttonMargin, 20, SortType.NORMAL.getButtonText(), b -> resortMods(SortType.NORMAL))); + int x = PADDING; + addButton(SortType.NORMAL.button = new Button(x, PADDING, width - buttonMargin, 20, SortType.NORMAL.getButtonText(), b -> resortMods(SortType.NORMAL))); x += width + buttonMargin; - addButton(SortType.A_TO_Z.button = new Button(x, y, width - buttonMargin, 20, SortType.A_TO_Z.getButtonText(), b -> resortMods(SortType.A_TO_Z))); + addButton(SortType.A_TO_Z.button = new Button(x, PADDING, width - buttonMargin, 20, SortType.A_TO_Z.getButtonText(), b -> resortMods(SortType.A_TO_Z))); x += width + buttonMargin; - addButton(SortType.Z_TO_A.button = new Button(x, y, width - buttonMargin, 20, SortType.Z_TO_A.getButtonText(), b -> resortMods(SortType.Z_TO_A))); + addButton(SortType.Z_TO_A.button = new Button(x, PADDING, width - buttonMargin, 20, SortType.Z_TO_A.getButtonText(), b -> resortMods(SortType.Z_TO_A))); resortMods(SortType.NORMAL); updateCache(); } @@ -375,8 +383,8 @@ public class GuiModList extends Screen this.modInfo.render(mouseX, mouseY, partialTicks); String text = I18n.format("fml.menu.mods.search"); - int x = ((modList.getRight()) / 2) - (getFontRenderer().getStringWidth(text) / 2); - getFontRenderer().drawString(text, x, modList.getBottom() + 5, 0xFFFFFF); + int x = modList.getLeft() + ((modList.getRight() - modList.getLeft()) / 2) - (getFontRenderer().getStringWidth(text) / 2); + getFontRenderer().drawString(text, x, search.y - getFontRenderer().FONT_HEIGHT, 0xFFFFFF); this.search.render(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks); } @@ -391,7 +399,7 @@ public class GuiModList extends Screen return font; } - public void setSelected(GuiSlotModList.ModEntry entry) + public void setSelected(ModListWidget.ModEntry entry) { this.selected = entry == this.selected ? null : entry; updateCache(); @@ -424,7 +432,16 @@ public class GuiModList extends Screen if (logo != null) { - return Pair.of(tm.getDynamicTextureLocation("modlogo", new DynamicTexture(logo)), new Size2i(logo.getWidth(), logo.getHeight())); + return Pair.of(tm.getDynamicTextureLocation("modlogo", new DynamicTexture(logo) { + + @Override + public void updateDynamicTexture() { + this.func_229148_d_(); + NativeImage td = this.getTextureData(); + // Use custom "blur" value which controls texture filtering (nearest-neighbor vs linear) + this.getTextureData().func_227789_a_(0, 0, 0, 0, 0, td.getWidth(), td.getHeight(), selectedMod.getLogoBlur(), false, false, false); + } + }), new Size2i(logo.getWidth(), logo.getHeight())); } } catch (IOException e) { } @@ -473,7 +490,7 @@ public class GuiModList extends Screen { String s = this.search.getText(); SortType sort = this.sortType; - GuiSlotModList.ModEntry selected = this.selected; + ModListWidget.ModEntry selected = this.selected; this.init(mc, width, height); this.search.setText(s); this.selected = selected; diff --git a/src/main/java/net/minecraftforge/fml/client/gui/GuiSlotModList.java b/src/main/java/net/minecraftforge/fml/client/gui/ModListWidget.java similarity index 90% rename from src/main/java/net/minecraftforge/fml/client/gui/GuiSlotModList.java rename to src/main/java/net/minecraftforge/fml/client/gui/ModListWidget.java index 74ece630d..1227664b9 100644 --- a/src/main/java/net/minecraftforge/fml/client/gui/GuiSlotModList.java +++ b/src/main/java/net/minecraftforge/fml/client/gui/ModListWidget.java @@ -31,17 +31,17 @@ import net.minecraftforge.fml.loading.moddiscovery.ModInfo; import com.mojang.blaze3d.systems.RenderSystem; -public class GuiSlotModList extends ExtendedList +public class ModListWidget extends ExtendedList { private static String stripControlCodes(String value) { return net.minecraft.util.StringUtils.stripControlCodes(value); } private static final ResourceLocation VERSION_CHECK_ICONS = new ResourceLocation(ForgeVersion.MOD_ID, "textures/gui/version_check_icons.png"); private final int listWidth; - private GuiModList parent; + private ModListScreen parent; - public GuiSlotModList(GuiModList parent, int listWidth) + public ModListWidget(ModListScreen parent, int listWidth, int top, int bottom) { - super(parent.getMinecraftInstance(), listWidth, parent.height, 32, parent.height - 91 + 4, parent.getFontRenderer().FONT_HEIGHT * 2 + 8); + super(parent.getMinecraftInstance(), listWidth, parent.height, top, bottom, parent.getFontRenderer().FONT_HEIGHT * 2 + 8); this.parent = parent; this.listWidth = listWidth; this.refreshList(); @@ -72,9 +72,9 @@ public class GuiSlotModList extends ExtendedList class ModEntry extends ExtendedList.AbstractListEntry { private final ModInfo modInfo; - private final GuiModList parent; + private final ModListScreen parent; - ModEntry(ModInfo info, GuiModList parent) { + ModEntry(ModInfo info, ModListScreen parent) { this.modInfo = info; this.parent = parent; } @@ -103,7 +103,7 @@ public class GuiSlotModList extends ExtendedList public boolean mouseClicked(double p_mouseClicked_1_, double p_mouseClicked_3_, int p_mouseClicked_5_) { parent.setSelected(this); - GuiSlotModList.this.setSelected(this); + ModListWidget.this.setSelected(this); return false; } diff --git a/src/main/resources/forge_logo.png b/src/main/resources/forge_logo.png index 7129008d1fd5910071a73571c2c1b12a97061416..49db5c8a777afb7ea916dc10997b58296097878c 100644 GIT binary patch literal 11237 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 D>F!Ab literal 1112 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