Initial commit
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package com.kasetoatz.dumbassconfig.ui;
|
||||
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.Element;
|
||||
import net.minecraft.client.gui.Selectable;
|
||||
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.gui.widget.TextWidget;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.kasetoatz.dumbassconfig.DumbassConfig.*;
|
||||
|
||||
public class ConfigEntry extends ElementListWidget.Entry<ConfigEntry>
|
||||
{
|
||||
private final ArrayList<ClickableWidget> widgets = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public List<? extends Selectable> selectableChildren()
|
||||
{
|
||||
return List.of();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Element> children()
|
||||
{
|
||||
return widgets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getY()
|
||||
{
|
||||
return super.getY() - 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float deltaTicks)
|
||||
{
|
||||
for (ClickableWidget widget : widgets)
|
||||
{
|
||||
if (widget instanceof TextWidget)
|
||||
{
|
||||
widget.setX(TEXT_LEFT);
|
||||
widget.setDimensions(TEXT_WIDTH, TEXT_HEIGHT);
|
||||
}
|
||||
else if (widget instanceof ButtonWidget || widget instanceof InputField)
|
||||
{
|
||||
widget.setX(this.getWidth() - OPTION_RIGHT);
|
||||
widget.setDimensions(OPTION_WIDTH, OPTION_HEIGHT);
|
||||
}
|
||||
widget.setY(this.getY() + (this.getHeight() - widget.getHeight()) / 2);
|
||||
widget.render(context, mouseX, mouseY, deltaTicks);
|
||||
}
|
||||
}
|
||||
|
||||
public void add(ClickableWidget widget)
|
||||
{
|
||||
widgets.add(widget);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.kasetoatz.dumbassconfig.ui;
|
||||
|
||||
import com.kasetoatz.dumbassconfig.options.ButtonOption;
|
||||
import com.kasetoatz.dumbassconfig.options.InputOption;
|
||||
import com.kasetoatz.dumbassconfig.options.Option;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.widget.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.kasetoatz.dumbassconfig.DumbassConfig.BACKGROUND_COLOR_1;
|
||||
import static com.kasetoatz.dumbassconfig.DumbassConfig.BACKGROUND_COLOR_2;
|
||||
|
||||
public class ConfigEntryList extends ElementListWidget<ConfigEntry>
|
||||
{
|
||||
public ConfigEntryList(MinecraftClient client, int width, int height, int y, int itemHeight)
|
||||
{
|
||||
super(client, width, height, y, itemHeight);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowWidth()
|
||||
{
|
||||
return this.width - 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getContentsHeightWithPadding()
|
||||
{
|
||||
return super.getContentsHeightWithPadding() - 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta)
|
||||
{
|
||||
List<ConfigEntry> options = this.children();
|
||||
for (int i = 0; i < options.size(); i++)
|
||||
{
|
||||
ConfigEntry option = options.get(i);
|
||||
if (option.getY() + option.getHeight() < this.getY())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (option.getY() > this.getY() + this.height)
|
||||
{
|
||||
break;
|
||||
}
|
||||
context.fill(0, Math.max(option.getY(), this.getY()), option.getWidth() + 30, Math.min(option.getY() + option.getHeight(), this.getY() + this.height), (i % 2 == 0) ? BACKGROUND_COLOR_1 : BACKGROUND_COLOR_2);
|
||||
}
|
||||
super.renderWidget(context, mouseX, mouseY, delta);
|
||||
}
|
||||
|
||||
public void add(Option<?> option)
|
||||
{
|
||||
ConfigEntry entry = new ConfigEntry();
|
||||
entry.add(new TextWidget(option.getText(), this.client.textRenderer));
|
||||
if (option instanceof ButtonOption<?> buttonOption)
|
||||
{
|
||||
entry.add(ButtonWidget.builder(buttonOption.getButtonText(), buttonOption::onClick).build());
|
||||
}
|
||||
else if (option instanceof InputOption<?> inputOption)
|
||||
{
|
||||
inputOption.textField = new InputField(this.client.textRenderer, inputOption.getText());
|
||||
inputOption.textField.setText(inputOption.getValue().toString());
|
||||
inputOption.textField.setTextPredicate(inputOption::predicate);
|
||||
inputOption.textField.setChangedListener(inputOption::changeListener);
|
||||
entry.add(inputOption.textField);
|
||||
}
|
||||
this.addEntry(entry);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.kasetoatz.dumbassconfig.ui;
|
||||
|
||||
import com.kasetoatz.dumbassconfig.options.Option;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.client.gui.widget.ThreePartsLayoutWidget;
|
||||
import net.minecraft.screen.ScreenTexts;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.kasetoatz.dumbassconfig.DumbassConfig.DONE_BUTTON_WIDTH;
|
||||
import static com.kasetoatz.dumbassconfig.DumbassConfig.ENTRY_HEIGHT;
|
||||
|
||||
public class ConfigScreen extends Screen
|
||||
{
|
||||
private Screen parent;
|
||||
private final List<Option<?>> options;
|
||||
private final ThreePartsLayoutWidget layout = new ThreePartsLayoutWidget(this);
|
||||
private ConfigEntryList body;
|
||||
|
||||
public ConfigScreen(Text title, List<Option<?>> options)
|
||||
{
|
||||
super(title);
|
||||
this.options = options;
|
||||
}
|
||||
|
||||
public void setParent(Screen parent)
|
||||
{
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void init()
|
||||
{
|
||||
this.layout.addHeader(this.title, this.textRenderer);
|
||||
this.body = new ConfigEntryList(this.client, this.layout.getWidth(), this.layout.getContentHeight(), this.layout.getHeaderHeight(), ENTRY_HEIGHT);
|
||||
for (Option<?> option : this.options)
|
||||
{
|
||||
this.body.add(option);
|
||||
}
|
||||
this.layout.addBody(body);
|
||||
this.layout.addFooter(ButtonWidget.builder(ScreenTexts.DONE, button -> this.close()).width(DONE_BUTTON_WIDTH).build());
|
||||
this.layout.forEachChild(this::addDrawableChild);
|
||||
this.refreshWidgetPositions();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void refreshWidgetPositions()
|
||||
{
|
||||
this.layout.refreshPositions();
|
||||
if (this.body != null)
|
||||
{
|
||||
this.body.position(this.width, this.layout);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close()
|
||||
{
|
||||
if (this.client != null)
|
||||
{
|
||||
this.client.setScreen(this.parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
69
src/main/java/com/kasetoatz/dumbassconfig/ui/InputField.java
Normal file
69
src/main/java/com/kasetoatz/dumbassconfig/ui/InputField.java
Normal file
@@ -0,0 +1,69 @@
|
||||
package com.kasetoatz.dumbassconfig.ui;
|
||||
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gl.RenderPipelines;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.screen.ButtonTextures;
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import static com.kasetoatz.dumbassconfig.DumbassConfig.INVALID_INPUT_COLOR;
|
||||
|
||||
public class InputField extends TextFieldWidget
|
||||
{
|
||||
private boolean valid = true;
|
||||
private final ButtonTextures textures = new ButtonTextures(Identifier.ofVanilla("widget/text_field"), Identifier.ofVanilla("widget/text_field_highlighted"));
|
||||
private Field textX;
|
||||
private Field textY;
|
||||
|
||||
public InputField(TextRenderer textRenderer, Text text)
|
||||
{
|
||||
super(textRenderer, 80, 40, text);
|
||||
initTextPosition();
|
||||
}
|
||||
|
||||
private void initTextPosition()
|
||||
{
|
||||
try
|
||||
{
|
||||
this.textX = TextFieldWidget.class.getDeclaredField("textX");
|
||||
this.textY = TextFieldWidget.class.getDeclaredField("textY");
|
||||
this.textX.setAccessible(true);
|
||||
this.textY.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchFieldException ignored) {}
|
||||
}
|
||||
|
||||
private void updateTextPosition()
|
||||
{
|
||||
if (this.textX != null && this.textY != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.textX.setInt(this, this.getX() + 4);
|
||||
this.textY.setInt(this, this.getY() + (this.height - 8) / 2);
|
||||
}
|
||||
catch (IllegalAccessException ignored) {}
|
||||
}
|
||||
}
|
||||
|
||||
public void setValid(boolean valid)
|
||||
{
|
||||
this.valid = valid;
|
||||
this.setDrawsBackground(valid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta)
|
||||
{
|
||||
if (!this.valid)
|
||||
{
|
||||
updateTextPosition();
|
||||
context.drawGuiTexture(RenderPipelines.GUI_TEXTURED, textures.get(this.isInteractable(), this.isFocused()), super.getX(), super.getY(), this.getWidth(), this.getHeight(), INVALID_INPUT_COLOR);
|
||||
}
|
||||
super.renderWidget(context, mouseX, mouseY, delta);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user