aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/config/ConfigObject.java2
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java14
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/favorites/SystemFavoriteEntryProvider.java4
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java18
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java2
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/GameModeFavoriteEntry.java2
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/TimeFavoriteEntry.java2
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/WeatherFavoriteEntry.java2
-rw-r--r--fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplImpl.java1
-rw-r--r--forge/build.gradle10
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java3
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java22
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/RecipeDisplayExporter.java4
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java15
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java15
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java6
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java37
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java119
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java2
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java14
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java20
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
+ *</