diff options
author | isXander <xander@isxander.dev> | 2024-04-12 14:41:54 +0100 |
---|---|---|
committer | isXander <xander@isxander.dev> | 2024-04-12 14:41:54 +0100 |
commit | 34b62af39b4c9a64e5c04ab8fdf5a978c1cde310 (patch) | |
tree | 849cb2322b287876bae47d93a72a4615bee0d2ef | |
parent | 3f607dbea3c4c7a0ef30dd4709f6d5469d869c19 (diff) | |
download | YetAnotherConfigLib-34b62af39b4c9a64e5c04ab8fdf5a978c1cde310.tar.gz YetAnotherConfigLib-34b62af39b4c9a64e5c04ab8fdf5a978c1cde310.tar.bz2 YetAnotherConfigLib-34b62af39b4c9a64e5c04ab8fdf5a978c1cde310.zip |
Custom tab api
-rw-r--r-- | build.gradle.kts | 8 | ||||
-rw-r--r-- | src/main/java/dev/isxander/yacl3/api/CustomTabProvider.java | 16 | ||||
-rw-r--r-- | src/main/java/dev/isxander/yacl3/gui/YACLScreen.java | 55 |
3 files changed, 51 insertions, 28 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index 14b6130..98ce2a7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,15 +54,15 @@ val testmod by sourceSets.creating { loom { accessWidenerPath.set(rootProject.file("src/main/resources/yacl.accesswidener")) + runConfigs.all { + ideConfigGenerated(false) + runDir("../../run") + } runs { create("testmodClient") { client() name = "Testmod Client" source(testmod) - } - } - if (stonecutter.current.isActive) { - runConfigs.all { ideConfigGenerated(true) runDir("../../run") } diff --git a/src/main/java/dev/isxander/yacl3/api/CustomTabProvider.java b/src/main/java/dev/isxander/yacl3/api/CustomTabProvider.java new file mode 100644 index 0000000..c890c70 --- /dev/null +++ b/src/main/java/dev/isxander/yacl3/api/CustomTabProvider.java @@ -0,0 +1,16 @@ +package dev.isxander.yacl3.api; + +import dev.isxander.yacl3.gui.YACLScreen; +import net.minecraft.client.gui.components.tabs.Tab; +import net.minecraft.client.gui.navigation.ScreenRectangle; + +/** + * Allows categories to provide custom tab windows that replaces the + * regular YACL options screen. The tabs at the top will remain visible, + * but you can now provide custom tab content for richer configurations. + * <p> + * Part of the GUI API: could change with minecraft updates and is not stable + */ +public interface CustomTabProvider { + Tab createTab(YACLScreen screen, ScreenRectangle tabArea); +} diff --git a/src/main/java/dev/isxander/yacl3/gui/YACLScreen.java b/src/main/java/dev/isxander/yacl3/gui/YACLScreen.java index 1d3be9f..2eeb7d5 100644 --- a/src/main/java/dev/isxander/yacl3/gui/YACLScreen.java +++ b/src/main/java/dev/isxander/yacl3/gui/YACLScreen.java @@ -79,9 +79,12 @@ public class YACLScreen extends Screen { tabNavigationBar = new ScrollableNavigationBar(this.width, tabManager, config.categories() .stream() .map(category -> { + if (category instanceof CustomTabProvider tabProvider) { + return tabProvider.createTab(this, tabArea); + } if (category instanceof PlaceholderCategory placeholder) - return new PlaceholderTab(placeholder); - return new CategoryTab(category); + return new PlaceholderTab(placeholder, this); + return new CategoryTab(this, category, tabArea); }).toList()); tabNavigationBar.selectTab(currentTab, false); tabNavigationBar.arrangeElements(); @@ -135,7 +138,7 @@ public class YACLScreen extends Screen { } } - protected void finishOrSave() { + public void finishOrSave() { saveButtonMessage = null; if (pendingChanges()) { @@ -164,7 +167,7 @@ public class YACLScreen extends Screen { } else onClose(); } - protected void cancelOrReset() { + public void cancelOrReset() { if (pendingChanges()) { // if pending changes, button acts as a cancel button OptionUtils.forEachOptions(config, Option::forgetPendingValue); onClose(); @@ -173,7 +176,7 @@ public class YACLScreen extends Screen { } } - protected void undo() { + public void undo() { OptionUtils.forEachOptions(config, Option::forgetPendingValue); } @@ -200,13 +203,13 @@ public class YACLScreen extends Screen { } } - private void setSaveButtonMessage(Component message, Component tooltip) { + public void setSaveButtonMessage(Component message, Component tooltip) { saveButtonMessage = message; saveButtonTooltipMessage = Tooltip.create(tooltip); saveButtonMessageTime = 0; } - private boolean pendingChanges() { + public boolean pendingChanges() { return pendingChanges; } @@ -282,11 +285,12 @@ public class YACLScreen extends Screen { } } - public class CategoryTab implements TabExt { + public static class CategoryTab implements TabExt { /*? if >1.20.4 {*//* private static final ResourceLocation DARKER_BG = new ResourceLocation("textures/gui/menu_list_background.png"); *//*?}*/ + private final YACLScreen screen; private final ConfigCategory category; private final Tooltip tooltip; @@ -299,39 +303,40 @@ public class YACLScreen extends Screen { private final ScreenRectangle rightPaneDim; - public CategoryTab(ConfigCategory category) { + public CategoryTab(YACLScreen screen, ConfigCategory category, ScreenRectangle tabArea) { + this.screen = screen; this.category = category; this.tooltip = Tooltip.create(category.tooltip()); - int columnWidth = width / 3; + int columnWidth = screen.width / 3; int padding = columnWidth / 20; columnWidth = Math.min(columnWidth, 400); int paddedWidth = columnWidth - padding * 2; - rightPaneDim = new ScreenRectangle(width / 3 * 2, tabArea.top() + 1, width / 3, tabArea.height()); - MutableDimension<Integer> actionDim = Dimension.ofInt(width / 3 * 2 + width / 6, height - padding - 20, paddedWidth, 20); + rightPaneDim = new ScreenRectangle(screen.width / 3 * 2, tabArea.top() + 1, screen.width / 3, tabArea.height()); + MutableDimension<Integer> actionDim = Dimension.ofInt(screen.width / 3 * 2 + screen.width / 6, screen.height - padding - 20, paddedWidth, 20); - saveFinishedButton = Button.builder(Component.literal("Done"), btn -> finishOrSave()) + saveFinishedButton = Button.builder(Component.literal("Done"), btn -> screen.finishOrSave()) .pos(actionDim.x() - actionDim.width() / 2, actionDim.y()) .size(actionDim.width(), actionDim.height()) .build(); actionDim.expand(-actionDim.width() / 2 - 2, 0).move(-actionDim.width() / 2 - 2, -22); - cancelResetButton = Button.builder(Component.literal("Cancel"), btn -> cancelOrReset()) + cancelResetButton = Button.builder(Component.literal("Cancel"), btn -> screen.cancelOrReset()) .pos(actionDim.x() - actionDim.width() / 2, actionDim.y()) .size(actionDim.width(), actionDim.height()) .build(); actionDim.move(actionDim.width() + 4, 0); - undoButton = Button.builder(Component.translatable("yacl.gui.undo"), btn -> undo()) + undoButton = Button.builder(Component.translatable("yacl.gui.undo"), btn -> screen.undo()) .pos(actionDim.x() - actionDim.width() / 2, actionDim.y()) .size(actionDim.width(), actionDim.height()) .tooltip(Tooltip.create(Component.translatable("yacl.gui.undo.tooltip"))) .build(); searchField = new SearchFieldWidget( - YACLScreen.this, - font, - width / 3 * 2 + width / 6 - paddedWidth / 2 + 1, + screen, + screen.font, + screen.width / 3 * 2 + screen.width / 6 - paddedWidth / 2 + 1, undoButton.getY() - 22, paddedWidth - 2, 18, Component.translatable("gui.recipebook.search_hint"), @@ -341,14 +346,14 @@ public class YACLScreen extends Screen { this.optionList = new ListHolderWidget<>( () -> new ScreenRectangle(tabArea.position(), tabArea.width() / 3 * 2, tabArea.height()), - new OptionListWidget(YACLScreen.this, category, minecraft, 0, 0, width / 3 * 2 + 1, height, desc -> { + new OptionListWidget(screen, category, screen.minecraft, 0, 0, screen.width / 3 * 2 + 1, screen.height, desc -> { descriptionWidget.setOptionDescription(desc); }) ); descriptionWidget = new OptionDescriptionWidget( () -> new ScreenRectangle( - width / 3 * 2 + padding, + screen.width / 3 * 2 + padding, tabArea.top() + padding, paddedWidth, searchField.getY() - 1 - tabArea.top() - padding * 2 @@ -415,7 +420,7 @@ public class YACLScreen extends Screen { } public void updateButtons() { - boolean pendingChanges = pendingChanges(); + boolean pendingChanges = screen.pendingChanges(); undoButton.active = pendingChanges; saveFinishedButton.setMessage(pendingChanges ? Component.translatable("yacl.gui.save") : GuiUtils.translatableFallback("yacl.gui.done", CommonComponents.GUI_DONE)); @@ -425,11 +430,13 @@ public class YACLScreen extends Screen { } } - public class PlaceholderTab implements TabExt { + public static class PlaceholderTab implements TabExt { + private final YACLScreen screen; private final PlaceholderCategory category; private final Tooltip tooltip; - public PlaceholderTab(PlaceholderCategory category) { + public PlaceholderTab(PlaceholderCategory category, YACLScreen screen) { + this.screen = screen; this.category = category; this.tooltip = Tooltip.create(category.tooltip()); } @@ -446,7 +453,7 @@ public class YACLScreen extends Screen { @Override public void doLayout(ScreenRectangle screenRectangle) { - minecraft.setScreen(category.screen().apply(minecraft, YACLScreen.this)); + screen.minecraft.setScreen(category.screen().apply(screen.minecraft, screen)); } @Override |