From 7ebb226c85529ef9de4c93ce91f24c9ca6f608a7 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 16 May 2021 19:26:43 +0800 Subject: Add abstraction for IRecipesGui, fix #529 --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 6 +- .../rei/impl/client/ClientHelperImpl.java | 90 ++++++++-------------- .../shedaniel/rei/impl/client/REIHelperImpl.java | 8 +- .../impl/client/gui/ContainerScreenOverlay.java | 28 ++++--- .../gui/screen/AbstractDisplayViewingScreen.java | 45 ++++++----- .../gui/screen/CompositeDisplayViewingScreen.java | 2 +- .../gui/screen/DefaultDisplayViewingScreen.java | 4 +- .../impl/client/gui/widget/EntryListWidget.java | 38 ++++++++- .../rei/impl/client/gui/widget/EntryWidget.java | 8 +- .../client/gui/widget/FavoritesListWidget.java | 41 +++++++++- .../rei/impl/client/gui/widget/TabWidget.java | 14 +--- .../gui/widget/basewidgets/TextFieldWidget.java | 10 +-- .../gui/widget/search/OverlaySearchField.java | 6 +- .../shedaniel/rei/impl/client/view/ViewsImpl.java | 7 +- 14 files changed, 174 insertions(+), 133 deletions(-) (limited to 'runtime/src') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 312957985..1edb3c221 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -34,7 +34,7 @@ import me.shedaniel.architectury.registry.ReloadListeners; import me.shedaniel.architectury.utils.Env; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIHelper; -import me.shedaniel.rei.api.client.REIOverlay; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; @@ -52,7 +52,6 @@ import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.entry.comparison.EntryComparatorRegistry; import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; @@ -87,7 +86,6 @@ import me.shedaniel.rei.impl.common.display.DisplaySerializerRegistryImpl; import me.shedaniel.rei.impl.common.entry.EmptyEntryStack; import me.shedaniel.rei.impl.common.entry.EntryIngredientImpl; import me.shedaniel.rei.impl.common.entry.TypedEntryStack; -import me.shedaniel.rei.impl.common.entry.comparison.EntryComparatorRegistryImpl; import me.shedaniel.rei.impl.common.entry.comparison.FluidComparatorRegistryImpl; import me.shedaniel.rei.impl.common.entry.comparison.ItemComparatorRegistryImpl; import me.shedaniel.rei.impl.common.entry.comparison.NbtHasherProviderImpl; @@ -609,7 +607,7 @@ public class RoughlyEnoughItemsCore { @Environment(EnvType.CLIENT) private boolean resetFocused(Screen screen) { - if (screen.getFocused() instanceof REIOverlay || screen.getFocused() == screen) { + if (screen.getFocused() instanceof ScreenOverlay || screen.getFocused() == screen) { screen.setFocused(null); } return true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 659a410f2..849856165 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -45,6 +45,7 @@ import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.UncertainDisplayViewingScreen; +import me.shedaniel.rei.impl.client.view.ViewsImpl; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -63,7 +64,6 @@ import org.jetbrains.annotations.Nullable; import java.time.LocalDateTime; import java.util.*; -import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -103,7 +103,7 @@ public class ClientHelperImpl implements ClientHelper { return (ClientHelperImpl) ClientHelper.getInstance(); } - public boolean hasPermissionToUsePackets() { + public boolean hasPermissionToUsePackets() { try { Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(0); return hasOperatorPermission() && canUsePackets(); @@ -223,8 +223,15 @@ public class ClientHelperImpl implements ClientHelper { } @ApiStatus.Internal - public void openRecipeViewingScreen(Map, List> map, @Nullable CategoryIdentifier category, @Nullable EntryStack ingredientNotice, @Nullable EntryStack resultNotice) { - openView(new LegacyWrapperViewSearchBuilder(map).setPreferredOpenedCategory(category).setInputNotice(ingredientNotice).setOutputNotice(resultNotice).fillPreferredOpenedCategory()); + public void openRecipeViewingScreen(Map, List> map, @Nullable CategoryIdentifier category, List> ingredientNotice, List> resultNotice) { + LegacyWrapperViewSearchBuilder builder = new LegacyWrapperViewSearchBuilder(map); + for (EntryStack stack : ingredientNotice) { + builder.addInputNotice(stack); + } + for (EntryStack stack : resultNotice) { + builder.addOutputNotice(stack); + } + openView(builder.setPreferredOpenedCategory(category)); } @Override @@ -244,11 +251,11 @@ public class ClientHelperImpl implements ClientHelper { screen = new DefaultDisplayViewingScreen(map, builder.getPreferredOpenedCategory()); } if (screen instanceof DisplayScreen) { - if (builder.getInputNotice() != null) { - ((DisplayScreen) screen).setIngredientStackToNotice(builder.getInputNotice()); + for (EntryStack stack : builder.getUsagesFor()) { + ((DisplayScreen) screen).addIngredientToNotice(stack); } - if (builder.getOutputNotice() != null) { - ((DisplayScreen) screen).setResultStackToNotice(builder.getOutputNotice()); + for (EntryStack stack : builder.getRecipesFor()) { + ((DisplayScreen) screen).addResultToNotice(stack); } } if (Minecraft.getInstance().screen instanceof DisplayScreen) { @@ -269,7 +276,6 @@ public class ClientHelperImpl implements ClientHelper { } private static abstract class AbstractViewSearchBuilder implements ViewSearchBuilder { - @Override public ViewSearchBuilder fillPreferredOpenedCategory() { if (getPreferredOpenedCategory() == null) { Screen currentScreen = Minecraft.getInstance().screen; @@ -285,10 +291,9 @@ public class ClientHelperImpl implements ClientHelper { private final Set> categories = new HashSet<>(); private final List> recipesFor = new ArrayList<>(); private final List> usagesFor = new ArrayList<>(); - @Nullable private CategoryIdentifier preferredOpenedCategory = null; - @Nullable private EntryStack inputNotice; - @Nullable private EntryStack outputNotice; - private final LazyLoadedValue, List>> map = new LazyLoadedValue<>(() -> Views.getInstance().buildMapFor(this)); + @Nullable + private CategoryIdentifier preferredOpenedCategory = null; + private final LazyLoadedValue, List>> map = new LazyLoadedValue<>(() -> ((ViewsImpl) Views.getInstance()).buildMapFor(this)); @Override public ViewSearchBuilder addCategory(CategoryIdentifier category) { @@ -341,41 +346,21 @@ public class ClientHelperImpl implements ClientHelper { return this.preferredOpenedCategory; } - @Override - public ViewSearchBuilder setInputNotice(@Nullable EntryStack stack) { - this.inputNotice = stack; - return this; - } - - @Nullable - @Override - public EntryStack getInputNotice() { - return inputNotice; - } - - @Override - public ViewSearchBuilder setOutputNotice(@Nullable EntryStack stack) { - this.outputNotice = stack; - return this; - } - - @Nullable - @Override - public EntryStack getOutputNotice() { - return outputNotice; - } - @Override public Map, List> buildMap() { + fillPreferredOpenedCategory(); return this.map.get(); } } public static final class LegacyWrapperViewSearchBuilder extends AbstractViewSearchBuilder { private final Map, List> map; - @Nullable private CategoryIdentifier preferredOpenedCategory = null; - @Nullable private EntryStack inputNotice; - @Nullable private EntryStack outputNotice; + @Nullable + private EntryStack inputNotice; + @Nullable + private EntryStack outputNotice; + @Nullable + private CategoryIdentifier preferredOpenedCategory = null; public LegacyWrapperViewSearchBuilder(Map, List> map) { this.map = map; @@ -403,7 +388,7 @@ public class ClientHelperImpl implements ClientHelper { @Override public List> getRecipesFor() { - return Collections.emptyList(); + return inputNotice == null ? Collections.emptyList() : Collections.singletonList(outputNotice); } @Override @@ -413,7 +398,7 @@ public class ClientHelperImpl implements ClientHelper { @Override public List> getUsagesFor() { - return Collections.emptyList(); + return inputNotice == null ? Collections.emptyList() : Collections.singletonList(inputNotice); } @Override @@ -421,39 +406,26 @@ public class ClientHelperImpl implements ClientHelper { this.preferredOpenedCategory = category; return this; } - + @Override @Nullable public CategoryIdentifier getPreferredOpenedCategory() { return this.preferredOpenedCategory; } - @Override - public ViewSearchBuilder setInputNotice(@Nullable EntryStack stack) { + public LegacyWrapperViewSearchBuilder addInputNotice(@Nullable EntryStack stack) { this.inputNotice = stack; return this; } - @Nullable - @Override - public EntryStack getInputNotice() { - return inputNotice; - } - - @Override - public ViewSearchBuilder setOutputNotice(@Nullable EntryStack stack) { + public LegacyWrapperViewSearchBuilder addOutputNotice(@Nullable EntryStack stack) { this.outputNotice = stack; return this; } - @Nullable - @Override - public EntryStack getOutputNotice() { - return outputNotice; - } - @Override public Map, List> buildMap() { + fillPreferredOpenedCategory(); return this.map; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java index fc91a3bc5..4f44c5fe4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIHelperImpl.java @@ -30,7 +30,7 @@ import me.shedaniel.architectury.event.events.GuiEvent; import me.shedaniel.architectury.event.events.client.ClientTickEvent; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIHelper; -import me.shedaniel.rei.api.client.REIOverlay; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; @@ -126,7 +126,7 @@ public class REIHelperImpl implements REIHelper { } @Override - public Optional getOverlay(boolean reset) { + public Optional getOverlay(boolean reset) { if (overlay == null || reset) { overlay = new ContainerScreenOverlay(); overlay.init(); @@ -207,13 +207,13 @@ public class REIHelperImpl implements REIHelper { @Override public void startReload() { - getOverlay().ifPresent(REIOverlay::queueReloadOverlay); + getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); lastDisplayScreen.clear(); } @Override public void endReload() { - getOverlay().ifPresent(REIOverlay::queueReloadOverlay); + getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); } public void onInitializeClient() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java index ed321c055..f25bb13da 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java @@ -34,7 +34,8 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIHelper; -import me.shedaniel.rei.api.client.REIOverlay; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; @@ -99,7 +100,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; @ApiStatus.Internal -public class ContainerScreenOverlay extends REIOverlay { +public class ContainerScreenOverlay extends ScreenOverlay { private static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); private static final List TOOLTIPS = Lists.newArrayList(); private static final List AFTER_RENDER = Lists.newArrayList(); @@ -211,7 +212,7 @@ public class ContainerScreenOverlay extends REIOverlay { public void init() { Argument.SEARCH_CACHE.clear(); - draggingStack.set(DraggableStackProvider.from(() -> ScreenRegistry.getInstance().getDraggableProviders()), + draggingStack.set(DraggableStackProvider.from(() -> ScreenRegistry.getInstance().getDraggableProviders()), DraggableStackVisitor.from(() -> ScreenRegistry.getInstance().getDraggableVisitors())); this.shouldReload = false; @@ -254,7 +255,7 @@ public class ContainerScreenOverlay extends REIOverlay { .tooltipLine(new TranslatableComponent("text.rei.next_page")) .focusable(false)); } - + final Rectangle configButtonArea = getConfigButtonArea(); widgets.add(configButton = InternalWidgets.wrapLateRenderable( Widgets.withTranslate( @@ -683,9 +684,9 @@ public class ContainerScreenOverlay extends REIOverlay { if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) { - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addRecipesFor(stack).open(); } else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(keyCode, scanCode)) { - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { @@ -744,9 +745,9 @@ public class ContainerScreenOverlay extends REIOverlay { if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addRecipesFor(stack).open(); } else if (ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) { - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { @@ -784,7 +785,7 @@ public class ContainerScreenOverlay extends REIOverlay { }; Set> categories = ScreenRegistry.getInstance().handleClickArea((Class) screen.getClass(), context); if (categories != null && !categories.isEmpty()) { - ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addCategories(categories).fillPreferredOpenedCategory()); + ViewSearchBuilder.builder().addCategories(categories).open(); Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); return true; } @@ -837,4 +838,13 @@ public class ContainerScreenOverlay extends REIOverlay { return isInside(point.getX(), point.getY()); } + @Override + public OverlayListWidget getEntryList() { + return ENTRY_LIST_WIDGET; + } + + @Override + public Optional getFavoritesList() { + return Optional.ofNullable(getFavoritesListWidget()); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index fe057c8f1..ae5646af4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -41,14 +41,16 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; public abstract class AbstractDisplayViewingScreen extends Screen implements DisplayScreen { protected final Map, List> categoryMap; protected final List> categories; - protected EntryStack ingredientStackToNotice = EntryStack.empty(); - protected EntryStack resultStackToNotice = EntryStack.empty(); + protected List> ingredientStackToNotice = new ArrayList<>(); + protected List> resultStackToNotice = new ArrayList<>(); protected int selectedCategoryIndex = 0; protected int tabsPerPage; protected Rectangle bounds; @@ -79,23 +81,23 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis } @Override - public void setIngredientStackToNotice(EntryStack stack) { - this.ingredientStackToNotice = stack; + public void addIngredientToNotice(EntryStack stack) { + this.ingredientStackToNotice.add(stack); } @Override - public void setResultStackToNotice(EntryStack stack) { - this.resultStackToNotice = stack; + public void addResultToNotice(EntryStack stack) { + this.resultStackToNotice.add(stack); } @Override - public EntryStack getIngredientStackToNotice() { - return ingredientStackToNotice; + public List> getIngredientsToNotice() { + return Collections.unmodifiableList(ingredientStackToNotice); } @Override - public EntryStack getResultStackToNotice() { - return resultStackToNotice; + public List> getResultsToNotice() { + return Collections.unmodifiableList(resultStackToNotice); } @Override @@ -121,23 +123,26 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis ClientHelperImpl.getInstance().openRecipeViewingScreen(categoryMap, categories.get(currentCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); } - protected void transformIngredientNotice(List setupDisplay, EntryStack noticeStack) { - transformNotice(Slot.INPUT, setupDisplay, noticeStack); + protected void transformIngredientNotice(List setupDisplay, List> noticeStacks) { + transformNotice(Slot.INPUT, setupDisplay, noticeStacks); } - protected void transformResultNotice(List setupDisplay, EntryStack noticeStack) { - transformNotice(Slot.OUTPUT, setupDisplay, noticeStack); + protected void transformResultNotice(List setupDisplay, List> noticeStacks) { + transformNotice(Slot.OUTPUT, setupDisplay, noticeStacks); } - private static void transformNotice(int marker, List setupDisplay, EntryStack noticeStack) { - if (noticeStack.isEmpty()) + private static void transformNotice(int marker, List setupDisplay, List> noticeStacks) { + if (noticeStacks.isEmpty()) return; for (EntryWidget widget : Widgets.walk(setupDisplay, EntryWidget.class::isInstance)) { if (widget.getNoticeMark() == marker && widget.getEntries().size() > 1) { - EntryStack stack = CollectionUtils.findFirstOrNullEqualsExact(widget.getEntries(), noticeStack); - if (stack != null) { - widget.clearStacks(); - widget.entry(stack); + for (EntryStack noticeStack : noticeStacks) { + EntryStack stack = CollectionUtils.findFirstOrNullEqualsExact(widget.getEntries(), noticeStack); + if (stack != null) { + widget.clearStacks(); + widget.entry(stack); + break; + } } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java index 4361787a4..2d9e3df83 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java @@ -212,7 +212,7 @@ public class CompositeDisplayViewingScreen extends AbstractDisplayViewingScreen .enabled(categories.size() > tabsPerPage)); this.widgets.add(Widgets.createClickableLabel(new Point(bounds.x + 4 + scrollListBounds.width / 2, bounds.y + 6), categories.get(selectedCategoryIndex).getTitle(), label -> { - ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addAllCategories().fillPreferredOpenedCategory()); + ViewSearchBuilder.builder().addAllCategories().open(); }).tooltipLine(I18n.get("text.rei.view_all_categories")).noShadow().color(0xFF404040, 0xFFBBBBBB).hoveredColor(0xFF0041FF, 0xFFFFBD4D)); this.children.addAll(buttonList); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java index 627a18529..dd0088097 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java @@ -93,8 +93,6 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen { @Nullable private Panel workingStationsBaseWidget; private Button recipeBack, recipeNext, categoryBack, categoryNext; - private EntryStack ingredientStackToNotice = EntryStack.empty(); - private EntryStack resultStackToNotice = EntryStack.empty(); public DefaultDisplayViewingScreen(Map, List> categoriesMap, @Nullable CategoryIdentifier category) { super(categoriesMap, category, 5); @@ -196,7 +194,7 @@ public class DefaultDisplayViewingScreen extends AbstractDisplayViewingScreen { widgets.add(categoryBack = Widgets.createButton(new Rectangle(bounds.getX() + 5, bounds.getY() + 5, 12, 12), new TranslatableComponent("text.rei.left_arrow")) .onClick(button -> previousCategory()).tooltipLine(new TranslatableComponent("text.rei.previous_category"))); widgets.add(Widgets.createClickableLabel(new Point(bounds.getCenterX(), bounds.getY() + 7), getCurrentCategory().getTitle(), clickableLabelWidget -> { - ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addAllCategories().fillPreferredOpenedCategory()); + ViewSearchBuilder.builder().addAllCategories().open(); }).tooltipLine(I18n.get("text.rei.view_all_categories"))); widgets.add(categoryNext = Widgets.createButton(new Rectangle(bounds.getMaxX() - 17, bounds.getY() + 5, 12, 12), new TranslatableComponent("text.rei.right_arrow")) .onClick(button -> nextCategory()).tooltipLine(new TranslatableComponent("text.rei.next_category"))); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java index 6dea0453d..47c78ca7f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryListWidget.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.widget; +import com.google.common.base.Predicates; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -39,7 +40,8 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIHelper; -import me.shedaniel.rei.api.client.REIOverlay; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.EntryPanelOrdering; @@ -76,9 +78,10 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; @ApiStatus.Internal -public class EntryListWidget extends WidgetWithBounds { +public class EntryListWidget extends WidgetWithBounds implements OverlayListWidget { static final Comparator> ENTRY_NAME_COMPARER = Comparator.comparing(stack -> stack.asFormatStrippedText().getString()); static final Comparator> ENTRY_GROUP_COMPARER = Comparator.comparingInt(stack -> { if (stack.getType() == VanillaEntryTypes.ITEM) { @@ -170,7 +173,7 @@ public class EntryListWidget extends WidgetWithBounds { ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); if (config.setEntrySize(config.getEntrySize() + amount * 0.075)) { ConfigManager.getInstance().saveConfig(); - REIHelper.getInstance().getOverlay().ifPresent(REIOverlay::queueReloadOverlay); + REIHelper.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); return true; } } else if (ConfigObject.getInstance().isEntryListWidgetScrolled()) { @@ -474,6 +477,35 @@ public class EntryListWidget extends WidgetWithBounds { return false; } + @Override + public EntryStack getFocusedStacK() { + Point mouse = PointHelper.ofMouse(); + if (containsMouse(mouse)) { + for (EntryListEntry entry : entries) { + EntryStack currentEntry = entry.getCurrentEntry(); + if (!currentEntry.isEmpty() && entry.containsMouse(mouse)) { + return currentEntry.copy(); + } + } + } + return EntryStack.empty(); + } + + @Override + public Stream> getEntries() { + if (ConfigObject.getInstance().isEntryListWidgetScrolled()) { + int skip = Math.max(0, Mth.floor(scrolling.scrollAmount / (float) entrySize())); + int nextIndex = skip * innerBounds.width / entrySize(); + return (Stream>) (Stream>) entries.stream() + .skip(nextIndex) + .filter(entry -> entry.getBounds().y <= this.bounds.getMaxY()) + .map(EntryWidget::getCurrentEntry) + .filter(Predicates.not(EntryStack::isEmpty)); + } else { + return entries.stream().map(EntryWidget::getCurrentEntry); + } + } + private class EntryListEntry extends EntryListEntryWidget { private EntryListEntry(int x, int y, int entrySize) { super(new Point(x, y), entrySize); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index 942ebcda4..88f5362e7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -391,9 +391,9 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { } } if ((ConfigObject.getInstance().getRecipeKeybind().getType() != InputConstants.Type.MOUSE && button == 0) || ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(getCurrentEntry()).setOutputNotice(getCurrentEntry()).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addRecipesFor(getCurrentEntry()).open(); else if ((ConfigObject.getInstance().getUsageKeybind().getType() != InputConstants.Type.MOUSE && button == 1) || ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(getCurrentEntry()).setInputNotice(getCurrentEntry()).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addUsagesFor(getCurrentEntry()).open(); } return false; } @@ -438,9 +438,9 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { } } if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(int_1, int_2)) - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(getCurrentEntry()).setOutputNotice(getCurrentEntry()).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addRecipesFor(getCurrentEntry()).open(); else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(int_1, int_2)) - return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(getCurrentEntry()).setInputNotice(getCurrentEntry()).fillPreferredOpenedCategory()); + return ViewSearchBuilder.builder().addUsagesFor(getCurrentEntry()).open(); } return false; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index 8be3e7bfa..8543a83b7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -39,7 +39,6 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIHelper; -import me.shedaniel.rei.api.client.REIOverlay; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; @@ -50,6 +49,8 @@ import me.shedaniel.rei.api.client.gui.drag.*; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntrySerializer; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -83,7 +84,7 @@ import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.entrySize; import static me.shedaniel.rei.impl.client.gui.widget.EntryListWidget.notSteppingOnExclusionZones; @ApiStatus.Internal -public class FavoritesListWidget extends WidgetWithBounds implements DraggableStackProviderWidget, DraggableStackVisitorWidget { +public class FavoritesListWidget extends WidgetWithBounds implements DraggableStackProviderWidget, DraggableStackVisitorWidget, OverlayListWidget { protected final ScrollingContainer scrolling = new ScrollingContainer() { @Override public Rectangle getBounds() { @@ -127,7 +128,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); if (config.setEntrySize(config.getEntrySize() + double_3 * 0.075)) { ConfigManager.getInstance().saveConfig(); - REIHelper.getInstance().getOverlay().ifPresent(REIOverlay::queueReloadOverlay); + REIHelper.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); return true; } } else { @@ -172,6 +173,38 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt return null; } + @Override + public EntryStack getFocusedStacK() { + Point mouse = PointHelper.ofMouse(); + if (innerBounds.contains(mouse)) { + for (Entry entry : entries.values()) { + if (entry.getWidget().containsMouse(mouse)) { + return entry.getWidget().getCurrentEntry().copy(); + } + } + } + if (favoritePanel.bounds.contains(mouse)) { + for (AddFavoritePanel.Row row : favoritePanel.rows.get()) { + if (row instanceof AddFavoritePanel.SectionEntriesRow) { + for (AddFavoritePanel.SectionEntriesRow.SectionFavoriteWidget widget : ((AddFavoritePanel.SectionEntriesRow) row).widgets) { + if (widget.containsMouse(mouse)) { + return ClientEntryStacks.of(widget.entry.getRenderer(false)).copy(); + } + } + } + } + } + return EntryStack.empty(); + } + + @Override + public Stream> getEntries() { + return (Stream>) (Stream>) entriesList.stream() + .filter(entry -> entry.getBounds().getMaxY() >= this.currentBounds.getY() && entry.getBounds().y <= this.currentBounds.getMaxY()) + .map(EntryWidget::getCurrentEntry) + .filter(entry -> !entry.isEmpty()); + } + public class FavoriteDraggableStack implements DraggableStack { private Entry entry; private FavoriteEntry favoriteEntry; @@ -609,7 +642,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - Optional overlayOptional = REIHelper.getInstance().getOverlay(); + Optional overlayOptional = REIHelper.getInstance().getOverlay(); Optional>> menuEntries = favoriteEntry.getMenuEntries(); if (Math.abs(entry.x.doubleValue() - entry.x.target()) < 1 && Math.abs(entry.y.doubleValue() - entry.y.target()) < 1 && overlayOptional.isPresent() && menuEntries.isPresent()) { ContainerScreenOverlay overlay = (ContainerScreenOverlay) overlayOptional.get(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java index 2e8423f42..6b9d61f23 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TabWidget.java @@ -55,7 +55,7 @@ public class TabWidget extends WidgetWithBounds implements DraggableStackProvide public static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); public static final ResourceLocation CHEST_GUI_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer_dark.png"); - public boolean shown = false, selected = false; + public boolean selected = false; public Renderer renderer; public int id; public Component categoryName; @@ -84,13 +84,7 @@ public class TabWidget extends WidgetWithBounds implements DraggableStackProvide } public void setRenderer(DisplayCategory category, Renderer renderer, Component categoryName, boolean selected) { - if (renderer == null) { - shown = false; - this.renderer = null; - } else { - shown = true; - this.renderer = renderer; - } + this.renderer = renderer; this.category = category; this.selected = selected; this.categoryName = categoryName; @@ -105,7 +99,7 @@ public class TabWidget extends WidgetWithBounds implements DraggableStackProvide } public boolean isShown() { - return shown; + return renderer != null; } @Override @@ -115,7 +109,7 @@ public class TabWidget extends WidgetWithBounds implements DraggableStackProvide @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (shown) { + if (renderer != null) { minecraft.getTextureManager().bind(REIHelper.getInstance().isDarkThemeEnabled() ? CHEST_GUI_TEXTURE_DARK : CHEST_GUI_TEXTURE); this.blit(matrices, bounds.x, bounds.y + 2, u + (selected ? bounds.width : 0), v, bounds.width, (selected ? bounds.height + 2 : bounds.height - 1)); renderer.setZ(100); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java index 0f1657d59..0f9b1299a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java @@ -558,8 +558,8 @@ public class TextFieldWidget extends WidgetWithBounds implements TickableWidget, } @Override - public void setNotEditableColor(int int_1) { - this.notEditableColor = int_1; + public void setNotEditableColor(int notEditableColor) { + this.notEditableColor = notEditableColor; } @Override @@ -577,10 +577,10 @@ public class TextFieldWidget extends WidgetWithBounds implements TickableWidget, } @Override - public void setFocused(boolean boolean_1) { - if (boolean_1 && !this.focused) + public void setFocused(boolean focused) { + if (focused && !this.focused) this.frame = 0; - this.focused = boolean_1; + this.focused = focused; } public void setIsEditable(boolean boolean_1) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index 85d6a512e..dd608c480 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -112,10 +112,10 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg } @Override - public void setFocused(boolean boolean_1) { - if (isFocused() != boolean_1 && isMain) + public void setFocused(boolean focused) { + if (isFocused() != focused && isMain) addToHistory(getText()); - super.setFocused(boolean_1); + super.setFocused(focused); } @ApiStatus.Internal diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index 1a46bb09a..b608044e8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -49,7 +49,6 @@ import java.util.stream.Collectors; @ApiStatus.Internal public class ViewsImpl implements Views { - @Override public Map, List> buildMapFor(ViewSearchBuilder builder) { Stopwatch stopwatch = Stopwatch.createStarted(); Set> categories = builder.getCategories(); @@ -121,7 +120,7 @@ public class ViewsImpl implements Views { Set set = new LinkedHashSet<>(); generatorsCount += entry.getValue().size(); - for (LiveDisplayGenerator generator : (List>) (List) entry.getValue()) { + for (LiveDisplayGenerator generator : (List>) (List>) entry.getValue()) { generateLiveDisplays(generator, builder, set::add); } @@ -133,13 +132,13 @@ public class ViewsImpl implements Views { Consumer displayConsumer = display -> { CollectionUtils.getOrPutEmptyList(result, CategoryRegistry.getInstance().get(display.getCategoryIdentifier()).getCategory()).add(display); }; - for (LiveDisplayGenerator generator : (List>) (List) DisplayRegistry.getInstance().getGlobalDisplayGenerators()) { + for (LiveDisplayGenerator generator : (List>) (List>) DisplayRegistry.getInstance().getGlobalDisplayGenerators()) { generatorsCount++; generateLiveDisplays(generator, builder, displayConsumer); } String message = String.format("Built Recipe View in %s for %d categories, %d recipes for, %d usages for and %d live recipe generators.", - stopwatch.stop().toString(), categories.size(), recipesFor.size(), usagesFor.size(), generatorsCount); + stopwatch.stop(), categories.size(), recipesFor.size(), usagesFor.size(), generatorsCount); if (ConfigObject.getInstance().doDebugSearchTimeRequired()) { RoughlyEnoughItemsCore.LOGGER.info(message); } else { -- cgit