aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-04-16 03:15:46 +0800
committershedaniel <daniel@shedaniel.me>2022-04-16 03:15:46 +0800
commitad476378effa1dfd5fbef9c4d4cb5eadb9954d32 (patch)
tree5a9c0ada8e451b6ce84de8ef4f4520c092f4c680
parent8d9d53b65561fedea8f61d194d411565fd89b57e (diff)
downloadRoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.tar.gz
RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.tar.bz2
RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.zip
Add shapeless indicator
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java42
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java258
-rw-r--r--api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java13
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java3
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java4
-rw-r--r--default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java5
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java86
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java83
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/MergedWidget.java66
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/RendererWrappedWidget.java72
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/VanillaWrappedWidget.java82
-rw-r--r--runtime/src/main/resources/assets/roughlyenoughitems/lang/de_de.json50
-rwxr-xr-xruntime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json3
-rw-r--r--runtime/src/main/resources/assets/roughlyenoughitems/lang/pt_br.json57
-rw-r--r--runtime/src/main/resources/assets/roughlyenoughitems/lang/zh_cn.json4
-rw-r--r--runtime/src/main/resources/assets/roughlyenoughitems/lang/zh_tw.json4
16 files changed, 609 insertions, 223 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java
new file mode 100644
index 000000000..cf2a9e025
--- /dev/null
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java
@@ -0,0 +1,42 @@
+/*
+ * 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.widgets;
+
+import me.shedaniel.math.Rectangle;
+
+import java.util.function.Supplier;
+
+public class DelegateWidgetWithBounds extends DelegateWidget {
+ private final Supplier<Rectangle> bounds;
+
+ public DelegateWidgetWithBounds(Widget widget, Supplier<Rectangle> bounds) {
+ super(widget);
+ this.bounds = bounds;
+ }
+
+ @Override
+ public Rectangle getBounds() {
+ return bounds.get();
+ }
+} \ No newline at end of file
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java
index fee50c9d5..9dbeb363c 100644
--- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java
+++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java
@@ -24,9 +24,7 @@
package me.shedaniel.rei.api.client.gui.widgets;
import com.google.common.collect.AbstractIterator;
-import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix4f;
-import com.mojang.math.Vector4f;
import me.shedaniel.math.Dimension;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
@@ -37,13 +35,13 @@ import me.shedaniel.rei.impl.ClientInternals;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.gui.components.events.ContainerEventHandler;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvents;
+import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -60,8 +58,51 @@ public final class Widgets {
return ClientInternals.getWidgetsProvider().createDrawableWidget(drawable);
}
+ public static WidgetWithBounds withTooltip(WidgetWithBounds widget, Component... texts) {
+ return withTooltip(widget, Arrays.asList(texts));
+ }
+
+ public static WidgetWithBounds withTooltip(WidgetWithBounds widget, Collection<Component> texts) {
+ return withBounds(concat(
+ widget,
+ createTooltip(widget::getBounds, texts)
+ ), widget::getBounds);
+ }
+
+ public static Widget createTooltip(Rectangle bounds, Component... texts) {
+ return createTooltip(() -> bounds, Arrays.asList(texts));
+ }
+
+ public static Widget createTooltip(Rectangle bounds, Collection<Component> texts) {
+ return createTooltip(() -> bounds, texts);
+ }
+
+ public static Widget createTooltip(Supplier<Rectangle> bounds, Component... texts) {
+ return createTooltip(bounds, Arrays.asList(texts));
+ }
+
+ public static Widget createTooltip(Supplier<Rectangle> bounds, Collection<Component> texts) {
+ return createTooltip(mouse -> {
+ if (bounds.get().contains(mouse)) {
+ return Tooltip.create(mouse, texts);
+ } else {
+ return null;
+ }
+ });
+ }
+
+ public static Widget createTooltip(Function<Point, @Nullable Tooltip> tooltipSupplier) {
+ return createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> {
+ Point mouse = new Point(mouseX, mouseY);
+ Tooltip tooltip = tooltipSupplier.apply(mouse);
+ if (tooltip != null) {
+ tooltip.queue();
+ }
+ });
+ }
+
public static Widget wrapVanillaWidget(GuiEventListener element) {
- return new VanillaWrappedWidget(element);
+ return ClientInternals.getWidgetsProvider().wrapVanillaWidget(element);
}
public static WidgetWithBounds withTranslate(Widget widget, double x, double y, double z) {
@@ -69,119 +110,16 @@ public final class Widgets {
}
public static WidgetWithBounds withTranslate(Widget widget, Matrix4f translate) {
- WidgetWithBounds widgetWithBounds = wrapWidgetWithBounds(widget);
- return new WidgetWithBoundsWithTranslate(widgetWithBounds, () -> translate);
+ return withTranslate(widget, () -> translate);
}
public static <T extends Widget> WidgetWithBounds withTranslate(T widget, Function<T, Matrix4f> translate) {
- WidgetWithBounds widgetWithBounds = wrapWidgetWithBounds(widget);
- return new WidgetWithBoundsWithTranslate(widgetWithBounds, () -> translate.apply(widget));
+ return withTranslate(widget, () -> translate.apply(widget));
}
public static WidgetWithBounds withTranslate(Widget widget, Supplier<Matrix4f> translate) {
WidgetWithBounds widgetWithBounds = wrapWidgetWithBounds(widget);
- return new WidgetWithBoundsWithTranslate(widgetWithBounds, translate);
- }
-
- private static class WidgetWithBoundsWithTranslate extends DelegateWidget {
- private final Supplier<Matrix4f> translate;
-
- private WidgetWithBoundsWithTranslate(WidgetWithBounds widget, Supplier<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.get());
- Vector4f mouse = transformMouse(i, j);
- super.render(poseStack, (int) mouse.x(), (int) mouse.y(), f);
- poseStack.popPose();
- }
-
- private Vector4f transformMouse(double mouseX, double mouseY) {
- Vector4f mouse = new Vector4f((float) mouseX, (float) mouseY, 0, 1);
- mouse.transform(translate.get());
- return mouse;
- }
-
- @Override
- public boolean containsMouse(double mouseX, double mouseY) {
- Vector4f mouse = transformMouse(mouseX, mouseY);
- return super.containsMouse(mouse.x(), mouse.y());
- }
-
- @Override
- public boolean mouseClicked(double d, double e, int i) {
- Vector4f mouse = transformMouse(d, e);
- return super.mouseClicked(mouse.x(), mouse.y(), i);
- }
-
- @Override
- public boolean mouseReleased(double d, double e, int i) {
- Vector4f mouse = transformMouse(d, e);
- return super.mouseReleased(mouse.x(), mouse.y(), i);
- }
-
- @Override
- public boolean mouseDragged(double d, double e, int i, double f, double g) {
- Vector4f mouse = transformMouse(d, e);
- return super.mouseDragged(mouse.x(), mouse.y(), i, f, g);
- }
-
- @Override
- public boolean mouseScrolled(double d, double e, double f) {
- Vector4f mouse = transformMouse(d, e);
- return super.mouseScrolled(mouse.x(), mouse.y(), f);
- }
- }
-
- private static class VanillaWrappedWidget extends Widget {
- private GuiEventListener element;
-
- public VanillaWrappedWidget(GuiEventListener element) {
- this.element = Objects.requireNonNull(element);
- setFocused(element);
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- if (element instanceof GuiComponent component)
- component.setBlitOffset(getZ());
- if (element instanceof net.minecraft.client.gui.components.Widget widget)
- widget.render(matrices, mouseX, mouseY, delta);
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return Collections.singletonList(element);
- }
-
- @Nullable
- @Override
- public GuiEventListener getFocused() {
- return element;
- }
-
- @Override
- public void setFocused(@Nullable GuiEventListener guiEventListener) {
- if (guiEventListener == element) {
- super.setFocused(element);
- } else if (element instanceof ContainerEventHandler handler) {
- handler.setFocused(guiEventListener);
- }
- }
-
- @Override
- public boolean isDragging() {
- return true;
- }
-
- @Override
- public boolean containsMouse(double mouseX, double mouseY) {
- return element.isMouseOver(mouseX, mouseY);
- }
+ return ClientInternals.getWidgetsProvider().withTranslate(widgetWithBounds, translate);
}
public static WidgetWithBounds wrapRenderer(Rectangle bounds, Renderer renderer) {
@@ -191,18 +129,45 @@ public final class Widgets {
public static WidgetWithBounds wrapRenderer(Supplier<Rectangle> bounds, Renderer renderer) {
if (renderer instanceof Widget widget)
return wrapWidgetWithBoundsSupplier(widget, bounds);
- return new RendererWrappedWidget(renderer, bounds);
+ return ClientInternals.getWidgetsProvider().wrapRenderer(bounds, renderer);
}
+ /**
+ * @deprecated Use {@link #withBounds(Widget)} instead.
+ */
+ @Deprecated(forRemoval = true)
+ @ApiStatus.ScheduledForRemoval
public static WidgetWithBounds wrapWidgetWithBounds(Widget widget) {
- return wrapWidgetWithBounds(widget, null);
+ return withBounds(widget);
}
+ /**
+ * @deprecated Use {@link #withBounds(Widget, Rectangle)} instead.
+ */
+ @Deprecated(forRemoval = true)
+ @ApiStatus.ScheduledForRemoval
public static WidgetWithBounds wrapWidgetWithBounds(Widget widget, Rectangle bounds) {
- return wrapWidgetWithBoundsSupplier(widget, bounds == null ? null : () -> bounds);
+ return withBounds(widget, bounds);
}
+ /**
+ * @deprecated Use {@link #withBounds(Widget, Supplier)} instead.
+ */
+ @Deprecated(forRemoval = true)
+ @ApiStatus.ScheduledForRemoval
public static WidgetWithBounds wrapWidgetWithBoundsSupplier(Widget widget, Supplier<Rectangle> bounds) {
+ return withBounds(widget, bounds);
+ }
+
+ public static WidgetWithBounds withBounds(Widget widget) {
+ return wrapWidgetWithBounds(widget, null);
+ }
+
+ public static WidgetWithBounds withBounds(Widget widget, Rectangle bounds) {
+ return wrapWidgetWithBoundsSupplier(widget, bounds == null ? null : () -> bounds);
+ }
+
+ public static WidgetWithBounds withBounds(Widget widget, Supplier<Rectangle> bounds) {
if (widget instanceof WidgetWithBounds withBounds)
return withBounds;
if (bounds == null)
@@ -210,57 +175,6 @@ public final class Widgets {
return new DelegateWidgetWithBounds(widget, bounds);
}
- private static class RendererWrappedWidget extends WidgetWithBounds {
- private final Renderer renderer;
- private final Supplier<Rectangle> bounds;
-
- public RendererWrappedWidget(Renderer renderer, Supplier<Rectangle> bounds) {
- this.renderer = Objects.requireNonNull(renderer);
- this.bounds = Objects.requireNonNull(bounds);
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- renderer.render(matrices, getBounds(), mouseX, mouseY, delta);
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- if (renderer instanceof GuiEventListener listener)
- return Collections.singletonList(listener);
- return Collections.emptyList();
- }
-
- @Override
- public void setZ(int z) {
- renderer.setZ(z);
- }
-
- @Override
- public int getZ() {
- return renderer.getZ();
- }
-
- @Override
- public Rectangle getBounds() {
- return bounds.get();
- }
- }
-
- private static class DelegateWidgetWithBounds extends DelegateWidget {
- private final Supplier<Rectangle> bounds;
-
- public DelegateWidgetWithBounds(Widget widget, Supplier<Rectangle> bounds) {
- super(widget);
- this.bounds = bounds;
- }
-
- @Override
- public Rectangle getBounds() {
- return bounds.get();
- }
- }
-
public static Widget createTexturedWidget(ResourceLocation identifier, Rectangle bounds) {
return createTexturedWidget(identifier, bounds, 0, 0);
}
@@ -357,6 +271,14 @@ public final class Widgets {
return createSlotBase(rectangle).color(color);
}
+ public static Widget createShapelessIcon(Rectangle rectangle) {
+ return createShapelessIcon(new Point(rectangle.getMaxX() - 4, rectangle.y + 4));
+ }
+
+ public static Widget createShapelessIcon(Point topRightPos) {
+ return ClientInternals.getWidgetsProvider().createShapelessIcon(topRightPos);
+ }
+
public static Slot createSlot(Point point) {
return ClientInternals.getWidgetsProvider().createSlot(point);
}
@@ -373,6 +295,14 @@ public final class Widgets {
Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
}
+ public static Widget concat(Widget... widgets) {
+ return concat(Arrays.asList(widgets));
+ }
+
+ public static Widget concat(List<Widget> widgets) {
+ return ClientInternals.getWidgetsProvider().concatWidgets(widgets);
+ }
+
public static <T> Iterable<T> walk(Iterable<? extends GuiEventListener> listeners, Predicate<GuiEventListener> predicate) {
return () -> new AbstractIterator<T>() {
Stack<Iterator<? extends GuiEventListener>> stack;
diff --git a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java
index 755ab943a..4341771d1 100644
--- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java
+++ b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java
@@ -23,6 +23,7 @@
package me.shedaniel.rei.impl;
+import com.mojang.math.Matrix4f;
import com.mojang.serialization.DataResult;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
@@ -30,6 +31,7 @@ import me.shedaniel.rei.api.client.ClientHelper;
import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer;
import me.shedaniel.rei.api.client.favorites.FavoriteEntry;
import me.shedaniel.rei.api.client.gui.DrawableConsumer;
+import me.shedaniel.rei.api.client.gui.Renderer;
import me.shedaniel.rei.api.client.gui.widgets.*;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.client.registry.screen.ClickArea;
@@ -37,6 +39,7 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder;
import me.shedaniel.rei.api.common.plugins.PluginManager;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
+import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
@@ -155,6 +158,12 @@ public final class ClientInternals {
public interface WidgetsProvider {
boolean isRenderingPanel(Panel panel);
+ Widget wrapVanillaWidget(GuiEventListener element);
+
+ WidgetWithBounds wrapRenderer(Supplier<Rectangle> bounds, Renderer renderer);
+
+ WidgetWithBounds withTranslate(WidgetWithBounds widget, Supplier<Matrix4f> translate);
+
Widget createDrawableWidget(DrawableConsumer drawable);
Slot createSlot(Point point);
@@ -174,5 +183,9 @@ public final class ClientInternals {
DrawableConsumer createTexturedConsumer(ResourceLocation texture, int x, int y, int width, int height, float u, float v, int uWidth, int vHeight, int textureWidth, int textureHeight);
DrawableConsumer createFillRectangleConsumer(Rectangle rectangle, int color);
+
+ Widget createShapelessIcon(Point point);
+
+ Widget concatWidgets(List<Widget> widgets);
}
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java
index f4a4d0ca6..55f0ba48a 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java
@@ -81,6 +81,9 @@ public class DefaultCraftingCategory implements DisplayCategory<DefaultCraftingD
}
widgets.addAll(slots);
widgets.add(Widgets.createSlot(new Point(startPoint.x + 95, startPoint.y + 19)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput());
+ if (display.isShapeless()) {
+ widgets.add(Widgets.createShapelessIcon(bounds));
+ }
return widgets;
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java
index d405d9f5c..49be00f02 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java
@@ -143,6 +143,10 @@ public abstract class DefaultCraftingDisplay<C extends Recipe<?>> extends BasicD
return list;
}
+ public boolean isShapeless() {
+ return false;
+ }
+
public static int getSlotWithSize(DefaultCraftingDisplay<?> display, int index, int craftingGridWidth) {
return getSlotWithSize(display.getInputWidth(), index, craftingGridWidth);
}
diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java
index 502c5c61b..8f500bfb9 100644
--- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java
+++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java
@@ -61,4 +61,9 @@ public class DefaultShapelessDisplay extends DefaultCraftingDisplay<ShapelessRec
public int getInputHeight() {
return (int) Math.ceil(recipe.get().getIngredients().size() / 3.0);
}
+
+ @Override
+ public boolean isShapeless() {
+ return true;
+ }
}
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java
new file mode 100644
index 000000000..5867f4232
--- /dev/null
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java
@@ -0,0 +1,86 @@
+/*
+ * 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.impl.client.gui.widget;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Matrix4f;
+import com.mojang.math.Vector4f;
+import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget;
+import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds;
+
+import java.util.function.Supplier;
+
+public class DelegateWidgetWithTranslate extends DelegateWidget {
+ private final Supplier<Matrix4f> translate;
+
+ public DelegateWidgetWithTranslate(WidgetWithBounds widget, Supplier<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.get());
+ Vector4f mouse = transformMouse(i, j);
+ super.render(poseStack, (int) mouse.x(), (int) mouse.y(), f);
+ poseStack.popPose();
+ }
+
+ private Vector4f transformMouse(double mouseX, double mouseY) {
+ Vector4f mouse = new Vector4f((float) mouseX, (float) mouseY, 0, 1);
+ mouse.transform(translate.get());
+ return mouse;
+ }
+
+ @Override
+ public boolean containsMouse(double mouseX, double mouseY) {
+ Vector4f mouse = transformMouse(mouseX, mouseY);
+ return super.containsMouse(mouse.x(), mouse.y());
+ }
+
+ @Override
+ public boolean mouseClicked(double d, double e, int i) {
+ Vector4f mouse = transformMouse(d, e);
+ return super.mouseClicked(mouse.x(), mouse.y(), i);
+ }
+
+ @Override
+ public boolean mouseReleased(double d, double e, int i) {
+ Vector4f mouse = transformMouse(d, e);
+ return super.mouseReleased(mouse.x(), mouse.y(), i);
+ }
+
+ @Override
+ public boolean mouseDragged(double d, double e, int i, double f, double g) {
+ Vector4f mouse = transformMouse(d, e);
+ return super.mouseDragged(mouse.x(), mouse.y(), i, f, g);
+ }
+
+ @Override
+ public boolean mouseScrolled(double d, double e, double f) {
+ Vector4f mouse = transformMouse(d, e);
+ return super.mouseScrolled(mouse.x(), mouse.y(), f);
+ }
+} \ No newline at end of file
diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java
index e39b48fc5..f757bf9ad 100644
--- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java
+++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java
@@ -23,13 +23,14 @@
package me.shedaniel.rei.impl.client.gui.widget;
-import com.google.common.collect.Lists;
import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Matrix4f;
import me.shedaniel.math.Point;
import me.shedaniel.math.Rectangle;
import me.shedaniel.math.impl.PointHelper;
import me.shedaniel.rei.api.client.config.ConfigObject;
import me.shedaniel.rei.api.client.gui.DrawableConsumer;
+import me.shedaniel.rei.api.client.gui.Renderer;
import me.shedaniel.rei.api.client.gui.widgets.*;
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.common.display.Display;
@@ -44,12 +45,12 @@ import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.FormattedText;
+import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.ApiStatus;
import java.util.Collection;
import java.util.List;
-import java.util.Objects;
import java.util.function.Supplier;
@ApiStatus.Internal
@@ -141,34 +142,8 @@ public final class InternalWidgets {
return new MergedWidget(widget2, widget1);
}
- private static class MergedWidget extends Widget {
- private final List<Widget> widgets;
-
- public MergedWidget(Widget widget1, Widget widget2) {
- this.widgets = Lists.newArrayList(Objects.requireNonNull(widget1), Objects.requireNonNull(widget2));
- }
-
- @Override
- public void render(PoseStack matrices, int mouseX, int mouseY, float delta) {
- for (Widget widget : widgets) {
- widget.setZ(getZ());
- widget.render(matrices, mouseX, mouseY, delta);
- }
- }
-
- @Override
- public List<? extends GuiEventListener> children() {
- return widgets;
- }
-
- @Override
- public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
- for (Widget widget : this.widgets) {
- if (widget.mouseScrolled(mouseX, mouseY, amount))
- return true;
- }
- return false;
- }
+ public static Widget concatWidgets(List<Widget> widgets) {
+ return new MergedWidget(widgets);
}
private static class LateRenderableWidget extends DelegateWidget implements LateRenderable {
@@ -188,17 +163,33 @@ public final class InternalWidgets {
}
@Override
+ public Widget wrapVanillaWidget(GuiEventListener element) {
+ if (element instanceof Widget) return (Widget) element;
+ return new VanillaWrappedWidget(element);
+ }
+
+ @Override
+ public WidgetWithBounds wrapRenderer(Supplier<Rectangle> bounds, Renderer renderer) {
+ return new RendererWrappedWidget(renderer, bounds);
+ }
+
+ @Override
+ public WidgetWithBounds withTranslate(WidgetWithBounds widget, Supplier<Matrix4f> translate) {
+ return new DelegateWidgetWithTranslate(widget, translate);
+ }
+
+ @Override
public Widget createDrawableWidget(DrawableConsumer drawable) {
return new DrawableWidget(drawable);
}
@Override
- public me.shedaniel.rei.api.client.gui.widgets.Slot createSlot(Point point) {
+ public Slot createSlot(Point point) {
return new EntryWidget(point);
}
@Override
- public me.shedaniel.rei.api.client.gui.widgets.Slot createSlot(Rectangle bounds) {
+ public Slot createSlot(Rectangle bounds) {
return new EntryWidget(bounds);
}
@@ -236,5 +227,33 @@ public final class InternalWidgets {
public DrawableConsumer createFillRectangleConsumer(Rectangle rectangle, int color) {
return new FillRectangleDrawableConsumer(rectangle, color);
}
+
+ @Override
+ public Widget createShapelessIcon(Point point) {
+ int magnification;
+ double scale = Minecraft.getInstance().getWindow().getGuiScale();
+ if (scale >= 1 && scale <= 4 && scale == Math.floor(scale)) {
+ magnification = (int) scale;
+ } else if (scale > 4 && scale == Math.floor(scale)) {
+ magnification = 1;
+ for (int i = 4; i >= 1; i--) {
+ if (scale % i == 0) {
+ magnification = i;
+ break;
+ }
+ }
+ } else {
+ magnification = 4;
+ }
+ Rectangle bounds = new Rectangle(point.getX() - 9, point.getY() + 1, 8, 8);
+ Widget widget = Widgets.createTexturedWidget(new ResourceLocation("roughlyenoughitems:textures/gui/shapeless_icon_" + magnification + "x.png"), bounds.getX(), bounds.getY(), 0, 0, bounds.getWidth(), bounds.getHeight(), 1, 1, 1, 1);
+ return Widgets.withTooltip(Widgets.withBounds(widget, bounds),
+ new TranslatableComponent("text.rei.shapeless"));
+ }
+
+ @Override
+ public Widget concatWidgets(List<Widget> widgets) {
+ return InternalWidgets.concatWidgets(widgets);
+ }
}
}
diff --git a/runtime/src/main/java/me/shedaniel/