diff --git a/src/main/java/brachy/modularui/api/drawable/IRichTextBuilder.java b/src/main/java/brachy/modularui/api/drawable/IRichTextBuilder.java index 7f9dc30..a1f3974 100644 --- a/src/main/java/brachy/modularui/api/drawable/IRichTextBuilder.java +++ b/src/main/java/brachy/modularui/api/drawable/IRichTextBuilder.java @@ -3,8 +3,7 @@ import brachy.modularui.drawable.text.Spacer; import brachy.modularui.utils.Alignment; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.network.chat.Component; import java.util.function.UnaryOperator; import java.util.regex.Pattern; @@ -31,7 +30,7 @@ default T reset() { * @param c component to add * @return this */ - default T add(FormattedText c) { + default T add(Component c) { getRichText().add(c); return getThis(); } @@ -61,7 +60,7 @@ default T addDrawable(IDrawable drawable) { return getThis(); } - default T addLine(FormattedText formattedText) { + default T addLine(Component formattedText) { getRichText().add(formattedText).newLine(); return getThis(); } diff --git a/src/main/java/brachy/modularui/api/drawable/Text.java b/src/main/java/brachy/modularui/api/drawable/Text.java index 947745f..dc04f5a 100644 --- a/src/main/java/brachy/modularui/api/drawable/Text.java +++ b/src/main/java/brachy/modularui/api/drawable/Text.java @@ -10,6 +10,7 @@ import brachy.modularui.utils.Alignment; import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraftforge.api.distmarker.Dist; @@ -31,9 +32,9 @@ public interface Text extends IDrawable, IJsonSerializable { TextRenderer renderer = new TextRenderer(); - Component EMPTY = str(""); - Component LINE_FEED = str("\n"); - Component SPACE = str(" "); + Component EMPTY = CommonComponents.EMPTY; + Component LINE_FEED = CommonComponents.NEW_LINE; + Component SPACE = CommonComponents.SPACE; // Formatting for convenience ChatFormatting BLACK = ChatFormatting.BLACK; @@ -116,11 +117,11 @@ static ModularComponent comp(@NotNull Component... keys) { if (keys.length == 0) { return ModularComponent.empty(); } - MutableComponent main = ModularComponent.empty(); + ModularComponent main = ModularComponent.empty(); for (Component key : keys) { main.append(key); } - return main.asModular(); + return main; } /** diff --git a/src/main/java/brachy/modularui/client/component/FormattedTextContents.java b/src/main/java/brachy/modularui/client/component/FormattedTextContents.java deleted file mode 100644 index 803794f..0000000 --- a/src/main/java/brachy/modularui/client/component/FormattedTextContents.java +++ /dev/null @@ -1,23 +0,0 @@ -package brachy.modularui.client.component; - -import net.minecraft.network.chat.ComponentContents; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.network.chat.Style; - -import org.jetbrains.annotations.NotNullByDefault; - -import java.util.Optional; - -@NotNullByDefault -public record FormattedTextContents(FormattedText text) implements ComponentContents { - - @Override - public Optional visit(FormattedText.ContentConsumer acceptor) { - return text.visit(acceptor); - } - - @Override - public Optional visit(FormattedText.StyledContentConsumer acceptor, Style style) { - return text.visit(acceptor, style); - } -} diff --git a/src/main/java/brachy/modularui/client/schemarenderer/BaseSchemaRenderer.java b/src/main/java/brachy/modularui/client/schemarenderer/BaseSchemaRenderer.java index cb08d7a..d0355d6 100755 --- a/src/main/java/brachy/modularui/client/schemarenderer/BaseSchemaRenderer.java +++ b/src/main/java/brachy/modularui/client/schemarenderer/BaseSchemaRenderer.java @@ -71,6 +71,7 @@ import org.lwjgl.opengl.GL11; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -514,6 +515,23 @@ public boolean isBEREnabled() { return true; } + @Override + public boolean equals(Object o) { + if (!(o instanceof BaseSchemaRenderer that)) return false; + + return schema.equals(that.schema) && renderLevel.equals(that.renderLevel) && camera.equals(that.camera) && + Arrays.equals(viewport, that.viewport); + } + + @Override + public int hashCode() { + int result = schema.hashCode(); + result = 31 * result + renderLevel.hashCode(); + result = 31 * result + camera.hashCode(); + result = 31 * result + Arrays.hashCode(viewport); + return result; + } + protected enum CompileStatus { DISABLED, COMPILING, diff --git a/src/main/java/brachy/modularui/core/mixins/client/AbstractContainerScreenMixin.java b/src/main/java/brachy/modularui/core/mixins/client/AbstractContainerScreenMixin.java index 13156d7..bbd4070 100755 --- a/src/main/java/brachy/modularui/core/mixins/client/AbstractContainerScreenMixin.java +++ b/src/main/java/brachy/modularui/core/mixins/client/AbstractContainerScreenMixin.java @@ -20,7 +20,7 @@ public class AbstractContainerScreenMixin implements IClickableContainerScreen { protected Slot hoveredSlot; @Unique - private Slot gtceu$clickedSlot; + private Slot modularui$clickedSlot; /** * Mixin into ModularUI screen wrapper to return the true hovered slot. @@ -28,21 +28,21 @@ public class AbstractContainerScreenMixin implements IClickableContainerScreen { * That's why we can just return the current hovered slot. */ @Inject(method = "findSlot", at = @At("HEAD"), cancellable = true) - public void getSlot(double mouseX, double mouseY, CallbackInfoReturnable cir) { - if (this.gtceu$clickedSlot != null) { - cir.setReturnValue(this.gtceu$clickedSlot); + public void modularui$getSlot(double mouseX, double mouseY, CallbackInfoReturnable cir) { + if (this.modularui$clickedSlot != null) { + cir.setReturnValue(this.modularui$clickedSlot); } else if (IMuiScreen.class.isAssignableFrom(this.getClass())) { cir.setReturnValue(this.hoveredSlot); } } @Override - public void gtceu$setClickedSlot(Slot slot) { - this.gtceu$clickedSlot = slot; + public void modularui$setClickedSlot(Slot slot) { + this.modularui$clickedSlot = slot; } @Override - public Slot gtceu$getClickedSlot() { - return gtceu$clickedSlot; + public Slot modularui$getClickedSlot() { + return modularui$clickedSlot; } } diff --git a/src/main/java/brachy/modularui/core/mixins/client/MinecraftMixin.java b/src/main/java/brachy/modularui/core/mixins/client/MinecraftMixin.java index 105475a..99eeb5f 100755 --- a/src/main/java/brachy/modularui/core/mixins/client/MinecraftMixin.java +++ b/src/main/java/brachy/modularui/core/mixins/client/MinecraftMixin.java @@ -23,7 +23,7 @@ public class MinecraftMixin { @Inject(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Timer;advanceTime(J)I", shift = At.Shift.AFTER)) - public void timer(CallbackInfo ci) { + public void modularui$updateTimer(CallbackInfo ci) { int ticks = ClientProxy.getTimer60Fps().advanceTime(Util.getMillis()); for (int j = 0; j < Math.min(20, ticks); ++j) { ClientScreenHandler.onFrameUpdate(); @@ -31,10 +31,10 @@ public void timer(CallbackInfo ci) { } @Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;removed()V")) - public void setScreen(Screen guiScreen, CallbackInfo ci) { + public void modularui$trackRealScreenClose(Screen guiScreen, CallbackInfo ci) { if (guiScreen == null) { // the ScreenEvent.Closing is also closed when the screen is transitioning to another screen, - // but we only want to know when the next screen null is, so that all screens close. + // but we only want to know when the next screen is null, so that all screens close. ClientScreenHandler.onCloseScreens(this.screen); } } diff --git a/src/main/java/brachy/modularui/drawable/Circle.java b/src/main/java/brachy/modularui/drawable/Circle.java index 56ffbbb..1e73b06 100644 --- a/src/main/java/brachy/modularui/drawable/Circle.java +++ b/src/main/java/brachy/modularui/drawable/Circle.java @@ -91,4 +91,19 @@ public Circle copyOrImmutable() { .setColor(this.colorInner, this.colorOuter) .setSegments(this.segments); } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof Circle circle)) return false; + + return colorInner == circle.colorInner && colorOuter == circle.colorOuter && segments == circle.segments; + } + + @Override + public int hashCode() { + int result = colorInner; + result = 31 * result + colorOuter; + result = 31 * result + segments; + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/DelegateDrawable.java b/src/main/java/brachy/modularui/drawable/DelegateDrawable.java index 93f27aa..2bdebb0 100644 --- a/src/main/java/brachy/modularui/drawable/DelegateDrawable.java +++ b/src/main/java/brachy/modularui/drawable/DelegateDrawable.java @@ -61,4 +61,16 @@ public Widget asWidget() { public Icon asIcon() { return this.drawable.asIcon(); } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DelegateDrawable that)) return false; + + return drawable.equals(that.drawable); + } + + @Override + public int hashCode() { + return drawable.hashCode(); + } } diff --git a/src/main/java/brachy/modularui/drawable/DelegateIcon.java b/src/main/java/brachy/modularui/drawable/DelegateIcon.java index 2f98470..a6952a9 100755 --- a/src/main/java/brachy/modularui/drawable/DelegateIcon.java +++ b/src/main/java/brachy/modularui/drawable/DelegateIcon.java @@ -54,6 +54,18 @@ protected void setDelegate(IIcon icon) { this.icon = icon; } + @Override + public boolean equals(Object o) { + if (!(o instanceof DelegateIcon that)) return false; + + return icon.equals(that.icon); + } + + @Override + public int hashCode() { + return icon.hashCode(); + } + @Override public String toString() { return getClass().getSimpleName() + "(" + this.icon + ")"; diff --git a/src/main/java/brachy/modularui/drawable/DrawableStack.java b/src/main/java/brachy/modularui/drawable/DrawableStack.java index 86a74cb..dfb3f9f 100644 --- a/src/main/java/brachy/modularui/drawable/DrawableStack.java +++ b/src/main/java/brachy/modularui/drawable/DrawableStack.java @@ -16,6 +16,7 @@ import com.google.gson.JsonParseException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -85,4 +86,16 @@ public boolean saveToJson(JsonObject json) { json.add("drawables", jsonArray); return true; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof DrawableStack that)) return false; + + return Arrays.equals(drawables, that.drawables); + } + + @Override + public int hashCode() { + return Arrays.hashCode(drawables); + } } diff --git a/src/main/java/brachy/modularui/drawable/FlowDrawable.java b/src/main/java/brachy/modularui/drawable/FlowDrawable.java index c4de496..59a22b2 100755 --- a/src/main/java/brachy/modularui/drawable/FlowDrawable.java +++ b/src/main/java/brachy/modularui/drawable/FlowDrawable.java @@ -196,4 +196,21 @@ public FlowDrawable removeAll() { this.icons.clear(); return this; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof FlowDrawable that)) return false; + + return axis == that.axis && icons.equals(that.icons) && + mainAxisAlignment == that.mainAxisAlignment && crossAxisAlignment == that.crossAxisAlignment; + } + + @Override + public int hashCode() { + int result = axis.hashCode(); + result = 31 * result + icons.hashCode(); + result = 31 * result + mainAxisAlignment.hashCode(); + result = 31 * result + crossAxisAlignment.hashCode(); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/FluidDrawable.java b/src/main/java/brachy/modularui/drawable/FluidDrawable.java index f0622eb..0da9835 100644 --- a/src/main/java/brachy/modularui/drawable/FluidDrawable.java +++ b/src/main/java/brachy/modularui/drawable/FluidDrawable.java @@ -48,4 +48,16 @@ public FluidDrawable setFluid(FluidStack fluid) { this.fluid = fluid; return this; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof FluidDrawable that)) return false; + + return fluid.isFluidEqual(that.fluid); + } + + @Override + public int hashCode() { + return fluid.hashCode(); + } } diff --git a/src/main/java/brachy/modularui/drawable/HoverableIcon.java b/src/main/java/brachy/modularui/drawable/HoverableIcon.java index 83e4194..cf3e30c 100755 --- a/src/main/java/brachy/modularui/drawable/HoverableIcon.java +++ b/src/main/java/brachy/modularui/drawable/HoverableIcon.java @@ -10,6 +10,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + public class HoverableIcon extends DelegateIcon implements IHoverable, ITooltip { private final Area area = new Area(); @@ -43,4 +45,20 @@ public HoverableIcon tooltip(RichTooltip tooltip) { this.tooltip = tooltip; return this; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof HoverableIcon that)) return false; + if (!super.equals(o)) return false; + + return area.equals(that.area) && Objects.equals(tooltip, that.tooltip); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + area.hashCode(); + result = 31 * result + Objects.hashCode(tooltip); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/HueBar.java b/src/main/java/brachy/modularui/drawable/HueBar.java index 89948a9..598a218 100755 --- a/src/main/java/brachy/modularui/drawable/HueBar.java +++ b/src/main/java/brachy/modularui/drawable/HueBar.java @@ -41,4 +41,16 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget previous = current; } } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof HueBar hueBar)) return false; + + return axis == hueBar.axis; + } + + @Override + public int hashCode() { + return axis.hashCode(); + } } diff --git a/src/main/java/brachy/modularui/drawable/Icon.java b/src/main/java/brachy/modularui/drawable/Icon.java index ff8b2fa..e2f0423 100644 --- a/src/main/java/brachy/modularui/drawable/Icon.java +++ b/src/main/java/brachy/modularui/drawable/Icon.java @@ -188,6 +188,25 @@ public boolean saveToJson(JsonObject json) { return true; } + @Override + public final boolean equals(Object o) { + if (!(o instanceof Icon icon)) return false; + + return width == icon.width && height == icon.height && Float.compare(aspectRatio, icon.aspectRatio) == 0 && + drawable.equals(icon.drawable) && alignment.equals(icon.alignment) && margin.equals(icon.margin); + } + + @Override + public int hashCode() { + int result = drawable.hashCode(); + result = 31 * result + width; + result = 31 * result + height; + result = 31 * result + Float.hashCode(aspectRatio); + result = 31 * result + alignment.hashCode(); + result = 31 * result + margin.hashCode(); + return result; + } + @Override public String toString() { return getClass().getSimpleName() + "(" + this.drawable.getClass().getSimpleName() + ")"; diff --git a/src/main/java/brachy/modularui/drawable/IngredientDrawable.java b/src/main/java/brachy/modularui/drawable/IngredientDrawable.java index f567cc0..08f3563 100755 --- a/src/main/java/brachy/modularui/drawable/IngredientDrawable.java +++ b/src/main/java/brachy/modularui/drawable/IngredientDrawable.java @@ -15,6 +15,8 @@ import lombok.Setter; import lombok.experimental.Tolerate; +import java.util.Arrays; + public class IngredientDrawable implements IDrawable, IJsonSerializable { @Getter @@ -58,4 +60,18 @@ public IngredientDrawable cycleTime(int cycleTime) { public void setItems(Ingredient ingredient) { setItems(ingredient.getItems()); } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof IngredientDrawable that)) return false; + + return cycleTime == that.cycleTime && Arrays.equals(items, that.items); + } + + @Override + public int hashCode() { + int result = Arrays.hashCode(items); + result = 31 * result + cycleTime; + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/InteractableIcon.java b/src/main/java/brachy/modularui/drawable/InteractableIcon.java index 3f79317..79d1914 100644 --- a/src/main/java/brachy/modularui/drawable/InteractableIcon.java +++ b/src/main/java/brachy/modularui/drawable/InteractableIcon.java @@ -11,6 +11,8 @@ import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + @Accessors(fluent = true, chain = true) public class InteractableIcon extends DelegateIcon implements Interactable { @@ -126,4 +128,31 @@ public InteractableIcon onKeyTapped(IGuiAction.KeyPressed keyTapped) { this.keyTapped = keyTapped; return this; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof InteractableIcon that)) return false; + if (!super.equals(o)) return false; + + return playClickSound == that.playClickSound && + Objects.equals(mousePressed, that.mousePressed) && Objects.equals(mouseReleased, that.mouseReleased) && + Objects.equals(mouseTapped, that.mouseTapped) && Objects.equals(mouseScroll, that.mouseScroll) && + Objects.equals(keyPressed, that.keyPressed) && Objects.equals(keyReleased, that.keyReleased) && + Objects.equals(keyTapped, that.keyTapped) && Objects.equals(context, that.context); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Objects.hashCode(mousePressed); + result = 31 * result + Objects.hashCode(mouseReleased); + result = 31 * result + Objects.hashCode(mouseTapped); + result = 31 * result + Objects.hashCode(mouseScroll); + result = 31 * result + Objects.hashCode(keyPressed); + result = 31 * result + Objects.hashCode(keyReleased); + result = 31 * result + Objects.hashCode(keyTapped); + result = 31 * result + Boolean.hashCode(playClickSound); + result = 31 * result + Objects.hashCode(context); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/ItemDrawable.java b/src/main/java/brachy/modularui/drawable/ItemDrawable.java index 000cf47..f5c7e29 100755 --- a/src/main/java/brachy/modularui/drawable/ItemDrawable.java +++ b/src/main/java/brachy/modularui/drawable/ItemDrawable.java @@ -137,4 +137,16 @@ public boolean saveToJson(JsonObject json) { } return true; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof ItemDrawable that)) return false; + + return ItemStack.isSameItemSameTags(item, that.item); + } + + @Override + public int hashCode() { + return item.hashCode(); + } } diff --git a/src/main/java/brachy/modularui/drawable/NamedDrawableRow.java b/src/main/java/brachy/modularui/drawable/NamedDrawableRow.java index 86d23ba..858634e 100755 --- a/src/main/java/brachy/modularui/drawable/NamedDrawableRow.java +++ b/src/main/java/brachy/modularui/drawable/NamedDrawableRow.java @@ -10,6 +10,8 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + public class NamedDrawableRow implements IDrawable { @Getter @@ -63,4 +65,18 @@ public NamedDrawableRow drawable(@Nullable IIcon drawable) { this.drawable = drawable; return this; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof NamedDrawableRow that)) return false; + + return Objects.equals(name, that.name) && Objects.equals(drawable, that.drawable); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(name); + result = 31 * result + Objects.hashCode(drawable); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/Rectangle.java b/src/main/java/brachy/modularui/drawable/Rectangle.java index a11c398..798128f 100644 --- a/src/main/java/brachy/modularui/drawable/Rectangle.java +++ b/src/main/java/brachy/modularui/drawable/Rectangle.java @@ -206,4 +206,26 @@ public Rectangle copyOrImmutable() { .cornerSegments(this.cornerSegments) .canApplyTheme(this.canApplyTheme); } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof Rectangle rectangle)) return false; + + return cornerRadius == rectangle.cornerRadius && colorTL == rectangle.colorTL && colorTR == rectangle.colorTR && + colorBL == rectangle.colorBL && colorBR == rectangle.colorBR && cornerSegments == rectangle.cornerSegments && + Float.compare(borderThickness, rectangle.borderThickness) == 0 && canApplyTheme == rectangle.canApplyTheme; + } + + @Override + public int hashCode() { + int result = cornerRadius; + result = 31 * result + colorTL; + result = 31 * result + colorTR; + result = 31 * result + colorBL; + result = 31 * result + colorBR; + result = 31 * result + cornerSegments; + result = 31 * result + Float.hashCode(borderThickness); + result = 31 * result + Boolean.hashCode(canApplyTheme); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/SchemaRenderer.java b/src/main/java/brachy/modularui/drawable/SchemaRenderer.java index e48b82b..642c331 100755 --- a/src/main/java/brachy/modularui/drawable/SchemaRenderer.java +++ b/src/main/java/brachy/modularui/drawable/SchemaRenderer.java @@ -13,6 +13,7 @@ import lombok.experimental.Tolerate; import org.jetbrains.annotations.NotNull; +import java.util.Objects; import java.util.function.BiConsumer; import java.util.function.BooleanSupplier; import java.util.function.Consumer; @@ -97,4 +98,27 @@ public boolean isBEREnabled() { public boolean isIsometric() { return isometric; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof SchemaRenderer that)) return false; + if (!super.equals(o)) return false; + + return isometric == that.isometric && rayTracing == that.rayTracing && Objects.equals(scale, that.scale) && + Objects.equals(disableBER, that.disableBER) && Objects.equals(afterRender, that.afterRender) && + Objects.equals(cameraFunc, that.cameraFunc) && Objects.equals(highlight, that.highlight); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Objects.hashCode(scale); + result = 31 * result + Objects.hashCode(disableBER); + result = 31 * result + Objects.hashCode(afterRender); + result = 31 * result + Objects.hashCode(cameraFunc); + result = 31 * result + Objects.hashCode(highlight); + result = 31 * result + Boolean.hashCode(isometric); + result = 31 * result + Boolean.hashCode(rayTracing); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/SpriteDrawable.java b/src/main/java/brachy/modularui/drawable/SpriteDrawable.java index e304a3e..4cad7f6 100755 --- a/src/main/java/brachy/modularui/drawable/SpriteDrawable.java +++ b/src/main/java/brachy/modularui/drawable/SpriteDrawable.java @@ -40,4 +40,20 @@ public SpriteDrawable canApplyTheme(boolean canApplyTheme) { public boolean canApplyTheme() { return canApplyTheme; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof SpriteDrawable that)) return false; + + return canApplyTheme == that.canApplyTheme && + sprite.atlasLocation().equals(that.sprite.atlasLocation()) && + sprite.contents().name().equals(that.sprite.contents().name()); + } + + @Override + public int hashCode() { + int result = sprite.hashCode(); + result = 31 * result + Boolean.hashCode(canApplyTheme); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/SubAreaDrawable.java b/src/main/java/brachy/modularui/drawable/SubAreaDrawable.java index 76fcd5e..e638f53 100644 --- a/src/main/java/brachy/modularui/drawable/SubAreaDrawable.java +++ b/src/main/java/brachy/modularui/drawable/SubAreaDrawable.java @@ -74,4 +74,23 @@ public SubAreaDrawable drawable(@Nullable IDrawable drawable) { setDrawable(drawable); return this; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof SubAreaDrawable that)) return false; + if (!super.equals(o)) return false; + + return Float.compare(u0, that.u0) == 0 && Float.compare(v0, that.v0) == 0 && + Float.compare(u1, that.u1) == 0 && Float.compare(v1, that.v1) == 0; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Float.hashCode(u0); + result = 31 * result + Float.hashCode(v0); + result = 31 * result + Float.hashCode(u1); + result = 31 * result + Float.hashCode(v1); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/UITexture.java b/src/main/java/brachy/modularui/drawable/UITexture.java index b17ef6c..232dc6d 100644 --- a/src/main/java/brachy/modularui/drawable/UITexture.java +++ b/src/main/java/brachy/modularui/drawable/UITexture.java @@ -291,8 +291,10 @@ public boolean equals(Object o) { } protected boolean isEqual(UITexture texture) { - return Objects.equals(location, texture.location) && Float.compare(u0, texture.u0) == 0 && Float.compare(v0, texture.v0) == 0 && - Float.compare(u1, texture.u1) == 0 && Float.compare(v1, texture.v1) == 0 && nonOpaque == texture.nonOpaque && + return Objects.equals(location, texture.location) && + Float.compare(u0, texture.u0) == 0 && Float.compare(v0, texture.v0) == 0 && + Float.compare(u1, texture.u1) == 0 && Float.compare(v1, texture.v1) == 0 && + nonOpaque == texture.nonOpaque && colorOverride == texture.colorOverride && Objects.equals(colorType, texture.colorType); } diff --git a/src/main/java/brachy/modularui/drawable/graph/GraphDrawable.java b/src/main/java/brachy/modularui/drawable/graph/GraphDrawable.java index 56b1013..9547dc8 100644 --- a/src/main/java/brachy/modularui/drawable/graph/GraphDrawable.java +++ b/src/main/java/brachy/modularui/drawable/graph/GraphDrawable.java @@ -280,4 +280,35 @@ public GraphDrawable graphAspectRatio(float aspectRatio) { this.view.setAspectRatio(aspectRatio); return this; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof GraphDrawable that)) return false; + + return backgroundColor == that.backgroundColor && Float.compare(majorTickThickness, that.majorTickThickness) == 0 && + Float.compare(majorTickLength, that.majorTickLength) == 0 && + Float.compare(minorTickThickness, that.minorTickThickness) == 0 && + Float.compare(minorTickLength, that.minorTickLength) == 0 && Float.compare(gridLineWidth, that.gridLineWidth) == 0 && + gridLineColor == that.gridLineColor && Float.compare(minorGridLineWidth, that.minorGridLineWidth) == 0 && + minorGridLineColor == that.minorGridLineColor && view.equals(that.view) && x.equals(that.x) && y.equals(that.y) && + plots.equals(that.plots); + } + + @Override + public int hashCode() { + int result = view.hashCode(); + result = 31 * result + backgroundColor; + result = 31 * result + Float.hashCode(majorTickThickness); + result = 31 * result + Float.hashCode(majorTickLength); + result = 31 * result + Float.hashCode(minorTickThickness); + result = 31 * result + Float.hashCode(minorTickLength); + result = 31 * result + Float.hashCode(gridLineWidth); + result = 31 * result + gridLineColor; + result = 31 * result + Float.hashCode(minorGridLineWidth); + result = 31 * result + minorGridLineColor; + result = 31 * result + x.hashCode(); + result = 31 * result + y.hashCode(); + result = 31 * result + plots.hashCode(); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/progress/AbstractProgressDrawable.java b/src/main/java/brachy/modularui/drawable/progress/AbstractProgressDrawable.java index 780ca16..2a8257c 100644 --- a/src/main/java/brachy/modularui/drawable/progress/AbstractProgressDrawable.java +++ b/src/main/java/brachy/modularui/drawable/progress/AbstractProgressDrawable.java @@ -6,6 +6,8 @@ import lombok.Getter; +import java.util.Objects; + public abstract class AbstractProgressDrawable> extends BaseProgressDrawable { @Getter private IDrawable filledTexture; @@ -33,4 +35,20 @@ public D filledTexture(IDrawable drawable) { this.filledTexture = drawable; return self(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AbstractProgressDrawable that)) return false; + if (!super.equals(o)) return false; + + return Objects.equals(filledTexture, that.filledTexture); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Objects.hashCode(filledTexture); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/progress/BaseProgressDrawable.java b/src/main/java/brachy/modularui/drawable/progress/BaseProgressDrawable.java index b87e18a..e93d86c 100644 --- a/src/main/java/brachy/modularui/drawable/progress/BaseProgressDrawable.java +++ b/src/main/java/brachy/modularui/drawable/progress/BaseProgressDrawable.java @@ -12,6 +12,7 @@ import net.minecraft.Util; +import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.function.DoubleSupplier; @@ -122,4 +123,22 @@ public ProgressWidget asWidget() { if (this.progress != null) widget.clientValue(this.progress); return widget; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof BaseProgressDrawable that)) return false; + + return Float.compare(progressStepSize, that.progressStepSize) == 0 && + Objects.equals(emptyBackground, that.emptyBackground) && + Objects.equals(progress, that.progress); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(emptyBackground); + result = 31 * result + Objects.hashCode(progress); + result = 31 * result + Float.hashCode(progressStepSize); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/progress/CircularProgressDrawable.java b/src/main/java/brachy/modularui/drawable/progress/CircularProgressDrawable.java index 1773a2d..34e8310 100644 --- a/src/main/java/brachy/modularui/drawable/progress/CircularProgressDrawable.java +++ b/src/main/java/brachy/modularui/drawable/progress/CircularProgressDrawable.java @@ -122,6 +122,22 @@ public CircularProgressDrawable counterClockwise() { return direction(Direction.CCW); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CircularProgressDrawable that)) return false; + if (!super.equals(o)) return false; + + return direction == that.direction; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + direction.hashCode(); + return result; + } + public enum Direction { CW, CCW } diff --git a/src/main/java/brachy/modularui/drawable/progress/CompositeProgress.java b/src/main/java/brachy/modularui/drawable/progress/CompositeProgress.java index cb09fab..ddefca7 100644 --- a/src/main/java/brachy/modularui/drawable/progress/CompositeProgress.java +++ b/src/main/java/brachy/modularui/drawable/progress/CompositeProgress.java @@ -111,6 +111,22 @@ public CompositeProgress progress(DoubleSupplier progress) { return super.progress(progress); } + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CompositeProgress that)) return false; + if (!super.equals(o)) return false; + + return this.parts.equals(that.parts); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + this.parts.hashCode(); + return result; + } + public static class Part implements Comparable { private final BaseProgressDrawable progress; diff --git a/src/main/java/brachy/modularui/drawable/progress/ProgressDrawable.java b/src/main/java/brachy/modularui/drawable/progress/ProgressDrawable.java index 1f735a9..2ce74cb 100644 --- a/src/main/java/brachy/modularui/drawable/progress/ProgressDrawable.java +++ b/src/main/java/brachy/modularui/drawable/progress/ProgressDrawable.java @@ -124,6 +124,23 @@ public ProgressDrawable smooth() { return super.smooth().progressPixelStepSize(-1); } + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ProgressDrawable that)) return false; + if (!super.equals(o)) return false; + + return Float.compare(progressPixelStepSize, that.progressPixelStepSize) == 0 && direction == that.direction; + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + direction.hashCode(); + result = 31 * result + Float.hashCode(progressPixelStepSize); + return result; + } + public enum Direction { LEFT, RIGHT, diff --git a/src/main/java/brachy/modularui/drawable/text/DynamicComponent.java b/src/main/java/brachy/modularui/drawable/text/DynamicComponent.java index e1aa7d1..fb1f468 100644 --- a/src/main/java/brachy/modularui/drawable/text/DynamicComponent.java +++ b/src/main/java/brachy/modularui/drawable/text/DynamicComponent.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Objects; import java.util.function.Supplier; public class DynamicComponent implements Component, IDrawable { @@ -102,4 +103,18 @@ public DynamicComponent fallbackStyle(ChatFormatting... style) { public Style getFallbackStyle() { return this.style; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof DynamicComponent that)) return false; + + return Objects.equals(supplier, that.supplier) && style.equals(that.style); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(supplier); + result = 31 * result + style.hashCode(); + return result; + } } diff --git a/src/main/java/brachy/modularui/drawable/text/KeyIcon.java b/src/main/java/brachy/modularui/drawable/text/KeyIcon.java index b8e914a..8894b25 100755 --- a/src/main/java/brachy/modularui/drawable/text/KeyIcon.java +++ b/src/main/java/brachy/modularui/drawable/text/KeyIcon.java @@ -11,6 +11,8 @@ import lombok.Getter; +import java.util.Objects; + /** * An icon which represents a {@link Text} object. * Note: This class assumes the string will be a single line! @@ -127,6 +129,24 @@ public KeyIcon font(Font fr) { return this; } + @Override + public final boolean equals(Object o) { + if (!(o instanceof KeyIcon that)) return false; + + return expandWidth == that.expandWidth && expandHeight == that.expandHeight && + key.equals(that.key) && Objects.equals(overrideFont, that.overrideFont) && margin.equals(that.margin); + } + + @Override + public int hashCode() { + int result = key.hashCode(); + result = 31 * result + Objects.hashCode(overrideFont); + result = 31 * result + margin.hashCode(); + result = 31 * result + Boolean.hashCode(expandWidth); + result = 31 * result + Boolean.hashCode(expandHeight); + return result; + } + @Override public String toString() { return "KeyIcon(" + this.key.get() + ")"; diff --git a/src/main/java/brachy/modularui/drawable/text/ModularComponent.java b/src/main/java/brachy/modularui/drawable/text/ModularComponent.java index a7ee775..ba7fd6d 100644 --- a/src/main/java/brachy/modularui/drawable/text/ModularComponent.java +++ b/src/main/java/brachy/modularui/drawable/text/ModularComponent.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.function.IntSupplier; import java.util.function.UnaryOperator; @@ -210,6 +211,24 @@ public ModularComponent asModular() { return (ModularComponent) super.withStyle(modifyFunc); } + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof ModularComponent other)) return false; + return super.equals(other) && this.alignment.equals(other.alignment) && Float.compare(this.scale, other.scale) == 0 && + Objects.equals(this.shadow, other.shadow) && this.dynamicColor.equals(other.dynamicColor); + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + Objects.hashCode(this.alignment); + result = 31 * result + Float.hashCode(this.scale); + result = 31 * result + Objects.hashCode(this.shadow); + result = 31 * result + Objects.hashCode(getDynamicColor()); + return result; + } + @Override public boolean saveToJson(JsonObject json) { json.add("alignment", JsonHelper.serialize(this.alignment)); diff --git a/src/main/java/brachy/modularui/drawable/text/RichText.java b/src/main/java/brachy/modularui/drawable/text/RichText.java index e134322..01ea0e6 100644 --- a/src/main/java/brachy/modularui/drawable/text/RichText.java +++ b/src/main/java/brachy/modularui/drawable/text/RichText.java @@ -107,7 +107,7 @@ public RichText reset() { } @Override - public RichText add(FormattedText c) { + public RichText add(Component c) { addElement(c); clearComponents(); return this; diff --git a/src/main/java/brachy/modularui/drawable/text/TextIcon.java b/src/main/java/brachy/modularui/drawable/text/TextIcon.java index ef60552..ab2d448 100755 --- a/src/main/java/brachy/modularui/drawable/text/TextIcon.java +++ b/src/main/java/brachy/modularui/drawable/text/TextIcon.java @@ -50,4 +50,22 @@ public IIcon getWrappedDrawable() { public Box getMargin() { return margin; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof TextIcon textIcon)) return false; + + return width == textIcon.width && height == textIcon.height && Float.compare(scale, textIcon.scale) == 0 && + text.equals(textIcon.text) && alignment.equals(textIcon.alignment); + } + + @Override + public int hashCode() { + int result = text.hashCode(); + result = 31 * result + width; + result = 31 * result + height; + result = 31 * result + Float.hashCode(scale); + result = 31 * result + alignment.hashCode(); + return result; + } } diff --git a/src/main/java/brachy/modularui/integration/emi/recipe/ModularUIEmiRecipe.java b/src/main/java/brachy/modularui/integration/emi/recipe/ModularUIEmiRecipe.java index 50524cd..f056a7e 100644 --- a/src/main/java/brachy/modularui/integration/emi/recipe/ModularUIEmiRecipe.java +++ b/src/main/java/brachy/modularui/integration/emi/recipe/ModularUIEmiRecipe.java @@ -169,7 +169,7 @@ public List getTooltip(int mouseX, int mouseY) { richTooltip.isEmpty(); // causes the tooltip to rebuild if necessary IRichTextBuilder richTextBuilder = richTooltip.getRichText(); if (richTextBuilder instanceof RichText richText) { - // scuffed conversion, but it works mostly + // scuffed conversion, but it mostly works return richText.getAsText().toClientTooltipComponents(); } return List.of(); diff --git a/src/main/java/brachy/modularui/integration/rei/recipe/ModularUIREIDisplay.java b/src/main/java/brachy/modularui/integration/rei/recipe/ModularUIREIDisplay.java index 0239dca..8b67c69 100644 --- a/src/main/java/brachy/modularui/integration/rei/recipe/ModularUIREIDisplay.java +++ b/src/main/java/brachy/modularui/integration/rei/recipe/ModularUIREIDisplay.java @@ -2,7 +2,6 @@ import brachy.modularui.api.widget.ITooltip; import brachy.modularui.api.widget.IWidget; -import brachy.modularui.client.component.FormattedTextContents; import brachy.modularui.drawable.text.RichText; import brachy.modularui.integration.recipeviewer.RecipeSlotRole; import brachy.modularui.integration.recipeviewer.RecipeViewerScreenWrapper; @@ -19,13 +18,9 @@ import brachy.modularui.widgets.slot.FluidSlot; import brachy.modularui.widgets.slot.ItemSlot; -import com.mojang.datafixers.util.Either; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.tooltip.TooltipComponent; import lombok.Getter; import me.shedaniel.math.Rectangle; @@ -139,11 +134,8 @@ public List createWidgets(Rectangle bounds) { if (tooltip.tooltip().getRichText() instanceof RichText richText) { var textList = richText.getAsText(); entryWidget.tooltipProcessor(text -> { - for (Either line : textList) { - // TODO this is stupid - line.ifLeft(ft -> text.add(MutableComponent.create(new FormattedTextContents(ft)))); - line.ifRight(text::add); - } + // FIXME this is stupid + textList.forEach(line -> line.map(text::add, text::add)); return text; }); } diff --git a/src/main/java/brachy/modularui/schema/ArraySchema.java b/src/main/java/brachy/modularui/schema/ArraySchema.java index 7bb3389..13164c4 100755 --- a/src/main/java/brachy/modularui/schema/ArraySchema.java +++ b/src/main/java/brachy/modularui/schema/ArraySchema.java @@ -28,9 +28,11 @@ import org.joml.Vector3fc; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.BiPredicate; public class ArraySchema implements ISchema { @@ -146,6 +148,23 @@ protected Map.Entry computeNext() { }; } + @Override + public final boolean equals(Object o) { + if (!(o instanceof ArraySchema entries)) return false; + + return level.equals(entries.level) && Arrays.deepEquals(blocks, entries.blocks) && + Objects.equals(renderFilter, entries.renderFilter) && center.equals(entries.center); + } + + @Override + public int hashCode() { + int result = level.hashCode(); + result = 31 * result + Arrays.deepHashCode(blocks); + result = 31 * result + Objects.hashCode(renderFilter); + result = 31 * result + center.hashCode(); + return result; + } + public static class Builder { private final List tensor = new ArrayList<>(); diff --git a/src/main/java/brachy/modularui/schema/BoxSchema.java b/src/main/java/brachy/modularui/schema/BoxSchema.java index 6048762..6d8c25c 100755 --- a/src/main/java/brachy/modularui/schema/BoxSchema.java +++ b/src/main/java/brachy/modularui/schema/BoxSchema.java @@ -45,4 +45,20 @@ public Vector3fc getFocus() { public BlockPos getOrigin() { return min; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof BoxSchema entries)) return false; + + return level.equals(entries.level) && min.equals(entries.min) && max.equals(entries.max) && center.equals(entries.center); + } + + @Override + public int hashCode() { + int result = level.hashCode(); + result = 31 * result + min.hashCode(); + result = 31 * result + max.hashCode(); + result = 31 * result + center.hashCode(); + return result; + } } diff --git a/src/main/java/brachy/modularui/schema/PosListSchema.java b/src/main/java/brachy/modularui/schema/PosListSchema.java index 5d1ff6a..bb6cdbc 100755 --- a/src/main/java/brachy/modularui/schema/PosListSchema.java +++ b/src/main/java/brachy/modularui/schema/PosListSchema.java @@ -13,6 +13,7 @@ import java.util.Iterator; import java.util.Map; +import java.util.Objects; import java.util.function.BiPredicate; public abstract class PosListSchema implements ISchema { @@ -60,4 +61,19 @@ public Pair next() { } }; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof PosListSchema entries)) return false; + + return level.equals(entries.level) && posList.equals(entries.posList) && Objects.equals(renderFilter, entries.renderFilter); + } + + @Override + public int hashCode() { + int result = level.hashCode(); + result = 31 * result + posList.hashCode(); + result = 31 * result + Objects.hashCode(renderFilter); + return result; + } } diff --git a/src/main/java/brachy/modularui/screen/ClientScreenHandler.java b/src/main/java/brachy/modularui/screen/ClientScreenHandler.java index 4c3ad88..780b48e 100644 --- a/src/main/java/brachy/modularui/screen/ClientScreenHandler.java +++ b/src/main/java/brachy/modularui/screen/ClientScreenHandler.java @@ -399,11 +399,11 @@ public static void clickSlot(ModularScreen ms, Slot slot) { // remove buttons to make sure they are not clicked acc.setChildren(Collections.emptyList()); // set clicked slot to make sure the container clicks the desired slot - clickableScreen.gtceu$setClickedSlot(slot); + clickableScreen.modularui$setClickedSlot(slot); screen.mouseClicked(ctx.getMouseX(), ctx.getMouseY(), ctx.getLastMouseButton()); } finally { // undo modifications - clickableScreen.gtceu$setClickedSlot(null); + clickableScreen.modularui$setClickedSlot(null); acc.setChildren(buttonList); } } diff --git a/src/main/java/brachy/modularui/screen/IClickableContainerScreen.java b/src/main/java/brachy/modularui/screen/IClickableContainerScreen.java index f0b9695..c1c42ef 100755 --- a/src/main/java/brachy/modularui/screen/IClickableContainerScreen.java +++ b/src/main/java/brachy/modularui/screen/IClickableContainerScreen.java @@ -4,7 +4,7 @@ public interface IClickableContainerScreen { - void gtceu$setClickedSlot(Slot slot); + void modularui$setClickedSlot(Slot slot); - Slot gtceu$getClickedSlot(); + Slot modularui$getClickedSlot(); } diff --git a/src/main/java/brachy/modularui/screen/RichTooltip.java b/src/main/java/brachy/modularui/screen/RichTooltip.java index 9f7022a..51845b8 100644 --- a/src/main/java/brachy/modularui/screen/RichTooltip.java +++ b/src/main/java/brachy/modularui/screen/RichTooltip.java @@ -23,6 +23,7 @@ import net.minecraft.network.chat.FormattedText; import net.minecraft.util.Mth; import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; @@ -31,13 +32,17 @@ import net.minecraftforge.client.event.RenderTooltipEvent; import net.minecraftforge.common.MinecraftForge; +import com.mojang.datafixers.util.Either; + import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.Tolerate; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; @Accessors(fluent = true, chain = true) @@ -147,8 +152,11 @@ public void draw(GuiContext context, ItemStack stack) { // vanilla event to gather additional tooltip TooltipLines textLines = copy.getAsText(); + List> vanillaLines = textLines.stream() + .map(either -> either.mapBoth(c -> (FormattedText) c, Function.identity())) + .toList(); // noinspection UnstableApiUsage - var vanillaGatherEvent = new RenderTooltipEvent.GatherComponents(stack, screen.width, screen.height, textLines, this.maxWidth); + var vanillaGatherEvent = new RenderTooltipEvent.GatherComponents(stack, screen.width, screen.height, vanillaLines, this.maxWidth); if (MinecraftForge.EVENT_BUS.post(vanillaGatherEvent)) return; this.maxWidth = vanillaGatherEvent.getMaxWidth(); @@ -187,7 +195,7 @@ public void draw(GuiContext context, ItemStack stack) { context.getGraphics().pose().translate(-screen.x, -screen.y, 400); GuiDraw.drawTooltipBackground(context, stack, components, area.x, area.y, area.width, area.height, copy); - // MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostBackground(stack, textLines, area.x, area.y, + // MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostBackground(stack, vanillaLines, area.x, area.y, // TextRenderer.getFont(), area.width, area.height)); RenderSystem.setShaderColor(1f, 1f, 1f, 1f); @@ -375,11 +383,11 @@ public RichTooltip tooltipBuilder(Consumer tooltipBuilder) { public RichTooltip addFromItem(ItemStack item) { List lines = MCHelper.getItemToolTip(item); - add((FormattedText) lines.get(0)); + add(lines.get(0)); if (lines.size() > 1) { spaceLine(); for (int i = 1, n = lines.size(); i < n; i++) { - add((FormattedText) lines.get(i)).newLine(); + add(lines.get(i)).newLine(); } } return this; @@ -445,6 +453,33 @@ public RichTooltip copy() { return tooltip; } + @Override + public final boolean equals(Object o) { + if (!(o instanceof RichTooltip that)) return false; + + return showUpTimer == that.showUpTimer && autoUpdate == that.autoUpdate && + titleMargin == that.titleMargin && appliedMargin == that.appliedMargin + && x == that.x && y == that.y && maxWidth == that.maxWidth && + text.equals(that.text) && Objects.equals(parent, that.parent) && pos == that.pos && + Objects.equals(tooltipBuilder, that.tooltipBuilder); + } + + @Override + public int hashCode() { + int result = text.hashCode(); + result = 31 * result + Objects.hashCode(parent); + result = 31 * result + pos.hashCode(); + result = 31 * result + Objects.hashCode(tooltipBuilder); + result = 31 * result + showUpTimer; + result = 31 * result + Boolean.hashCode(autoUpdate); + result = 31 * result + titleMargin; + result = 31 * result + Boolean.hashCode(appliedMargin); + result = 31 * result + x; + result = 31 * result + y; + result = 31 * result + maxWidth; + return result; + } + public enum Pos { ABOVE(GuiAxis.Y), diff --git a/src/main/java/brachy/modularui/utils/Alignment.java b/src/main/java/brachy/modularui/utils/Alignment.java index 7f1ae0c..c3eed29 100644 --- a/src/main/java/brachy/modularui/utils/Alignment.java +++ b/src/main/java/brachy/modularui/utils/Alignment.java @@ -62,6 +62,13 @@ private Alignment(float x, float y, String name) { } } + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Alignment other)) return false; + return this.x == other.x && this.y == other.y; + } + /** * Defines how elements should be aligned on the main axis. * In a row this would mean the x coordinates. diff --git a/src/main/java/brachy/modularui/utils/TooltipLines.java b/src/main/java/brachy/modularui/utils/TooltipLines.java index 80ff24c..a10c841 100755 --- a/src/main/java/brachy/modularui/utils/TooltipLines.java +++ b/src/main/java/brachy/modularui/utils/TooltipLines.java @@ -1,5 +1,6 @@ package brachy.modularui.utils; +import brachy.modularui.api.drawable.IDrawable; import brachy.modularui.api.drawable.Text; import brachy.modularui.drawable.ClientTooltipComponentIcon; import brachy.modularui.drawable.text.FontRenderHelper; @@ -19,7 +20,7 @@ /** * A list that lazily parses a list of text-like and drawable types into a vanilla compatible types. */ -public class TooltipLines extends AbstractList> { +public class TooltipLines extends AbstractList> { private final List elements; private final List lines = new ArrayList<>(8); @@ -44,44 +45,50 @@ private void buildUntil(int index) { private Line parseNext() { if (this.lastElementIndex >= elements.size()) return null; - FormattedText currentLine = FormattedText.EMPTY; + List currentLine = new ArrayList<>(); int currentLength = 0; for (int i = this.lastElementIndex; i < this.elements.size(); i++) { Object o = elements.get(i); currentLength++; - if (o == Text.LINE_FEED) { - if (currentLength == 1 && i > 0 && this.elements.get(i - 1) != Text.LINE_FEED) { + if (Text.LINE_FEED.equals(o)) { + if (currentLength == 1 && i > 0 && !Text.LINE_FEED.equals(this.elements.get(i - 1))) { this.lastElementIndex++; continue; } - Line line = new Line(currentLine, this.lastElementIndex, currentLength); + Line line = new Line(collapse(currentLine), this.lastElementIndex, currentLength); this.lastElementIndex += currentLength; return line; } - FormattedText s = null; - if (o instanceof FormattedText txt) { - s = txt; + Component c = null; + if (o instanceof Component txt) { + c = txt; } else if (o instanceof String str) { - s = FormattedText.of(str); + c = Component.literal(str); } else if (o instanceof TextIcon ti) { - s = ti.getText(); - } else if (o instanceof TooltipComponent tc) { - if (FontRenderHelper.isEmpty(currentLine)) { - Line line = new Line(tc, this.lastElementIndex, currentLength); + c = ti.getText(); + } + if (c != null && !FontRenderHelper.isEmpty(c)) { + currentLine.add(c); + continue; + } + + if (o instanceof IDrawable drawable && !(o instanceof TooltipComponent)) { + o = drawable.asIcon(); + } + if (o instanceof TooltipComponent tc) { + Line line; + if (currentLine.isEmpty()) { + line = new Line(tc, this.lastElementIndex, currentLength); this.lastElementIndex += currentLength; - return line; } else { - Line line = new Line(currentLine, this.lastElementIndex, currentLength); + line = new Line(collapse(currentLine), this.lastElementIndex, currentLength); this.lastElementIndex += currentLength - 1; - return line; } - } - if (s != null) { - currentLine = FontRenderHelper.isEmpty(currentLine) ? s : FormattedText.composite(currentLine, s); + return line; } } if (currentLength > 0) { - Line line = new Line(currentLine, this.lastElementIndex, currentLength); + Line line = new Line(collapse(currentLine), this.lastElementIndex, currentLength); this.lastElementIndex += currentLength; return line; } @@ -89,7 +96,7 @@ private Line parseNext() { } @Override - public Either get(int index) { + public Either get(int index) { buildUntil(index); return lines.get(index).text; } @@ -101,7 +108,7 @@ public int size() { } @Override - public Either remove(int index) { + public Either remove(int index) { buildUntil(index); Line line = lines.remove(index); @@ -119,7 +126,7 @@ public Either remove(int index) { } @Override - public void add(int index, Either s) { + public void add(int index, Either s) { buildUntil(index); int elementIndex = index >= this.lines.size() ? this.lastElementIndex : this.lines.get(index).index; lines.add(index, new Line(s, elementIndex, 1)); @@ -133,16 +140,16 @@ public void add(int index, Either s) { // TODO support tooltip component } - public void add(int index, FormattedText s) { + public void add(int index, Component s) { add(index, Either.left(s)); } - public void add(FormattedText s) { + public void add(Component s) { add(size(), Either.left(s)); } @Override - public Either set(int index, Either element) { + public Either set(int index, Either element) { Line line = lines.get(index); if (line.length == 1) { this.elements.set(line.index, element); @@ -182,19 +189,25 @@ public static ClientTooltipComponent tooltipComponentToCTC(TooltipComponent comp return ClientTooltipComponent.create(comp); } + private static Component collapse(List components) { + if (components.isEmpty()) return Text.EMPTY; + else if (components.size() == 1) return components.get(0); + else return Text.comp(components.toArray(Component[]::new)); + } + private static class Line { - private final Either text; + private final Either text; private final int length; private int index; - private Line(Either text, int index, int length) { + private Line(Either text, int index, int length) { this.text = text; this.index = index; this.length = length; } - private Line(FormattedText text, int index, int length) { + private Line(Component text, int index, int length) { this(Either.left(text), index, length); } diff --git a/src/main/java/brachy/modularui/utils/fakelevel/MapSchema.java b/src/main/java/brachy/modularui/utils/fakelevel/MapSchema.java index b486d2b..fb2d6c2 100755 --- a/src/main/java/brachy/modularui/utils/fakelevel/MapSchema.java +++ b/src/main/java/brachy/modularui/utils/fakelevel/MapSchema.java @@ -20,6 +20,7 @@ import java.util.Iterator; import java.util.Map; +import java.util.Objects; import java.util.function.BiPredicate; import java.util.function.Function; @@ -130,6 +131,25 @@ protected Map.Entry computeNext() { }; } + @Override + public boolean equals(Object o) { + if (!(o instanceof MapSchema entries)) return false; + + return Objects.equals(level, entries.level) && blocks.equals(entries.blocks) && + Objects.equals(renderFilter, entries.renderFilter) && Objects.equals(origin, entries.origin) && + Objects.equals(center, entries.center); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(level); + result = 31 * result + blocks.hashCode(); + result = 31 * result + Objects.hashCode(renderFilter); + result = 31 * result + Objects.hashCode(origin); + result = 31 * result + Objects.hashCode(center); + return result; + } + @Accessors(chain = true) public static class Builder { diff --git a/src/main/java/brachy/modularui/utils/fakelevel/SchemaLevel.java b/src/main/java/brachy/modularui/utils/fakelevel/SchemaLevel.java index e642241..17dda67 100755 --- a/src/main/java/brachy/modularui/utils/fakelevel/SchemaLevel.java +++ b/src/main/java/brachy/modularui/utils/fakelevel/SchemaLevel.java @@ -58,6 +58,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.BiPredicate; import java.util.stream.Stream; import javax.annotation.ParametersAreNonnullByDefault; @@ -314,6 +315,27 @@ public FeatureFlagSet enabledFeatures() { return FeatureFlags.VANILLA_SET; } + @Override + public final boolean equals(Object o) { + if (!(o instanceof SchemaLevel entries)) return false; + + return filledBlocks.equals(entries.filledBlocks) && Objects.equals(renderFilter, entries.renderFilter) && + litSections.equals(entries.litSections) && min.equals(entries.min) && max.equals(entries.max) && + biome.equals(entries.biome) && defaultDataLayer.equals(entries.defaultDataLayer); + } + + @Override + public int hashCode() { + int result = filledBlocks.hashCode(); + result = 31 * result + Objects.hashCode(renderFilter); + result = 31 * result + litSections.hashCode(); + result = 31 * result + min.hashCode(); + result = 31 * result + max.hashCode(); + result = 31 * result + biome.hashCode(); + result = 31 * result + defaultDataLayer.hashCode(); + return result; + } + private static class ClientCallWrapper { private static RecipeManager getClientRecipeManager() { diff --git a/src/main/java/brachy/modularui/utils/serialization/network/ByteBufAdapters.java b/src/main/java/brachy/modularui/utils/serialization/network/ByteBufAdapters.java index c3e3715..bd2843f 100644 --- a/src/main/java/brachy/modularui/utils/serialization/network/ByteBufAdapters.java +++ b/src/main/java/brachy/modularui/utils/serialization/network/ByteBufAdapters.java @@ -46,8 +46,7 @@ public class ByteBufAdapters { public static final IByteBufAdapter GLOBAL_POS = makeAdapterFromCodec(GlobalPos.CODEC, GlobalPos::equals); public static final IByteBufAdapter RESOURCE_LOCATION = makeAdapterFromCodec(ResourceLocation.CODEC, ResourceLocation::equals); public static final IByteBufAdapter UUID = makeAdapter(FriendlyByteBuf::readUUID, FriendlyByteBuf::writeUUID, java.util.UUID::equals); - public static final IByteBufAdapter COMPONENT = makeAdapter(FriendlyByteBuf::readComponent, FriendlyByteBuf::writeComponent, - (a, b) -> Objects.equals(a.getString(), b.getString())); + public static final IByteBufAdapter COMPONENT = makeAdapter(FriendlyByteBuf::readComponent, FriendlyByteBuf::writeComponent, Component::equals); public static final IByteBufAdapter BYTE_ARR = new IByteBufAdapter<>() { diff --git a/src/main/resources/modularui.mixins.json b/src/main/resources/modularui.mixins.json index 460bec4..e52a801 100755 --- a/src/main/resources/modularui.mixins.json +++ b/src/main/resources/modularui.mixins.json @@ -16,7 +16,7 @@ ], "mixins": [ "common.CombinedInvWrapperAccessor", - "common.ComponentMixin" + "common.ComponentMixin" ], "injectors": { "defaultRequire": 1,