129 lines
4.7 KiB
Java
129 lines
4.7 KiB
Java
package io.gitlab.jfronny.libjf.config.impl.client.screen;
|
|
|
|
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 java.util.List;
|
|
import java.util.Optional;
|
|
import java.util.function.Supplier;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class MidnightConfigListWidget extends ElementListWidget<MidnightConfigListWidget.ConfigListEntryAbstract> {
|
|
TextRenderer textRenderer;
|
|
|
|
public MidnightConfigListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l, int m) {
|
|
super(minecraftClient, i, j, k, l, m);
|
|
this.centerListVertically = false;
|
|
textRenderer = minecraftClient.textRenderer;
|
|
}
|
|
|
|
@Override
|
|
public int getScrollbarPositionX() {
|
|
return this.width -7;
|
|
}
|
|
|
|
public void addButton(ClickableWidget button, ClickableWidget resetButton, Supplier<Boolean> resetVisible, Text text) {
|
|
this.addEntry(new ConfigScreenEntry(button, text, resetVisible, resetButton));
|
|
}
|
|
|
|
public void addReference(int centerX, Text text, Supplier<Screen> targetScreen) {
|
|
this.addEntry(new ConfigListReferenceEntry(centerX, text, targetScreen));
|
|
}
|
|
|
|
@Override
|
|
public int getRowWidth() {
|
|
return 10000;
|
|
}
|
|
|
|
public Optional<Text> getHoveredEntryTitle(double mouseY) {
|
|
for (ConfigListEntryAbstract abstractEntry : this.children()) {
|
|
if (abstractEntry instanceof ConfigScreenEntry entry
|
|
&& entry.button.visible
|
|
&& mouseY >= entry.button.y && mouseY < entry.button.y + itemHeight) {
|
|
return Optional.of(entry.getText());
|
|
}
|
|
}
|
|
return Optional.empty();
|
|
}
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public static abstract class ConfigListEntryAbstract extends Entry<ConfigListEntryAbstract> {
|
|
}
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public static class ConfigListReferenceEntry extends ConfigListEntryAbstract {
|
|
private final ClickableWidget button;
|
|
|
|
public ConfigListReferenceEntry(int centerX, Text text, Supplier<Screen> targetScreen) {
|
|
this.button = new ButtonWidget(centerX - 154, 0, 308, 20, text, btn -> MinecraftClient.getInstance().setScreen(targetScreen.get()));
|
|
}
|
|
|
|
@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.y = y;
|
|
button.render(matrices, mouseX, mouseY, tickDelta);
|
|
}
|
|
}
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public static class ConfigScreenEntry extends ConfigListEntryAbstract {
|
|
private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
|
|
public final ClickableWidget button;
|
|
private final Supplier<Boolean> resetVisible;
|
|
private final ClickableWidget resetButton;
|
|
private final Text text;
|
|
|
|
public ConfigScreenEntry(ClickableWidget button, Text text, Supplier<Boolean> 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.y = y;
|
|
button.render(matrices, mouseX, mouseY, tickDelta);
|
|
drawTextWithShadow(matrices,textRenderer, text,12,y+5,0xFFFFFF);
|
|
if (resetVisible.get()) {
|
|
resetButton.y = 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;
|
|
}
|
|
}
|
|
}
|