aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-09-11 02:32:57 +0800
committershedaniel <daniel@shedaniel.me>2022-09-11 02:32:57 +0800
commit229b1fecdac427d3debe68f52ed7276e54a11cd0 (patch)
treedad0bbe34d45fd2ec3424890f3f4085f116ad584
parentfb91ed996b01f986492de4007cb86be5e68ad192 (diff)
downloadRoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.gz
RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.bz2
RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.zip
Improve Overlay Menus
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java8
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java11
-rw-r--r--gradle.properties1
-rw-r--r--runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java5
-rw-r--r--runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java4
-rw-r--r--runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java89
-rw-r--r--runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java39
-rw-r--r--runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java8
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java90
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java5
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java6
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java5
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/hints/InputMethodWatcher.java172
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java2
-rw-r--r--runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java11
-rw-r--r--runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider1
-rw-r--r--runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider1
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java13
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java13
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java107
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java4
-rw-r--r--runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider3
23 files changed, 333 insertions, 269 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java
index 2e683f51a..9f7fe44b9 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java
@@ -57,18 +57,18 @@ public abstract class Widget extends AbstractContainerEventHandler implements ne
* The font for rendering text
*/
protected final Font font = minecraft.font;
- private static final Stack<Point> mouseStack = new Stack<>();
+ private static final Stack<Point> MOUSE_STACK = new Stack<>();
public static Point mouse() {
- return mouseStack.empty() ? PointHelper.ofMouse() : mouseStack.peek();
+ return MOUSE_STACK.empty() ? PointHelper.ofMouse() : MOUSE_STACK.peek();
}
public static Point pushMouse(Point mouse) {
- return mouseStack.push(mouse);
+ return MOUSE_STACK.push(mouse);
}
public static Point popMouse() {
- return mouseStack.pop();
+ return MOUSE_STACK.pop();
}
public static Point translateMouse(PoseStack poses) {
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java
index 9954a57a9..496fb72d9 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java
@@ -31,6 +31,7 @@ import me.shedaniel.rei.api.client.gui.widgets.TextField;
import me.shedaniel.rei.api.client.gui.widgets.Tooltip;
import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds;
import me.shedaniel.rei.api.client.search.SearchFilter;
+import me.shedaniel.rei.api.common.display.Display;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import org.jetbrains.annotations.ApiStatus;
@@ -134,4 +135,14 @@ public abstract class ScreenOverlay extends WidgetWithBounds {
* @param tooltip the tooltip
*/
public abstract void renderTooltip(PoseStack matrices, Tooltip tooltip);
+
+ /**
+ * Returns whether slot highlighting is on for the current search filter.
+ *
+ * @return whether slot highlighting is on for the current search filter.
+ */
+ public abstract boolean isHighlighting();
+
+ @ApiStatus.Experimental
+ public abstract boolean submitDisplayHistory(Display display, @Nullable Rectangle fromBounds);
}
diff --git a/gradle.properties b/gradle.properties
index d287dec04..92c5ff156 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,3 +1,4 @@
+org.gradle.java.home=C:\\Program Files\\OpenJDK\\jdk-17.0.2
org.gradle.jvmargs=-Xmx10G
base_version=8.4
unstable=false
diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java
index 82eb891be..8a3dace66 100644
--- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java
+++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java
@@ -251,4 +251,9 @@ public class FavoritesListWidgetImpl extends WidgetWithBounds implements Favorit
public Rectangle getFavoritesBounds() {
return favoritesBounds;
}
+
+ @Override
+ public void submitDisplayHistory(Display display, @Nullable Rectangle fromBounds) {
+ displayHistory.addDisplay(fromBounds, display);
+ }
}
diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java
index eabe883a5..eef3e2686 100644
--- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java
+++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java
@@ -36,7 +36,6 @@ 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;
import me.shedaniel.rei.api.client.gui.widgets.Button;
-import me.shedaniel.rei.api.client.gui.widgets.TextField;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.overlay.ScreenOverlay;
@@ -53,14 +52,13 @@ import net.minecraft.network.chat.TranslatableComponent;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
-import java.util.function.Consumer;
import java.util.function.UnaryOperator;
public class ConfigButtonWidgetProvider implements OverlayWidgetProvider {
private static final UUID CONFIG_MENU_UUID = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f");
@Override
- public List<Widget> provide(ScreenOverlay overlay, MenuAccess access, Consumer<TextField> textFieldSink, UnaryOperator<Widget> lateRenderable) {
+ public List<Widget> provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator<Widget> lateRenderable) {
return List.of(create(overlay, access, lateRenderable));
}
diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java
index f5fbc42a0..b470678b0 100644
--- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java
+++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java
@@ -30,40 +30,34 @@ 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.*;
+import me.shedaniel.rei.api.client.gui.widgets.Button;
+import me.shedaniel.rei.api.client.gui.widgets.Widget;
+import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.overlay.OverlayListWidget;
import me.shedaniel.rei.api.client.overlay.ScreenOverlay;
-import me.shedaniel.rei.api.client.search.method.InputMethod;
-import me.shedaniel.rei.api.client.search.method.InputMethodRegistry;
import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.impl.client.config.ConfigManagerInternal;
import me.shedaniel.rei.impl.client.gui.menu.MenuAccess;
+import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SeparatorMenuEntry;
import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SubMenuEntry;
import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.ToggleMenuEntry;
-import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen;
-import me.shedaniel.rei.impl.common.InternalLogger;
+import me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.chat.NarratorChatListener;
-import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
-import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Blocks;
import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.function.Consumer;
import java.util.function.UnaryOperator;
public class CraftableFilterButtonWidgetProvider implements OverlayWidgetProvider {
public static final UUID FILTER_MENU_UUID = UUID.fromString("2839e998-1679-4f9e-a257-37411d16f1e6");
@Override
- public List<Widget> provide(ScreenOverlay overlay, MenuAccess access, Consumer<TextField> textFieldSink, UnaryOperator<Widget> lateRenderable) {
+ public List<Widget> provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator<Widget> lateRenderable) {
if (ConfigObject.getInstance().isCraftableFilterEnabled()) {
return List.of(create(overlay, access, lateRenderable));
} else {
@@ -111,60 +105,33 @@ public class CraftableFilterButtonWidgetProvider implements OverlayWidgetProvide
.toList())
));
- List<Map.Entry<ResourceLocation, InputMethod<?>>> applicableInputMethods = getApplicableInputMethods();
- if (applicableInputMethods.size() > 1) {
- entries.add(new SubMenuEntry(new TranslatableComponent("text.rei.config.menu.search_field.input_method"), createInputMethodEntries(applicableInputMethods)));
+ List<List<FavoriteMenuEntry>> additionalEntries = new ArrayList<>();
+
+ for (OverlayMenuEntryProvider provider : OverlayMenuEntryProvider.PROVIDERS) {
+ List<FavoriteMenuEntry> provided = provider.provide(OverlayMenuEntryProvider.Type.CRAFTABLE_FILTER);
+
+ if (provided != null && !provided.isEmpty()) {
+ additionalEntries.add(provided);
+ }
+ }
+
+ for (List<FavoriteMenuEntry> additionalEntryList : additionalEntries) {
+ if (additionalEntryList.size() > 1) {
+ entries.add(new SeparatorMenuEntry());
+ entries.addAll(additionalEntryList);
+ }
+ }
+
+ List<FavoriteMenuEntry> singleEntries = CollectionUtils.flatMap(CollectionUtils.filterToList(additionalEntries, list -> list.size() == 1), list -> list);
+
+ if (!singleEntries.isEmpty()) {
+ entries.add(new SeparatorMenuEntry());
+ entries.addAll(singleEntries);
}
return entries;
}
- public static List<Map.Entry<ResourceLocation, InputMethod<?>>> getApplicableInputMethods() {
- String languageCode = Minecraft.getInstance().options.languageCode;
- return InputMethodRegistry.getInstance().getAll().entrySet().stream()
- .filter(entry -> CollectionUtils.anyMatch(entry.getValue().getMatchingLocales(), locale -> locale.code().equals(languageCode)))
- .toList();
- }
-
- public static List<FavoriteMenuEntry> createInputMethodEntries(List<Map.Entry<ResourceLocation, InputMethod<?>>> applicableInputMethods) {
- ConfigManagerInternal manager = ConfigManagerInternal.getInstance();
- ConfigObject config = ConfigObject.getInstance();
- return applicableInputMethods.stream()
- .<FavoriteMenuEntry>map(pair -> ToggleMenuEntry.of(pair.getValue().getName(),
- () -> Objects.equals(config.getInputMethodId(), pair.getKey()),
- bool -> {
- ExecutorService service = Executors.newSingleThreadExecutor();
- InputMethod<?> active = InputMethod.active();
- active.dispose(service).whenComplete((unused, throwable) -> {
- if (throwable != null) {
- InternalLogger.getInstance().error("Failed to dispose input method", throwable);
- }
-
- manager.set("functionality.inputMethod", new ResourceLocation("rei:default"));
- }).join();
- CompletableFuture<Void> future = pair.getValue().prepare(service).whenComplete((unused, throwable) -> {
- if (throwable != null) {
- InternalLogger.getInstance().error("Failed to prepare input method", throwable);
- manager.set("functionality.inputMethod", new ResourceLocation("rei:default"));
- } else {
- manager.set("functionality.inputMethod", pair.getKey());
- }
- });
- Screen screen = Minecraft.getInstance().screen;
- Minecraft.getInstance().setScreen(new ConfigReloadingScreen(new TranslatableComponent("text.rei.input.methods.initializing"),
- () -> !future.isDone(), () -> {
- Minecraft.getInstance().setScreen(screen);
- }));
- future.whenComplete((unused, throwable) -> {
- service.shutdown();
- });
- })
- .withActive(() -> !Objects.equals(config.getInputMethodId(), pair.getKey()))
- .withTooltip(() -> Tooltip.create(TooltipContext.ofMouse(), pair.getValue().getDescription()))
- )
- .toList();
- }
-
private static Rectangle getCraftableFilterBounds() {
Rectangle area = REIRuntime.getInstance().getSearchTextField().asWidget().getBounds().clone();
area.setLocation(area.x + area.width + 4, area.y - 1);
diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java
index 7fb67cf34..85d305568 100644
--- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java
+++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java
@@ -1,25 +1,56 @@
package me.shedaniel.rei.impl.client.gui.overlay.widgets;
-import me.shedaniel.rei.api.client.gui.widgets.TextField;
+import com.mojang.blaze3d.platform.Window;
+import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.client.REIRuntime;
+import me.shedaniel.rei.api.client.config.ConfigObject;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.overlay.ScreenOverlay;
+import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry;
import me.shedaniel.rei.impl.client.gui.menu.MenuAccess;
import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchField;
+import net.minecraft.client.Minecraft;
import java.util.List;
-import java.util.function.Consumer;
import java.util.function.UnaryOperator;
public class SearchFieldWidgetProvider implements OverlayWidgetProvider {
private OverlaySearchField searchField;
@Override
- public List<Widget> provide(ScreenOverlay overlay, MenuAccess access, Consumer<TextField> textFieldSink, UnaryOperator<Widget> lateRenderable) {
+ public List<Widget> provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator<Widget> lateRenderable) {
if (searchField == null) {
searchField = new OverlaySearchField(access);
}
- textFieldSink.accept(searchField);
+ searchField.getBounds().setBounds(getSearchFieldArea(overlay));
+ textFieldSink.accept(searchField, searchField::isHighlighting);
return List.of(lateRenderable.apply(searchField));
}
+
+ private Rectangle getSearchFieldArea(ScreenOverlay overlay) {
+ int widthRemoved = 1;
+ if (ConfigObject.getInstance().isCraftableFilterEnabled()) widthRemoved += 22;
+ if (ConfigObject.getInstance().isLowerConfigButton()) widthRemoved += 22;
+ return switch (REIRuntime.getInstance().getContextualSearchFieldLocation()) {
+ case TOP_SIDE -> getTopSideSearchFieldArea(overlay, widthRemoved);
+ case BOTTOM_SIDE -> getBottomSideSearchFieldArea(overlay, widthRemoved);
+ case CENTER -> getCenterSearchFieldArea(overlay, widthRemoved);
+ };
+ }
+
+ private Rectangle getTopSideSearchFieldArea(ScreenOverlay overlay, int widthRemoved) {
+ return new Rectangle(overlay.getBounds().x + 2, 4, overlay.getBounds().width - 6 - widthRemoved, 18);
+ }
+
+ private Rectangle getBottomSideSearchFieldArea(ScreenOverlay overlay, int widthRemoved) {
+ Window window = Minecraft.getInstance().getWindow();
+ return new Rectangle(overlay.getBounds().x + 2, window.getGuiScaledHeight() - 22, overlay.getBounds().width - 6 - widthRemoved, 18);
+ }
+
+ private Rectangle getCenterSearchFieldArea(ScreenOverlay overlay, int widthRemoved) {
+ Window window = Minecraft.getInstance().getWindow();
+ Rectangle screenBounds = ScreenRegistry.getInstance().getScreenBounds(Minecraft.getInstance().screen);
+ return new Rectangle(screenBounds.x, window.getGuiScaledHeight() - 22, screenBounds.width - widthRemoved, 18);
+ }
}
diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java
index 6484f82e2..8428270d6 100644
--- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java
+++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java
@@ -73,10 +73,10 @@ import java.util.function.Consumer;
@SuppressWarnings("UnstableApiUsage")
@ApiStatus.Internal
public class OverlaySearchField extends DelegateWidget implements DelegateTextField, TextField.TextFormatter, TextField.SuggestionRenderer, TextField.BorderColorProvider {
- public static boolean isHighlighting = false;
private static final Style SPLITTER_STYLE = Style.EMPTY.withColor(ChatFormatting.GRAY);
private static final Style QUOTES_STYLE = Style.EMPTY.withColor(ChatFormatting.GOLD);
private static final Style ERROR_STYLE = Style.EMPTY.withColor(TextColor.fromRgb(0xff5555));
+ private boolean isHighlighting = false;
private final TextField textField;
private final MenuAccess access;
private boolean previouslyClicking = false;
@@ -383,7 +383,7 @@ public class OverlaySearchField extends DelegateWidget implements DelegateTextFi
super.render(matrices, mouseX, mouseY, delta);
RenderSystem.enableDepthTest();
if (isMain && isHighlighting) {
- this.renderEntryHighlighting(matrices);
+ renderEntryHighlighting(matrices);
}
}
@@ -427,4 +427,8 @@ public class OverlaySearchField extends DelegateWidget implements DelegateTextFi
RenderSystem.colorMask(true, true, true, true);
RenderSystem.enableDepthTest();
}
+
+ public boolean isHighlighting() {
+ return isHighlighting;
+ }
}
diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java
index ba55096b4..f4d8a1875 100644
--- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java
+++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java
@@ -24,56 +24,36 @@
package me.shedaniel.rei.impl.client.gui.overlay;
import com.mojang.blaze3d.platform.InputConstants;
-import com.mojang.blaze3d.platform.Window;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.client.REIRuntime;
import me.shedaniel.rei.api.client.config.ConfigObject;
-import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation;
import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget;
import me.shedaniel.rei.api.client.gui.widgets.TextField;
import me.shedaniel.rei.api.client.gui.widgets.Widget;
import me.shedaniel.rei.api.client.gui.widgets.Widgets;
import me.shedaniel.rei.api.client.overlay.OverlayListWidget;
-import me.shedaniel.rei.api.client.overlay.ScreenOverlay;
-import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry;
import me.shedaniel.rei.api.client.search.SearchFilter;
-import me.shedaniel.rei.impl.client.ClientInternals;
+import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider;
import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListWidget;
import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListProvider;
import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListWidget;
import me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider;
import me.shedaniel.rei.impl.common.InternalLogger;
-import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.events.GuiEventListener;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
-import java.util.List;
import java.util.Objects;
import java.util.Optional;
+import java.util.function.BooleanSupplier;
@ApiStatus.Internal
public final class ScreenOverlayImpl extends AbstractScreenOverlay {
- private static final List<EntryListProvider> ENTRY_LIST_PROVIDERS = ClientInternals.resolveServices(EntryListProvider.class);
- private static final List<FavoritesListProvider> FAVORITES_LIST_PROVIDERS = ClientInternals.resolveServices(FavoritesListProvider.class);
- private static final List<OverlayWidgetProvider> OVERLAY_WIDGET_PROVIDERS = ClientInternals.resolveServices(OverlayWidgetProvider.class);
private EntryListWidget entryListWidget = null;
private FavoritesListWidget favoritesListWidget = null;
private TextField searchField = null;
-
- public static EntryListWidget getEntryListWidget() {
- return getInstanceInternal().getEntryList();
- }
-
- @Nullable
- public static FavoritesListWidget getFavoritesListWidget() {
- return getInstanceInternal().getFavoritesListNullable();
- }
-
- private static ScreenOverlayImpl getInstanceInternal() {
- return (ScreenOverlayImpl) ScreenOverlay.getInstance().orElseThrow();
- }
+ private BooleanSupplier isHighlighted = null;
public ScreenOverlayImpl() {
this.init();
@@ -84,27 +64,29 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay {
super.init();
this.searchField = null;
+ this.isHighlighted = null;
- FavoritesListWidget favoritesListWidget = getFavoritesListWidget();
+ FavoritesListWidget favoritesListWidget = getFavoritesListNullable();
if (favoritesListWidget != null) {
this.children().add(favoritesListWidget.asWidget());
}
- EntryListWidget entryListWidget = getEntryListWidget();
+ EntryListWidget entryListWidget = getEntryList();
entryListWidget.initBounds(this.getBounds());
entryListWidget.initSearch(searchField.getText(), true);
this.children().add(entryListWidget.asWidget());
searchField.setResponder(s -> entryListWidget.initSearch(s, false));
entryListWidget.init(this);
- for (OverlayWidgetProvider provider : OVERLAY_WIDGET_PROVIDERS) {
- provider.provide(this, menuAccess(), textField -> this.searchField = textField,
- LateRenderableWidget::new);
+ for (OverlayWidgetProvider provider : OverlayWidgetProvider.PROVIDERS) {
+ provider.provide(this, menuAccess(), (textField, isHighlighted) -> {
+ this.searchField = textField;
+ this.isHighlighted = isHighlighted;
+ }, LateRenderableWidget::new);
}
if (this.searchField != null) {
- this.searchField.asWidget().getBounds().setBounds(getSearchFieldArea());
this.children().add(this.searchField.asWidget());
} else {
InternalLogger.getInstance().warn("Search Field is not found! This might cause problems!");
@@ -117,36 +99,9 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay {
}
}
- private Rectangle getSearchFieldArea() {
- int widthRemoved = 1;
- if (ConfigObject.getInstance().isCraftableFilterEnabled()) widthRemoved += 22;
- if (ConfigObject.getInstance().isLowerConfigButton()) widthRemoved += 22;
- SearchFieldLocation searchFieldLocation = REIRuntime.getInstance().getContextualSearchFieldLocation();
- return switch (searchFieldLocation) {
- case TOP_SIDE -> getTopSideSearchFieldArea(widthRemoved);
- case BOTTOM_SIDE -> getBottomSideSearchFieldArea(widthRemoved);
- case CENTER -> getCenterSearchFieldArea(widthRemoved);
- };
- }
-
- private Rectangle getTopSideSearchFieldArea(int widthRemoved) {
- return new Rectangle(getBounds().x + 2, 4, getBounds().width - 6 - widthRemoved, 18);
- }
-
- private Rectangle getBottomSideSearchFieldArea(int widthRemoved) {
- Window window = Minecraft.getInstance().getWindow();
- return new Rectangle(getBounds().x + 2, window.getGuiScaledHeight() - 22, getBounds().width - 6 - widthRemoved, 18);
- }
-
- private Rectangle getCenterSearchFieldArea(int widthRemoved) {
- Window window = Minecraft.getInstance().getWindow();
- Rectangle screenBounds = ScreenRegistry.getInstance().getScreenBounds(minecraft.screen);
- return new Rectangle(screenBounds.x, window.getGuiScaledHeight() - 22, screenBounds.width - widthRemoved, 18);
- }
-
@Override
protected void updateSearch() {
- getEntryListWidget().initSearch(getSearchField().getText(), true);
+ getEntryList().initSearch(getSearchField().getText(), true);
}
@Override
@@ -184,7 +139,7 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay {
@Override
public EntryListWidget getEntryList() {
EntryListWidget current = null;
- for (EntryListProvider provider : ENTRY_LIST_PROVIDERS) {
+ for (EntryListProvider provider : EntryListProvider.PROVIDERS) {
current = provider.getEntryList();
if (current != null) break;
}
@@ -205,7 +160,7 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay {
private FavoritesListWidget getFavoritesListNullable() {
if (ConfigObject.getInstance().isFavoritesEnabled()) {
FavoritesListWidget current = null;
- for (FavoritesListProvider provider : FAVORITES_LIST_PROVIDERS) {
+ for (FavoritesListProvider provider : FavoritesListProvider.PROVIDERS) {
current = provider.getFavoritesList();
if (current != null) break;
}
@@ -230,4 +185,21 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay {
public SearchFilter getCurrentSearchFilter() {
return getEntryList().getSearchFilter();
}
+
+ @Override
+ public boolean isHighlighting() {
+ return this.isHighlighted != null && this.isHighlighted.getAsBoolean();
+ }
+
+ @Override
+ public boolean submitDisplayHistory(Display display, @Nullable Rectangle fromBounds) {
+ FavoritesListWidget favoritesListWidget = getFavoritesListNullable();
+
+ if (favoritesListWidget != null) {