aboutsummaryrefslogtreecommitdiff
path: root/runtime/src
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-03-17 00:30:40 +0800
committershedaniel <daniel@shedaniel.me>2021-03-17 00:30:40 +0800
commit8af94d0768f57b59b56f019c9d40d95b77382187 (patch)
tree7b8c95251db7d54bec4e0ce10331c414c83ebea9 /runtime/src
parent7451a88de892b5f3496eb63c7be44bc339df96b9 (diff)
downloadRoughlyEnoughItems-8af94d0768f57b59b56f019c9d40d95b77382187.tar.gz
RoughlyEnoughItems-8af94d0768f57b59b56f019c9d40d95b77382187.tar.bz2
RoughlyEnoughItems-8af94d0768f57b59b56f019c9d40d95b77382187.zip
Expend DraggableStackProvider and DraggableStackVisitor to work in any widgets, implement renderBackToPosition
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'runtime/src')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java20
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/AbstractRecipeViewingScreen.java8
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java93
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java56
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java29
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java32
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java32
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java1
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java133
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java15
10 files changed, 180 insertions, 239 deletions
diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
index 15bee847e..a0a2f4ff0 100644
--- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
+++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
@@ -108,7 +108,6 @@ import static me.shedaniel.rei.impl.Internals.attachInstance;
@Environment(EnvType.CLIENT)
public class RoughlyEnoughItemsCore {
@ApiStatus.Internal public static final Logger LOGGER = LogManager.getFormatterLogger("REI");
- private static final List<REIPlugin> PLUGINS = new ArrayList<>();
private static final ExecutorService SYNC_RECIPES = Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "REI-SyncRecipes"));
@ApiStatus.Experimental
public static boolean isLeftModePressed = false;
@@ -328,23 +327,6 @@ public class RoughlyEnoughItemsCore {
}, "clickAreaHandlerResult");
}
- /**
- * Registers a REI plugin
- *
- * @param plugin the plugin instance
- * @return the plugin itself
- */
- @ApiStatus.Internal
- public static <T extends REIPlugin> T registerPlugin(T plugin) {
- PLUGINS.add(plugin);
- RoughlyEnoughItemsCore.LOGGER.info("Registered plugin %s", plugin.getPluginName());
- return plugin;
- }
-
- public static List<REIPlugin> getPlugins() {
- return Collections.unmodifiableList(PLUGINS);
- }
-
public static boolean hasPermissionToUsePackets() {
try {
Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(0);
@@ -438,7 +420,7 @@ public class RoughlyEnoughItemsCore {
private void loadTestPlugins() {
if (isDebugModeEnabled()) {
- registerPlugin(new REITestPlugin());
+ PluginManager.getInstance().registerPlugin(new REITestPlugin());
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/AbstractRecipeViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/AbstractRecipeViewingScreen.java
index 02deb5231..0384a5b49 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/AbstractRecipeViewingScreen.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/AbstractRecipeViewingScreen.java
@@ -34,6 +34,8 @@ import me.shedaniel.rei.api.util.CollectionUtils;
import me.shedaniel.rei.gui.widget.EntryWidget;
import me.shedaniel.rei.impl.ClientHelperImpl;
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 net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
@@ -118,10 +120,10 @@ public abstract class AbstractRecipeViewingScreen extends Screen implements Reci
transformNotice(Slot.OUTPUT, setupDisplay, noticeStack);
}
- private static void transformNotice(int marker, List<Widget> setupDisplay, EntryStack<?> noticeStack) {
+ private static void transformNotice(int marker, List<? extends GuiEventListener> setupDisplay, EntryStack<?> noticeStack) {
if (noticeStack.isEmpty())
return;
- for (Widget widget : setupDisplay) {
+ for (GuiEventListener widget : setupDisplay) {
if (widget instanceof EntryWidget) {
EntryWidget entry = (EntryWidget) widget;
if (entry.getNoticeMark() == marker && entry.getEntries().size() > 1) {
@@ -131,6 +133,8 @@ public abstract class AbstractRecipeViewingScreen extends Screen implements Reci
entry.entry(stack);
}
}
+ } else if (widget instanceof ContainerEventHandler) {
+ transformNotice(marker, ((ContainerEventHandler) widget).children(), noticeStack);
}
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
index 2daf4db4f..c48cf5da2 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
@@ -23,6 +23,7 @@
package me.shedaniel.rei.gui;
+import com.google.common.collect.AbstractIterator;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -68,6 +69,7 @@ import me.shedaniel.rei.impl.REIHelperImpl;
import me.shedaniel.rei.impl.Weather;
import net.minecraft.client.Minecraft;
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 net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
@@ -170,7 +172,7 @@ public class ContainerScreenOverlay extends REIOverlay {
}
public void openMenu(UUID uuid, Menu menu, Predicate<Point> inPoint) {
- this.overlayMenu = new OverlayMenu(uuid, menu, InternalWidgets.wrapTranslate(menu, 0, 0, 400), inPoint);
+ this.overlayMenu = new OverlayMenu(uuid, menu, Widgets.withTranslate(menu, 0, 0, 400), inPoint);
}
@ApiStatus.Internal
@@ -200,13 +202,44 @@ public class ContainerScreenOverlay extends REIOverlay {
return draggingStack;
}
+ private static <T> Iterable<T> buildWidgetsTree(Iterable<? extends GuiEventListener> listeners, Class<T> type) {
+ return () -> new AbstractIterator<T>() {
+ Stack<Iterator<? extends GuiEventListener>> stack;
+
+ {
+ stack = new Stack<>();
+ stack.push(listeners.iterator());
+ }
+
+ @Override
+ protected T computeNext() {
+ while (!stack.empty()) {
+ Iterator<? extends GuiEventListener> peek = stack.peek();
+ GuiEventListener listener = peek.next();
+ if (!peek.hasNext())
+ stack.pop();
+ if (type.isInstance(listener)) {
+ return (T) listener;
+ }
+ if (listener instanceof ContainerEventHandler) {
+ List<? extends GuiEventListener> children = ((ContainerEventHandler) listener).children();
+ if (!children.isEmpty()) {
+ stack.push(children.iterator());
+ }
+ }
+ }
+ return endOfData();
+ }
+ };
+ }
+
public void init(boolean useless) {
init();
}
public void init() {
- Iterable<DraggableStackProvider> stackProviders = (Iterable) Iterables.filter(widgets, widget -> widget instanceof DraggableStackProvider);
- Iterable<DraggableStackVisitor> stackVisitors = (Iterable) Iterables.filter(widgets, widget -> widget instanceof DraggableStackVisitor);
+ Iterable<DraggableStackProvider> stackProviders = buildWidgetsTree(Iterables.concat(widgets, Minecraft.getInstance().screen.children()), DraggableStackProvider.class);
+ Iterable<DraggableStackVisitor> stackVisitors = buildWidgetsTree(Iterables.concat(widgets, Minecraft.getInstance().screen.children()), DraggableStackVisitor.class);
draggingStack.set(DraggableStackProvider.from(() -> stackProviders), DraggableStackVisitor.from(() -> stackVisitors));
this.shouldReload = false;
@@ -252,7 +285,7 @@ public class ContainerScreenOverlay extends REIOverlay {
final Rectangle configButtonArea = getConfigButtonArea();
Widget tmp;
- widgets.add(tmp = InternalWidgets.wrapLateRenderable(InternalWidgets.mergeWidgets(
+ widgets.add(tmp = InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets(
Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE)
.onClick(button -> {
if (Screen.hasShiftDown() || Screen.hasControlDown()) {
@@ -346,7 +379,7 @@ public class ContainerScreenOverlay extends REIOverlay {
}
Rectangle subsetsButtonBounds = getSubsetsButtonBounds();
if (ConfigObject.getInstance().isSubsetsEnabled()) {
- widgets.add(InternalWidgets.wrapLateRenderable(InternalWidgets.wrapTranslate(Widgets.createButton(subsetsButtonBounds, ClientHelperImpl.getInstance().isAprilFools.get() ? new TranslatableComponent("text.rei.tiny_potato") : new TranslatableComponent("text.rei.subsets"))
+ 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);
@@ -368,7 +401,7 @@ public class ContainerScreenOverlay extends REIOverlay {
Rectangle area = getCraftableToggleArea();
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
ItemStack icon = new ItemStack(Blocks.CRAFTING_TABLE);
- this.widgets.add(tmp = InternalWidgets.wrapLateRenderable(InternalWidgets.mergeWidgets(
+ this.widgets.add(tmp = InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets(
Widgets.createButton(area, NarratorChatListener.NO_TITLE)
.focusable(false)
.onClick(button -> {
@@ -390,54 +423,6 @@ public class ContainerScreenOverlay extends REIOverlay {
}
widgets.add(draggingStack);
-
- if (Minecraft.getInstance().screen instanceof RecipeViewingScreen) {
- widgets.add(new RecipeViewingScreenDraggable());
- }
- }
-
- private static class RecipeViewingScreenDraggable extends Widget implements DraggableStackProvider {
- @Nullable
- @Override
- public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) {
- for (Widget widget : ((RecipeViewingScreen) Minecraft.getInstance().screen).getWidgets()) {
- if (widget instanceof EntryWidget) {
- if (widget.containsMouse(mouseX, mouseY)) {
- return new DraggableStack() {
- EntryStack<?> stack = ((EntryWidget) widget).getCurrentEntry().copy().rewrap();
-
- @Override
- public EntryStack<?> getStack() {
- return stack;
- }
-
- @Override
- public void drag() {
-
- }
-
- @Override
- public void release(boolean accepted) {
- if (!accepted) {
- context.renderBackToPosition(this, () -> new Point(((EntryWidget) widget).getBounds().x - 8, ((EntryWidget) widget).getBounds().y - 8));
- }
- }
- };
- }
- }
- }
- return null;
- }
-
- @Override
- public void render(PoseStack poseStack, int i, int j, float f) {
-
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return Collections.emptyList();
- }
}
private Rectangle getSubsetsButtonBounds() {
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java b/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java
index 9a71db41d..a2014f15c 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java
@@ -34,19 +34,21 @@ import me.shedaniel.rei.api.gui.drag.DraggableStackVisitor;
import me.shedaniel.rei.api.gui.drag.DraggingContext;
import me.shedaniel.rei.api.gui.widgets.Widget;
import me.shedaniel.rei.gui.widget.LateRenderable;
+import me.shedaniel.rei.impl.Animator;
import net.minecraft.client.gui.components.events.GuiEventListener;
import org.jetbrains.annotations.Nullable;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
import java.util.function.Supplier;
+import static me.shedaniel.rei.gui.widget.EntryListWidget.entrySize;
+
public class CurrentDraggingStack extends Widget implements LateRenderable, DraggingContext {
private DraggableStackProvider provider;
private DraggableStackVisitor visitor;
@Nullable
private DraggableEntry entry;
+ private final List<RenderBackEntry> backToOriginals = new ArrayList<>();
public void set(DraggableStackProvider provider, DraggableStackVisitor visitor) {
this.provider = provider;
@@ -65,6 +67,20 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag
entry.stack.render(matrices, new Rectangle(mouseX - 8, mouseY - 8, 16, 16), mouseX, mouseY, delta);
matrices.popPose();
}
+
+ Iterator<RenderBackEntry> iterator = backToOriginals.iterator();
+ while (iterator.hasNext()) {
+ RenderBackEntry renderBackEntry = iterator.next();
+ renderBackEntry.update(delta);
+ if (Math.abs(renderBackEntry.x.doubleValue() - renderBackEntry.x.target()) <= 2 && Math.abs(renderBackEntry.y.doubleValue() - renderBackEntry.y.target()) <= 2) {
+ iterator.remove();
+ } else {
+ matrices.pushPose();
+ matrices.translate(0, 0, 600);
+ renderBackEntry.stack.render(matrices, new Rectangle(renderBackEntry.x.intValue(), renderBackEntry.y.intValue(), 16, 16), mouseX, mouseY, delta);
+ matrices.popPose();
+ }
+ }
}
@Override
@@ -131,8 +147,8 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag
}
@Override
- public void renderBackToPosition(DraggableStack stack, Supplier<Point> position) {
-
+ public void renderBackToPosition(DraggableStack stack, Point initialPosition, Supplier<Point> position) {
+ backToOriginals.add(new RenderBackEntry(stack, initialPosition, position));
}
private class DraggableEntry {
@@ -145,4 +161,34 @@ public class CurrentDraggingStack extends Widget implements LateRenderable, Drag
this.start = start;
}
}
+
+ private static class RenderBackEntry {
+ private final DraggableStack stack;
+ private final Supplier<Point> position;
+ private Animator x = new Animator();
+ private Animator y = new Animator();
+ private int lastDestination = -1;
+
+ public RenderBackEntry(DraggableStack stack, Point initialPosition, Supplier<Point> position) {
+ this.stack = stack;
+ this.x.setAs(initialPosition.x - 8);
+ this.y.setAs(initialPosition.y - 8);
+ this.position = position;
+ }
+
+ public Point getPosition() {
+ return position.get();
+ }
+
+ public void update(double delta) {
+ this.x.update(delta);
+ this.y.update(delta);
+ Point position = getPosition();
+ if (lastDestination != position.hashCode()) {
+ lastDestination = position.hashCode();
+ this.x.setTo(position.x, 200);
+ this.y.setTo(position.y, 200);
+ }
+ }
+ }
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
index e1af5ecf2..ee0e7f66c 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
@@ -95,7 +95,7 @@ import java.util.function.Consumer;
import java.util.stream.Collectors;
@ApiStatus.Internal
-public class EntryListWidget extends WidgetWithBounds implements DraggableStackProvider {
+public class EntryListWidget extends WidgetWithBounds {
static final Comparator<? super EntryStack<?>> ENTRY_NAME_COMPARER = Comparator.comparing(stack -> stack.asFormatStrippedText().getString());
static final Comparator<? super EntryStack<?>> ENTRY_GROUP_COMPARER = Comparator.comparingInt(stack -> {
if (stack.getType() == VanillaEntryTypes.ITEM) {
@@ -184,33 +184,6 @@ public class EntryListWidget extends WidgetWithBounds implements DraggableStackP
}
@Override
- @Nullable
- public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) {
- for (EntryListEntry entry : entries) {
- if (!entry.getCurrentEntry().isEmpty() && entry.containsMouse(mouseX, mouseY)) {
- return new DraggableStack() {
- EntryStack<?> stack = entry.getCurrentEntry().copy();
-
- @Override
- public EntryStack<?> getStack() {
- return stack;
- }
-
- @Override
- public void drag() {
- }
-
- @Override
- public void release(boolean accepted) {
- context.renderBackToPosition(this, () -> new Point(entry.getBounds().x - 8, entry.getBounds().y - 8));
- }
- };
- }
- }
- return null;
- }
-
- @Override
public boolean mouseScrolled(double double_1, double double_2, double double_3) {
if (bounds.contains(double_1, double_2)) {
if (Screen.hasControlDown()) {
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
index f8a042ac0..6dddd1ffc 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
@@ -35,6 +35,9 @@ import me.shedaniel.rei.api.ConfigManager;
import me.shedaniel.rei.api.ConfigObject;
import me.shedaniel.rei.api.REIHelper;
import me.shedaniel.rei.api.favorites.FavoriteEntry;
+import me.shedaniel.rei.api.gui.drag.DraggableStack;
+import me.shedaniel.rei.api.gui.drag.DraggableStackProvider;
+import me.shedaniel.rei.api.gui.drag.DraggingContext;
import me.shedaniel.rei.api.gui.widgets.Slot;
import me.shedaniel.rei.api.gui.widgets.Tooltip;
import me.shedaniel.rei.api.ingredient.EntryStack;
@@ -57,7 +60,7 @@ import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-public class EntryWidget extends Slot {
+public class EntryWidget extends Slot implements DraggableStackProvider {
@ApiStatus.Internal
public static long stackDisplayOffset = 0;
protected static final ResourceLocation RECIPE_GUI = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png");
@@ -447,4 +450,31 @@ public class EntryWidget extends Slot {
}
return false;
}
+
+ @Override
+ @Nullable
+ public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) {
+ if (!getCurrentEntry().isEmpty() && containsMouse(mouseX, mouseY)) {
+ return new DraggableStack() {
+ EntryStack<?> stack = getCurrentEntry().copy();
+
+ @Override
+ public EntryStack<?> getStack() {
+ return stack;
+ }
+
+ @Override
+ public void drag() {
+ }
+
+ @Override
+ public void release(boolean accepted) {
+ if (!accepted) {
+ context.renderBackToPosition(this, DraggingContext.getInstance().getCurrentPosition(), () -> new Point(getBounds().x, getBounds().y));
+ }
+ }
+ };
+ }
+ return null;
+ }
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
index dea403a31..681818a97 100644
--- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
+++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
@@ -24,13 +24,18 @@
package me.shedaniel.rei.gui.widget;
import com.mojang.blaze3d.vertex.PoseStack;
+import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.rei.api.ClientHelper;
import me.shedaniel.rei.api.REIHelper;
import me.shedaniel.rei.api.gui.Renderer;
+import me.shedaniel.rei.api.gui.drag.DraggableStack;
+import me.shedaniel.rei.api.gui.drag.DraggableStackProvider;
+import me.shedaniel.rei.api.gui.drag.DraggingContext;
import me.shedaniel.rei.api.gui.widgets.Tooltip;
import me.shedaniel.rei.api.gui.widgets.Widget;
import me.shedaniel.rei.api.gui.widgets.WidgetWithBounds;
+import me.shedaniel.rei.api.ingredient.EntryStack;
import me.shedaniel.rei.api.registry.display.DisplayCategory;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
@@ -45,7 +50,7 @@ import java.util.List;
import java.util.function.Predicate;
@ApiStatus.Internal
-public class TabWidget extends WidgetWithBounds {
+public class TabWidget extends WidgetWithBounds implements DraggableStackProvider {
public static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png");
public static final ResourceLocation CHEST_GUI_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer_dark.png");
@@ -134,4 +139,29 @@ public class TabWidget extends WidgetWithBounds {
return bounds;
}
+ @Override
+ public @Nullable DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) {
+ if (isShown() && renderer instanceof EntryStack && containsMouse(mouseX, mouseY)) {
+ return new DraggableStack() {
+ EntryStack<?> stack = ((EntryStack<?>) renderer).copy();
+
+ @Override
+ public EntryStack<?> getStack() {
+ return stack;
+ }
+
+ @Override
+ public void drag() {
+ }
+
+ @Override
+ public void release(boolean accepted) {
+ if (!accepted) {
+ context.renderBackToPosition(this, DraggingContext.getInstance().getCurrentPosition(), () -> new Point(getBounds().getCenterX() - 8, getBounds().getCenterY() - 8));
+ }
+ }
+ };
+ }
+ return null;
+ }
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
index b1960af17..85c9ebe12 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java
@@ -51,7 +51,6 @@ import java.util.List;
@Config(name = "roughlyenoughitems/config")
@Environment(EnvType.CLIENT)
public class ConfigObjectImpl implements ConfigObject, ConfigData {
-
@ConfigEntry.Category("basics") @ConfigEntry.Gui.TransitiveObject @DontApplyFieldName
public Basics basics = new Basics();
@ConfigEntry.Category("appearance") @ConfigEntry.Gui.TransitiveObject @DontApplyFieldName
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java b/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java
index 4abe7aa01..c9c9968cc 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java
@@ -30,10 +30,7 @@ import me.shedaniel.math.Rectangle;
import me.shedaniel.math.impl.PointHelper;
import me.shedaniel.rei.api.ConfigObject;
import me.shedaniel.rei.api.REIHelper;
-import me.shedaniel.rei.api.gui.widgets.Button;
-import me.shedaniel.rei.api.gui.widgets.Widget;
-import me.shedaniel.rei.api.gui.widgets.WidgetWithBounds;
-import me.shedaniel.rei.api.gui.widgets.Widgets;
+import me.shedaniel.rei.api.gui.widgets.*;
import me.shedaniel.rei.api.registry.display.Display;
import me.shedaniel.rei.api.registry.display.DisplayCategory;
import me.shedaniel.rei.api.registry.display.TransferDisplayCategory;
@@ -51,9 +48,7 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import org.jetbrains.annotations.ApiStatus;
-import org.jetbrains.annotations.NotNull;
-import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
@@ -169,22 +164,7 @@ public final class InternalWidgets {
}
return str;
});
- return new WidgetWithBounds() {
- @Override
- public @NotNull Rectangle getBounds() {
- return autoCraftingButton.getBounds();
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return Collections.singletonList(autoCraftingButton);
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- autoCraftingButton.render(matrices, mouseX, mouseY, delta);
- }
-
+ return new DelegateWidget(autoCraftingButton) {
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
if (displaySupplier.get().getDisplayLocation().isPresent() && ConfigObject.getInstance().getCopyRecipeIdentifierKeybind().matchesKey(keyCode, scanCode) && containsMouse(PointHelper.ofMouse())) {
@@ -211,19 +191,11 @@ public final class InternalWidgets {
};
}
- public static WidgetWithBounds wrapLateRenderable(WidgetWithBounds widget) {
- return new LateRenderableWidgetWithBounds(widget);
- }
-
- public static WidgetWithBounds wrapTranslate(WidgetWithBounds widget, float x, float y, float z) {
- return new WidgetWithBoundsWithTranslate(widget, x, y, z);
- }
-
- public static Widget wrapLateRenderable(Widget widget) {
+ public static WidgetWithBounds wrapLateRenderable(Widget widget) {
return new LateRenderableWidget(widget);
}
- public static Widget mergeWidgets(Widget widget1, Widget widget2) {
+ public static Widget concatWidgets(Widget widget1, Widget widget2) {
return new MergedWidget(widget2, widget1);
}
@@ -257,102 +229,9 @@ public final class InternalWidgets {
}
}
- private static class LateRenderableWidget extends Widget implements LateRenderable {
- private final Widget widget;
-
+ private static class LateRenderableWidget extends DelegateWidget implements LateRenderable {
private LateRenderableWidget(Widget widget) {
- this.widget = widget;
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- this.widget.setZ(getZ());
- this.widget.render(matrices, mouseX, mouseY, delta);
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return Collections.singletonList(this.widget);
- }
-
- @Override
- public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
- return this.widget.mouseScrolled(mouseX, mouseY, amount);
- }
- }
-
- private static class LateRenderableWidgetWithBounds extends WidgetWithBounds implements LateRenderable {
- private final WidgetWithBounds widget;
-
- private LateRenderableWidgetWithBounds(WidgetWithBounds widget) {
- this.widget = widget;
- }
-
- @Override
- public @NotNull Rectangle getBounds() {
- return this.widget.getBounds();
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- this.widget.setZ(getZ());
- this.widget.render(matrices, mouseX, mouseY, delta);
- }
-
- @Override
- public boolean containsMouse(double mouseX, double mouseY) {
- return this.widget.containsMouse(mouseX, mouseY);
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return Collections.singletonList(this.widget);
- }
-
- @Override
- public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
- return this.widget.mouseScrolled(mouseX, mouseY, amount);
- }
- }
-
- private static class WidgetWithBoundsWithTranslate extends WidgetWithBounds implements LateRenderable {
- private final WidgetWithBounds widget;
- private final float x, y, z;
-
- public WidgetWithBoundsWithTranslate(WidgetWithBounds widget, float x, float y, float z) {
- this.widget = widget;
- this.x = x;
- this.y = y;
- this.z = z;
- }
-
- @Override
- public @NotNull Rectangle getBounds() {
- return this.widget.getBounds();
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- matrices.pushPose();
- matrices.translate(x, y, z);
- this.widget.setZ(getZ());
- this.widget.render(matrices, mouseX, mouseY, delta);
- matrices.popPose();
- }
-
- @Override
- public boolean containsMouse(double mouseX, double mouseY) {
- return this.widget.containsMouse(mouseX, mouseY);
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return Collections.singletonList(this.widget);
- }
-
- @Override
- public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
- return this.widget.mouseScrolled(mouseX, mouseY, amount);
+ super(widget);
}
}
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java
index bd7cbd299..e62c18a30 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java
@@ -58,6 +58,7 @@ public class PluginManagerImpl implements PluginManager {
private final List<Reloadable> reloadables = new ArrayList<>();
private final Map<Class<? extends Reloadable>, Reloadable> cache = new ConcurrentHashMap<>();
private boolean arePluginsLoading = false;
+ private final List<REIPlugin> plugins = new ArrayList<>();