diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-09-11 02:32:57 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-09-11 02:32:57 +0800 |
| commit | 229b1fecdac427d3debe68f52ed7276e54a11cd0 (patch) | |
| tree | dad0bbe34d45fd2ec3424890f3f4085f116ad584 | |
| parent | fb91ed996b01f986492de4007cb86be5e68ad192 (diff) | |
| download | RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.gz RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.bz2 RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.zip | |
Improve Overlay Menus
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) { |
