aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java/me/shedaniel
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/src/main/java/me/shedaniel')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java28
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java32
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java44
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java19
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java33
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java60
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/hint/HintWidget.java198
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/hint/HintsContainerWidget.java114
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java50
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java21
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/BomopofoInputMethod.java10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/DoublePinyinInputMethod.java335
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/PinyinInputMethod.java208
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanInputMethod.java16
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanManager.java14
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java6
24 files changed, 1041 insertions, 192 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/screen/ConfigReloadingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java
index eeb1a1852..082ac44ec 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java
@@ -28,14 +28,17 @@ import net.minecraft.Util;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Nullable;
import java.util.function.BooleanSupplier;
+import java.util.function.Supplier;
@ApiStatus.Internal
public class ConfigReloadingScreen extends Screen {
private final Component title;
private final BooleanSupplier predicate;
- private Runnable parent;
+ private Supplier<@Nullable Component> subtitle = () -> null;
+ private final Runnable parent;
public ConfigReloadingScreen(Component title, BooleanSupplier predicate, Runnable parent) {
super(Component.empty());
@@ -44,6 +47,10 @@ public class ConfigReloadingScreen extends Screen {
this.parent = parent;
}
+ public void setSubtitle(Supplier<@Nullable Component> subtitle) {
+ this.subtitle = subtitle;
+ }
+
@Override
public boolean shouldCloseOnEsc() {
return false;
@@ -56,21 +63,17 @@ public class ConfigReloadingScreen extends Screen {
parent.run();
return;
}
- drawCenteredString(matrices, this.font, title, this.width / 2, this.height / 2 - 50, 16777215);
- String text;
- switch ((int) (Util.getMillis() / 300L % 4L)) {
- case 0:
- default:
- text = "O o o";
- break;
- case 1:
- case 3:
- text = "o O o";
- break;
- case 2:
- text = "o o O";
+ drawCenteredString(matrices, this.font, title, this.width / 2, this.height / 2 - 50, 0xffffff);
+ String text = switch ((int) (Util.getMillis() / 300L % 4L)) {
+ case 1, 3 -> "o O o";
+ case 2 -> "o o O";
+ default -> "O o o";
+ };
+ drawCenteredString(matrices, this.font, text, this.width / 2, this.height / 2 - 50 + 9, 0x808080);
+ Component subtitle = this.subtitle.get();
+ if (subtitle != null) {
+ drawCenteredString(matrices, this.font, subtitle, this.width / 2, this.height / 2 - 50 + 9 + 9, 0x808080);
}
- drawCenteredString(matrices, this.font, text, this.width / 2, this.height / 2 - 41, 8421504);
super.render(matrices, mouseX, mouseY, delta);
}
}
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 d2f3f7464..9d34545d5 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
@@ -23,8 +23,12 @@
package me.shedaniel.rei.impl.client.gui.widget;
+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.shed