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 /runtime-frontend/overlay-entries/src/main/java | |
| parent | fb91ed996b01f986492de4007cb86be5e68ad192 (diff) | |
| download | RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.gz RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.bz2 RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.zip | |
Improve Overlay Menus
Diffstat (limited to 'runtime-frontend/overlay-entries/src/main/java')
4 files changed, 70 insertions, 70 deletions
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; + } } |
