177 lines
6.4 KiB
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;
|
|
}
|
|
}
|
|
}
|