diff options
Diffstat (limited to 'runtime/src/main/java')
19 files changed, 768 insertions, 145 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 16558a54e..b911f9968 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -34,6 +34,7 @@ import dev.architectury.event.events.client.ClientGuiEvent; import dev.architectury.event.events.client.ClientRecipeUpdateEvent; import dev.architectury.event.events.client.ClientScreenInputEvent; import dev.architectury.networking.NetworkManager; +import dev.architectury.utils.value.BooleanValue; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -41,6 +42,7 @@ import me.shedaniel.rei.api.client.entry.filtering.FilteringRuleTypeRegistry; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; @@ -66,6 +68,8 @@ import me.shedaniel.rei.impl.client.entry.renderer.EntryRendererRegistryImpl; import me.shedaniel.rei.impl.client.favorites.DelegatingFavoriteEntryProviderImpl; import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.modules.entries.SubMenuEntry; +import me.shedaniel.rei.impl.client.gui.modules.entries.ToggleMenuEntry; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip; import me.shedaniel.rei.impl.client.gui.widget.TooltipContextImpl; @@ -151,6 +155,8 @@ public class RoughlyEnoughItemsCoreClient { ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection<Tooltip.Entry>, Tooltip>) QueuedTooltip::impl, "tooltipProvider"); ClientInternals.attachInstance((TriFunction<Point, @Nullable TooltipFlag, Boolean, TooltipContext>) TooltipContextImpl::new, "tooltipContextProvider"); ClientInternals.attachInstance((Function<Object, Tooltip.Entry>) QueuedTooltip.TooltipEntryImpl::new, "tooltipEntryProvider"); + ClientInternals.attachInstance((BiFunction<Component, List<FavoriteMenuEntry>, FavoriteMenuEntry>) SubMenuEntry::new, "subMenuEntry"); + ClientInternals.attachInstance((BiFunction<Component, BooleanValue, FavoriteMenuEntry>) (text, value) -> ToggleMenuEntry.of(text, value::get, value), "toggleEntry"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List<CategoryIdentifier<?>> categories = Lists.newArrayList(); private BooleanSupplier execute = () -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index a18d7aeab..6b2e7c5c8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -280,6 +280,15 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { } @Override + public boolean doDisplayIMEHints() { + return advanced.tooltips.displayIMEHints; + } + + public void setDoDisplayIMEHints(boolean displayIMEHints) { + advanced.tooltips.displayIMEHints = displayIMEHints; + } + + @Override public boolean doesFastEntryRendering() { return advanced.miscellaneous.newFastEntryRendering; } @@ -661,6 +670,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { public static class Tooltips { @Comment("Declares whether REI should append mod names to entries.") private boolean appendModNames = true; @Comment("Declares whether favorites tooltip should be displayed.") private boolean displayFavoritesTooltip = false; + @ConfigEntry.Gui.Excluded private boolean displayIMEHints = true; } public static class Layout { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index fe6abb1ba..7ceaa4123 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -59,6 +59,7 @@ import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.PaginatedEntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.ScrolledEntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.widget.hint.HintsContainerWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.common.util.RectangleUtils; import net.minecraft.client.Minecraft; @@ -86,10 +87,11 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { private Rectangle bounds; private Window window; private Widget configButton; - private CurrentDraggingStack draggingStack = new CurrentDraggingStack(); + private final CurrentDraggingStack draggingStack = new CurrentDraggingStack(); @Nullable public DefaultDisplayChoosePageWidget choosePageWidget; - private MenuHolder menuHolder = new MenuHolder(); + private final MenuHolder menuHolder = new MenuHolder(); + private final HintsContainerWidget hintsWidget = new HintsContainerWidget(); public static EntryListWidget getEntryListWidget() { boolean widgetScrolled = ConfigObject.getInstance().isEntryListWidgetScrolled(); @@ -118,7 +120,7 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { } public static ScreenOverlayImpl getInstance() { - return (ScreenOverlayImpl) REIRuntime.getInstance().getOverlay().get(); + return (ScreenOverlayImpl) REIRuntime.getInstance().getOverlay().orElseThrow(); } public void tick() { @@ -183,6 +185,8 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { } this.widgets.add(draggingStack); + this.widgets.add(InternalWidgets.wrapLateRenderable(hintsWidget)); + this.hintsWidget.init(); } private Rectangle getSearchFieldArea() { @@ -294,6 +298,8 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { for (Widget widget : widgets) { if (widget instanceof LateRenderable && widget != menuHolder.widget()) widget.render(matrices, mouseX, mouseY, delta); + else if (widget instanceof OverlaySearchField field) + field.laterRender(matrices, mouseX, mouseY, delta); } matrices.pushPose(); matrices.translate(0, 0, 500); @@ -347,6 +353,8 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { return false; if (menuHolder.mouseScrolled(mouseX, mouseY, amount)) return true; + if (hintsWidget.mouseScrolled(mouseX, mouseY, amount)) + return true; if (isInside(mouseX, mouseY) && getEntryListWidget().mouseScrolled(mouseX, mouseY, amount)) { return true; } @@ -357,6 +365,7 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { for (Widget widget : widgets) if (widget != getEntryListWidget() && (favoritesListWidget == null || widget != favoritesListWidget) && widget != menuHolder.widget() + && widget != hintsWidget && widget.mouseScrolled(mouseX, mouseY, amount)) return true; return false; @@ -488,6 +497,13 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { REIRuntimeImpl.getSearchField().setFocused(false); return true; } + if (hintsWidget.mouseClicked(mouseX, mouseY, button)) { + this.setFocused(hintsWidget); + if (button == 0) + this.setDragging(true); + REIRuntimeImpl.getSearchField().setFocused(false); + return true; + } } if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { Screen screen = Minecraft.getInstance().screen; @@ -500,7 +516,7 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { return false; } for (GuiEventListener element : widgets) { - if (element != configButton && element != menuHolder.widget() && element.mouseClicked(mouseX, mouseY, button)) { + if (element != configButton && element != menuHolder.widget() && element != hintsWidget && element.mouseClicked(mouseX, mouseY, button)) { this.setFocused(element); if (button == 0) this.setDragging(true); @@ -568,4 +584,8 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { public MenuAccess menuAccess() { return menuHolder; } + + public HintsContainerWidget getHintsContainer() { + return this.hintsWidget; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java index 47fc0b085..2f87ca127 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java @@ -23,7 +23,9 @@ package me.shedaniel.rei.impl.client.gui.modules; -public abstract class AbstractMenuEntry extends MenuEntry { +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; + +public abstract class AbstractMenuEntry extends FavoriteMenuEntry { private int x, y, width; private boolean selected, containsMouse, rendering; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java index 05173e464..af6a07740 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java @@ -31,7 +31,9 @@ import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; +import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.modules.entries.SubMenuEntry; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import net.minecraft.client.Minecraft; @@ -50,12 +52,12 @@ public class Menu extends WidgetWithBounds implements LateRenderable { public final Point menuStartPoint; public final boolean facingRight; public final boolean facingDownwards; - private final List<MenuEntry> entries = Lists.newArrayList(); + private final List<FavoriteMenuEntry> entries = Lists.newArrayList(); public final ScrollingContainer scrolling = new ScrollingContainer() { @Override public int getMaxScrollHeight() { int i = 0; - for (MenuEntry entry : children()) { + for (FavoriteMenuEntry entry : children()) { i += entry.getEntryHeight(); } return i; @@ -72,7 +74,7 @@ public class Menu extends WidgetWithBounds implements LateRenderable { } }; - public Menu(Rectangle menuStart, Collection<MenuEntry> entries, boolean sort) { + public Menu(Rectangle menuStart, Collection<FavoriteMenuEntry> entries, boolean sort) { buildEntries(entries, sort); int fullWidth = Minecraft.getInstance().screen.width; int fullHeight = Minecraft.getInstance().screen.height; @@ -91,16 +93,18 @@ public class Menu extends WidgetWithBounds implements LateRenderable { this.menuStartPoint = new Point(x, y); } - @SuppressWarnings("deprecation") - private void buildEntries(Collection<MenuEntry> entries, boolean sort) { + private void buildEntries(Collection<FavoriteMenuEntry> entries, boolean sort) { this.entries.clear(); this.entries.addAll(entries); if (sort) { this.entries.sort(Comparator.comparing(entry -> entry instanceof SubMenuEntry ? 0 : 1) .thenComparing(entry -> entry instanceof SubMenuEntry menuEntry ? menuEntry.text.getString() : "")); } - for (MenuEntry entry : this.entries) { - entry.parent = this; + for (FavoriteMenuEntry entry : this.entries) { + entry.closeMenu = ScreenOverlayImpl.getInstance().menuAccess()::close; + if (entry instanceof SubMenuEntry menuEntry) { + menuEntry.setParent(this); + } } } @@ -123,7 +127,7 @@ public class Menu extends WidgetWithBounds implements LateRenderable { public int getMaxEntryWidth() { int i = 0; - for (MenuEntry entry : children()) { + for (FavoriteMenuEntry entry : children()) { if (entry.getEntryWidth() > i) i = entry.getEntryWidth(); } @@ -137,9 +141,9 @@ public class Menu extends WidgetWithBounds implements LateRenderable { fill(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), containsMouse(mouseX, mouseY) ? (REIRuntime.getInstance().isDarkThemeEnabled() ? -17587 : -1) : -6250336); fill(matrices, innerBounds.x, innerBounds.y, innerBounds.getMaxX(), innerBounds.getMaxY(), -16777216); boolean contains = innerBounds.contains(mouseX, mouseY); - MenuEntry focused = getFocused() instanceof MenuEntry menuEntry ? menuEntry : null; + FavoriteMenuEntry focused = getFocused() instanceof FavoriteMenuEntry menuEntry ? menuEntry : null; int currentY = innerBounds.y - scrolling.scrollAmountInt(); - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { boolean containsMouse = contains && mouseY >= currentY && mouseY < currentY + child.getEntryHeight(); if (containsMouse) { focused = child; @@ -148,7 +152,7 @@ public class Menu extends WidgetWithBounds implements LateRenderable { } currentY = innerBounds.y - scrolling.scrollAmountInt(); ScissorsHandler.INSTANCE.scissor(scrolling.getScissorBounds()); - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { boolean rendering = currentY + child.getEntryHeight() >= innerBounds.y && currentY <= innerBounds.getMaxY(); boolean containsMouse = contains && mouseY >= currentY && mouseY < currentY + child.getEntryHeight(); child.updateInformation(innerBounds.x, currentY, focused == child || containsMouse, containsMouse, rendering, getMaxEntryWidth()); @@ -183,7 +187,7 @@ public class Menu extends WidgetWithBounds implements LateRenderable { scrolling.offset(ClothConfigInitializer.getScrollStep() * -amount, true); return true; } - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { if (child instanceof SubMenuEntry) { if (child.mouseScrolled(mouseX, mouseY, amount)) return true; @@ -195,7 +199,7 @@ public class Menu extends WidgetWithBounds implements LateRenderable { @Override public boolean containsMouse(double mouseX, double mouseY) { if (super.containsMouse(mouseX, mouseY)) return true; - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { if (child.containsMouse(mouseX, mouseY)) { return true; } @@ -204,7 +208,7 @@ public class Menu extends WidgetWithBounds implements LateRenderable { } @Override - public List<MenuEntry> children() { + public List<FavoriteMenuEntry> children() { return entries; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java index 3d8d6896f..a826fbcfe 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.impl.client.gui.modules; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import java.util.Collection; import java.util.UUID; @@ -43,7 +44,7 @@ public interface MenuAccess { void open(UUID uuid, Menu menu, Predicate<Point> or, Predicate<Point> and); - default void openOrClose(UUID uuid, Rectangle selfBounds, Supplier<Collection<MenuEntry>> menuSupplier) { + default void openOrClose(UUID uuid, Rectangle selfBounds, Supplier<Collection<FavoriteMenuEntry>> menuSupplier) { boolean isOpened = isOpened(uuid); if (isOpened || !isAnyOpened()) { boolean inBounds = (isValidPoint(PointHelper.ofMouse()) && selfBounds.contains(PointHelper.ofMouse())) || isInBounds(uuid); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java deleted file mode 100644 index c2cf89925..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package me.shedaniel.rei.impl.client.gui.modules; - -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public abstract class MenuEntry extends Widget { - @ApiStatus.Internal - @Deprecated - Menu parent = null; - - public final Menu getParent() { - return parent; - } - - public abstract int getEntryWidth(); - - public abstract int getEntryHeight(); - - public abstract void updateInformation(int xPos, int yPos, boolean selected, boolean containsMouse, boolean rendering, int width); -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java index 1113bb457..3fb54a619 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java @@ -29,10 +29,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.modules.AbstractMenuEntry; import me.shedaniel.rei.impl.client.gui.modules.Menu; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; @@ -44,22 +44,27 @@ import java.util.function.Supplier; public class SubMenuEntry extends AbstractMenuEntry { public final Component text; private int textWidth = -69; - protected List<MenuEntry> entries; + protected List<FavoriteMenuEntry> entries; + protected Menu parent; protected Menu childMenu; public SubMenuEntry(Component text) { this(text, Collections.emptyList()); } - public SubMenuEntry(Component text, Supplier<List<MenuEntry>> entries) { + public SubMenuEntry(Component text, Supplier<List<FavoriteMenuEntry>> entries) { this(text, entries.get()); } - public SubMenuEntry(Component text, List<MenuEntry> entries) { + public SubMenuEntry(Component text, List<FavoriteMenuEntry> entries) { this.text = MoreObjects.firstNonNull(text, Component.empty()); this.entries = entries; } + public void setParent(Menu parent) { + this.parent = parent; + } + private int getTextWidth() { if (textWidth == -69) { this.textWidth = Math.max(0, font.width(text)); @@ -69,7 +74,7 @@ public class SubMenuEntry extends AbstractMenuEntry { public Menu getChildMenu() { if (childMenu == null) { - this.childMenu = new Menu(new Rectangle(getParent().getBounds().x + 1, getY() - 1, getParent().getBounds().width - 2, getEntryHeight() - 2), entries, false); + this.childMenu = new Menu(new Rectangle(parent.getBounds().x + 1, getY() - 1, parent.getBounds().width - 2, getEntryHeight() - 2), entries, false); } return childMenu; } @@ -91,11 +96,11 @@ public class SubMenuEntry extends AbstractMenuEntry { if (!entries.isEmpty()) { Menu menu = getChildMenu(); - Rectangle menuStart = new Rectangle(getParent().getBounds().x, getY(), getParent().getBounds().width, getEntryHeight()); + Rectangle menuStart = new Rectangle(parent.getBounds().x, getY(), parent.getBounds().width, getEntryHeight()); int fullWidth = Minecraft.getInstance().screen.width; int fullHeight = Minecraft.getInstance().screen.height; - boolean facingRight = getParent().facingRight; + boolean facingRight = parent.facingRight; int menuWidth = menu.getMaxEntryWidth() + 2 + (menu.hasScrollBar() ? 6 : 0); if (facingRight && fullWidth - menuStart.getMaxX() < menuWidth + 10) { facingRight = false; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java index cf4a4703f..c61118b5b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; @@ -43,7 +44,6 @@ import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; import me.shedaniel.rei.impl.client.gui.modules.entries.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -95,7 +95,7 @@ public class ConfigButtonWidget { return Widgets.concat(configButton, overlayWidget); } - private static Collection<MenuEntry> menuEntries() { + private static Collection<FavoriteMenuEntry> menuEntries() { ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); return List.of( ToggleMenuEntry.of(Component.translatable("text.rei.cheating"), diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index d0d611890..e76f9f022 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -24,8 +24,12 @@ package me.shedaniel.rei.impl.client.gui.widget; import com.mojang.math.Vector4f; +import dev.architectury.utils.value.BooleanValue; +import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.widgets.Button; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; @@ -39,10 +43,11 @@ import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; +import me.shedaniel.rei.impl.client.gui.modules.entries.SeparatorMenuEntry; import me.shedaniel.rei.impl.client.gui.modules.entries.SubMenuEntry; import me.shedaniel.rei.impl.client.gui.modules.entries.ToggleMenuEntry; import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; +import me.shedaniel.rei.impl.client.search.method.DefaultInputMethod; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -57,6 +62,7 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Collectors; public class CraftableFilterButtonWidget { public static final UUID FILTER_MENU_UUID = UUID.fromString("2839e998-1679-4f9e-a257-37411d16f1e6"); @@ -75,7 +81,7 @@ public class CraftableFilterButtonWidget { .onRender((matrices, button) -> { button.setTint(ConfigManager.getInstance().isCraftableOnlyEnabled() ? 0x3800d907 : 0x38ff0000); - access.openOrClose(FILTER_MENU_UUID, button.getBounds(), CraftableFilterButtonWidget::menuEntries); + access.openOrClose(FILTER_MENU_UUID, button.getBounds(), () -> menuEntries(access)); }) .containsMousePredicate((button, point) -> button.getBounds().contains(point) && overlay.isNotInExclusionZones(point.x, point.y)) .tooltipLineSupplier(button -> Component.translatable(ConfigManager.getInstance().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all")); @@ -89,11 +95,11 @@ public class CraftableFilterButtonWidget { return Widgets.concat(filterButton, overlayWidget); } - private static Collection<MenuEntry> menuEntries() { + private static Collection<FavoriteMenuEntry> menuEntries(MenuAccess access) { ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); - ArrayList<MenuEntry> entries = new ArrayList<>(List.of( + ArrayList<FavoriteMenuEntry> entries = new ArrayList<>(List.of( new SubMenuEntry(Component.translatable("text.rei.config.menu.search_field.position"), Arrays.stream(SearchFieldLocation.values()) - .<MenuEntry>map(location -> ToggleMenuEntry.of(Component.literal(location.toString()), + .<FavoriteMenuEntry>map(location -> ToggleMenuEntry.of(Component.literal(location.toString()), () -> config.getSearchFieldLocation() == location, bool -> config.setSearchFieldLocation(location)) .withActive(() -> config.getSearchFieldLocation() != location) @@ -103,7 +109,7 @@ public class CraftableFilterButtonWidget { List<Map.Entry<ResourceLocation, InputMethod<?>>> applicableInputMethods = getApplicableInputMethods(); if (applicableInputMethods.size() > 1) { - entries.add(new SubMenuEntry(Component.translatable("text.rei.config.menu.search_field.input_method"), createInputMethodEntries(applicableInputMethods))); + entries.add(new SubMenuEntry(Component.translatable("text.rei.config.menu.search_field.input_method"), createInputMethodEntries(access, applicableInputMethods))); } return entries; @@ -116,10 +122,10 @@ public class CraftableFilterButtonWidget { .toList(); } - public static List<MenuEntry> createInputMethodEntries(List<Map.Entry<ResourceLocation, InputMethod<?>>> applicableInputMethods) { + public static List<FavoriteMenuEntry> createInputMethodEntries(MenuAccess access, List<Map.Entry<ResourceLocation, InputMethod<?>>> applicableInputMethods) { ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); - return applicableInputMethods.stream() - .<MenuEntry>map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), + List<FavoriteMenuEntry> entries = applicableInputMethods.stream() + .<FavoriteMenuEntry>map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), () -> Objects.equals(config.getInputMethodId(), pair.getKey()), bool -> { ExecutorService service = Executors.newSingleThreadExecutor(); @@ -147,14 +153,38 @@ public class CraftableFilterButtonWidget { }); reloadingScreen.setSubtitle(() -> new TranslatableComponent("text.rei.input.methods.reload.progress", String.format("%.2f", progress[0] * 100))); Minecraft.getInstance().setScreen(reloadingScreen); + access.close(); future.whenComplete((unused, throwable) -> { service.shutdown(); }); + ScreenOverlayImpl.getInstance().getHintsC |
