package io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.Text; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Optional; import java.util.function.BooleanSupplier; import java.util.function.Supplier; @Environment(EnvType.CLIENT) public class EntryListWidget extends ElementListWidget { TextRenderer textRenderer; public EntryListWidget(MinecraftClient client, TextRenderer tr, int i, int j, int k, int l, int m) { super(client, i, j, k, l, m); this.centerListVertically = false; textRenderer = tr; setRenderBackground(client.world == null); } @Override public int getScrollbarPositionX() { return this.width -7; } public void addUnknown(ClickableWidget resetButton, BooleanSupplier resetVisible, Text text) { this.addEntry(new ConfigUnknownEntry(text, resetVisible, resetButton)); } public void addButton(@Nullable ClickableWidget button, ClickableWidget resetButton, BooleanSupplier resetVisible, Text text) { this.addEntry(new ConfigScreenEntry(button, text, resetVisible, resetButton)); } public void addReference(int centerX, Text text, Supplier targetScreen) { this.addEntry(new ConfigReferenceEntry(centerX, text, targetScreen)); } @Override public int getRowWidth() { return 10000; } public Optional getHoveredEntryTitle(double mouseY) { for (ConfigEntry abstractEntry : this.children()) { if (abstractEntry instanceof ConfigScreenEntry entry && entry.button.visible && mouseY >= entry.button.getY() && mouseY < entry.button.getY() + itemHeight) { return Optional.of(entry.getText()); } else if (abstractEntry instanceof ConfigUnknownEntry entry && mouseY >= entry.resetButton.getY() && mouseY < entry.resetButton.getY() + itemHeight) { return Optional.of(entry.getText()); } } return Optional.empty(); } @Environment(EnvType.CLIENT) public abstract static class ConfigEntry extends Entry { @Override public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { if (hovered) { fill(matrices, x, y, x + entryWidth, y + entryHeight, 0x24FFFFFF); } } } @Environment(EnvType.CLIENT) public static class ConfigReferenceEntry extends ConfigEntry { private final ClickableWidget button; public ConfigReferenceEntry(int centerX, Text text, Supplier targetScreen) { this.button = ButtonWidget.builder(text, btn -> MinecraftClient.getInstance().setScreen(targetScreen.get())) .position(centerX - 154, 0) .size(308, 20) .build(); } @Override public List selectableChildren() { return List.of(button); } @Override public List children() { return List.of(button); } @Override public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, hovered, tickDelta); button.setY(y); button.render(matrices, mouseX, mouseY, tickDelta); } } @Environment(EnvType.CLIENT) public static class ConfigScreenEntry extends ConfigEntry { private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; public final ClickableWidget button; private final BooleanSupplier resetVisible; private final ClickableWidget resetButton; private final Text text; public ConfigScreenEntry(ClickableWidget button, Text text, BooleanSupplier resetVisible, ClickableWidget resetButton) { this.button = button; this.resetVisible = resetVisible; this.resetButton = resetButton; this.text = text; } @Override public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, hovered, tickDelta); button.setY(y); button.render(matrices, mouseX, mouseY, tickDelta); drawTextWithShadow(matrices,textRenderer, text,12,y+5,0xFFFFFF); if (resetVisible.getAsBoolean()) { resetButton.setY(y); resetButton.render(matrices, mouseX, mouseY, tickDelta); } } @Override public List children() { return List.of(button, resetButton); } @Override public List selectableChildren() { return List.of(button); } public Text getText() { return text; } } @Environment(EnvType.CLIENT) public static class ConfigUnknownEntry extends ConfigEntry { private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; private final BooleanSupplier resetVisible; private final ClickableWidget resetButton; private final Text text; public ConfigUnknownEntry(Text text, BooleanSupplier resetVisible, ClickableWidget resetButton) { this.resetVisible = resetVisible; this.resetButton = resetButton; this.text = text; } @Override public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, hovered, tickDelta); drawTextWithShadow(matrices,textRenderer, text,12,y+5,0xFFFFFF); if (resetVisible.getAsBoolean()) { resetButton.setY(y); resetButton.render(matrices, mouseX, mouseY, tickDelta); } } @Override public List children() { return List.of(resetButton); } @Override public List selectableChildren() { return List.of(); } public Text getText() { return text; } } }