1
mirror of https://github.com/Shiewk/Widgets.git synced 2026-04-28 11:34:17 +02:00

Revised WidgetConfigScreen

This commit is contained in:
Shy
2025-11-26 18:13:03 +01:00
parent 3e044078d6
commit 61f0ac3eb5
4 changed files with 114 additions and 62 deletions
@@ -26,7 +26,7 @@ public abstract class AnimatedScreen extends Screen {
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
stack.translate((float) -translation, 0, stack);
parent.render(context, (int) (mouseX + translation), mouseY, delta);
parent.render(context, -67, -67, delta);
stack.translate(this.width, 0, stack);
mouseX -= (int) translation;
}
@@ -2,28 +2,26 @@ package de.shiewk.widgets.client.screen;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.WidgetManager;
import de.shiewk.widgets.client.screen.components.ScaledTextWidget;
import de.shiewk.widgets.client.screen.components.WidgetListWidget;
import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.AxisGridWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.GridWidget;
import net.minecraft.client.gui.widget.SimplePositioningWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.text.Text;
import net.minecraft.util.Util;
import org.joml.Matrix3x2fStack;
import java.util.ArrayList;
import java.util.Objects;
import java.util.function.Consumer;
public class WidgetConfigScreen extends Screen {
private final Screen parent;
private final long creationTime = Util.getMeasuringTimeNano();
private String search = "";
private WidgetListWidget widgetList = null;
private final ArrayList<ModWidget> widgetsEdited = new ArrayList<>();
private final Consumer<ModWidget> onWidgetEdit = this::changedSettings;
@@ -46,38 +44,42 @@ public class WidgetConfigScreen extends Screen {
client.setScreen(parent);
}
int widgetListWidth;
@Override
protected void init() {
super.init();
AxisGridWidget agw = new AxisGridWidget(3, height - 22, width - 6, 20, AxisGridWidget.DisplayAxis.HORIZONTAL);
final TextFieldWidget searchField = new TextFieldWidget(textRenderer, this.width - 160, 20, Text.empty());
int widgetColumns = WidgetListWidget.getColumns(width / 2);
widgetListWidth = widgetColumns * WidgetListWidget.COLUMN_SIZE;
// Right side
final WidgetListWidget widgetList = new WidgetListWidget(width - widgetListWidth - 4, 0, widgetListWidth, height - 24, client, textRenderer, onWidgetEdit);
final TextFieldWidget searchField = new TextFieldWidget(textRenderer, widgetListWidth, 20, Text.empty());
searchField.setPlaceholder(Text.translatable("widgets.ui.search"));
searchField.setChangedListener(this::search);
if (this.widgetList != null){
searchField.setText(this.getSearchQuery());
}
agw.add(searchField);
agw.add(new ButtonWidget.Builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build());
searchField.setChangedListener(widgetList::search);
searchField.setX(width - widgetListWidth - 4);
searchField.setY(height - 24);
agw.refreshPositions();
agw.forEachChild(this::addDrawableChild);
this.addDrawableChild(widgetList);
this.addDrawableChild(searchField);
if (Objects.equals(search, "")){
search("");
}
}
// Left side
GridWidget gw = new GridWidget(0, 0);
gw.getMainPositioner().margin(4, 4, 4, 4);
GridWidget.Adder adder = gw.createAdder(1);
{
ScaledTextWidget title = new ScaledTextWidget(0, 0, Text.literal("ᴡɪᴅɢᴇᴛѕ"), textRenderer, width < 600 ? 4 : 6);
adder.add(title);
private String getSearchQuery() {
return search;
ButtonWidget editPosButton = ButtonWidget.builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build();
adder.add(editPosButton);
}
public void setSearchQuery(String search) {
this.search = search;
}
private void search(String query) {
this.setSearchQuery(query);
widgetList = new WidgetListWidget(0, 0, width-4, height-24, Text.translatable("widgets.ui.config"), client, WidgetManager.getAllWidgets().stream().filter(this::searchQueryMatches).toList(), textRenderer, this.onWidgetEdit);
gw.refreshPositions();
SimplePositioningWidget.setPos(gw, 0, 0, width - widgetListWidth, height, .5f, .5f);
gw.forEachChild(c -> c.setX((width - widgetListWidth) / 2 - (c.getWidth() / 2)));
gw.forEachChild(this::addDrawableChild);
}
private void switchToEditPositions(ButtonWidget widget) {
@@ -86,20 +88,6 @@ public class WidgetConfigScreen extends Screen {
client.setScreen(new EditWidgetPositionsScreen(this, this.onWidgetEdit));
}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
if (super.mouseClicked(click, doubled)){
return true;
} else return widgetList.mouseClicked(click, doubled);
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) {
if (super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount)){
return true;
} else return widgetList.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount);
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
assert client != null;
@@ -111,18 +99,12 @@ public class WidgetConfigScreen extends Screen {
stack.scale(v, v, stack);
}
super.render(context, mouseX, mouseY, delta);
if (widgetList != null){
widgetList.render(context, mouseX, mouseY, delta);
}
if (time < 400){
context.getMatrices().popMatrix();
}
}
private boolean searchQueryMatches(ModWidget widget) {
return widget.getName().getString().contains(search) || widget.getDescription().getString().contains(search) || widget.getId().toString().contains(search);
}
public void changedSettings(ModWidget widget) {
if (!widgetsEdited.contains(widget)){
widgetsEdited.add(widget);
@@ -0,0 +1,42 @@
package de.shiewk.widgets.client.screen.components;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.text.Text;
import org.joml.Matrix3x2fStack;
public class ScaledTextWidget extends ClickableWidget {
private final TextRenderer textRenderer;
private final float scale;
public ScaledTextWidget(int x, int y, Text message, TextRenderer textRenderer, float scale) {
super(x, y, 0, (int) (textRenderer.fontHeight * scale), message);
this.textRenderer = textRenderer;
this.scale = scale;
}
@Override
public int getWidth() {
return (int) (textRenderer.getWidth(getMessage()) * scale);
}
@Override
protected void renderWidget(DrawContext context, int mouseX, int mouseY, float deltaTicks) {
Matrix3x2fStack stack = context.getMatrices().pushMatrix();
stack.scale(scale);
context.drawText(textRenderer, getMessage(), (int) (getX() / scale), (int) (getY() / scale), 0xffffffff, true);
stack.popMatrix();
}
@Override
protected void appendClickableNarrations(NarrationMessageBuilder builder) {}
@Override
public boolean mouseClicked(Click click, boolean doubled) {
return false;
}
}
@@ -1,6 +1,7 @@
package de.shiewk.widgets.client.screen.components;
import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.WidgetManager;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click;
@@ -22,31 +23,44 @@ import java.util.function.Consumer;
public class WidgetListWidget extends ScrollableWidget {
public static final int COLUMN_SIZE = 208;
private final MinecraftClient client;
private final List<ModWidget> widgets;
private List<ModWidget> widgets;
private final List<WidgetWidget> elements = new ArrayList<>();
private final TextRenderer textRenderer;
private final Consumer<ModWidget> onEdit;
public static boolean searchQueryMatches(String search, ModWidget widget) {
return widget.getName().getString().contains(search) || widget.getDescription().getString().contains(search) || widget.getId().toString().contains(search);
}
public WidgetListWidget(int x, int y, int width, int height, Text message, MinecraftClient client, List<ModWidget> widgets, TextRenderer textRenderer, Consumer<ModWidget> onEdit) {
super(x, y, width, height, message);
public WidgetListWidget(int x, int y, int width, int height, MinecraftClient client, TextRenderer textRenderer, Consumer<ModWidget> onEdit) {
super(x, y, width, height, Text.empty());
this.client = client;
this.widgets = widgets;
this.widgets = loadWidgets(null);
this.textRenderer = textRenderer;
this.onEdit = onEdit;
init();
}
private List<ModWidget> loadWidgets(String search) {
if (search == null) {
return WidgetManager.getAllWidgets();
} else {
return WidgetManager.getAllWidgets().stream().filter(w -> searchQueryMatches(search, w)).toList();
}
}
private void init(){
GridWidget gw = new GridWidget();
gw.getMainPositioner().margin(4, 4, 4, 4);
final GridWidget.Adder adder = gw.createAdder(this.width / 208);
final GridWidget.Adder adder = gw.createAdder(getColumns());
for (ModWidget widget : widgets) {
adder.add(new WidgetWidget(0, 0, 200, 100, client, widget, textRenderer, onEdit));
}
SimplePositioningWidget.setPos(gw, getX(), getY(), this.getWidth(), this.getContentsHeightWithPadding(), 0, 0);
gw.refreshPositions();
SimplePositioningWidget.setPos(gw, 0, 0, this.width, this.getContentsHeightWithPadding(), 0.5F, 0.5F);
this.elements.clear();
gw.forEachChild(w -> this.addWidget((WidgetWidget) w));
}
@@ -56,11 +70,19 @@ public class WidgetListWidget extends ScrollableWidget {
@Override
protected int getContentsHeightWithPadding() {
final int rowSize = this.width / 208;
final int rows = widgets.size() % rowSize == 0 ? widgets.size() / rowSize : widgets.size() / rowSize + 1;
final int columns = getColumns();
final int rows = widgets.size() / columns;
return 10 + (rows * 108);
}
public int getColumns() {
return getColumns(this.width);
}
public static int getColumns(int width){
return Math.max(1, width / COLUMN_SIZE);
}
@Override
protected double getDeltaYPerScroll() {
return 35;
@@ -99,4 +121,10 @@ public class WidgetListWidget extends ScrollableWidget {
builder.put(NarrationPart.HINT, widget.getName());
}
}
public void search(String query) {
widgets = this.loadWidgets(query);
setScrollY(0);
init();
}
}