aboutsummaryrefslogtreecommitdiff
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
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>
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/ConfigObject.java1
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java7
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/widgets/DelegateWidget.java62
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widgets.java49
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/plugins/PluginManager.java17
-rw-r--r--fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java8
-rw-r--r--forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java11
-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
17 files changed, 316 insertions, 258 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/ConfigObject.java b/api/src/main/java/me/shedaniel/rei/api/ConfigObject.java
index 9558bdd1e..a92300e00 100644
--- a/api/src/main/java/me/shedaniel/rei/api/ConfigObject.java
+++ b/api/src/main/java/me/shedaniel/rei/api/ConfigObject.java
@@ -35,7 +35,6 @@ import java.util.List;
@Environment(EnvType.CLIENT)
public interface ConfigObject {
-
/**
* @return the instance of {@link me.shedaniel.rei.api.ConfigObject}
*/
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java
index 1b76cbaaf..e96b14ba2 100644
--- a/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/drag/DraggingContext.java
@@ -65,8 +65,9 @@ public interface DraggingContext {
* Renders the draggable stack back to the position {@code position}.
* This may be used to animate an unaccepted draggable stack returning to its initial position.
*
- * @param stack the stack to use for render
- * @param position the position supplier of the destination
+ * @param stack the stack to use for render
+ * @param initialPosition the initial position of the stack
+ * @param position the position supplier of the destination
*/
- void renderBackToPosition(DraggableStack stack, Supplier<Point> position);
+ void renderBackToPosition(DraggableStack stack, Point initialPosition, Supplier<Point> position);
}
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/DelegateWidget.java b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/DelegateWidget.java
new file mode 100644
index 000000000..ed4e4a3cc
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/DelegateWidget.java
@@ -0,0 +1,62 @@
+package me.shedaniel.rei.api.gui.widgets;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import me.shedaniel.math.Rectangle;
+import net.minecraft.client.gui.components.events.GuiEventListener;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collections;
+import java.util.List;
+
+public class DelegateWidget extends WidgetWithBounds {
+ private static final Rectangle EMPTY = new Rectangle();
+ protected final Widget widget;
+ private final List<Widget> children;
+
+ public DelegateWidget(Widget widget) {
+ this.widget = widget;
+ this.children = Collections.singletonList(widget);
+ }
+
+ @Override
+ public void render(PoseStack poseStack, int i, int j, float f) {
+ widget.render(poseStack, i, j, f);
+ }
+
+ @Override
+ public List<? extends GuiEventListener> children() {
+ return children;
+ }
+
+ @Override
+ public @NotNull Rectangle getBounds() {
+ return widget instanceof WidgetWithBounds ? ((WidgetWithBounds) widget).getBounds() : EMPTY;
+ }
+
+ @Override
+ public void setZ(int z) {
+ widget.setZ(z);
+ }
+
+ @Override
+ public int getZ() {
+ return widget.getZ();
+ }
+
+ @Nullable
+ @Override
+ public GuiEventListener getFocused() {
+ return widget;
+ }
+
+ @Override
+ public void setFocused(@Nullable GuiEventListener guiEventListener) {
+ widget.setFocused(guiEventListener);
+ }
+
+ @Override
+ public boolean containsMouse(double mouseX, double mouseY) {
+ return widget.containsMouse(mouseX, mouseY);
+ }
+}
diff --git a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widgets.java b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widgets.java
index bd7801533..c0ef26b7d 100644
--- a/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widgets.java
+++ b/api/src/main/java/me/shedaniel/rei/api/gui/widgets/Widgets.java
@@ -24,6 +24,7 @@
package me.shedaniel.rei.api.gui.widgets;
import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Matrix4f;
import me.shedaniel.math.Dimension;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
@@ -59,12 +60,35 @@ public final class Widgets {
@NotNull
public static Widget wrapVanillaWidget(GuiEventListener element) {
- Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> {
-
- });
return new VanillaWrappedWidget(element);
}
+ public static WidgetWithBounds withTranslate(Widget widget, double x, double y, double z) {
+ return withTranslate(widget, Matrix4f.createTranslateMatrix((float) x, (float) y, (float) z));
+ }
+
+ public static WidgetWithBounds withTranslate(Widget widget, Matrix4f translate) {
+ WidgetWithBounds widgetWithBounds = wrapWidgetWithBounds(widget);
+ return new WidgetWithBoundsWithTranslate(widgetWithBounds, translate);
+ }
+
+ private static class WidgetWithBoundsWithTranslate extends DelegateWidget {
+ private final Matrix4f translate;
+
+ private WidgetWithBoundsWithTranslate(WidgetWithBounds widget, Matrix4f translate) {
+ super(widget);
+ this.translate = translate;
+ }
+
+ @Override
+ public void render(PoseStack poseStack, int i, int j, float f) {
+ poseStack.pushPose();
+ poseStack.last().pose().multiply(translate);
+ super.render(poseStack, i, j, f);
+ poseStack.popPose();
+ }
+ }
+
private static class VanillaWrappedWidget extends Widget {
private GuiEventListener element;
@@ -86,11 +110,18 @@ public final class Widgets {
}
}
- @NotNull
public static WidgetWithBounds wrapRenderer(Rectangle bounds, Renderer renderer) {
+ if (renderer instanceof Widget)
+ return wrapWidgetWithBounds((Widget) renderer);
return new RendererWrappedWidget(renderer);
}
+ public static WidgetWithBounds wrapWidgetWithBounds(Widget widget) {
+ if (widget instanceof WidgetWithBounds)
+ return (WidgetWithBounds) widget;
+ return new DelegateWidget(widget);
+ }
+
private static class RendererWrappedWidget extends WidgetWithBounds {
private Renderer renderer;
private Rectangle bounds;
@@ -111,6 +142,16 @@ public final class Widgets {
return Collections.emptyList();
}
+ @Override
+ public void setZ(int z) {
+ renderer.setZ(z);
+ }
+
+ @Override
+ public int getZ() {
+ return renderer.getZ();
+ }
+
@NotNull
@Override
public Rectangle getBounds() {
diff --git a/api/src/main/java/me/shedaniel/rei/api/plugins/PluginManager.java b/api/src/main/java/me/shedaniel/rei/api/plugins/PluginManager.java
index 3942942a8..f9e5a8b3f 100644
--- a/api/src/main/java/me/shedaniel/rei/api/plugins/PluginManager.java
+++ b/api/src/main/java/me/shedaniel/rei/api/plugins/PluginManager.java
@@ -26,7 +26,13 @@ package me.shedaniel.rei.api.plugins;
import me.shedaniel.rei.api.registry.ParentReloadable;
import me.shedaniel.rei.api.registry.Reloadable;
import me.shedaniel.rei.impl.Internals;
+import org.jetbrains.annotations.ApiStatus;
+import java.util.List;
+
+/**
+ * The plugin manager responsible for reloading and applying plugins.
+ */
public interface PluginManager extends ParentReloadable {
static PluginManager getInstance() {
return Internals.getPluginManager();
@@ -35,4 +41,15 @@ public interface PluginManager extends ParentReloadable {
boolean arePluginsReloading();
<T extends Reloadable> T get(Class<T> reloadableClass);
+
+ /**
+ * Registers a REI plugin
+ *
+ * @param plugin the plugin instance
+ * @return the plugin instance
+ */
+ @ApiStatus.Internal
+ <T extends REIPlugin> T registerPlugin(T plugin);
+
+ List<REIPlugin> getPlugins();
}
diff --git a/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java b/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java
index 55293fdde..b27f49da5 100644
--- a/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java
+++ b/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java
@@ -25,13 +25,11 @@ package me.shedaniel.rei.fabric;
import com.google.common.collect.Iterables;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.plugins.PluginManager;
import me.shedaniel.rei.api.plugins.REIPlugin;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
-import net.fabricmc.loader.api.ModContainer;
-
-import static me.shedaniel.rei.RoughlyEnoughItemsCore.registerPlugin;
public class PluginDetectorImpl {
public static void detectServerPlugins() {
@@ -46,7 +44,7 @@ public class PluginDetectorImpl {
FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPlugin.class)
)) {
try {
- registerPlugin(plugin);
+ PluginManager.getInstance().registerPlugin(plugin);
} catch (Exception e) {
e.printStackTrace();
RoughlyEnoughItemsCore.LOGGER.error("Can't load REI plugins from %s: %s", plugin.getClass(), e.getLocalizedMessage());
@@ -54,7 +52,7 @@ public class PluginDetectorImpl {
}
if (FabricLoader.getInstance().isModLoaded("libblockattributes-fluids")) {
try {
- registerPlugin((REIPlugin) Class.forName("me.shedaniel.rei.compat.LBASupportPlugin").getConstructor().newInstance());
+ PluginManager.getInstance().registerPlugin((REIPlugin) Class.forName("me.shedaniel.rei.compat.LBASupportPlugin").getConstructor().newInstance());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
diff --git a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java
index 973380f1e..747a6d790 100644
--- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java
+++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java
@@ -24,6 +24,7 @@
package me.shedaniel.rei.forge;
import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.plugins.PluginManager;
import me.shedaniel.rei.gui.plugin.DefaultRuntimePlugin;
import me.shedaniel.rei.jeicompat.JEIPluginDetector;
import me.shedaniel.rei.plugin.DefaultPlugin;
@@ -33,8 +34,6 @@ import net.minecraftforge.api.distmarker.OnlyIn;
import java.util.function.Consumer;
-import static me.shedaniel.rei.RoughlyEnoughItemsCore.registerPlugin;
-
public class PluginDetectorImpl {
public static void detectServerPlugins() {
new DefaultServerContainerPlugin().run();
@@ -42,12 +41,12 @@ public class PluginDetectorImpl {
@OnlyIn(Dist.CLIENT)
public static void detectClientPlugins() {
- registerPlugin(new DefaultPlugin());
- registerPlugin(new DefaultRuntimePlugin());
+ PluginManager.getInstance().registerPlugin(new DefaultPlugin());
+ PluginManager.getInstance().registerPlugin(new DefaultRuntimePlugin());
RoughlyEnoughItemsForge.scanAnnotation(REIPlugin.class, plugin -> {
- registerPlugin(((me.shedaniel.rei.api.plugins.REIPlugin) plugin));
+ PluginManager.getInstance().registerPlugin(((me.shedaniel.rei.api.plugins.REIPlugin) plugin));
});
JEIPluginDetector.detect((aClass, consumer) -> RoughlyEnoughItemsForge.scanAnnotation((Class<Object>) aClass, (Consumer<Object>) consumer),
- RoughlyEnoughItemsCore::registerPlugin);
+ PluginManager.getInstance()::registerPlugin);
}
}
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