diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-04-28 14:03:31 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-05-20 02:37:49 +0800 |
| commit | 6d092d7599d27748abd8dc50b0c87e7fdba689cd (patch) | |
| tree | 2ef04a225cdc464689690ddc081fd5eb1e0dd7ac | |
| parent | a1d8c20c7b34c12b5d95c1d61131a253cdd8affd (diff) | |
| download | RoughlyEnoughItems-6d092d7599d27748abd8dc50b0c87e7fdba689cd.tar.gz RoughlyEnoughItems-6d092d7599d27748abd8dc50b0c87e7fdba689cd.tar.bz2 RoughlyEnoughItems-6d092d7599d27748abd8dc50b0c87e7fdba689cd.zip | |
REI 8.2
- Display History
- Draggable Component
- Multi Select Filtering Screen
- Better Craftable Filter
- Fix #850
- Fix #845
- Fix #832
- Fix #731
- Fix #839
- Fix #804
- Fix EvilCraft
73 files changed, 2066 insertions, 291 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableBoundsProvider.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableBoundsProvider.java new file mode 100644 index 000000000..c6d1a35cf --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableBoundsProvider.java @@ -0,0 +1,70 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.api.client.gui.drag; + +import me.shedaniel.math.Rectangle; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +import java.util.stream.StreamSupport; + +@FunctionalInterface +public interface DraggableBoundsProvider { + static VoxelShape fromRectangle(Rectangle bounds) { + return Shapes.box(bounds.x, bounds.y, 0, bounds.getMaxX(), bounds.getMaxY(), 0.1); + } + + static DraggableBoundsProvider ofRectangle(Rectangle bounds) { + return ofShape(fromRectangle(bounds)); + } + + static DraggableBoundsProvider ofRectangles(Iterable<Rectangle> bounds) { + VoxelShape shape = StreamSupport.stream(bounds.spliterator(), false) + .map(DraggableBoundsProvider::fromRectangle) + .reduce(Shapes.empty(), Shapes::or); + return ofShape(shape); + } + + static DraggableBoundsProvider ofShape(VoxelShape shape) { + return () -> shape; + } + + static DraggableBoundsProvider ofShapes(Iterable<VoxelShape> shapes) { + VoxelShape shape = StreamSupport.stream(shapes.spliterator(), false) + .reduce(Shapes.empty(), Shapes::or); + return ofShape(shape); + } + + static DraggableBoundsProvider empty() { + return Shapes::empty; + } + + static DraggableBoundsProvider concat(Iterable<DraggableBoundsProvider> providers) { + return () -> StreamSupport.stream(providers.spliterator(), false) + .map(DraggableBoundsProvider::bounds) + .reduce(Shapes.empty(), Shapes::or); + } + + VoxelShape bounds(); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStack.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStack.java index dc3311055..713347743 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStack.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStack.java @@ -24,17 +24,64 @@ package me.shedaniel.rei.api.client.gui.drag; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponent; import me.shedaniel.rei.api.common.entry.EntryStack; -public interface DraggableStack { +public interface DraggableStack extends DraggableComponent<EntryStack<?>> { + static DraggableStack from(DraggableComponent<EntryStack<?>> component) { + return component instanceof DraggableStack ? (DraggableStack) component : new DraggableStack() { + @Override + public EntryStack<?> getStack() { + return component.get(); + } + + @Override + public void drag() { + component.drag(); + } + + @Override + public void release(DraggedAcceptorResult result) { + component.release(result); + } + + @Override + public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + component.render(matrices, bounds, mouseX, mouseY, delta); + } + + @Override + public void render(PoseStack matrices, Point position, int mouseX, int mouseY, float delta) { + component.render(matrices, position, mouseX, mouseY, delta); + } + }; + } + EntryStack<?> getStack(); + @Override + default EntryStack<?> get() { + return getStack(); + } + void drag(); + @Override + default int getWidth() { + return 18; + } + + @Override + default int getHeight() { + return 18; + } + default void release(DraggedAcceptorResult result) { } + @Override default void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { getStack().render(matrices, bounds, mouseX, mouseY, delta); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProvider.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProvider.java index 57569b405..e11805d0a 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProvider.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProvider.java @@ -23,6 +23,9 @@ package me.shedaniel.rei.api.client.gui.drag; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponent; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProvider; +import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; @@ -31,7 +34,7 @@ import java.util.function.Supplier; /** * A provider for supplying {@link DraggableStack} to the screen. */ -public interface DraggableStackProvider<T extends Screen> extends Comparable<DraggableStackProvider<T>> { +public interface DraggableStackProvider<T extends Screen> extends DraggableComponentProvider<T, EntryStack<?>> { static <T extends Screen> DraggableStackProvider<T> from(Supplier<Iterable<DraggableStackProvider<T>>> providers) { return new DraggableStackProvider<T>() { @Override @@ -61,8 +64,16 @@ public interface DraggableStackProvider<T extends Screen> extends Comparable<Dra @Nullable DraggableStack getHoveredStack(DraggingContext<T> context, double mouseX, double mouseY); + @Override + @Nullable + default DraggableComponent<EntryStack<?>> getHovered(DraggingContext<T> context, double mouseX, double mouseY) { + return getHoveredStack(context, mouseX, mouseY); + } + + @Override <R extends Screen> boolean isHandingScreen(R screen); + @Override default DraggingContext<T> getContext() { return DraggingContext.getInstance().cast(); } @@ -72,11 +83,11 @@ public interface DraggableStackProvider<T extends Screen> extends Comparable<Dra * * @return the priority */ + @Override default double getPriority() { return 0f; } - @Override default int compareTo(DraggableStackProvider<T> o) { return Double.compare(getPriority(), o.getPriority()); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProviderWidget.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProviderWidget.java index 29d375118..d0ae7227c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProviderWidget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackProviderWidget.java @@ -23,6 +23,9 @@ package me.shedaniel.rei.api.client.gui.drag; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponent; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProviderWidget; +import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; @@ -33,7 +36,7 @@ import java.util.function.Function; * {@link DraggableStack}. */ @FunctionalInterface -public interface DraggableStackProviderWidget { +public interface DraggableStackProviderWidget extends DraggableComponentProviderWidget<EntryStack<?>> { static DraggableStackProviderWidget from(Function<DraggingContext<Screen>, Iterable<DraggableStackProviderWidget>> providers) { return (context, mouseX, mouseY) -> { for (DraggableStackProviderWidget provider : providers.apply(context)) { @@ -47,6 +50,12 @@ public interface DraggableStackProviderWidget { @Nullable DraggableStack getHoveredStack(DraggingContext<Screen> context, double mouseX, double mouseY); + @Override + @Nullable + default DraggableComponent<EntryStack<?>> getHovered(DraggingContext<Screen> context, double mouseX, double mouseY) { + return getHoveredStack(context, mouseX, mouseY); + } + static DraggableStackProvider<Screen> toProvider(DraggableStackProviderWidget widget) { return toProvider(widget, 0D); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackVisitor.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackVisitor.java index 8b8f9c220..dfbf5d69b 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackVisitor.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/drag/DraggableStackVisitor.java @@ -24,11 +24,16 @@ package me.shedaniel.rei.api.client.gui.drag; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponent; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; +import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.gui.screens.Screen; import ne |
