diff options
Diffstat (limited to 'src/main/java/dev/isxander/yacl/gui')
5 files changed, 73 insertions, 38 deletions
diff --git a/src/main/java/dev/isxander/yacl/gui/CategoryWidget.java b/src/main/java/dev/isxander/yacl/gui/CategoryWidget.java index 65daef3..31dacb9 100644 --- a/src/main/java/dev/isxander/yacl/gui/CategoryWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/CategoryWidget.java @@ -7,7 +7,10 @@ public class CategoryWidget extends TooltipButtonWidget { private final int categoryIndex; public CategoryWidget(YACLScreen screen, ConfigCategory category, int categoryIndex, int x, int y, int width, int height) { - super(screen, x, y, width, height, category.name(), category.tooltip(), btn -> screen.changeCategory(screen.categoryButtons.indexOf(btn))); + super(screen, x, y, width, height, category.name(), category.tooltip(), btn -> { + screen.searchFieldWidget.setText(""); + screen.changeCategory(screen.categoryButtons.indexOf(btn)); + }); this.categoryIndex = categoryIndex; } diff --git a/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java b/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java index ca6fc5d..5b80e51 100644 --- a/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/OptionListWidget.java @@ -30,34 +30,51 @@ import java.util.function.Supplier; public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> { private final YACLScreen yaclScreen; - public OptionListWidget(ConfigCategory category, YACLScreen screen, MinecraftClient client, int width, int height) { + public OptionListWidget(YACLScreen screen, MinecraftClient client, int width, int height) { super(client, width / 3 * 2, height, 0, height, 22); this.yaclScreen = screen; left = width - this.width; right = width; - for (OptionGroup group : category.groups()) { - Supplier<Boolean> viewableSupplier; - GroupSeparatorEntry groupSeparatorEntry = null; - if (!group.isRoot()) { - groupSeparatorEntry = new GroupSeparatorEntry(group, screen); - viewableSupplier = groupSeparatorEntry::isExpanded; - addEntry(groupSeparatorEntry); - } else { - viewableSupplier = () -> true; - } + refreshOptions(); + } - List<OptionEntry> optionEntries = new ArrayList<>(); - for (Option<?> option : group.options()) { - OptionEntry entry = new OptionEntry(option.controller().provideWidget(screen, Dimension.ofInt(getRowLeft(), 0, getRowWidth(), 20)), viewableSupplier); - addEntry(entry); - optionEntries.add(entry); - } + public void refreshOptions() { + super.children().clear(); + + List<ConfigCategory> categories = new ArrayList<>(); + if (yaclScreen.currentCategoryIdx == -1) { + categories.addAll(yaclScreen.config.categories()); + } else { + categories.add(yaclScreen.config.categories().get(yaclScreen.currentCategoryIdx)); + } + + for (ConfigCategory category : categories) { + for (OptionGroup group : category.groups()) { + Supplier<Boolean> viewableSupplier; + GroupSeparatorEntry groupSeparatorEntry = null; + if (!group.isRoot()) { + groupSeparatorEntry = new GroupSeparatorEntry(group, yaclScreen); + viewableSupplier = groupSeparatorEntry::isExpanded; + addEntry(groupSeparatorEntry); + } else { + viewableSupplier = () -> true; + } - if (groupSeparatorEntry != null) { - groupSeparatorEntry.setOptionEntries(optionEntries); + List<OptionEntry> optionEntries = new ArrayList<>(); + for (Option<?> option : group.options()) { + OptionEntry entry = new OptionEntry(option.controller().provideWidget(yaclScreen, Dimension.ofInt(getRowLeft(), 0, getRowWidth(), 20)), viewableSupplier); + addEntry(entry); + optionEntries.add(entry); + } + + if (groupSeparatorEntry != null) { + groupSeparatorEntry.setOptionEntries(optionEntries); + } } } + + setScrollAmount(0); } /* @@ -126,6 +143,11 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> /* END cloth config code */ @Override + public int getRowWidth() { + return Math.min(396, (int)(width / 1.3f)); + } + + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { for (Entry child : children()) { if (child != getEntryAtPosition(mouseX, mouseY) && child instanceof OptionEntry optionEntry) @@ -168,7 +190,7 @@ public class OptionListWidget extends ElementListWidget<OptionListWidget.Entry> @Override protected int getScrollbarPositionX() { - return left + super.getScrollbarPositionX(); + return left + width - (int)(width * 0.05f); } @Override diff --git a/src/main/java/dev/isxander/yacl/gui/RequireRestartScreen.java b/src/main/java/dev/isxander/yacl/gui/RequireRestartScreen.java index 807292e..3c46738 100644 --- a/src/main/java/dev/isxander/yacl/gui/RequireRestartScreen.java +++ b/src/main/java/dev/isxander/yacl/gui/RequireRestartScreen.java @@ -7,7 +7,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; public class RequireRestartScreen extends ConfirmScreen { - protected RequireRestartScreen(Screen parent) { + public RequireRestartScreen(Screen parent) { super(option -> { if (option) MinecraftClient.getInstance().scheduleStop(); else MinecraftClient.getInstance().setScreen(parent); diff --git a/src/main/java/dev/isxander/yacl/gui/SearchFieldWidget.java b/src/main/java/dev/isxander/yacl/gui/SearchFieldWidget.java index fedebdb..68f050f 100644 --- a/src/main/java/dev/isxander/yacl/gui/SearchFieldWidget.java +++ b/src/main/java/dev/isxander/yacl/gui/SearchFieldWidget.java @@ -37,6 +37,13 @@ public class SearchFieldWidget extends TextFieldWidget { super.write(text); } + @Override + public void eraseCharacters(int characterOffset) { + yaclScreen.optionList.setScrollAmount(0); + + super.eraseCharacters(characterOffset); + } + public Text getEmptyText() { return emptyText; } diff --git a/src/main/java/dev/isxander/yacl/gui/YACLScreen.java b/src/main/java/dev/isxander/yacl/gui/YACLScreen.java index adb6007..9b73d8d 100644 --- a/src/main/java/dev/isxander/yacl/gui/YACLScreen.java +++ b/src/main/java/dev/isxander/yacl/gui/YACLScreen.java @@ -2,6 +2,7 @@ package dev.isxander.yacl.gui; import dev.isxander.yacl.api.ConfigCategory; import dev.isxander.yacl.api.Option; +import dev.isxander.yacl.api.OptionFlag; import dev.isxander.yacl.api.YetAnotherConfigLib; import dev.isxander.yacl.api.utils.Dimension; import dev.isxander.yacl.api.utils.OptionUtils; @@ -13,7 +14,9 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; public class YACLScreen extends Screen { @@ -65,18 +68,16 @@ public class YACLScreen extends Screen { categoryDim.move(0, 21); } - searchFieldWidget = new SearchFieldWidget(this, textRenderer, width / 3 / 2 - paddedWidth / 2 + 1, height - 71, paddedWidth - 2, 18, Text.translatable("yacl.gui.search"), Text.translatable("yacl.gui.search")); - Dimension<Integer> actionDim = Dimension.ofInt(width / 3 / 2, height - padding - 20, paddedWidth, 20); finishedSaveButton = new TooltipButtonWidget(this, actionDim.x() - actionDim.width() / 2, actionDim.y(), actionDim.width(), actionDim.height(), Text.empty(), Text.empty(), (btn) -> { saveButtonMessage = null; if (pendingChanges()) { - AtomicBoolean requiresRestart = new AtomicBoolean(false); + Set<OptionFlag> flags = new HashSet<>(); OptionUtils.forEachOptions(config, option -> { - if (option.requiresRestart() && option.changed()) - requiresRestart.set(true); - option.applyValue(); + if (option.applyValue()) { + flags.addAll(option.flags()); + } }); OptionUtils.forEachOptions(config, option -> { if (option.changed()) { @@ -85,9 +86,8 @@ public class YACLScreen extends Screen { } }); config.saveFunction().run(); - if (requiresRestart.get()) { - client.setScreen(new RequireRestartScreen(this)); - } + + flags.forEach(flag -> flag.accept(client)); } else close(); }); actionDim.expand(-actionDim.width() / 2 - 2, 0).move(-actionDim.width() / 2 - 2, -22); @@ -105,14 +105,15 @@ public class YACLScreen extends Screen { OptionUtils.forEachOptions(config, Option::forgetPendingValue); }); + searchFieldWidget = new SearchFieldWidget(this, textRenderer, width / 3 / 2 - paddedWidth / 2 + 1, undoButton.y - 22, paddedWidth - 2, 18, Text.translatable("yacl.gui.search"), Text.translatable("yacl.gui.search")); + updateActionAvailability(); addDrawableChild(searchFieldWidget); addDrawableChild(cancelResetButton); addDrawableChild(undoButton); addDrawableChild(finishedSaveButton); - ConfigCategory currentCategory = config.categories().get(currentCategoryIdx); - optionList = new OptionListWidget(currentCategory, this, client, width, height); + optionList = new OptionListWidget(this, client, width, height); addSelectableChild(optionList); config.initConsumer().accept(this); @@ -154,7 +155,7 @@ public class YACLScreen extends Screen { public void changeCategory(int idx) { currentCategoryIdx = idx; - refreshGUI(); + optionList.refreshOptions(); } private void updateActionAvailability() { @@ -170,6 +171,12 @@ public class YACLScreen extends Screen { @Override public void tick() { searchFieldWidget.tick(); + if (!searchFieldWidget.getText().isEmpty() && currentCategoryIdx != -1) { + changeCategory(-1); + } + if (searchFieldWidget.getText().isEmpty() && currentCategoryIdx == -1) { + changeCategory(0); + } updateActionAvailability(); @@ -207,10 +214,6 @@ public class YACLScreen extends Screen { return pendingChanges.get(); } - private void refreshGUI() { - init(client, width, height); - } - @Override public boolean shouldCloseOnEsc() { if (pendingChanges()) { |