LibJF/libjf-config-ui-tiny-v1/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/entry/EntryListWidget.java

177 lines
6.4 KiB
Java

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.ButtonWidget;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.ElementListWidget;
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.*;
@Environment(EnvType.CLIENT)
public class EntryListWidget extends ElementListWidget<EntryListWidget.ConfigEntry> {
TextRenderer textRenderer;
public EntryListWidget(MinecraftClient minecraftClient, TextRenderer tr, int i, int j, int k, int l, int m) {
super(minecraftClient, i, j, k, l, m);
this.centerListVertically = false;
textRenderer = tr;
}
@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<Screen> targetScreen) {
this.addEntry(new ConfigReferenceEntry(centerX, text, targetScreen));
}
@Override
public int getRowWidth() {
return 10000;
}
public Optional<Text> 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<ConfigEntry> {
}
@Environment(EnvType.CLIENT)
public static class ConfigReferenceEntry extends ConfigEntry {
private final ClickableWidget button;
public ConfigReferenceEntry(int centerX, Text text, Supplier<Screen> targetScreen) {
this.button = ButtonWidget.builder(text, btn -> MinecraftClient.getInstance().setScreen(targetScreen.get()))
.position(centerX - 154, 0)
.size(308, 20)
.build();
}
@Override
public List<? extends Selectable> selectableChildren() {
return List.of(button);
}
@Override
public List<? extends Element> 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) {
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) {
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<? extends Element> children() {
return List.of(button, resetButton);
}
@Override
public List<? extends Selectable> 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) {
drawTextWithShadow(matrices,textRenderer, text,12,y+5,0xFFFFFF);
if (resetVisible.getAsBoolean()) {
resetButton.setY(y);
resetButton.render(matrices, mouseX, mouseY, tickDelta);
}
}
@Override
public List<? extends Element> children() {
return List.of(resetButton);
}
@Override
public List<? extends Selectable> selectableChildren() {
return List.of();
}
public Text getText() {
return text;
}
}
}