diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-03-17 00:30:40 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-03-17 00:30:40 +0800 |
| commit | 8af94d0768f57b59b56f019c9d40d95b77382187 (patch) | |
| tree | 7b8c95251db7d54bec4e0ce10331c414c83ebea9 | |
| parent | 7451a88de892b5f3496eb63c7be44bc339df96b9 (diff) | |
| download | RoughlyEnoughItems-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>
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 |
