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();
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user