aboutsummaryrefslogtreecommitdiff
path: root/api
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 /api
parent8d9d53b65561fedea8f61d194d411565fd89b57e (diff)
downloadRoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.tar.gz
RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.tar.bz2
RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.zip
Add shapeless indicator
Diffstat (limited to 'api')
-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
3 files changed, 149 insertions, 164 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);
}
}