aboutsummaryrefslogtreecommitdiff
path: root/runtime-frontend/overlay-entries/src/main/java
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 /runtime-frontend/overlay-entries/src/main/java
parentfb91ed996b01f986492de4007cb86be5e68ad192 (diff)
downloadRoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.gz
RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.tar.bz2
RoughlyEnoughItems-229b1fecdac427d3debe68f52ed7276e54a11cd0.zip
Improve Overlay Menus
Diffstat (limited to 'runtime-frontend/overlay-entries/src/main/java')
-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
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;
+ }
}