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(); Matrix3x2fStack stack = context.getMatrices().pushMatrix();
stack.translate((float) -translation, 0, stack); 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); stack.translate(this.width, 0, stack);
mouseX -= (int) translation; mouseX -= (int) translation;
} }
@@ -2,28 +2,26 @@ package de.shiewk.widgets.client.screen;
import de.shiewk.widgets.ModWidget; import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.WidgetManager; 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.client.screen.components.WidgetListWidget;
import de.shiewk.widgets.utils.WidgetUtils; import de.shiewk.widgets.utils.WidgetUtils;
import net.minecraft.client.gui.Click;
import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen; 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.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.client.gui.widget.TextFieldWidget;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import org.joml.Matrix3x2fStack; import org.joml.Matrix3x2fStack;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
public class WidgetConfigScreen extends Screen { public class WidgetConfigScreen extends Screen {
private final Screen parent; private final Screen parent;
private final long creationTime = Util.getMeasuringTimeNano(); private final long creationTime = Util.getMeasuringTimeNano();
private String search = "";
private WidgetListWidget widgetList = null;
private final ArrayList<ModWidget> widgetsEdited = new ArrayList<>(); private final ArrayList<ModWidget> widgetsEdited = new ArrayList<>();
private final Consumer<ModWidget> onWidgetEdit = this::changedSettings; private final Consumer<ModWidget> onWidgetEdit = this::changedSettings;
@@ -46,38 +44,42 @@ public class WidgetConfigScreen extends Screen {
client.setScreen(parent); client.setScreen(parent);
} }
int widgetListWidth;
@Override @Override
protected void init() { protected void init() {
super.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.setPlaceholder(Text.translatable("widgets.ui.search"));
searchField.setChangedListener(this::search); searchField.setChangedListener(widgetList::search);
if (this.widgetList != null){ searchField.setX(width - widgetListWidth - 4);
searchField.setText(this.getSearchQuery()); searchField.setY(height - 24);
}
agw.add(searchField);
agw.add(new ButtonWidget.Builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build());
agw.refreshPositions(); this.addDrawableChild(widgetList);
agw.forEachChild(this::addDrawableChild); this.addDrawableChild(searchField);
if (Objects.equals(search, "")){ // Left side
search(""); 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() { ButtonWidget editPosButton = ButtonWidget.builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build();
return search; adder.add(editPosButton);
} }
gw.refreshPositions();
public void setSearchQuery(String search) { SimplePositioningWidget.setPos(gw, 0, 0, width - widgetListWidth, height, .5f, .5f);
this.search = search; gw.forEachChild(c -> c.setX((width - widgetListWidth) / 2 - (c.getWidth() / 2)));
} gw.forEachChild(this::addDrawableChild);
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);
} }
private void switchToEditPositions(ButtonWidget widget) { private void switchToEditPositions(ButtonWidget widget) {
@@ -86,20 +88,6 @@ public class WidgetConfigScreen extends Screen {
client.setScreen(new EditWidgetPositionsScreen(this, this.onWidgetEdit)); 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 @Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) { public void render(DrawContext context, int mouseX, int mouseY, float delta) {
assert client != null; assert client != null;
@@ -111,18 +99,12 @@ public class WidgetConfigScreen extends Screen {
stack.scale(v, v, stack); stack.scale(v, v, stack);
} }
super.render(context, mouseX, mouseY, delta); super.render(context, mouseX, mouseY, delta);
if (widgetList != null){
widgetList.render(context, mouseX, mouseY, delta);
}
if (time < 400){ if (time < 400){
context.getMatrices().popMatrix(); 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) { public void changedSettings(ModWidget widget) {
if (!widgetsEdited.contains(widget)){ if (!widgetsEdited.contains(widget)){
widgetsEdited.add(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; package de.shiewk.widgets.client.screen.components;
import de.shiewk.widgets.ModWidget; import de.shiewk.widgets.ModWidget;
import de.shiewk.widgets.client.WidgetManager;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.Click; import net.minecraft.client.gui.Click;
@@ -22,31 +23,44 @@ import java.util.function.Consumer;
public class WidgetListWidget extends ScrollableWidget { public class WidgetListWidget extends ScrollableWidget {
public static final int COLUMN_SIZE = 208;
private final MinecraftClient client; private final MinecraftClient client;
private final List<ModWidget> widgets; private List<ModWidget> widgets;
private final List<WidgetWidget> elements = new ArrayList<>(); private final List<WidgetWidget> elements = new ArrayList<>();
private final TextRenderer textRenderer; private final TextRenderer textRenderer;
private final Consumer<ModWidget> onEdit; 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) { public WidgetListWidget(int x, int y, int width, int height, MinecraftClient client, TextRenderer textRenderer, Consumer<ModWidget> onEdit) {
super(x, y, width, height, message); super(x, y, width, height, Text.empty());
this.client = client; this.client = client;
this.widgets = widgets; this.widgets = loadWidgets(null);
this.textRenderer = textRenderer; this.textRenderer = textRenderer;
this.onEdit = onEdit; this.onEdit = onEdit;
init(); 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(){ private void init(){
GridWidget gw = new GridWidget(); GridWidget gw = new GridWidget();
gw.getMainPositioner().margin(4, 4, 4, 4); 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) { for (ModWidget widget : widgets) {
adder.add(new WidgetWidget(0, 0, 200, 100, client, widget, textRenderer, onEdit)); 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(); 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)); gw.forEachChild(w -> this.addWidget((WidgetWidget) w));
} }
@@ -56,11 +70,19 @@ public class WidgetListWidget extends ScrollableWidget {
@Override @Override
protected int getContentsHeightWithPadding() { protected int getContentsHeightWithPadding() {
final int rowSize = this.width / 208; final int columns = getColumns();
final int rows = widgets.size() % rowSize == 0 ? widgets.size() / rowSize : widgets.size() / rowSize + 1; final int rows = widgets.size() / columns;
return 10 + (rows * 108); 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 @Override
protected double getDeltaYPerScroll() { protected double getDeltaYPerScroll() {
return 35; return 35;
@@ -99,4 +121,10 @@ public class WidgetListWidget extends ScrollableWidget {
builder.put(NarrationPart.HINT, widget.getName()); builder.put(NarrationPart.HINT, widget.getName());
} }
} }
public void search(String query) {
widgets = this.loadWidgets(query);
setScrollY(0);
init();
}
} }