diff options
7 files changed, 348 insertions, 347 deletions
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java b/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java index 8524afb..54038ec 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/CottonCraftingController.java @@ -83,7 +83,7 @@ public class CottonCraftingController extends CraftingContainer<Inventory> imple @Environment(EnvType.CLIENT) public void addPainters() { if (this.rootPanel!=null) { - this.rootPanel.setBackgroundPainter(BackgroundPainter.VANILLA_9PATCH); + this.rootPanel.setBackgroundPainter(BackgroundPainter.VANILLA); } } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java b/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java index 014d458..70d8ba4 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/client/BackgroundPainter.java @@ -3,9 +3,6 @@ package io.github.cottonmc.cotton.gui.client; import io.github.cottonmc.cotton.gui.widget.WItemSlot; import io.github.cottonmc.cotton.gui.widget.WWidget; import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; - -import javax.annotation.Nullable; /** * Background painters are used to paint the background of a widget. @@ -25,20 +22,20 @@ public interface BackgroundPainter { * The {@code VANILLA} background painter draws a vanilla-like gui panel using {@link ScreenDrawing#drawGuiPanel(int, int, int, int)}. * * <p>This background painter applies a padding of 8 pixels to all sides around the widget. + * + * <p>This background painter is the default painter for root panels. + * * You can override {@link io.github.cottonmc.cotton.gui.GuiDescription#addPainters()} to customize the painter yourself. */ public static BackgroundPainter VANILLA = (left, top, panel) -> { ScreenDrawing.drawGuiPanel(left-8, top-8, panel.getWidth()+16, panel.getHeight()+16); }; /** - * The {@code VANILLA_9PATCH} background painter draws a vanilla-like gui panel using nine-patch textures. + * The {@code VANILLA_9PATCH} background painter draws a vanilla-like gui panel using {@linkplain NinePatch nine-patch textures}. * * <p>This background painter uses {@code libgui:textures/widget/panel_light.png} as the light texture and * {@code libgui:textures/widget/panel_dark.png} as the dark texture. * - * <p>This background painter is the default painter for root panels. - * You can override {@link io.github.cottonmc.cotton.gui.GuiDescription#addPainters()} to customize the painter yourself. - * * <p>This background painter applies a padding of 8 pixels to all sides around the widget. * * @since 1.5.0 @@ -112,7 +109,7 @@ public interface BackgroundPainter { * @return a new nine-patch background painter * @since 1.5.0 */ - public static BackgroundPainter.NinePatch createNinePatch(Identifier texture) { + public static NinePatch createNinePatch(Identifier texture) { return new NinePatch(texture); } @@ -126,7 +123,7 @@ public interface BackgroundPainter { * @return a new nine-patch background painter * @since 1.5.0 */ - public static BackgroundPainter.NinePatch createNinePatch(Identifier texture, int padding) { + public static NinePatch createNinePatch(Identifier texture, int padding) { return new NinePatch(texture).setPadding(padding); } @@ -145,238 +142,4 @@ public interface BackgroundPainter { else light.paintBackground(left, top, panel); }; } - - /** - * The nine-patch background painter paints rectangles using a nine-patch texture. - * - * <p>Nine-patch textures are separated into nine sections: four corners, four edges and a center part. - * The edges and the center are either tiled or stretched, depending on the {@linkplain BackgroundPainter.NinePatch.Mode mode}, - * to fill the area between the corners. By default, the texture mode is loaded from the texture metadata. - * The default mode for that is {@link BackgroundPainter.NinePatch.Mode#STRETCHING}. - * - * <p>{@code NinePatch} painters have a customizable padding that can be applied. - * For example, a GUI panel for a container block might have a padding of 8 pixels, like {@link BackgroundPainter#VANILLA}. - * You can set the padding using {@link NinePatch#setPadding(int)}. - * - * <h2>Nine-patch metadata</h2> - * You can specify metadata for a nine-patch texture in a resource pack by creating a metadata file. - * Metadata files can currently specify the filling mode of the painter that paints the texture. - * <p>The metadata file for a texture has to be placed in the same directory as the texture. - * The file name must be {@code X.9patch} where X is the texture file name (including .png). - * <p>Metadata files use {@linkplain java.util.Properties .properties format} with the following keys: - * <table border="1"> - * <caption>Properties</caption> - * <tr> - * <th>Key</th> - * <th>Value</th> - * <th>Description</th> - * </tr> - * <tr> - * <td>{@code mode}</td> - * <td>{@link Mode#STRETCHING stretching} | {@link Mode#TILING tiling}</td> - * <td>The texture filling mode</td> - * </tr> - * <tr> - * <td>{@code cornerUv}</td> - * <td>a float</td> - * <td>the fraction of the corners of the whole texture</td> - * </tr> - * </table> - * - * @since 1.5.0 - */ - public static class NinePatch implements BackgroundPainter { - private final Identifier texture; - private final int cornerSize; - private int topPadding = 0; - private int leftPadding = 0; - private int bottomPadding = 0; - private int rightPadding = 0; - private Mode mode = null; - - /** - * Creates a nine-patch background painter with 4 px corners. - * - * @param texture the texture ID - */ - public NinePatch(Identifier texture) { - this(texture, 4); - } - - /** - * Creates a nine-patch background painter. - * - * @param texture the texture ID - * @param cornerSize the size of the corners on the screen - */ - public NinePatch(Identifier texture, int cornerSize) { - this.texture = texture; - this.cornerSize = cornerSize; - } - - public int getTopPadding() { - return topPadding; - } - - public NinePatch setTopPadding(int topPadding) { - this.topPadding = topPadding; - return this; - } - - public int getLeftPadding() { - return leftPadding; - } - - public NinePatch setLeftPadding(int leftPadding) { - this.leftPadding = leftPadding; - return this; - } - - public int getBottomPadding() { - return bottomPadding; - } - - public NinePatch setBottomPadding(int bottomPadding) { - this.bottomPadding = bottomPadding; - return this; - } - - public int getRightPadding() { - return rightPadding; - } - - public NinePatch setRightPadding(int rightPadding) { - this.rightPadding = rightPadding; - return this; - } - - public NinePatch setPadding(int padding) { - this.topPadding = this.leftPadding = this.bottomPadding = this.rightPadding = padding; - return this; - } - - public NinePatch setPadding(int vertical, int horizontal) { - this.topPadding = this.bottomPadding = vertical; - this.leftPadding = this.rightPadding = horizontal; - return this; - } - - public NinePatch setPadding(int topPadding, int leftPadding, int bottomPadding, int rightPadding) { - this.topPadding = topPadding; - this.leftPadding = leftPadding; - this.bottomPadding = bottomPadding; - this.rightPadding = rightPadding; - - return this; - } - - public Identifier getTexture() { - return texture; - } - - public int getCornerSize() { - return cornerSize; - } - - @Nullable - public Mode getMode() { - return mode; - } - - /** - * Sets the {@linkplain Mode mode} of this painter to the specified mode. - * <p>If the {@code mode} is not null, it will override the one specified in the texture metadata. - * A null mode uses the texture metadata. - */ - public NinePatch setMode(@Nullable Mode mode) { - this.mode = mode; - return this; - } - - @Override - public void paintBackground(int left, int top, WWidget panel) { - NinePatchMetadataLoader.TextureProperties properties = NinePatchMetadataLoader.INSTANCE.getProperties(texture); - int width = panel.getWidth() + leftPadding + rightPadding; - int height = panel.getHeight() + topPadding + bottomPadding; - left = left - leftPadding; - top = top - topPadding; - int x1 = left + cornerSize; - int x2 = left + width - cornerSize; - int y1 = top + cornerSize; - int y2 = top + height - cornerSize; - float cornerUv = properties.getCornerUv(); - float uv1 = cornerUv; - float uv2 = 1.0f - cornerUv; - Mode mode = this.mode != null ? this.mode : properties.getMode(); - - ScreenDrawing.texturedRect(left, top, cornerSize, cornerSize, texture, 0, 0, uv1, uv1, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(x2, top, cornerSize, cornerSize, texture, uv2, 0, 1, uv1, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(left, y2, cornerSize, cornerSize, texture, 0, uv2, uv1, 1, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(x2, y2, cornerSize, cornerSize, texture, uv2, uv2, 1, 1, 0xFF_FFFFFF); - - if (mode == Mode.TILING) { - int tileSize = (int) (cornerSize / cornerUv - 2 * cornerSize); - int widthLeft = width - 2 * cornerSize; - int heightLeft = height - 2 * cornerSize; - int tileCountX = MathHelper.ceil((float) widthLeft / tileSize); - int tileCountY = MathHelper.ceil((float) heightLeft / tileSize); - for (int i = 0; i < tileCountX; i++) { - float px = 1 / 16f; - int tileWidth = Math.min(widthLeft, tileSize); - float uo = (tileSize - tileWidth) * px; // Used to remove unnecessary pixels on the X axis - - ScreenDrawing.texturedRect(x1 + i * tileSize, top, tileWidth, cornerSize, texture, uv1, 0, uv2 - uo, uv1, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(x1 + i * tileSize, y2, tileWidth, cornerSize, texture, uv1, uv2, uv2 - uo, 1, 0xFF_FFFFFF); - - // Reset the height left each time the Y is looped - heightLeft = height - 2 * cornerSize; - - for (int j = 0; j < tileCountY; j++) { - int tileHeight = Math.min(heightLeft, tileSize); - float vo = (tileSize - tileHeight) * px; // Used to remove unnecessary pixels on the Y axis - - ScreenDrawing.texturedRect(left, y1 + j * tileSize, cornerSize, tileHeight, texture, 0, uv1, uv1, uv2 - vo, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(x2, y1 + j * tileSize, cornerSize, tileHeight, texture, uv2, uv1, 1, uv2 - vo, 0xFF_FFFFFF); - - ScreenDrawing.texturedRect(x1 + i * tileSize, y1 + j * tileSize, tileWidth, tileHeight, texture, uv1, uv1, uv2 - uo, uv2 - vo, 0xFF_FFFFFF); - heightLeft -= tileSize; - } - widthLeft -= tileSize; - } - } else { - ScreenDrawing.texturedRect(x1, top, width - 2 * cornerSize, cornerSize, texture, uv1, 0, uv2, uv1, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(left, y1, cornerSize, height - 2 * cornerSize, texture, 0, uv1, uv1, uv2, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(x1, y2, width - 2 * cornerSize, cornerSize, texture, uv1, uv2, uv2, 1, 0xFF_FFFFFF); - ScreenDrawing.texturedRect(x2, y1, cornerSize, height - 2 * cornerSize, texture, uv2, uv1, 1, uv2, 0xFF_FFFFFF); - - ScreenDrawing.texturedRect(x1, y1, width - 2 * cornerSize, height - 2 * cornerSize, texture, uv1, uv1, uv2, uv2, 0xFF_FFFFFF); - } - } - - /** - * The mode of a nine-patch painter defines how it fills the area between the corners. - */ - public enum Mode { - /** - * The texture is stretched to fill the edges and the center. - * This is the default mode. - */ - STRETCHING, - - /** - * The texture is tiled to fill the edges and the center. - */ - TILING; - - @Nullable - static Mode fromString(String str) { - if (str == null) return null; - - if (str.equalsIgnoreCase("stretching")) return STRETCHING; - if (str.equalsIgnoreCase("tiling")) return TILING; - - return null; - } - } - } } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/LibGuiClient.java b/src/main/java/io/github/cottonmc/cotton/gui/client/LibGuiClient.java index d457e50..013382f 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/client/LibGuiClient.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/client/LibGuiClient.java @@ -27,7 +27,7 @@ public class LibGuiClient implements ClientModInitializer { public void onInitializeClient() { config = loadConfig(); - ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(NinePatchMetadataLoader.INSTANCE); + ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(NinePatch.MetadataLoader.INSTANCE); } public static LibGuiConfig loadConfig() { diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java b/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java index 078b390..6284c2f 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/client/LightweightGuiDescription.java @@ -45,7 +45,7 @@ public class LightweightGuiDescription implements GuiDescription { @Override public void addPainters() { if (this.rootPanel!=null) { - this.rootPanel.setBackgroundPainter(BackgroundPainter.VANILLA_9PATCH); + this.rootPanel.setBackgroundPainter(BackgroundPainter.VANILLA); } } diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatch.java b/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatch.java new file mode 100644 index 0000000..baae61a --- /dev/null +++ b/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatch.java @@ -0,0 +1,337 @@ +package io.github.cottonmc.cotton.gui.client; + +import io.github.cottonmc.cotton.gui.widget.WWidget; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.minecraft.resource.Resource; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.SinglePreparationResourceReloadListener; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.profiler.Profiler; + +import javax.annotation.Nullable; +import java.io.InputStream; +import java.util.*; + +/** + * The nine-patch background painter paints rectangles using a nine-patch texture. + * + * <p>Nine-patch textures are separated into nine sections: four corners, four edges and a center part. + * The edges and the center are either tiled or stretched, depending on the {@linkplain Mode mode}, + * to fill the area between the corners. By default, the texture mode is loaded from the texture metadata. + * The default mode for that is {@link Mode#STRETCHING}. + * + * <p>{@code NinePatch} painters have a customizable padding that can be applied. + * For example, a GUI panel for a container block might have a padding of 8 pixels, like {@link BackgroundPainter#VANILLA}. + * You can set the padding using {@link NinePatch#setPadding(int)}. + * + * <h2>Nine-patch metadata</h2> + * You can specify metadata for a nine-patch texture in a resource pack by creating a metadata file. + * Metadata files can currently specify the filling mode of the painter that paints the texture. + * <p>The metadata file for a texture has to be placed in the same directory as the texture. + * The file name must be {@code X.9patch} where X is the texture file name (including .png). + * <p>Metadata files use {@linkplain java.util.Properties the .properties format} with the following keys: + * <table border="1"> + * <caption>Properties</caption> + * <tr> + * <th>Key</th> + * <th>Value</th> + * <th>Description</th> + * </tr> + * <tr> + * <td>{@code mode}</td> + * <td>{@link Mode#STRETCHING stretching} | {@link Mode#TILING tiling}</td> + * <td>The texture filling mode</td> + * </tr> + * <tr> + * <td>{@code cornerUv}</td> + * <td>a float</td> + * <td>the fraction of the corners of the whole texture</td> + * </tr> + * </table> + * + * @since 1.5.0 + */ +public class NinePatch implements BackgroundPainter { + private final Identifier texture; + private final int cornerSize; + private int topPadding = 0; + private int leftPadding = 0; + private int bottomPadding = 0; + private int rightPadding = 0; + private Mode mode = null; + + /** + * Creates a nine-patch background painter with 4 px corners. + * + * @param texture the texture ID + */ + public NinePatch(Identifier texture) { + this(texture, 4); + } + + /** + * Creates a nine-patch background painter. + * + * @param texture the texture ID + * @param cornerSize the size of the corners on the screen + */ + public NinePatch(Identifier texture, int cornerSize) { + this.texture = texture; + this.cornerSize = cornerSize; + } + + public int getTopPadding() { + return topPadding; + } + + public NinePatch setTopPadding(int topPadding) { + this.topPadding = topPadding; + return this; + } + + public int getLeftPadding() { + return leftPadding; + } + + public NinePatch setLeftPadding(int leftPadding) { + this.leftPadding = leftPadding; + return this; + } + + public int getBottomPadding() { + return bottomPadding; + } + + public NinePatch setBottomPadding(int bottomPadding) { + this.bottomPadding = bottomPadding; + return this; + } + + public int getRightPadding() { + return rightPadding; + } + + public NinePatch setRightPadding(int rightPadding) { + this.rightPadding = rightPadding; + return this; + } + + public NinePatch setPadding(int padding) { + this.topPadding = this.leftPadding = this.bottomPadding = this.rightPadding = padding; + return this; + } + + public NinePatch setPadding(int vertical, int horizontal) { + this.topPadding = this.bottomPadding = vertical; + this.leftPadding = this.rightPadding = horizontal; + return this; + } + + public NinePatch setPadding(int topPadding, int leftPadding, int bottomPadding, int rightPadding) { + this.topPadding = topPadding; + this.leftPadding = leftPadding; + this.bottomPadding = bottomPadding; + this.rightPadding = rightPadding; + + return this; + } + + public Identifier getTexture() { + return texture; + } + + public int getCornerSize() { + return cornerSize; + } + + @Nullable + public Mode getMode() { + return mode; + } + + /** + * Sets the {@linkplain Mode mode} of this painter to the specified mode. + * <p>If the {@code mode} is not null, it will override the one specified in the texture metadata. + * A null mode uses the texture metadata. + */ + public NinePatch setMode(@Nullable Mode mode) { + this.mode = mode; + return this; + } + + @Override + public void paintBackground(int left, int top, WWidget panel) { + TextureProperties properties = MetadataLoader.INSTANCE.getProperties(texture); + int width = panel.getWidth() + leftPadding + rightPadding; + int height = panel.getHeight() + topPadding + bottomPadding; + left = left - leftPadding; + top = top - topPadding; + int x1 = left + cornerSize; + int x2 = left + width - cornerSize; + int y1 = top + cornerSize; + int y2 = top + height - cornerSize; + float cornerUv = properties.getCornerUv(); + float uv1 = cornerUv; + float uv2 = 1.0f - cornerUv; + Mode mode = this.mode != null ? this.mode : properties.getMode(); + + ScreenDrawing.texturedRect(left, top, cornerSize, cornerSize, texture, 0, 0, uv1, uv1, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(x2, top, cornerSize, cornerSize, texture, uv2, 0, 1, uv1, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(left, y2, cornerSize, cornerSize, texture, 0, uv2, uv1, 1, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(x2, y2, cornerSize, cornerSize, texture, uv2, uv2, 1, 1, 0xFF_FFFFFF); + + if (mode == Mode.TILING) { + int tileSize = (int) (cornerSize / cornerUv - 2 * cornerSize); + int widthLeft = width - 2 * cornerSize; + int heightLeft = height - 2 * cornerSize; + int tileCountX = MathHelper.ceil((float) widthLeft / tileSize); + int tileCountY = MathHelper.ceil((float) heightLeft / tileSize); + for (int i = 0; i < tileCountX; i++) { + float px = 1 / 16f; + int tileWidth = Math.min(widthLeft, tileSize); + float uo = (tileSize - tileWidth) * px; // Used to remove unnecessary pixels on the X axis + + ScreenDrawing.texturedRect(x1 + i * tileSize, top, tileWidth, cornerSize, texture, uv1, 0, uv2 - uo, uv1, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(x1 + i * tileSize, y2, tileWidth, cornerSize, texture, uv1, uv2, uv2 - uo, 1, 0xFF_FFFFFF); + + // Reset the height left each time the Y is looped + heightLeft = height - 2 * cornerSize; + + for (int j = 0; j < tileCountY; j++) { + int tileHeight = Math.min(heightLeft, tileSize); + float vo = (tileSize - tileHeight) * px; // Used to remove unnecessary pixels on the Y axis + + ScreenDrawing.texturedRect(left, y1 + j * tileSize, cornerSize, tileHeight, texture, 0, uv1, uv1, uv2 - vo, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(x2, y1 + j * tileSize, cornerSize, tileHeight, texture, uv2, uv1, 1, uv2 - vo, 0xFF_FFFFFF); + + ScreenDrawing.texturedRect(x1 + i * tileSize, y1 + j * tileSize, tileWidth, tileHeight, texture, uv1, uv1, uv2 - uo, uv2 - vo, 0xFF_FFFFFF); + heightLeft -= tileSize; + } + widthLeft -= tileSize; + } + } else { + ScreenDrawing.texturedRect(x1, top, width - 2 * cornerSize, cornerSize, texture, uv1, 0, uv2, uv1, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(left, y1, cornerSize, height - 2 * cornerSize, texture, 0, uv1, uv1, uv2, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(x1, y2, width - 2 * cornerSize, cornerSize, texture, uv1, uv2, uv2, 1, 0xFF_FFFFFF); + ScreenDrawing.texturedRect(x2, y1, cornerSize, height - 2 * cornerSize, texture, uv2, uv1, 1, uv2, 0xFF_FFFFFF); + + ScreenDrawing.texturedRect(x1, y1, width - 2 * cornerSize, height - 2 * cornerSize, texture, uv1, uv1, uv2, uv2, 0xFF_FFFFFF); + } + } + + /** + * The mode of a nine-patch painter defines how it fills the area between the corners. + */ + public enum Mode { + /** + * The texture is stretched to fill the edges and the center. + * This is the default mode. + */ + STRETCHING, + + /** + * The texture is tiled to fill the edges and the center. + */ + TILING; + + @Nullable + static Mode fromString(String str) { + if (str == null) return null; + + if (str.equalsIgnoreCase("stretching")) return STRETCHING; + if (str.equalsIgnoreCase("tiling")) return TILING; + + return null; + } + } + + public static class TextureProperties { + public static final TextureProperties DEFAULT = new TextureProperties(Mode.STRETCHING, 0.25f); + + private final Mode mode; + private final float cornerUv; + + public TextureProperties(Mode mode, float cornerUv) { + this.mode = mode; + this.cornerUv = cornerUv; + } + + public Mode getMode() { + return mode; + } + + public float getCornerUv() { + return cornerUv; + } + } + + @Environment(EnvType.CLIENT) + public static class MetadataLoader extends SinglePreparationResourceReloadListener<Map<Identifier, Properties>> implements IdentifiableResourceReloadListener { + public static final MetadataLoader INSTANCE = new MetadataLoader(); + + private static final Identifier ID = new Identifier("libgui", "9patch_metadata"); + private static final String SUFFIX = ".9patch"; + + private Map<Identifier, TextureProperties> properties = Collections.emptyMap(); + + public TextureProperties getProperties(Identifier texture) { + return properties.getOrDefault(texture, TextureProperties.DEFAULT); + } + + @Override + public Identifier getFabricId() { + return ID; + } + + @Override + protected Map<Identifier, Properties> prepare(ResourceManager manager, Profiler profiler) { + Collection<Identifier> ids = manager.findResources("textures", s -> s.endsWith(SUFFIX)); + Map<Identifier, Properties> result = new HashMap<>(); + + for (Identifier input : ids) { + try (Resource resource = manager.getResource(input); + InputStream stream = resource.getInputStream()) { + Properties props = new Properties(); + props.load(stream); + Identifier textureId = new Identifier(input.getNamespace(), input.getPath().substring(0, input.getPath().length() - SUFFIX.length())); + result.put(textureId, props); + } catch (Exception e) { + LibGuiClient.logger.error("Error while loading metadata file {}, skipping...", input, e); + } + } + + return result; + } + + @Override + protected void apply(Map<Identifier, Properties> meta, ResourceManager manager, Profiler profiler) { + properties = new HashMap<>(); + for (Map.Entry<Identifier, Properties> entry : meta.entrySet()) { + Identifier id = entry.getKey(); + Properties props = entry.getValue(); + + Mode mode = TextureProperties.DEFAULT.getMode(); + float cornerUv = TextureProperties.DEFAULT.getCornerUv(); + + if (props.containsKey("mode")) { + String modeStr = props.getProperty("mode"); + mode = Mode.fromString(modeStr); + if (mode == null) { + LibGuiClient.logger.error("Invalid mode '{}' in nine-patch metadata file for texture {}", modeStr, id); + continue; + } + } + + if (props.containsKey("cornerUv")) { + cornerUv = Float.parseFloat(props.getProperty("cornerUv")); + } + + TextureProperties texProperties = new TextureProperties(mode, cornerUv); + properties.put(id, texProperties); + } + } + } +} diff --git a/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchMetadataLoader.java b/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchMetadataLoader.java deleted file mode 100644 index f55e6ac..0000000 --- a/src/main/java/io/github/cottonmc/cotton/gui/client/NinePatchMetadataLoader.java +++ /dev/null @@ -1,100 +0,0 @@ -package io.github.cottonmc.cotton.gui.client; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.resource.SinglePreparationResourceReloadListener; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; - -import java.io.InputStream; -import java.util.*; - -@Environment(EnvType.CLIENT) -public class NinePatchMetadataLoader extends SinglePreparationResourceReloadListener<Map<Identifier, Properties>> implements IdentifiableResourceReloadListener { - public static final NinePatchMetadataLoader INSTANCE = new NinePatchMetadataLoader(); - - private static final Identifier ID = new Identifier("libgui", "9patch_metadata"); - private static final String SUFFIX = ".9patch"; - - private Map<Identifier, TextureProperties> properties = Collections.emptyMap(); - - public TextureProperties getProperties(Identifier texture) { - return properties.getOrDefault(texture, TextureProperties.DEFAULT); - } - - @Override - public Identifier getFabricId() { - return ID; - } - - @Override - protected Map<Identifier, Properties> prepare(ResourceManager manager, Profiler profiler) { - Collection<Identifier> ids = manager.findResources("textures", s -> s.endsWith(SUFFIX)); - Map<Identifier, Properties> result = new HashMap<>(); - - for (Identifier input : ids) { - try (Resource resource = manager.getResource(input); - InputStream stream = resource.getInputStream()) { - Properties props = new Properties(); - props.load(stream); - Identifier textureId = new Identifier(input.getNamespace(), input.getPath().substring(0, input.getPath().length() - SUFFIX.length())); - result.put(textureId, props); - } catch (Exception e) { - LibGuiClient.logger.error("Error while loading metadata file {}, skipping...", input, e); - } - } - - return result; - } - - @Override - protected void apply(Map<Identifier, Properties> meta, ResourceManager manager, Profiler profiler) { - properties = new HashMap<>(); - for (Map.Entry<Identifier, Properties> entry : meta.entrySet()) { - Identifier id = entry.getKey(); - Properties props = entry.getValue(); - - BackgroundPainter.NinePatch.Mode mode = TextureProperties.DEFAULT.getMode(); - float cornerUv = TextureProperties.DEFAULT.getCornerUv(); - - if (props.containsKey("mode")) { - String modeStr = props.getProperty("mode"); - mode = BackgroundPainter.NinePatch.Mode.fromString(modeStr); - if (mode == null) { - LibGuiClient.logger.error("Invalid mode '{}' in nine-patch metadata file for texture {}", modeStr, id); - continue; - } - } - - if (props.containsKey("cornerUv")) { - cornerUv = Float.parseFloat(props.getProperty("cornerUv")); - } - - TextureProperties texProperties = new TextureProperties(mode, cornerUv); - properties.put(id, texProperties); - } - } - - public static class TextureProperties { - public static final TextureProperties DEFAULT = new TextureProperties(BackgroundPainter.NinePatch.Mode.STRETCHING, 0.25f); - - private final BackgroundPainter.NinePatch.Mode mode; - private final float cornerUv; - - public TextureProperties(BackgroundPainter.NinePatch.Mode mode, float cornerUv) { - this.mode = mode; - this.cornerUv = cornerUv; - } - - public BackgroundPainter.NinePatch.Mode getMode() { - return mode; - } - - public float getCornerUv() { - return cornerUv; - } - } -} diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WTitle.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WTitle.java index b415970..d17835b 100644 --- a/src/main/java/io/github/cottonmc/cotton/gui/widget/WTitle.java +++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WTitle.java @@ -1,6 +1,7 @@ package io.github.cottonmc.cotton.gui.widget; import io.github.cottonmc.cotton.gui.client.BackgroundPainter; +import io.github.cottonmc.cotton.gui.client.NinePatch; import io.github.cottonmc.cotton.gui.client.ScreenDrawing; import io.github.cottonmc.cotton.gui.widget.data.Alignment; import net.fabricmc.api.EnvType; @@ -17,7 +18,7 @@ import javax.annotation.Nullable; * * <p>Titles should be added to their panels at (0, 0) and they should be as wide as the panel. * The default title painter assumes that the containing panel uses {@link BackgroundPainter#VANILLA} or - * a {@linkplain BackgroundPainter.NinePatch nine-patch background painter} with a padding of 8. + * a {@linkplain NinePatch nine-patch background painter} with a padding of 8. */ public class WTitle extends WWidget { public static final BackgroundPainter DEFAULT_BACKGROUND_PAINTER = |