From 8af94d0768f57b59b56f019c9d40d95b77382187 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 17 Mar 2021 00:30:40 +0800 Subject: Expend DraggableStackProvider and DraggableStackVisitor to work in any widgets, implement renderBackToPosition Signed-off-by: shedaniel --- .../me/shedaniel/rei/gui/CurrentDraggingStack.java | 56 ++++++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) (limited to 'runtime/src/main/java/me/shedaniel/rei/gui/CurrentDraggingStack.java') 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 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 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 position) { - + public void renderBackToPosition(DraggableStack stack, Point initialPosition, Supplier 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 position; + private Animator x = new Animator(); + private Animator y = new Animator(); + private int lastDestination = -1; + + public RenderBackEntry(DraggableStack stack, Point initialPosition, Supplier 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); + } + } + } } -- cgit