From 02d1d95dd54285cc1237d1b5016401274a5ae5f0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 25 Mar 2021 18:15:16 +0800 Subject: Refactor Default Plugin packages, fix favorites Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 35 ++-- .../rei/impl/client/ClientHelperImpl.java | 1 - .../shedaniel/rei/impl/client/REIHelperImpl.java | 2 +- .../rei/impl/client/config/ConfigManagerImpl.java | 8 +- .../client/config/entries/FilteringScreen.java | 2 +- .../entry/filtering/rules/ManualFilteringRule.java | 2 +- .../entry/filtering/rules/SearchFilteringRule.java | 4 +- .../entry/type/types/RenderingEntryDefinition.java | 4 +- .../impl/client/gui/ContainerScreenOverlay.java | 108 +++++------- .../rei/impl/client/gui/credits/CreditsScreen.java | 2 +- .../client/gui/dragging/CurrentDraggingStack.java | 42 +++-- .../rei/impl/client/gui/modules/Menu.java | 2 +- .../entries/EntryStackSubsetsMenuEntry.java | 4 +- .../gui/modules/entries/SubSubsetsMenuEntry.java | 2 +- .../gui/screen/AbstractDisplayViewingScreen.java | 21 +-- .../gui/screen/CompositeDisplayViewingScreen.java | 6 +- .../gui/screen/DefaultDisplayViewingScreen.java | 6 +- .../impl/client/gui/screen/TransformingScreen.java | 1 - .../gui/screen/UncertainDisplayViewingScreen.java | 4 +- .../impl/client/gui/widget/EntryListWidget.java | 8 +- .../rei/impl/client/gui/widget/EntryWidget.java | 2 +- .../client/gui/widget/FavoritesListWidget.java | 186 +++++++++++++-------- .../impl/client/gui/widget/InternalWidgets.java | 3 +- .../gui/widget/search/OverlaySearchField.java | 2 +- .../client/registry/screen/ScreenRegistryImpl.java | 2 +- .../shedaniel/rei/impl/client/view/ViewsImpl.java | 2 +- .../rei/impl/common/compat/LBASupportPlugin.java | 2 +- .../rei/impl/common/entry/EntryIngredientImpl.java | 71 ++++++++ .../impl/common/entry/type/EntryRegistryImpl.java | 2 +- .../entry/type/types/BuiltinEntryDefinition.java | 2 +- .../entry/type/types/EmptyEntryDefinition.java | 2 +- .../common/fluid/FluidSupportProviderImpl.java | 2 +- .../rei/impl/common/plugins/PluginManagerImpl.java | 22 +-- .../impl/common/transfer/MenuInfoRegistryImpl.java | 4 +- .../shedaniel/rei/impl/common/util/Animator.java | 102 ----------- .../plugin/client/DefaultClientRuntimePlugin.java | 8 +- .../plugin/client/entry/FluidEntryDefinition.java | 7 +- .../plugin/client/entry/ItemEntryDefinition.java | 4 +- 38 files changed, 341 insertions(+), 348 deletions(-) delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/common/util/Animator.java (limited to 'runtime') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 787a25cb6..7bc63e0b3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -36,12 +36,12 @@ 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.config.ConfigObject; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.api.client.gui.widgets.*; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; @@ -51,40 +51,41 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.Internals; import me.shedaniel.rei.impl.client.REIHelperImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.entry.type.types.RenderingEntryDefinition; +import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip; -import me.shedaniel.rei.impl.*; +import me.shedaniel.rei.impl.client.registry.category.CategoryRegistryImpl; +import me.shedaniel.rei.impl.client.registry.display.DisplayRegistryImpl; +import me.shedaniel.rei.impl.client.registry.screen.ScreenRegistryImpl; +import me.shedaniel.rei.impl.client.search.SearchProviderImpl; +import me.shedaniel.rei.impl.client.subsets.SubsetsRegistryImpl; +import me.shedaniel.rei.impl.client.transfer.TransferHandlerRegistryImpl; +import me.shedaniel.rei.impl.client.view.ViewsImpl; import me.shedaniel.rei.impl.common.category.CategoryIdentifierImpl; import me.shedaniel.rei.impl.common.display.DisplaySerializerRegistryImpl; -import me.shedaniel.rei.impl.common.plugins.PluginManagerImpl; -import me.shedaniel.rei.impl.common.transfer.MenuInfoRegistryImpl; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import me.shedaniel.rei.impl.common.entry.EntryIngredientImpl; -import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl; +import me.shedaniel.rei.impl.common.entry.TypedEntryStack; import me.shedaniel.rei.impl.common.entry.comparison.ItemComparatorRegistryImpl; import me.shedaniel.rei.impl.common.entry.comparison.NbtHasherProviderImpl; -import me.shedaniel.rei.impl.common.entry.TypedEntryStack; import me.shedaniel.rei.impl.common.entry.type.EntryRegistryImpl; import me.shedaniel.rei.impl.common.entry.type.EntryTypeDeferred; import me.shedaniel.rei.impl.common.entry.type.EntryTypeRegistryImpl; import me.shedaniel.rei.impl.common.entry.type.types.EmptyEntryDefinition; -import me.shedaniel.rei.impl.client.entry.type.types.RenderingEntryDefinition; import me.shedaniel.rei.impl.common.fluid.FluidSupportProviderImpl; -import me.shedaniel.rei.impl.client.registry.category.CategoryRegistryImpl; -import me.shedaniel.rei.impl.client.registry.display.DisplayRegistryImpl; -import me.shedaniel.rei.impl.client.registry.screen.ScreenRegistryImpl; -import me.shedaniel.rei.impl.client.search.SearchProviderImpl; -import me.shedaniel.rei.impl.client.subsets.SubsetsRegistryImpl; +import me.shedaniel.rei.impl.common.plugins.PluginManagerImpl; +import me.shedaniel.rei.impl.common.transfer.MenuInfoRegistryImpl; import me.shedaniel.rei.impl.common.util.IssuesDetector; -import me.shedaniel.rei.impl.client.transfer.TransferHandlerRegistryImpl; -import me.shedaniel.rei.impl.client.view.ViewsImpl; import me.shedaniel.rei.plugin.test.REITestPlugin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; 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 887230dcd..64700c4cd 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 @@ -26,7 +26,6 @@ package me.shedaniel.rei.impl.client; import io.netty.buffer.Unpooled; import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.architectury.platform.Platform; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIHelper; 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 f47aba025..82c3eb983 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 @@ -38,8 +38,8 @@ import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.client.gui.screen.RecipeScreen; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index b58e14524..4ce4c30f6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -57,14 +57,14 @@ import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.config.entries.*; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; +import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen; import me.shedaniel.rei.impl.client.gui.screen.TransformingScreen; import me.shedaniel.rei.impl.client.gui.screen.WarningAndErrorScreen; -import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen; -import me.shedaniel.rei.impl.client.REIHelperImpl; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; -import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.FabricLoader; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index 6c5a37fbc..adabe8d62 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -46,8 +46,8 @@ import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java index 8504a8aa8..5bcd19e2c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java @@ -27,8 +27,8 @@ import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.entry.filtering.AbstractFilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.FilteringContext; import me.shedaniel.rei.impl.client.entry.filtering.FilteringResult; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java index 072fb2f24..3113cc79c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java @@ -24,12 +24,12 @@ package me.shedaniel.rei.impl.client.entry.filtering.rules; import com.google.common.collect.Lists; -import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; -import me.shedaniel.rei.impl.client.config.entries.FilteringRuleOptionsScreen; import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; +import me.shedaniel.rei.impl.client.config.entries.FilteringRuleOptionsScreen; import me.shedaniel.rei.impl.client.entry.filtering.AbstractFilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.FilteringContext; import me.shedaniel.rei.impl.client.entry.filtering.FilteringResult; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java index 90aa654ee..d04a86e14 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java @@ -27,10 +27,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; -import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.entry.type.BuiltinClientEntryTypes; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.impl.common.entry.type.types.BuiltinEntryDefinition; 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 a53fb7fc6..68d9a7782 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,6 @@ import com.mojang.math.Vector4f; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; 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; @@ -45,10 +44,7 @@ import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitor; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; -import me.shedaniel.rei.api.client.gui.widgets.Button; -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.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; @@ -56,9 +52,11 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; +import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; import me.shedaniel.rei.impl.client.gui.modules.Menu; import me.shedaniel.rei.impl.client.gui.modules.entries.GameModeMenuEntry; @@ -66,12 +64,10 @@ import me.shedaniel.rei.impl.client.gui.modules.entries.WeatherMenuEntry; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.widget.EntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.FavoritesListWidget; -import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; -import me.shedaniel.rei.impl.client.REIHelperImpl; +import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.common.util.Weather; -import me.shedaniel.rei.impl.client.ClientHelperImpl; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.events.ContainerEventHandler; @@ -83,9 +79,8 @@ import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.locale.Language; +import net.minecraft.network.chat.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.util.FormattedCharSequence; @@ -100,6 +95,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.stream.Collectors; @ApiStatus.Internal public class ContainerScreenOverlay extends REIOverlay { @@ -134,16 +130,16 @@ public class ContainerScreenOverlay extends REIOverlay { } private static class OverlayMenu { - private UUID uuid; - private Menu menu; - private Widget wrappedMenu; - private Predicate inBounds; + private UUID uuid; + private Menu menu; + private Widget wrappedMenu; + private Predicate inBounds; - public OverlayMenu(UUID uuid, Menu menu, Widget wrappedMenu, Predicate inBounds) { + public OverlayMenu(UUID uuid, Menu menu, Widget wrappedMenu, Predicate or, Predicate and) { this.uuid = uuid; this.menu = menu; this.wrappedMenu = wrappedMenu; - this.inBounds = inBounds.or(point -> menu.getBounds().contains(point)); + this.inBounds = or.or(point -> menu.getBounds().contains(point)).and(and); } } @@ -172,8 +168,11 @@ public class ContainerScreenOverlay extends REIOverlay { } } - public void openMenu(UUID uuid, Menu menu, Predicate inPoint) { - this.overlayMenu = new OverlayMenu(uuid, menu, Widgets.withTranslate(menu, 0, 0, 400), inPoint); + public void openMenu(UUID uuid, Menu menu) { + openMenu(uuid, menu, point -> false, point -> true); + } + public void openMenu(UUID uuid, Menu menu, Predicate or, Predicate and) { + this.overlayMenu = new OverlayMenu(uuid, menu, Widgets.withTranslate(menu, 0, 0, 400), or, and); } @ApiStatus.Internal @@ -204,34 +203,7 @@ public class ContainerScreenOverlay extends REIOverlay { } private static Iterable buildWidgetsTree(Iterable listeners, Class type) { - return () -> new AbstractIterator() { - Stack> stack; - - { - stack = new Stack<>(); - stack.push(listeners.iterator()); - } - - @Override - protected T computeNext() { - while (!stack.empty()) { - Iterator peek = stack.peek(); - GuiEventListener listener = peek.next(); - if (!peek.hasNext()) - stack.pop(); - if (type.isInstance(listener)) { - return (T) listener; - } - if (listener instanceof ContainerEventHandler) { - List children = ((ContainerEventHandler) listener).children(); - if (!children.isEmpty()) { - stack.push(children.iterator()); - } - } - } - return endOfData(); - } - }; + return Widgets.walk(listeners, type::isInstance); } public void init(boolean useless) { @@ -305,7 +277,7 @@ public class ContainerScreenOverlay extends REIOverlay { .focusable(false) .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)) .tooltipSupplier(button -> { - List tooltips =new ArrayList<>(); + List tooltips = new ArrayList<>(); tooltips.add(new TranslatableComponent("text.rei.config_tooltip")); tooltips.add(new ImmutableTextComponent(" ")); if (!ClientHelper.getInstance().isCheating()) @@ -340,7 +312,7 @@ public class ContainerScreenOverlay extends REIOverlay { CollectionUtils.map(GameType.values(), GameModeMenuEntry::new)); if (ConfigObject.getInstance().isLeftHandSidePanel()) menu.menuStartPoint.x -= menu.getBounds().width - button.getBounds().width; - openMenu(Menu.GAME_TYPE, menu, point -> button.isFocused() && button.containsMouse(PointHelper.ofMouse())); + openMenu(Menu.GAME_TYPE, menu, point -> button.isFocused() && button.containsMouse(PointHelper.ofMouse()), point -> true); } else { closeOverlayMenu(); } @@ -363,7 +335,7 @@ public class ContainerScreenOverlay extends REIOverlay { CollectionUtils.map(Weather.values(), WeatherMenuEntry::new)); if (ConfigObject.getInstance().isLeftHandSidePanel()) menu.menuStartPoint.x -= menu.getBounds().width - button.getBounds().width; - openMenu(Menu.WEATHER, menu, point -> button.isFocused() && button.containsMouse(PointHelper.ofMouse())); + openMenu(Menu.WEATHER, menu, point -> button.isFocused() && button.containsMouse(PointHelper.ofMouse()), point -> true); } else { closeOverlayMenu(); } @@ -384,7 +356,7 @@ public class ContainerScreenOverlay extends REIOverlay { widgets.add(InternalWidgets.wrapLateRenderable(Widgets.withTranslate(Widgets.createButton(subsetsButtonBounds, ClientHelperImpl.getInstance().isAprilFools.get() ? new TranslatableComponent("text.rei.tiny_potato") : new TranslatableComponent("text.rei.subsets")) .onClick(button -> { proceedOpenMenuOrElse(Menu.SUBSETS, () -> { - openMenu(Menu.SUBSETS, Menu.createSubsetsMenuFromRegistry(new Point(subsetsButtonBounds.x, subsetsButtonBounds.getMaxY())), point -> true); + openMenu(Menu.SUBSETS, Menu.createSubsetsMenuFromRegistry(new Point(subsetsButtonBounds.x, subsetsButtonBounds.getMaxY())), point -> true, point -> true); }, menu -> { closeOverlayMenu(); }); @@ -592,10 +564,14 @@ public class ContainerScreenOverlay extends REIOverlay { widget.render(matrices, mouseX, mouseY, delta); } if (overlayMenu != null) { - if (overlayMenu.wrappedMenu.containsMouse(mouseX, mouseY)) { - TOOLTIPS.clear(); + if (!overlayMenu.inBounds.test(PointHelper.ofMouse())) { + closeOverlayMenu(); + } else { + if (overlayMenu.wrappedMenu.containsMouse(mouseX, mouseY)) { + TOOLTIPS.clear(); + } + overlayMenu.wrappedMenu.render(matrices, mouseX, mouseY, delta); } - overlayMenu.wrappedMenu.render(matrices, mouseX, mouseY, delta); } } Screen currentScreen = Minecraft.getInstance().screen; @@ -615,19 +591,23 @@ public class ContainerScreenOverlay extends REIOverlay { } public void renderTooltip(PoseStack matrices, Tooltip tooltip) { - renderTooltip(matrices, tooltip.getText(), tooltip.getX(), tooltip.getY()); + renderTooltip(matrices, tooltip.getText().stream() + .flatMap(component -> Minecraft.getInstance().font.getSplitter().splitLines(component, 100000, Style.EMPTY).stream()) + .collect(Collectors.toList()), tooltip.getX(), tooltip.getY()); } - public void renderTooltip(PoseStack matrices, List lines, int mouseX, int mouseY) { - if (lines.isEmpty()) + public void renderTooltip(PoseStack matrices, List lines, int mouseX, int mouseY) { + if (lines.isEmpty()) { return; - List orderedTexts = CollectionUtils.map(lines, Component::getVisualOrderText); + } + List orderedTexts = CollectionUtils.map(lines, Language.getInstance()::getVisualOrder); renderTooltipInner(matrices, orderedTexts, mouseX, mouseY); } public void renderTooltipInner(PoseStack matrices, List lines, int mouseX, int mouseY) { - if (lines.isEmpty()) + if (lines.isEmpty()) { return; + } matrices.pushPose(); matrices.translate(0, 0, 500); minecraft.screen.renderTooltip(matrices, lines, mouseX, mouseY); @@ -706,8 +686,9 @@ public class ContainerScreenOverlay extends REIOverlay { return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) + if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget(); if (favoritesListWidget != null) @@ -759,8 +740,9 @@ public class ContainerScreenOverlay extends REIOverlay { return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) + if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ContainerScreenOverlay.getFavoritesListWidget(); if (favoritesListWidget != null) @@ -778,8 +760,6 @@ public class ContainerScreenOverlay extends REIOverlay { this.setDragging(true); REIHelperImpl.getSearchField().setFocused(false); return true; - } else if (!overlayMenu.inBounds.test(new Point(mouseX, mouseY))) { - closeOverlayMenu(); } } if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java index 3b78ed463..83fe328da 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java @@ -29,9 +29,9 @@ import me.shedaniel.architectury.platform.Platform; import me.shedaniel.clothconfig2.impl.EasingMethod; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.client.gui.screen.TransformingScreen; import me.shedaniel.rei.impl.client.gui.credits.CreditsEntryListWidget.TextCreditsItem; import me.shedaniel.rei.impl.client.gui.credits.CreditsEntryListWidget.TranslationCreditsItem; +import me.shedaniel.rei.impl.client.gui.screen.TransformingScreen; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java index 0572c394c..4fdbf4976 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java @@ -33,8 +33,8 @@ import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitor; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.common.util.Animator; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; -import me.shedaniel.rei.impl.common.util.Animator; import net.minecraft.client.gui.components.events.GuiEventListener; import org.jetbrains.annotations.Nullable; @@ -55,17 +55,28 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (entry != null && entry.dragging) { + if (entry != null) { + if (!entry.dragging) { + Point startPoint = entry.start; + double xDistance = Math.abs(startPoint.x - mouseX); + double yDistance = Math.abs(startPoint.y - mouseY); + double requiredDistance = 8; + + if (xDistance * xDistance + yDistance * yDistance > requiredDistance * requiredDistance) { + entry.dragging = true; + entry.stack.drag(); + } + } if (!RoughlyEnoughItemsCore.isLeftMousePressed) { drop(); - return; + } else if (entry.dragging) { + matrices.pushPose(); + matrices.translate(0, 0, 600); + entry.stack.render(matrices, new Rectangle(mouseX - 8, mouseY - 8, 16, 16), mouseX, mouseY, delta); + matrices.popPose(); } - matrices.pushPose(); - matrices.translate(0, 0, 600); - entry.stack.render(matrices, new Rectangle(mouseX - 8, mouseY - 8, 16, 16), mouseX, mouseY, delta); - matrices.popPose(); } - + Iterator iterator = backToOriginals.iterator(); while (iterator.hasNext()) { RenderBackEntry renderBackEntry = iterator.next(); @@ -92,7 +103,6 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag DraggableStack hoveredStack = provider.getHoveredStack(this, mouseX, mouseY); if (hoveredStack != null) { entry = new DraggableEntry(hoveredStack, new Point(mouseX, mouseY)); - return true; } return false; } @@ -104,19 +114,7 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag @Override public boolean mouseDragged(double mouseX1, double mouseY1, int button, double mouseX2, double mouseY2) { - if (entry != null && !entry.dragging) { - Point startPoint = entry.start; - double xDistance = Math.abs(startPoint.x - mouseX1); - double yDistance = Math.abs(startPoint.y - mouseY1); - double requiredDistance = 4; - - if (xDistance * xDistance + yDistance * yDistance > requiredDistance * requiredDistance) { - entry.dragging = true; - entry.stack.drag(); - } - } - - return entry != null; + return entry != null && entry.dragging; } private boolean drop() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java index 97ced4515..227da3407 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java @@ -38,8 +38,8 @@ import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.subsets.SubsetsRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.gui.modules.entries.EntryStackSubsetsMenuEntry; import me.shedaniel.rei.impl.client.gui.modules.entries.SubSubsetsMenuEntry; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java index 787d1f655..74174d60f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EntryStackSubsetsMenuEntry.java @@ -32,12 +32,12 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.gui.modules.Menu; import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; -import me.shedaniel.rei.impl.client.REIHelperImpl; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.sounds.SoundEvents; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java index 23750529a..4a33aa7d6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubSubsetsMenuEntry.java @@ -35,11 +35,11 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.gui.modules.Menu; import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; import me.shedaniel.rei.impl.client.gui.widget.TabWidget; -import me.shedaniel.rei.impl.client.REIHelperImpl; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.sounds.SimpleSoundInstance; 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 91516febf..05230cbe5 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 @@ -27,15 +27,15 @@ import com.google.common.collect.Lists; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.gui.chat.NarratorChatListener; -import net.minecraft.client.gui.components.events.ContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; @@ -123,18 +123,13 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Rec private static void transformNotice(int marker, List setupDisplay, EntryStack noticeStack) { if (noticeStack.isEmpty()) return; - for (GuiEventListener widget : setupDisplay) { - if (widget instanceof EntryWidget) { - EntryWidget entry = (EntryWidget) widget; - if (entry.getNoticeMark() == marker && entry.getEntries().size() > 1) { - EntryStack stack = CollectionUtils.findFirstOrNullEqualsExact(entry.getEntries(), noticeStack); - if (stack != null) { - entry.clearStacks(); - entry.entry(stack); - } + 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); } - } else if (widget instanceof ContainerEventHandler) { - transformNotice(marker, ((ContainerEventHandler) widget).children(), noticeStack); } } } 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 a7c3e8488..619b9ab7a 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 @@ -47,10 +47,10 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.impl.client.gui.widget.TabWidget; -import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; -import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.impl.client.REIHelperImpl; +import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; +import me.shedaniel.rei.impl.client.gui.widget.TabWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.events.GuiEventListener; 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 a7edb3630..915e85be6 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 @@ -50,13 +50,13 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; +import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.impl.client.REIHelperImpl; import me.shedaniel.rei.impl.client.gui.RecipeDisplayExporter; import me.shedaniel.rei.impl.client.gui.widget.DefaultDisplayChoosePageWidget; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.client.gui.widget.TabWidget; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; -import me.shedaniel.rei.impl.client.REIHelperImpl; -import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.impl.client.gui.widget.TabWidget; import me.shedaniel.rei.impl.client.gui.widget.basewidgets.PanelWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java index eeed0018a..5c9bb0863 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java @@ -27,7 +27,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.ScissorsScreen; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.impl.client.gui.screen.DelegateScreen; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java index 4e3ea4fa6..31ebbf260 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java @@ -40,8 +40,8 @@ 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.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.common.util.Animator; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.common.util.Animator; import me.shedaniel.rei.impl.ClientInternals; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -79,7 +79,7 @@ public class UncertainDisplayViewingScreen extends Screen { private Widget slider; private boolean showTips; private Animator scroll = new Animator(); - private List allModsUsingJEI = new ArrayList<>(); + private List allModsUsingJEI = null; public UncertainDisplayViewingScreen(Screen parent, DisplayScreenType type, boolean showTips, BooleanConsumer callback) { super(ImmutableTextComponent.EMPTY); 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 e696e7fe5..5d4917fba 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 @@ -47,12 +47,12 @@ 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.entry.renderer.BatchEntryRenderer; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.gui.config.EntryPanelOrdering; 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.entry.renderer.BatchEntryRenderer; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; @@ -61,12 +61,12 @@ import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; 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 f0cad1fb0..ec4cb12e1 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 @@ -42,8 +42,8 @@ import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.REIHelperImpl; +import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.TextComponent; 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 434893624..fbdee9dda 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 @@ -41,6 +41,7 @@ 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.entry.renderer.BatchEntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; @@ -52,17 +53,16 @@ import me.shedaniel.rei.api.client.gui.drag.DraggingContext; 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.entry.renderer.BatchEntryRenderer; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.Animator; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; +import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import me.shedaniel.rei.impl.client.gui.ContainerScreenOverlay; import me.shedaniel.rei.impl.client.gui.modules.Menu; import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; -import me.shedaniel.rei.impl.common.util.Animator; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; @@ -150,34 +150,10 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override @Nullable public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { - Function apply = entry -> new DraggableStack() { - private FavoriteEntry favoriteEntry = entry.getEntry(); - private EntryStack stack = ClientEntryStacks.of(favoriteEntry.getRenderer(false)).copy(); - - @Override - public EntryStack getStack() { - return stack; - } - - @Override - public void drag() { - entries.remove(entry.hashIgnoreAmount()); - applyNewFavorites(entries.values().stream() - .map(Entry::getEntry) - .collect(Collectors.toList())); - } - - @Override - public void release(boolean accepted) { - if (!accepted) { - drop(entry, this, favoriteEntry); - } - } - }; if (innerBounds.contains(mouseX, mouseY)) { for (Entry entry : entries.values()) { if (entry.getWidget().containsMouse(mouseX, mouseY)) { - return apply.apply(entry); + return new FavoriteDraggableStack(entry); } } } @@ -188,7 +164,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt if (widget.containsMouse(mouseX, mouseY)) { Entry entry = new Entry(widget.entry.copy(), entrySize()); entry.size.setAs(entrySize() * 100); - return apply.apply(entry); + return new FavoriteDraggableStack(entry); } } } @@ -197,6 +173,38 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt return null; } + public class FavoriteDraggableStack implements DraggableStack { + private Entry entry; + private FavoriteEntry favoriteEntry; + private EntryStack stack; + + public FavoriteDraggableStack(Entry entry) { + this.entry = entry; + this.favoriteEntry = entry.getEntry(); + this.stack = ClientEntryStacks.of(favoriteEntry.getRenderer(false)).copy(); + } + + @Override + public EntryStack getStack() { + return stack; + } + + @Override + public void drag() { + entries.remove(entry.hashIgnoreAmount()); + applyNewFavorites(entries.values().stream() + .map(Entry::getEntry) + .collect(Collectors.toList())); + } + + @Override + public void release(boolean accepted) { + if (!accepted) { + drop(entry, this, favoriteEntry); + } + } + } + @Override public Optional visitDraggedStack(DraggableStack stack) { if (innerBounds.contains(PointHelper.ofMouse())) { @@ -206,7 +214,8 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } private void acceptDraggedStack(DraggableStack stack) { - FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack.getStack().copy()); + FavoriteEntry favoriteEntry = stack instanceof FavoriteDraggableStack ? ((FavoriteDraggableStack) stack).favoriteEntry.copy() + : FavoriteEntry.fromEntryStack(stack.getStack().copy()); Entry entry = new Entry(favoriteEntry, entrySize()); entry.size.setAs(entrySize() * 100); drop(entry, stack, favoriteEntry); @@ -456,7 +465,11 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt int newIndex = contains ? getReleaseIndex() : Iterables.indexOf(entries.values(), e -> e == entry); if (entries.size() - 1 <= newIndex) { - this.entries.remove(entry.hashIgnoreAmount()); + Entry remove = this.entries.remove(entry.hashIgnoreAmount()); + if (remove != null) { + remove.remove(); + this.removedEntries.put(remove.hashIgnoreAmount(), remove); + } this.entries.put(entry.hashIgnoreAmount(), entry); } else { Int2ObjectMap prevEntries = new Int2ObjectLinkedOpenHashMap<>(entries); @@ -464,11 +477,11 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt int index = 0; for (Int2ObjectMap.Entry entryEntry : prevEntries.int2ObjectEntrySet()) { - if (index == newIndex) + if (index == newIndex) { this.entries.put(entry.hashIgnoreAmount(), entry); + } if (entryEntry.getIntKey() != entry.hashIgnoreAmount()) { this.entries.put(entryEntry.getIntKey(), entryEntry.getValue()); - index++; } } @@ -529,7 +542,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt if (!hidden) { this.hidden = true; if (!ConfigObject.getInstance().isFavoritesAnimated()) this.size.setAs(0); - else this.size.setTo(0, 300); + else this.size.setTo(0, 1000); } } @@ -647,9 +660,10 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt entry.setZ(z); } })); - if (ConfigObject.getInstance().isLeftHandSidePanel()) + if (ConfigObject.getInstance().isLeftHandSidePanel()) { menu.menuStartPoint.x -= menu.getBounds().width - getBounds().width; - overlay.openMenu(uuid, menu, this::containsMouse); + } + overlay.openMenu(uuid, menu, this::containsMouse, point -> entries.containsKey(entry.hashIgnoreAmount()) && !removedEntries.containsKey(entry.hashIgnoreAmount())); } else { overlay.closeOverlayMenu(); } @@ -665,45 +679,80 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } } - public static class ToggleAddFavoritePanelButton extends WidgetWithBounds { - private final FavoritesListWidget widget; + public static class ToggleAddFavoritePanelButton extends FadingFavoritePanelButton { + public ToggleAddFavoritePanelButton(FavoritesListWidget widget) { + super(widget); + } + + @Override + protected void onClick() { + widget.favoritePanel.expendState.setTo(widget.favoritePanel.expendState.target() == 1 ? 0 : 1, 1500); + widget.favoritePanel.resetRows(); + } + + @Override + protected void queueTooltip() { + Tooltip.create(new TranslatableComponent("text.rei.add_favorite_widget")).queue(); + } + + @Override + protected Rectangle updateArea(Rectangle fullArea) { + return new Rectangle(fullArea.x + 4, fullArea.getMaxY() - 16 - 4, 16, 16); + } + + @Override + protected boolean isAvailable(int mouseX, int mouseY) { + float expendProgress = widget.favoritePanel.expendState.floatValue(); + return widget.fullBounds.contains(mouseX, mouseY) || expendProgress > .1f; + } + + @Override + protected void renderButtonText(PoseStack matrices, MultiBufferSource.BufferSource bufferSource) { + float expendProgress = widget.favoritePanel.expendState.floatValue(); + if (expendProgress < .9f) { + int textColor = 0xFFFFFF | (Math.round(0xef * alpha.floatValue() * (1 - expendProgress)) << 24); + font.drawInBatch("+", bounds.getCenterX() - 2.5f, bounds.getCenterY() - 3, textColor, false, matrices.last().pose(), bufferSource, false, 0, 15728880); + } + if (expendProgress > .1f) { + int textColor = 0xFFFFFF | (Math.round(0xef * alpha.floatValue() * expendProgress) << 24); + font.drawInBatch("-", bounds.getCenterX() - 2.5f, bounds.getCenterY() - 3, textColor, false, matrices.last().pose(), bufferSource, false, 0, 15728880); + } + } + } + public abstract static class FadingFavoritePanelButton extends WidgetWithBounds { + protected final FavoritesListWidget widget; public boolean wasClicked = false; public final Animator alpha = new Animator(0); public final Rectangle bounds = new Rectangle(); - public ToggleAddFavoritePanelButton(FavoritesListWidget widget) { + public FadingFavoritePanelButton(FavoritesListWidget widget) { this.widget = widget; } @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - float expendProgress = widget.favoritePanel.expendState.floatValue(); - this.bounds.setBounds(updateAddFavoriteButtonArea(widget.fullBounds)); - - boolean isHoveringAddFavoriteButton = containsMouse(mouseX, mouseY); - this.alpha.setTo(isHoveringAddFavoriteButton ? 1f : widget.fullBounds.contains(mouseX, mouseY) || expendProgress > .1f ? 0.3f : 0f, 260); + this.bounds.setBounds(updateArea(widget.fullBounds)); + boolean hovered = containsMouse(mouseX, mouseY); + this.alpha.setTo(hovered ? 1f : isAvailable(mouseX, mouseY) ? 0.3f : 0f, 260); this.alpha.update(delta); int buttonColor = 0xFFFFFF | (Math.round(0x34 * alpha.floatValue()) << 24); fillGradient(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), buttonColor, buttonColor); if (isVisible()) { MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); - if (expendProgress < .9f) { - int textColor = 0xFFFFFF | (Math.round(0xef * alpha.floatValue() * (1 - expendProgress)) << 24); - font.drawInBatch("+", bounds.getCenterX() - 2.5f, bounds.getCenterY() - 3, textColor, false, matrices.last().pose(), bufferSource, false, 0, 15728880); - } - if (expendProgress > .1f) { - int textColor = 0xFFFFFF | (Math.round(0xef * alpha.floatValue() * expendProgress) << 24); - font.drawInBatch("-", bounds.getCenterX() - 2.5f, bounds.getCenterY() - 3, textColor, false, matrices.last().pose(), bufferSource, false, 0, 15728880); - } + renderButtonText(matrices, bufferSource); bufferSource.endBatch(); } - if (isHoveringAddFavoriteButton) { - Tooltip.create(new TranslatableComponent("text.rei.add_favorite_widget")).queue(); + if (hovered) { + queueTooltip(); } } - @Override + protected abstract boolean isAvailable(int mouseX, int mouseY); + + protected abstract void renderButtonText(PoseStack matrices, MultiBufferSource.BufferSource bufferSource); + + @Override public Rectangle getBounds() { return bounds; } @@ -712,14 +761,10 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt return Math.round(0x12 * alpha.floatValue()) > 0; } - private Rectangle updateAddFavoriteButtonArea(Rectangle fullArea) { - return new Rectangle(fullArea.x + 4, fullArea.getMaxY() - 16 - 4, 16, 16); - } - protected boolean wasClicked() { - boolean b = this.wasClicked; + boolean tmp = this.wasClicked; this.wasClicked = false; - return b; + return tmp; } @Override @@ -729,20 +774,25 @@ public class FavoritesListWidget extends WidgetWithBounds implements