mirror of
https://github.com/Shiewk/Widgets.git
synced 2026-04-28 11:34:17 +02:00
Revised WidgetConfigScreen
This commit is contained in:
@@ -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());
|
||||
searchField.setChangedListener(widgetList::search);
|
||||
searchField.setX(width - widgetListWidth - 4);
|
||||
searchField.setY(height - 24);
|
||||
|
||||
this.addDrawableChild(widgetList);
|
||||
this.addDrawableChild(searchField);
|
||||
|
||||
// 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);
|
||||
|
||||
ButtonWidget editPosButton = ButtonWidget.builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build();
|
||||
adder.add(editPosButton);
|
||||
}
|
||||
agw.add(searchField);
|
||||
agw.add(new ButtonWidget.Builder(Text.translatable("widgets.ui.editPositions"), this::switchToEditPositions).build());
|
||||
|
||||
agw.refreshPositions();
|
||||
agw.forEachChild(this::addDrawableChild);
|
||||
|
||||
if (Objects.equals(search, "")){
|
||||
search("");
|
||||
}
|
||||
}
|
||||
|
||||
private String getSearchQuery() {
|
||||
return search;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user