diff --git a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/api/v0/ResourcePackEntryWidget.java b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/api/v0/ResourcePackEntryWidget.java index 03e91dd..9d55216 100644 --- a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/api/v0/ResourcePackEntryWidget.java +++ b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/api/v0/ResourcePackEntryWidget.java @@ -1,11 +1,11 @@ package io.gitlab.jfronny.libjf.entrywidgets.api.v0; +import io.gitlab.jfronny.libjf.entrywidgets.impl.EntrypointComparator; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; -import java.util.Comparator; import java.util.List; /** @@ -18,7 +18,7 @@ public interface ResourcePackEntryWidget { List WIDGETS = FabricLoader.getInstance() .getEntrypointContainers("libjf:resource_pack_entry_widget", ResourcePackEntryWidget.class) .stream() - .sorted(Comparator.comparing(entrypoint -> entrypoint.getProvider().getMetadata().getId())) + .sorted(new EntrypointComparator()) .map(EntrypointContainer::getEntrypoint) .toList(); diff --git a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java new file mode 100644 index 0000000..aafe3f8 --- /dev/null +++ b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java @@ -0,0 +1,15 @@ +package io.gitlab.jfronny.libjf.entrywidgets.impl; + +import io.gitlab.jfronny.libjf.entrywidgets.api.v0.ResourcePackEntryWidget; +import net.fabricmc.loader.api.entrypoint.EntrypointContainer; + +import java.util.Comparator; + +public class EntrypointComparator implements Comparator> { + @Override + public int compare(EntrypointContainer o1, EntrypointContainer o2) { + return Comparator., String>comparing(entrypoint -> entrypoint.getProvider().getMetadata().getId()) + .thenComparing(s -> s.getEntrypoint().getClass().getName()) + .compare(o1, o2); + } +} diff --git a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/mixin/ResourcePackEntryMixin.java b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/mixin/ResourcePackEntryMixin.java index 3671b04..ff1360d 100644 --- a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/mixin/ResourcePackEntryMixin.java +++ b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/mixin/ResourcePackEntryMixin.java @@ -15,12 +15,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PackListWidget.ResourcePackEntry.class) public abstract class ResourcePackEntryMixin { - @Shadow - protected abstract boolean isSelectable(); - @Shadow @Final - private ResourcePackOrganizer.Pack pack; - @Unique - int libjf$selected = -1; + @Shadow protected abstract boolean isSelectable(); + @Shadow @Final private ResourcePackOrganizer.Pack pack; + @Unique int libjf$selected = -1; @Inject(at = @At("TAIL"), method = "render(Lnet/minecraft/client/gui/DrawContext;IIIIIIIZF)V") private void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta, CallbackInfo info) { @@ -36,6 +33,7 @@ public abstract class ResourcePackEntryMixin { int height = widget.getHeight(pack, entryHeight); int entryX = x + entryWidth - deltaX - width; int entryY = y + widget.getY(pack, entryHeight); + deltaX += width; boolean widgetHovered = mouseX <= entryX + width && mouseX >= entryX && mouseY <= entryY + height && mouseY >= entryY; widget.render(pack, context, entryX, entryY, widgetHovered, tickDelta); if (widgetHovered) libjf$selected = i; diff --git a/libjf-resource-pack-entry-widgets-v0/src/testmod/java/io/gitlab/jfronny/libjf/entrywidgets/test/TestWidget1.java b/libjf-resource-pack-entry-widgets-v0/src/testmod/java/io/gitlab/jfronny/libjf/entrywidgets/test/TestWidget1.java new file mode 100644 index 0000000..0b1edb0 --- /dev/null +++ b/libjf-resource-pack-entry-widgets-v0/src/testmod/java/io/gitlab/jfronny/libjf/entrywidgets/test/TestWidget1.java @@ -0,0 +1,27 @@ +package io.gitlab.jfronny.libjf.entrywidgets.test; + +import io.gitlab.jfronny.libjf.entrywidgets.api.v0.ResourcePackEntryWidget; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; + +public class TestWidget1 implements ResourcePackEntryWidget { + @Override + public int getWidth(ResourcePackOrganizer.Pack pack) { + return (int) ((System.currentTimeMillis() % 5_000) / 100 + 10); + } + + @Override + public int getXMargin(ResourcePackOrganizer.Pack pack) { + return (int) (Math.abs((System.currentTimeMillis() % 1_200) / 50 - 12) + 5); + } + + @Override + public void render(ResourcePackOrganizer.Pack pack, DrawContext context, int x, int y, boolean hovered, float tickDelta) { + context.fill(x, y, x + getWidth(pack), y + getHeight(pack, 20), hovered ? 0x8000FF80 : 0x8000FF00); + } + + @Override + public void onClick(ResourcePackOrganizer.Pack pack) { + System.out.println("Clicked on Widget1"); + } +} diff --git a/libjf-resource-pack-entry-widgets-v0/src/testmod/java/io/gitlab/jfronny/libjf/entrywidgets/test/TestWidget2.java b/libjf-resource-pack-entry-widgets-v0/src/testmod/java/io/gitlab/jfronny/libjf/entrywidgets/test/TestWidget2.java new file mode 100644 index 0000000..e64c15f --- /dev/null +++ b/libjf-resource-pack-entry-widgets-v0/src/testmod/java/io/gitlab/jfronny/libjf/entrywidgets/test/TestWidget2.java @@ -0,0 +1,22 @@ +package io.gitlab.jfronny.libjf.entrywidgets.test; + +import io.gitlab.jfronny.libjf.entrywidgets.api.v0.ResourcePackEntryWidget; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; + +public class TestWidget2 implements ResourcePackEntryWidget { + @Override + public boolean isVisible(ResourcePackOrganizer.Pack pack, boolean selectable) { + return System.currentTimeMillis() % 1_000 < 500; + } + + @Override + public void render(ResourcePackOrganizer.Pack pack, DrawContext context, int x, int y, boolean hovered, float tickDelta) { + context.fill(x, y, x + getWidth(pack), y + getHeight(pack, 20), hovered ? 0x80FF0080 : 0x80FF0000); + } + + @Override + public void onClick(ResourcePackOrganizer.Pack pack) { + System.out.println("Clicked on Widget2"); + } +} diff --git a/libjf-resource-pack-entry-widgets-v0/src/testmod/resources/fabric.mod.json b/libjf-resource-pack-entry-widgets-v0/src/testmod/resources/fabric.mod.json new file mode 100644 index 0000000..84b1306 --- /dev/null +++ b/libjf-resource-pack-entry-widgets-v0/src/testmod/resources/fabric.mod.json @@ -0,0 +1,21 @@ +{ + "schemaVersion": 1, + "id": "libjf-resource-pack-entry-widgets-v0-testmod", + "name": "LibJF Web", + "version": "1.0", + "environment": "*", + "entrypoints": { + "libjf:resource_pack_entry_widget": [ + "io.gitlab.jfronny.libjf.entrywidgets.test.TestWidget1", + "io.gitlab.jfronny.libjf.entrywidgets.test.TestWidget2" + ] + }, + "custom": { + "libjf": { + "web": true + }, + "modmenu": { + "parent": "libjf-testmod" + } + } +} \ No newline at end of file