aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/dev/isxander/yacl/gui')
-rw-r--r--src/main/java/dev/isxander/yacl/gui/CategoryWidget.java5
-rw-r--r--src/main/java/dev/isxander/yacl/gui/OptionListWidget.java62
-rw-r--r--src/main/java/dev/isxander/yacl/gui/RequireRestartScreen.java2
-rw-r--r--src/main/java/dev/isxander/yacl/gui/SearchFieldWidget.java7
-rw-r--r--src/main/java/dev/isxander/yacl/gui/YACLScreen.java35
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()) {