diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-04-16 03:15:46 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-04-16 03:15:46 +0800 |
| commit | ad476378effa1dfd5fbef9c4d4cb5eadb9954d32 (patch) | |
| tree | 5a9c0ada8e451b6ce84de8ef4f4520c092f4c680 /api/src | |
| parent | 8d9d53b65561fedea8f61d194d411565fd89b57e (diff) | |
| download | RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.tar.gz RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.tar.bz2 RoughlyEnoughItems-ad476378effa1dfd5fbef9c4d4cb5eadb9954d32.zip | |
Add shapeless indicator
Diffstat (limited to 'api/src')
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); } } |
