From e82ab958bc7d13e556d7426b7a1862ec76e23eba Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 22 May 2021 04:10:24 +0800 Subject: Initial port to 21w20a --- build.gradle | 5 +- .../rei/plugin/client/DefaultClientPlugin.java | 15 ----- .../resources/roughlyenoughitems.accessWidener | 6 +- gradle.properties | 10 +-- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 8 +-- .../shedaniel/rei/impl/client/REIHelperImpl.java | 2 +- .../rei/impl/client/config/ConfigManagerImpl.java | 18 +----- .../config/entries/FilteringAddRuleScreen.java | 8 ++- .../impl/client/config/entries/FilteringEntry.java | 8 ++- .../config/entries/FilteringRuleOptionsScreen.java | 23 ++++++- .../config/entries/FilteringRulesScreen.java | 13 +++- .../client/config/entries/NoFilteringEntry.java | 8 ++- .../config/entries/RecipeScreenTypeEntry.java | 24 ++++--- .../client/config/entries/ReloadPluginsEntry.java | 9 ++- .../SearchFilterSyntaxHighlightingEntry.java | 16 +++-- .../client/gui/credits/CreditsEntryListWidget.java | 7 +- .../rei/impl/client/gui/credits/CreditsScreen.java | 5 +- .../gui/screen/AbstractDisplayViewingScreen.java | 4 ++ .../gui/screen/CompositeDisplayViewingScreen.java | 6 +- .../gui/screen/DefaultDisplayViewingScreen.java | 10 +-- .../rei/impl/client/gui/screen/DelegateScreen.java | 20 ++++-- .../gui/screen/UncertainDisplayViewingScreen.java | 10 ++- .../client/gui/screen/WarningAndErrorScreen.java | 51 ++++++++++++++- .../widget/DynamicErrorFreeEntryListWidget.java | 75 ++++++++++++++++++++-- .../gui/widget/basewidgets/TextFieldWidget.java | 2 +- 25 files changed, 267 insertions(+), 96 deletions(-) diff --git a/build.gradle b/build.gradle index d8e0fb21f..a41934159 100755 --- a/build.gradle +++ b/build.gradle @@ -60,10 +60,7 @@ allprojects { tasks.withType(JavaCompile) { options.encoding = "UTF-8" - def targetVersion = 8 - if (JavaVersion.current().isJava9Compatible()) { - options.release = targetVersion - } + options.release = 16 } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java index 325995f52..05f670dcf 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -44,7 +44,6 @@ import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; @@ -258,9 +257,6 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin DummyAxeItem.getStrippedBlocksMap().entrySet().stream().sorted(Comparator.comparing(b -> Registry.BLOCK.getKey(b.getKey()))).forEach(set -> { registry.add(new DefaultStrippingDisplay(EntryStacks.of(set.getKey()), EntryStacks.of(set.getValue()))); }); - DummyHoeItem.getTilledBlocksMap().entrySet().stream().sorted(Comparator.comparing(b -> Registry.BLOCK.getKey(b.getKey()))).forEach(set -> { - registry.add(new DefaultTillingDisplay(EntryStacks.of(set.getKey()), EntryStacks.of(set.getValue().getBlock()))); - }); DummyShovelItem.getPathBlocksMap().entrySet().stream().sorted(Comparator.comparing(b -> Registry.BLOCK.getKey(b.getKey()))).forEach(set -> { registry.add(new DefaultPathingDisplay(EntryStacks.of(set.getKey()), EntryStacks.of(set.getValue().getBlock()))); }); @@ -380,15 +376,4 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin return STRIPPABLES; } } - - public static class DummyHoeItem extends HoeItem { - public DummyHoeItem(Tier tier, int i, float f, Properties properties) { - super(tier, i, f, properties); - } - - public static Map getTilledBlocksMap() { - return TILLABLES; - } - } - } diff --git a/fabric/src/main/resources/roughlyenoughitems.accessWidener b/fabric/src/main/resources/roughlyenoughitems.accessWidener index 555e7bc91..74966e6f4 100644 --- a/fabric/src/main/resources/roughlyenoughitems.accessWidener +++ b/fabric/src/main/resources/roughlyenoughitems.accessWidener @@ -32,4 +32,8 @@ accessible method net/minecraft/client/gui/screens/Screen accessible method net/minecraft/client/gui/screens/Screen insertText (Ljava/lang/String;Z)V accessible method net/minecraft/client/gui/screens/Screen isValidCharacterForName (Ljava/lang/String;CI)Z accessible field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen draggingItem Lnet/minecraft/world/item/ItemStack; -mutable field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen draggingItem Lnet/minecraft/world/item/ItemStack; \ No newline at end of file +mutable field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen draggingItem Lnet/minecraft/world/item/ItemStack; +extendable method net/minecraft/client/gui/screens/Screen init (Lnet/minecraft/client/Minecraft;II)V +accessible method net/minecraft/client/gui/screens/Screen addRenderableWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener; +accessible method net/minecraft/client/gui/screens/Screen addRenderableOnly (Lnet/minecraft/client/gui/components/Widget;)Lnet/minecraft/client/gui/components/Widget; +accessible method net/minecraft/client/gui/screens/Screen addWidget (Lnet/minecraft/client/gui/components/events/GuiEventListener;)Lnet/minecraft/client/gui/components/events/GuiEventListener; \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 25ff411b4..8b4fa6b01 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,14 @@ org.gradle.jvmargs=-Xmx3G base_version=6.0.0 unstable=true -supported_version=21w19a -minecraft_version=21w19a +supported_version=21w20a +minecraft_version=21w20a forgeEnabled=false forge_version=36.0.43 fabricloader_version=0.11.3 -cloth_config_version=5.0.23 +cloth_config_version=5.0.33 modmenu_version=2.0.0-beta.4 -fabric_api=0.34.4+1.17 -architectury_version=2.0.154 +fabric_api=0.34.5+1.17 +architectury_version=2.0.11 api_exculde= #api_include=me.shedaniel.cloth:cloth-events,me.shedaniel.cloth:config-2,me.sargunvohra.mcmods:autoconfig1u,org.jetbrains:annotations,net.fabricmc.fabric-api:fabric- \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 1edb3c221..dcb8ce91e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -27,7 +27,6 @@ import com.google.common.collect.Lists; import me.shedaniel.architectury.event.events.GuiEvent; import me.shedaniel.architectury.event.events.RecipeUpdateEvent; import me.shedaniel.architectury.event.events.client.ClientScreenInputEvent; -import me.shedaniel.architectury.hooks.ScreenHooks; import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.architectury.platform.Platform; import me.shedaniel.architectury.registry.ReloadListeners; @@ -519,11 +518,12 @@ public class RoughlyEnoughItemsCore { final ResourceLocation recipeButtonTex = new ResourceLocation("textures/gui/recipe_button.png"); MutableLong lastReload = new MutableLong(-1); RecipeUpdateEvent.EVENT.register(recipeManager -> reloadPlugins(lastReload)); - GuiEvent.INIT_POST.register((screen, widgets, children) -> { + GuiEvent.INIT_POST.register((screen, access) -> { REIHelperImpl.getInstance().setPreviousScreen(screen); if (ConfigObject.getInstance().doesDisableRecipeBook() && screen instanceof AbstractContainerScreen) { - ScreenHooks.getButtons(screen).removeIf(widget -> widget instanceof ImageButton && ((ImageButton) widget).resourceLocation.equals(recipeButtonTex)); - children.removeIf(widget -> widget instanceof ImageButton && ((ImageButton) widget).resourceLocation.equals(recipeButtonTex)); + access.getRenderables().removeIf(widget -> widget instanceof ImageButton && ((ImageButton) widget).resourceLocation.equals(recipeButtonTex)); + access.getNarratables().removeIf(widget -> widget instanceof ImageButton && ((ImageButton) widget).resourceLocation.equals(recipeButtonTex)); + screen.children().removeIf(widget -> widget instanceof ImageButton && ((ImageButton) widget).resourceLocation.equals(recipeButtonTex)); } }); ClientScreenInputEvent.MOUSE_CLICKED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java index 5bdb3c710..58c7506b3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java @@ -218,7 +218,7 @@ public class REIHelperImpl implements REIHelper { } public void onInitializeClient() { - GuiEvent.INIT_PRE.register((screen, widgets, children) -> { + GuiEvent.INIT_PRE.register((screen, access) -> { if (previousContainerScreen != screen && screen instanceof AbstractContainerScreen) previousContainerScreen = (AbstractContainerScreen) screen; return InteractionResult.PASS; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index b3ebdeaad..e89995311 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -30,8 +30,7 @@ import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.math.Matrix4f; -import me.shedaniel.architectury.hooks.ScreenHooks; -import me.shedaniel.architectury.platform.Platform; +import me.shedaniel.architectury.hooks.screen.ScreenHooks; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.annotation.ConfigEntry; import me.shedaniel.autoconfig.gui.ConfigScreenProvider; @@ -64,7 +63,6 @@ import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen; import me.shedaniel.rei.impl.client.gui.screen.TransformingScreen; -import me.shedaniel.rei.impl.client.gui.screen.WarningAndErrorScreen; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.FabricLoader; @@ -74,7 +72,6 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.resources.language.I18n; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.nbt.TagParser; @@ -83,7 +80,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; -import net.minecraft.util.Tuple; import net.minecraft.world.InteractionResult; import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; @@ -309,14 +305,6 @@ public class ConfigManagerImpl implements ConfigManager { @Override public Screen getConfigScreen(Screen parent) { try { - if (Platform.isFabric() && !detectWorkingOptifabric()) { - List> warnings = Lists.newArrayList(); - warnings.add(new Tuple<>(I18n.get("text.rei.config.optifine.title"), null)); - warnings.add(new Tuple<>(I18n.get("text.rei.config.optifine.description"), null)); - WarningAndErrorScreen screen = new WarningAndErrorScreen("config screen", warnings, Collections.emptyList(), Minecraft.getInstance()::setScreen); - screen.setParent(parent); - return screen; - } Screen parentTranslated; if (!getConfig().isConfigScreenAnimated()) { parentTranslated = parent; @@ -340,7 +328,7 @@ public class ConfigManagerImpl implements ConfigManager { builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().add(0, new ReloadPluginsEntry(220)); } return builder.setAfterInitConsumer(screen -> { - ScreenHooks.addButton(screen, new Button(screen.width - 104, 4, 100, 20, new TranslatableComponent("text.rei.credits"), button -> { + ScreenHooks.addRenderableWidget(screen, new Button(screen.width - 104, 4, 100, 20, new TranslatableComponent("text.rei.credits"), button -> { MutableLong current = new MutableLong(0); CreditsScreen creditsScreen = new CreditsScreen(screen); if (getConfig().isCreditsScreenAnimated()) { @@ -401,7 +389,7 @@ public class ConfigManagerImpl implements ConfigManager { @Override public void init() { super.init(); - this.addButton(new Button(this.width / 2 - 100, 140, 200, 20, CommonComponents.GUI_CANCEL, button -> this.minecraft.setScreen(parent))); + this.addRenderableWidget(new Button(this.width / 2 - 100, 140, 200, 20, CommonComponents.GUI_CANCEL, button -> this.minecraft.setScreen(parent))); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java index 0b588f9ea..0d09a298a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; @@ -58,7 +59,7 @@ public class FilteringAddRuleScreen extends Screen { super.init(); { Component backText = new TextComponent("↩ ").append(new TranslatableComponent("gui.back")); - addButton(new Button(4, 4, Minecraft.getInstance().font.width(backText) + 10, 20, backText, button -> { + addRenderableWidget(new Button(4, 4, Minecraft.getInstance().font.width(backText) + 10, 20, backText, button -> { minecraft.setScreen(parent); this.parent = null; })); @@ -191,5 +192,10 @@ public class FilteringAddRuleScreen extends Screen { public List children() { return Collections.singletonList(addButton); } + + @Override + public List narratables() { + return Collections.singletonList(addButton); + } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java index 6c484cf07..498054393 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java @@ -36,6 +36,7 @@ import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.TranslatableComponent; import org.jetbrains.annotations.ApiStatus; @@ -57,7 +58,7 @@ public class FilteringEntry extends AbstractConfigListEntry>> filteringRulesScreen.parent = Minecraft.getInstance().screen; Minecraft.getInstance().setScreen(filteringRulesScreen); }); - private final List children = ImmutableList.of(buttonWidget); + private final List children = ImmutableList.of(buttonWidget); public FilteringEntry(int width, List> configFiltered, List> rules, List> defaultValue, Consumer>> saveConsumer, Consumer>> rulesSaveConsumer) { super(NarratorChatListener.NO_TITLE, false); @@ -103,6 +104,11 @@ public class FilteringEntry extends AbstractConfigListEntry>> return children; } + @Override + public List narratables() { + return children; + } + @Override public boolean isEdited() { return super.isEdited() || edited; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java index 6abeef0c2..de973d768 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java @@ -30,6 +30,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; @@ -62,7 +63,7 @@ public abstract class FilteringRuleOptionsScreen> ext { Component doneText = new TranslatableComponent("gui.done"); int width = Minecraft.getInstance().font.width(doneText); - addButton(new Button(this.width - 4 - width - 10, 4, width + 10, 20, doneText, button -> { + addRenderableWidget(new Button(this.width - 4 - width - 10, 4, width + 10, 20, doneText, button -> { save(); minecraft.setScreen(parent); })); @@ -147,6 +148,11 @@ public abstract class FilteringRuleOptionsScreen> ext public List children() { return Collections.emptyList(); } + + @Override + public List narratables() { + return Collections.emptyList(); + } } public static class EmptyRuleEntry extends RuleEntry { @@ -170,6 +176,11 @@ public abstract class FilteringRuleOptionsScreen> ext public List children() { return Collections.emptyList(); } + + @Override + public List narratables() { + return Collections.emptyList(); + } } public static class TextFieldRuleEntry extends RuleEntry { @@ -201,6 +212,11 @@ public abstract class FilteringRuleOptionsScreen> ext public List children() { return Collections.singletonList(widget); } + + @Override + public List narratables() { + return Collections.singletonList(widget); + } } public static class BooleanRuleEntry extends RuleEntry { @@ -236,5 +252,10 @@ public abstract class FilteringRuleOptionsScreen> ext public List children() { return Collections.singletonList(widget); } + + @Override + public List narratables() { + return Collections.singletonList(widget); + } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java index a7722dd1a..ac81c87af 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java @@ -30,7 +30,11 @@ import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.narration.NarratedElementType; +import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.locale.Language; @@ -63,14 +67,14 @@ public class FilteringRulesScreen extends Screen { super.init(); { Component backText = new TextComponent("↩ ").append(new TranslatableComponent("gui.back")); - addButton(new Button(4, 4, Minecraft.getInstance().font.width(backText) + 10, 20, backText, button -> { + addRenderableWidget(new Button(4, 4, Minecraft.getInstance().font.width(backText) + 10, 20, backText, button -> { minecraft.setScreen(parent); this.parent = null; })); } { Component addText = new TextComponent(" + "); - addButton(new Button(width - 4 - 20, 4, 20, 20, addText, button -> { + addRenderableWidget(new Button(width - 4 - 20, 4, 20, 20, addText, button -> { FilteringAddRuleScreen screen = new FilteringAddRuleScreen(entry); screen.parent = this; minecraft.setScreen(screen); @@ -244,5 +248,10 @@ public class FilteringRulesScreen extends Screen { public List children() { return Arrays.asList(configureButton, deleteButton); } + + @Override + public List narratables() { + return Arrays.asList(configureButton, deleteButton); + } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java index 4cf03088e..2db7bebdf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java @@ -33,6 +33,7 @@ import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.TranslatableComponent; import org.jetbrains.annotations.ApiStatus; @@ -47,7 +48,7 @@ public class NoFilteringEntry extends AbstractConfigListEntry private List> defaultValue; private List> configFiltered; private final AbstractWidget buttonWidget = new Button(0, 0, 0, 20, new TranslatableComponent("config.roughlyenoughitems.filteredEntries.loadWorldFirst"), button -> {}); - private final List children = ImmutableList.of(buttonWidget); + private final List children = ImmutableList.of(buttonWidget); public NoFilteringEntry(int width, List> configFiltered, List> defaultValue, Consumer>> saveConsumer) { super(NarratorChatListener.NO_TITLE, false); @@ -87,4 +88,9 @@ public class NoFilteringEntry extends AbstractConfigListEntry public List children() { return children; } + + @Override + public List narratables() { + return children; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java index 2e30e76ff..7950a6f23 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java @@ -33,7 +33,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; @@ -47,22 +49,19 @@ public class RecipeScreenTypeEntry extends TooltipListEntry { private DisplayScreenType type; private DisplayScreenType defaultValue; private Consumer save; - private final AbstractWidget buttonWidget = new AbstractButton(0, 0, 0, 20, NarratorChatListener.NO_TITLE) { - @Override - public void onPress() { - Minecraft.getInstance().setScreen(new UncertainDisplayViewingScreen(getConfigScreen(), type, false, original -> { - Minecraft.getInstance().setScreen(getConfigScreen()); - type = original ? DisplayScreenType.ORIGINAL : DisplayScreenType.COMPOSITE; - })); - } - + private final AbstractWidget buttonWidget = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, button -> { + Minecraft.getInstance().setScreen(new UncertainDisplayViewingScreen(getConfigScreen(), type, false, original -> { + Minecraft.getInstance().setScreen(getConfigScreen()); + type = original ? DisplayScreenType.ORIGINAL : DisplayScreenType.COMPOSITE; + })); + }) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { setMessage(new TranslatableComponent("config.roughlyenoughitems.recipeScreenType.config", type.toString())); super.render(matrices, mouseX, mouseY, delta); } }; - private final List children = ImmutableList.of(buttonWidget); + private final List children = ImmutableList.of(buttonWidget); @SuppressWarnings("deprecation") public RecipeScreenTypeEntry(int width, Component fieldName, DisplayScreenType type, DisplayScreenType defaultValue, Consumer save) { @@ -99,6 +98,11 @@ public class RecipeScreenTypeEntry extends TooltipListEntry { return children; } + @Override + public List narratables() { + return children; + } + @Override public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) { super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, isSelected, delta); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java index cadbe569c..9766b436c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java @@ -32,9 +32,11 @@ import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; +import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Unit; @@ -57,7 +59,7 @@ public class ReloadPluginsEntry extends AbstractConfigListEntry { } } }; - private List children = ImmutableList.of(buttonWidget); + private List children = ImmutableList.of(buttonWidget); public ReloadPluginsEntry(int width) { super(NarratorChatListener.NO_TITLE, false); @@ -95,4 +97,9 @@ public class ReloadPluginsEntry extends AbstractConfigListEntry { public List children() { return children; } + + @Override + public List narratables() { + return children; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java index 8d9afcfd4..ce853a3aa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java @@ -32,7 +32,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -45,19 +47,14 @@ public class SearchFilterSyntaxHighlightingEntry extends TooltipListEntry save; - private final AbstractWidget buttonWidget = new AbstractButton(0, 0, 0, 20, NarratorChatListener.NO_TITLE) { - @Override - public void onPress() { - - } - + private final AbstractWidget buttonWidget = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, $ -> {}) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { setMessage(new TextComponent(type.toString())); super.render(matrices, mouseX, mouseY, delta); } }; - private final List children = ImmutableList.of(buttonWidget); + private final List children = ImmutableList.of(buttonWidget); @SuppressWarnings("deprecation") public SearchFilterSyntaxHighlightingEntry(Component fieldName, SyntaxHighlightingMode type, SyntaxHighlightingMode defaultValue, Consumer save) { @@ -93,6 +90,11 @@ public class SearchFilterSyntaxHighlightingEntry extends TooltipListEntry narratables() { + return children; + } + @Override public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isSelected, float delta) { super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, isSelected, delta); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java index bffbb7287..73e80c2fe 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java @@ -30,6 +30,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -39,6 +40,7 @@ import org.jetbrains.annotations.ApiStatus; import java.net.URI; import java.net.URISyntaxException; +import java.util.Collections; import java.util.List; @ApiStatus.Internal @@ -89,7 +91,10 @@ public class CreditsEntryListWidget extends DynamicNewSmoothScrollingEntryListWi } public static abstract class CreditsItem extends DynamicNewSmoothScrollingEntryListWidget.Entry { - + @Override + public List narratables() { + return Collections.emptyList(); + } } public static class TextCreditsItem extends CreditsItem { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java index a4c0bedcb..39f44a8a9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java @@ -73,7 +73,7 @@ public class CreditsScreen extends Screen { @Override public void init() { - children.add(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32)); + addWidget(entryListWidget = new CreditsEntryListWidget(minecraft, width, height, 32, height - 32)); entryListWidget.creditsClearEntries(); List> translators = Lists.newArrayList(); Exception[] exception = {null}; @@ -118,7 +118,7 @@ public class CreditsScreen extends Screen { entryListWidget.creditsAddEntry(new CreditsEntryListWidget.LinkItem(new ImmutableTextComponent("Visit the project page at CurseForge."), "https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items", entryListWidget.getItemWidth(), false)); entryListWidget.creditsAddEntry(new CreditsEntryListWidget.LinkItem(new ImmutableTextComponent("Support the project via Patreon!"), "https://patreon.com/shedaniel", entryListWidget.getItemWidth(), true)); entryListWidget.creditsAddEntry(new TextCreditsItem(NarratorChatListener.NO_TITLE)); - children.add(buttonDone = new Button(width / 2 - 100, height - 26, 200, 20, new TranslatableComponent("gui.done"), button -> openPrevious())); + addRenderableWidget(buttonDone = new Button(width / 2 - 100, height - 26, 200, 20, new TranslatableComponent("gui.done"), button -> openPrevious())); } private void openPrevious() { @@ -145,7 +145,6 @@ public class CreditsScreen extends Screen { this.entryListWidget.render(matrices, int_1, int_2, float_1); drawCenteredString(matrices, this.font, I18n.get("text.rei.credits"), this.width / 2, 16, 16777215); super.render(matrices, int_1, int_2, float_1); - buttonDone.render(matrices, int_1, int_2, float_1); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index ae5646af4..0d69d3fce 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -70,6 +70,10 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis } } + public List _children() { + return (List) children(); + } + @Override public boolean isPauseScreen() { return false; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java index 557ad9c09..64452d37d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java @@ -110,7 +110,7 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen boolean isCompactTabs = ConfigObject.getInstance().isUsingCompactTabs(); int tabSize = isCompactTabs ? 24 : 28; scrolling.draggingScrollBar = false; - this.children.clear(); + this.children().clear(); this.widgets.clear(); this.buttonList.clear(); this.displayRenderers.clear(); @@ -215,9 +215,9 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen ViewSearchBuilder.builder().addAllCategories().open(); }).tooltipLine(I18n.get("text.rei.view_all_categories")).noShadow().color(0xFF404040, 0xFFBBBBBB).hoveredColor(0xFF0041FF, 0xFFFFBD4D)); - this.children.addAll(buttonList); + this._children().addAll(buttonList); this.widgets.addAll(tabs); - this.children.addAll(widgets); + this._children().addAll(widgets); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java index c2c409cb8..384f5d0c8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java @@ -156,7 +156,7 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen { super.init(); boolean isCompactTabs = ConfigObject.getInstance().isUsingCompactTabs(); int tabSize = isCompactTabs ? 24 : 28; - this.children.clear(); + this.children().clear(); this.recipeBounds.clear(); this.tabs.clear(); this.preWidgets.clear(); @@ -283,10 +283,10 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen { } } } - - children.addAll(tabs); - children.addAll(widgets); - children.addAll(preWidgets); + + _children().addAll(tabs); + _children().addAll(widgets); + _children().addAll(preWidgets); } public List getWidgets() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DelegateScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DelegateScreen.java index e9b44246b..0192f66b8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DelegateScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DelegateScreen.java @@ -27,7 +27,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -56,8 +58,8 @@ public class DelegateScreen extends Screen { } @Override - public String getNarrationMessage() { - return parent == null ? "" : parent.getNarrationMessage(); + public Component getNarrationMessage() { + return parent == null ? ImmutableTextComponent.EMPTY : parent.getNarrationMessage(); } @Override @@ -78,15 +80,23 @@ public class DelegateScreen extends Screen { } @Override - public T addButton(T abstractWidget) { + public T addRenderableWidget(T abstractWidget) { if (parent != null) { - return parent.addButton(abstractWidget); + return parent.addRenderableWidget(abstractWidget); } return abstractWidget; } @Override - public T addWidget(T guiEventListener) { + public T addRenderableOnly(T abstractWidget) { + if (parent != null) { + return parent.addRenderableOnly(abstractWidget); + } + return abstractWidget; + } + + @Override + public T addWidget(T guiEventListener) { if (parent != null) { return parent.addWidget(guiEventListener); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java index 3bc654496..104cea37f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java @@ -129,9 +129,9 @@ public class UncertainDisplayViewingScreen extends Screen { @Override public void init() { - this.children.clear(); + this.children().clear(); this.widgets.clear(); - this.children.add(button = Widgets.createButton(new Rectangle(width / 2 - 100, height - 40, 200, 20), NarratorChatListener.NO_TITLE) + this._children().add(button = Widgets.createButton(new Rectangle(width / 2 - 100, height - 40, 200, 20), NarratorChatListener.NO_TITLE) .onRender((matrices, button) -> { button.setEnabled(isSet); if (scroll.target() != 0 && allModsUsingJEI != null) { @@ -174,7 +174,11 @@ public class UncertainDisplayViewingScreen extends Screen { y = UncertainDisplayViewingScreen.this.height * 2 - 64 - (int) (scroll.floatValue() / 200f * height); } }))); - this.children.addAll(widgets); + this._children().addAll(widgets); + } + + public List _children() { + return (List) children(); } private Widget transformScroll(Widget widget) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java index d463d5b17..69d1bd69f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.screen; +import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.RoughlyEnoughItemsState; import me.shedaniel.rei.impl.client.gui.widget.DynamicErrorFreeEntryListWidget; @@ -33,7 +34,11 @@ import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.narration.NarratedElementType; +import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.controls.ControlList; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; @@ -44,6 +49,7 @@ import org.jetbrains.annotations.ApiStatus; import java.net.URI; import java.net.URISyntaxException; +import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -88,7 +94,7 @@ public class WarningAndErrorScreen extends Screen { @Override public void init() { - children.add(listWidget = new StringEntryListWidget(minecraft, width, height, 32, height - 32)); + addWidget(listWidget = new StringEntryListWidget(minecraft, width, height, 32, height - 32)); listWidget.max = 80; listWidget.creditsClearEntries(); listWidget.creditsAddEntry(new EmptyItem()); @@ -118,7 +124,7 @@ public class WarningAndErrorScreen extends Screen { for (StringItem child : listWidget.children()) { listWidget.max = Math.max(listWidget.max, child.getWidth()); } - children.add(buttonExit = new Button(width / 2 - 100, height - 26, 200, 20, + addRenderableWidget(buttonExit = new Button(width / 2 - 100, height - 26, 200, 20, new TextComponent(errors.isEmpty() ? "Continue" : "Exit"), button -> onContinue.accept(parent))); } @@ -207,6 +213,11 @@ public class WarningAndErrorScreen extends Screen { public int getWidth() { return 0; } + + @Override + public List narratables() { + return Collections.emptyList(); + } } private static class TextItem extends StringItem { @@ -235,6 +246,24 @@ public class WarningAndErrorScreen extends Screen { public int getWidth() { return Minecraft.getInstance().font.width(text) + 10; } + + @Override + public List narratables() { + return ImmutableList.of(new NarratableEntry() { + public NarrationPriority narrationPriority() { + return NarrationPriority.HOVERED; + } + + public void updateNarration(NarrationElementOutput narrationElementOutput) { + StringBuilder builder = new StringBuilder(); + text.accept((i, style, j) -> { + builder.append(Character.toChars(j)); + return false; + }); + narrationElementOutput.add(NarratedElementType.TITLE, builder.toString()); + } + }); + } } private class LinkItem extends StringItem { @@ -288,5 +317,23 @@ public class WarningAndErrorScreen extends Screen { } return false; } + + @Override + public List narratables() { + return ImmutableList.of(new NarratableEntry() { + public NarrationPriority narrationPriority() { + return NarrationPriority.HOVERED; + } + + public void updateNarration(NarrationElementOutput narrationElementOutput) { + StringBuilder builder = new StringBuilder(); + text.accept((i, style, j) -> { + builder.append(Character.toChars(j)); + return false; + }); + narrationElementOutput.add(NarratedElementType.TITLE, builder.toString()); + } + }); + } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java index 3bbc7fbd2..f0b812687 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java @@ -35,9 +35,15 @@ import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.components.AbstractSelectionList; import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.narration.NarratedElementType; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import org.jetbrains.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; @@ -45,7 +51,7 @@ import java.util.List; import java.util.Objects; @Environment(EnvType.CLIENT) -public abstract class DynamicErrorFreeEntryListWidget> extends AbstractContainerEventHandler implements Widget { +public abstract class DynamicErrorFreeEntryListWidget> extends AbstractContainerEventHandler implements Widget, NarratableEntry { protected static final int DRAG_OUTSIDE = -2; protected final Minecraft client; private final List entries = new Entries(); @@ -62,6 +68,8 @@ public abstract class DynamicErrorFreeEntryListWidget list = this.children(); + if (list.size() > 1) { + int i = list.indexOf(entry); + if (i != -1) { + narrationElementOutput.add(NarratedElementType.POSITION, new TranslatableComponent("narrator.position.list", i + 1, list.size())); + } + } + + } + public int getItemWidth() { return 220; } @@ -249,9 +292,8 @@ public abstract class DynamicErrorFreeEntryListWidget> extends GuiComponent implements GuiEventListener { @Deprecated DynamicErrorFreeEntryListWidget parent; + @Nullable + private NarratableEntry lastNarratable; public Entry() { } @@ -527,6 +572,28 @@ public abstract class DynamicErrorFreeEntryListWidget narratables(); + + void updateNarration(NarrationElementOutput narrationElementOutput) { + List list = this.narratables(); + Screen.NarratableSearchResult narratableSearchResult = Screen.findNarratableWidget(list, this.lastNarratable); + if (narratableSearchResult != null) { + if (narratableSearchResult.priority.isTerminal()) { + this.lastNarratable = narratableSearchResult.entry; + } + + if (list.size() > 1) { + narrationElementOutput.add(NarratedElementType.POSITION, new TranslatableComponent("narrator.position.object_list", new Object[]{narratableSearchResult.index + 1, list.size()})); + if (narratableSearchResult.priority == NarrationPriority.FOCUSED) { + narrationElementOutput.add(NarratedElementType.USAGE, new TranslatableComponent("narration.component_list.usage")); + } + } + + narratableSearchResult.entry.updateNarration(narrationElementOutput.nest()); + } + + } } @Environment(EnvType.CLIENT) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java index 63f132278..2d9b8053c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; +import me.shedaniel.clothconfig2.api.TickableWidget; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.gui.widgets.TextField; @@ -33,7 +34,6 @@ import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import net.minecraft.SharedConstants; import net.minecraft.Util; -import net.minecraft.client.gui.components.TickableWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Style; -- cgit