diff options
22 files changed, 258 insertions, 61 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java b/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java index 27707d21a..efbe5aca1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java @@ -157,7 +157,7 @@ public interface ConfigObject { boolean isLowerConfigButton(); - @ApiStatus.Experimental + @Deprecated(forRemoval = true) List<FavoriteEntry> getFavoriteEntries(); @ApiStatus.Experimental diff --git a/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java b/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java index d3e54425f..35a5e8f96 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java @@ -68,15 +68,27 @@ public interface FavoriteEntryType<T extends FavoriteEntry> { Iterable<Section> sections(); + /** + * @deprecated {@link FavoriteEntryType.Section#add(boolean, FavoriteEntry...)} + */ + @Deprecated(forRemoval = true) <A extends FavoriteEntry> void registerSystemFavorites(SystemFavoriteEntryProvider<A> provider); } @ApiStatus.NonExtendable interface Section { - void add(FavoriteEntry... entries); + default void add(FavoriteEntry... entries) { + add(false, entries); + } + + @ApiStatus.Experimental + void add(boolean defaultFavorited, FavoriteEntry... entries); Component getText(); List<FavoriteEntry> getEntries(); + + @ApiStatus.Experimental + List<FavoriteEntry> getDefaultEntries(); } } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/favorites/SystemFavoriteEntryProvider.java b/api/src/main/java/me/shedaniel/rei/api/client/favorites/SystemFavoriteEntryProvider.java index bc450317a..2d2dffea3 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/favorites/SystemFavoriteEntryProvider.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/favorites/SystemFavoriteEntryProvider.java @@ -27,8 +27,12 @@ import org.jetbrains.annotations.ApiStatus; import java.util.List; +/** + * @deprecated {@link FavoriteEntryType.Section#add(boolean, FavoriteEntry...)} + */ @FunctionalInterface @ApiStatus.Experimental +@Deprecated(forRemoval = true) public interface SystemFavoriteEntryProvider<T extends FavoriteEntry> { List<T> provide(); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java index bfb63808d..55f50e2b3 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java @@ -36,6 +36,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Supplier; @@ -129,6 +130,8 @@ public interface TransferHandler extends Comparable<TransferHandler> { @ApiStatus.Experimental Result overrideTooltipRenderer(BiConsumer<Point, TooltipSink> renderer); + Result tooltip(Component component); + /** * @return whether this handler has successfully handled the transfer. */ @@ -209,6 +212,7 @@ public interface TransferHandler extends Comparable<TransferHandler> { final class ResultImpl implements Result { private boolean successful, applicable, returningToScreen, blocking; private Component error; + private List<Component> tooltips = new ArrayList<>(); private TransferHandlerRenderer renderer; private BiConsumer<Point, TooltipSink> tooltipRenderer; private int color; @@ -264,6 +268,12 @@ public interface TransferHandler extends Comparable<TransferHandler> { } @Override + public Result tooltip(Component component) { + this.tooltips.add(component); + return this; + } + + @Override public boolean isSuccessful() { return successful; } @@ -300,8 +310,12 @@ public interface TransferHandler extends Comparable<TransferHandler> { @Override public void fillTooltip(List<Component> components) { - if (!isSuccessful() && isApplicable()) { - components.add(getError()); + if (isApplicable()) { + if (isSuccessful()) { + components.addAll(tooltips); + } else { + components.add(getError()); + } } } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java index a22a4df40..0b6bab7ee 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -349,7 +349,7 @@ public class DefaultClientPlugin implements REIClientPlugin, BuiltinClientPlugin public void registerFavorites(FavoriteEntryType.Registry registry) { registry.register(GameModeFavoriteEntry.ID, GameModeFavoriteEntry.Type.INSTANCE); registry.getOrCrateSection(Component.translatable(GameModeFavoriteEntry.TRANSLATION_KEY)) - .add(Stream.concat( + .add(true, Stream.concat( Arrays.stream(GameType.values()) .filter(type -> type.getId() >= 0), Stream.of((GameType) null) diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java index ed3614f1d..2537b44df 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java @@ -167,7 +167,7 @@ public class GameModeFavoriteEntry extends FavoriteEntry { @Override public long hashIgnoreAmount() { - return gameMode == null ? -1 : gameMode.ordinal(); + return gameMode == null ? 31290831290L : gameMode.ordinal(); } @Override diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java index d03e88797..a390af657 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java @@ -201,7 +201,7 @@ public class TimeFavoriteEntry extends FavoriteEntry { @Override public long hashIgnoreAmount() { - return time == null ? -1 : time.ordinal(); + return time == null ? 31290831290L : time.ordinal(); } @Override diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java index fceb2a973..65286cad5 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java @@ -175,7 +175,7 @@ public class WeatherFavoriteEntry extends FavoriteEntry { @Override public long hashIgnoreAmount() { - return weather == null ? -1 : weather.ordinal(); + return weather == null ? 31290831290L : weather.ordinal(); } @Override diff --git a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java index a9b808e0e..03a697957 100644 --- a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java +++ b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java @@ -26,6 +26,7 @@ package me.shedaniel.rei.impl.client.gui.fabric; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; diff --git a/forge/build.gradle b/forge/build.gradle index 0f1dd4ebf..cde58082d 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -24,6 +24,7 @@ processResources { repositories { maven { url "https://www.cursemaven.com" } + maven { url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven" } maven { name "Modmaven" url "https://modmaven.dev/" @@ -90,10 +91,11 @@ dependencies { // modRuntime("curse.maven:mekanism-generators-268566:3743837") // modRuntime("curse.maven:immersive-engineering-231951:3721708") // modRuntime("curse.maven:autoreglib-250363:3326041") - // modRuntime("curse.maven:ars-nouveau-401955:3619899") - // modRuntime("curse.maven:patchouli-306770:3594394") - // modRuntime("curse.maven:curios-309927:3613028") - // modRuntime("curse.maven:geckolib-388172:3627502") + modRuntime("curse.maven:ars-nouveau-401955:3814106") + modRuntime("curse.maven:patchouli-306770:3809917") + modRuntime("curse.maven:curios-309927:3748873") + modRuntime("software.bernie.geckolib:geckolib-1.18-forge:3.0.22") + modRuntime("curse.maven:little-logistics-570050:3818773") // modRuntime("curse.maven:refined-storage-243076:3623324") // modRuntime("appeng:appliedenergistics2:10.0.1") // modRuntime("curse.maven:tcon-74072:3784732") 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 d7cccd915..f2f9ad795 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 @@ -272,9 +272,6 @@ public class ConfigManagerImpl implements ConfigManager { @Override public void saveConfig() { - if (getConfig().getFavoriteEntries() != null) { - getConfig().getFavoriteEntries().removeIf(Objects::isNull); - } if (getConfig().getFilteringRules().stream().noneMatch(filteringRule -> filteringRule instanceof ManualFilteringRule)) { getConfig().getFilteringRules().add(new ManualFilteringRule()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index 28f45277b..0bfa01856 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -369,6 +369,10 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Override public List<FavoriteEntry> getFavoriteEntries() { return basics.favorites; + } + + public List<FavoriteEntry> getHiddenFavoriteEntries() { + return basics.hiddenFavorites; } @Override @@ -526,6 +530,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { public static class Basics { @ConfigEntry.Gui.Excluded public List<FavoriteEntry> favorites = new ArrayList<>(); + @ConfigEntry.Gui.Excluded public List<FavoriteEntry> hiddenFavorites = new ArrayList<>(); @Comment("Declares whether cheating mode is on.") @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private CheatingMode cheating = CheatingMode.OFF; private boolean favoritesEnabled = true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java index 82439dd62..45e598625 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java @@ -34,6 +34,8 @@ import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.favorites.SystemFavoriteEntryProvider; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.apache.commons.lang3.mutable.MutableLong; @@ -113,8 +115,8 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry @Override public void endReload() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - List<FavoriteEntry> favorites = ConfigObject.getInstance().getFavoriteEntries(); - favorites.removeIf(FavoriteEntry::isInvalid); + ConfigObject.getInstance().getFavoriteEntries().removeIf(FavoriteEntry::isInvalid); + ConfigManagerImpl.getInstance().getConfig().getHiddenFavoriteEntries().removeIf(FavoriteEntry::isInvalid); ConfigManager.getInstance().saveConfig(); } @@ -122,15 +124,16 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry private static class SectionImpl implements FavoriteEntryType.Section { private final Component text; - private final List<FavoriteEntry> entries = new ArrayList<>(); + private final List<CompoundEntry> entries = new ArrayList<>(); public SectionImpl(Component text) { this.text = text; } @Override - public void add(FavoriteEntry... entries) { - Collections.addAll(this.entries, entries); + public void add(boolean defaultFavorited, FavoriteEntry... entries) { + this.entries.addAll(CollectionUtils.map(entries, + entry -> new CompoundEntry(entry, defaultFavorited))); } @Override @@ -140,7 +143,14 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry @Override public List<FavoriteEntry> getEntries() { - return entries; + return CollectionUtils.map(entries, CompoundEntry::entry); } + + @Override + public List<FavoriteEntry> getDefaultEntries() { + return CollectionUtils.filterAndMap(entries, CompoundEntry::defaultFavorited, CompoundEntry::entry); + } + + public record CompoundEntry(FavoriteEntry entry, boolean defaultFavorited) {} } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java index 9895def4f..755d303df 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java @@ -67,7 +67,7 @@ public final class RecipeDisplayExporter extends Widget { Collection<ResourceLocation> locations = display.provideInternalDisplayIds(); String string = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date()); if (!locations.isEmpty()) { - string = locations.iterator().next().toString().replace('/', '_'); + string = locations.iterator().next().toString().replace('/', '_').replace(':', '_'); } int i = 1; @@ -114,7 +114,7 @@ public final class RecipeDisplayExporter extends Widget { } Util.ioPool().execute(() -> { try { - File export = new File(minecraft.gameDirectory, "rei_exports/" + display.provideInternalDisplay().getCategoryIdentifier().toString().replace('/', '_')); + File export = new File(minecraft.gameDirectory, "rei_exports/" + display.provideInternalDisplay().getCategoryIdentifier().toString().replace('/', '_').replace(':', '_')); export.mkdirs(); strippedImage.writeToFile(getExportFilename(display, export)); } catch (IOException e) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index 6f3d20eb5..20072ec30 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -72,6 +72,7 @@ import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListSearchManager; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.common.util.Weather; @@ -802,12 +803,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - ConfigManager.getInstance().saveConfig(); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) - favoritesListWidget.updateSearch(); + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); return true; } } @@ -876,12 +872,7 @@ public class ScreenOverlayImpl extends ScreenOverlay { return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - ConfigManager.getInstance().saveConfig(); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) - favoritesListWidget.updateSearch(); + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); return true; } } 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 90bad862f..2b5809e86 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 @@ -25,6 +25,7 @@ package me.shedaniel.rei.impl.client.gui.screen; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.math.Matrix4f; import dev.architectury.fluid.FluidStack; import me.shedaniel.math.Rectangle; @@ -252,7 +253,7 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis public int getHeight() { int entrySize = EntryListWidget.entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); - int height = Mth.ceil(widget.getEntries().size() / (float) w) * entrySize + 2; + int height = Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize + 2; height += 12; if (widget.tagMatch != null) height += 12; return height; @@ -279,8 +280,16 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis for (EntryStack<?> entry : widget.getEntries()) { int x1 = x + (i % w) * entrySize; int y1 = y + 13 + (i / w) * entrySize; - entry.render(poses, new Rectangle(x1, y1, entrySize, entrySize), -1000, -1000, 0); i++; + if (i / w > 5) { + MultiBufferSource.BufferSource source = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); + Component text = Component.literal("+" + (widget.getEntries().size() - w * 6 + 1)).withStyle(ChatFormatting.GRAY); + font.drawInBatch(text, x1 + entrySize / 2 - font.width(text) / 2, y1 + entrySize / 2 - 1, -1, true, poses.last().pose(), source, false, 0, 15728880); + source.endBatch(); + break; + } else { + entry.render(poses, new Rectangle(x1, y1, entrySize, entrySize), -1000, -1000, 0); + } } poses.popPose(); } @@ -295,7 +304,7 @@ public abstract class AbstractDisplayViewingScreen extends Screen implements Dis int w = Math.max(1, MAX_WIDTH / entrySize); font.drawInBatch(Component.translatable("text.rei.tag_accept", widget.tagMatch.toString()) .withStyle(ChatFormatting.GRAY), - x, y + 16 + Mth.ceil(widget.getEntries().size() / (float) entrySize) * entrySize, + x, y + 16 + Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize, -1, true, pose, buffers, false, 0, 15728880); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java index b9658ff55..a56666c9c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java @@ -94,6 +94,7 @@ public class AutoCraftingEvaluator { } List<TransferHandler.Result> errors = new ArrayList<>(); + TransferHandler.Result successfulResult = null; TransferHandler.Context context = TransferHandler.Context.create(actuallyCrafting, stackedCrafting, containerScreen, display); for (TransferHandler transferHandler : TransferHandlerRegistry.getInstance()) { @@ -125,6 +126,7 @@ public class AutoCraftingEvaluator { if (transferResult.isSuccessful()) { errors.clear(); + successfulResult = transferResult; result.successful = true; result.successfulHandler = transferHandler; break; @@ -150,6 +152,10 @@ public class AutoCraftingEvaluator { if (errors.isEmpty()) { errorTooltip.clear(); errorTooltip.add(Component.translatable("text.auto_craft.move_items")); + + if (successfulResult != null) { + successfulResult.fillTooltip(errorTooltip); + } } else { errorTooltip.clear(); List<Component> tooltipsFilled = new ArrayList<>(); 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 61f915bf1..9bc1b55c4 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 @@ -52,6 +52,7 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.view.ViewsImpl; import net.minecraft.ChatFormatting; @@ -430,6 +431,24 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { } } + if (tooltip != null) { + if (interactableFavorites && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) { + String name = ConfigObject.getInstance().getFavoriteKeyCode().getLocalizedName().getString(); + if (reverseFavoritesAction()) + tooltip.addAllTexts(Stream.of(I18n.get("text.rei.remove_favorites_tooltip", name).split("\n")) + .map(TextComponent::new).collect(Collectors.toList())); + else + tooltip.addAllTexts(Stream.of(I18n.get("text.rei.favorites_tooltip", name).split("\n")) + .map(TextComponent::new).collect(Collectors.toList())); + } + + if (tooltipProcessors != null) { + for (UnaryOperator<Tooltip> processor : tooltipProcessors) { + tooltip = processor.apply(tooltip); + } + } + } + return tooltip; } @@ -510,11 +529,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { if (keyCode.matchesMouse(button)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { - if (reverseFavoritesAction()) - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - else { - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + if (reverseFavoritesAction()) { + FavoritesEntriesManager.INSTANCE.remove(favoriteEntry); + } else { + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); @@ -593,11 +611,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { - if (reverseFavoritesAction()) - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - else { - ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + if (reverseFavoritesAction()) { + FavoritesEntriesManager.INSTANCE.remove(favoriteEntry); + } else { + FavoritesEntriesManager.INSTANCE.add(favoriteEntry); } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java new file mode 100644 index 000000000..c235e29ca --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java @@ -0,0 +1,119 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * |
