From 97b5d0e35eab5be0c8f2b70b4a6fce176eb56e1f Mon Sep 17 00:00:00 2001 From: "natan.nascimento" Date: Wed, 27 Sep 2023 16:37:08 -0300 Subject: [PATCH] Draft --- .../internal/LayoutSlot.java | 16 +++++++++--- .../pipeline/LayoutRenderInterceptor.java | 26 ++++++++++++------- .../pipeline/LayoutResolutionInterceptor.java | 3 ++- .../AvailableSlotInterceptorTest.java | 8 +++--- .../context/PlatformRenderContext.java | 19 ++++++++++++++ 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/LayoutSlot.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/LayoutSlot.java index 9b15c29d2..68b7d3c25 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/LayoutSlot.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/LayoutSlot.java @@ -14,11 +14,13 @@ public final class LayoutSlot { private final char character; private final IntFunction factory; private final int[] positions; + private final boolean fill; - public LayoutSlot(char character, @Nullable IntFunction factory, int[] positions) { + public LayoutSlot(char character, @Nullable IntFunction factory, int[] positions, boolean fill) { this.character = character; this.factory = factory; this.positions = positions; + this.fill = fill; } public char getCharacter() { @@ -30,9 +32,13 @@ public IntFunction getFactory() { } public LayoutSlot withFactory(@Nullable IntFunction factory) { - return new LayoutSlot(character, factory, positions); + return new LayoutSlot(character, factory, positions, fill); } + public LayoutSlot withFill(boolean fill) { + return new LayoutSlot(character, factory, positions, fill); + } + public int[] getPositions() { return positions; } @@ -41,6 +47,10 @@ public boolean isDefinedByTheUser() { return factory != null; } + public boolean isToFill() { + return fill; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -57,6 +67,6 @@ public int hashCode() { @Override public String toString() { return "LayoutSlot{" + "character=" + character + ", factory=" + factory + ", positions=" - + Arrays.toString(positions) + '}'; + + Arrays.toString(positions) + ", fill=" + fill + "}"; } } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutRenderInterceptor.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutRenderInterceptor.java index eadb12ff4..f172398c9 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutRenderInterceptor.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutRenderInterceptor.java @@ -25,15 +25,23 @@ public void intercept(PipelineContext pipeline, VirtualView subject continue; } - int iterationIndex = 0; - for (final int slot : layoutSlot.getPositions()) { - final ComponentFactory componentFactory = factory.apply(iterationIndex++); - if (componentFactory instanceof ItemComponentBuilder) - ((ItemComponentBuilder) componentFactory).withSlot(slot); - - final Component component = componentFactory.create(); - renderContext.addComponent(component); - } + if (layoutSlot.isToFill()) { + int iterationIndex = 0; + for (final int slot : layoutSlot.getPositions()) { + renderContext.addComponent(createComponent(slot, iterationIndex++, factory)); + } + } else { + final int nextAvailableSlot = layoutSlot. + renderContext.addComponent(createComponent(nextAvailableSlot, 0 /* TODO not supported for now */, factory)); + } } } + + private Component createComponent(int slot, int index, IntFunction factory) { + final ComponentFactory componentFactory = factory.apply(index); + if (componentFactory instanceof ItemComponentBuilder) + ((ItemComponentBuilder) componentFactory).withSlot(slot); + + return componentFactory.create(); + } } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutResolutionInterceptor.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutResolutionInterceptor.java index b615d5007..fac97381d 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutResolutionInterceptor.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/pipeline/LayoutResolutionInterceptor.java @@ -26,7 +26,8 @@ public void intercept(PipelineContext pipeline, VirtualView subject final LayoutSlot layoutSlot = new LayoutSlot( entry.getKey(), null, - entry.getValue().stream().mapToInt($ -> $).toArray()); + entry.getValue().stream().mapToInt($ -> $).toArray(),, + true); renderContext.addLayoutSlot(layoutSlot); } } diff --git a/inventory-framework-core/src/test/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptorTest.java b/inventory-framework-core/src/test/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptorTest.java index 70a525ed5..5c1d1dc05 100644 --- a/inventory-framework-core/src/test/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptorTest.java +++ b/inventory-framework-core/src/test/java/me/devnatan/inventoryframework/pipeline/AvailableSlotInterceptorTest.java @@ -44,7 +44,7 @@ void resolveFromLayoutMustBeEmptyIfPositionsIsNull() { when(context.getConfig()).thenReturn(createLayoutConfig(defaultLayout)); when(context.getLayoutSlots()) .thenReturn(Collections.singletonList( - new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> mock(ComponentFactory.class), null))); + new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> mock(ComponentFactory.class), null, true))); assertTrue(new AvailableSlotInterceptor().resolveFromLayoutSlot(context).isEmpty()); } @@ -56,7 +56,7 @@ void resolveFromLayoutMustBeEmptyIfPositionsIsEmpty() { when(context.getConfig()).thenReturn(createLayoutConfig(defaultLayout)); LayoutSlot layoutSlot = - new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> mock(ComponentFactory.class), new int[0]); + new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> mock(ComponentFactory.class), new int[0], true); when(context.getLayoutSlots()).thenReturn(Collections.singletonList(layoutSlot)); @@ -83,7 +83,7 @@ void resolveFromLayoutSlot() { when(context.getAvailableSlotFactory()).thenReturn(availableSlotFactory); LayoutSlot layoutSlot = - new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> componentFactory, defaultLayoutSlotRange); + new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> componentFactory, defaultLayoutSlotRange, true); when(context.getLayoutSlots()).thenReturn(Collections.singletonList(layoutSlot)); List resolved = new AvailableSlotInterceptor().resolveFromLayoutSlot(context); @@ -111,7 +111,7 @@ void interceptFromLayoutSlot() { when(context.getAvailableSlotFactory()).thenReturn(availableSlotFactory); LayoutSlot layoutSlot = - new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> componentFactory, defaultLayoutSlotRange); + new LayoutSlot(LayoutSlot.FILLED_RESERVED_CHAR, $ -> componentFactory, defaultLayoutSlotRange, true); when(context.getLayoutSlots()).thenReturn(Collections.singletonList(layoutSlot)); new AvailableSlotInterceptor().intercept(mock(PipelineContext.class), context); diff --git a/inventory-framework-platform/src/main/java/me/devnatan/inventoryframework/context/PlatformRenderContext.java b/inventory-framework-platform/src/main/java/me/devnatan/inventoryframework/context/PlatformRenderContext.java index 7c9754550..5deda12cc 100644 --- a/inventory-framework-platform/src/main/java/me/devnatan/inventoryframework/context/PlatformRenderContext.java +++ b/inventory-framework-platform/src/main/java/me/devnatan/inventoryframework/context/PlatformRenderContext.java @@ -215,6 +215,25 @@ public void layoutSlot(char character, @NotNull BiConsumer factory) })); } + /** + *

This API is experimental and is not subject to the general compatibility guarantees + * such API may be changed or may be removed completely in any further release. + */ + @ApiStatus.Experimental + public @NotNull T singleLayoutSlot(char character) { + requireNonReservedLayoutCharacter(character); + + // TODO More detailed exception message + final LayoutSlot layoutSlot = getLayoutSlots().stream() + .filter(value -> value.getCharacter() == character) + .findFirst() + .orElseThrow(() -> new InventoryFrameworkException("Missing layout character: " + character)); + + final T builder = createBuilder(); + getLayoutSlots().add(layoutSlot.withFactory($ -> (ComponentFactory) builder).withFill(false)); + return builder; + } + /** *

This API is experimental and is not subject to the general compatibility guarantees * such API may be changed or may be removed completely in any further release.