diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/ExampleUtil.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/ExampleUtil.java index 19832f5ad..1f2e51af2 100644 --- a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/ExampleUtil.java +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/ExampleUtil.java @@ -24,7 +24,11 @@ public static List getRandomItems(int amount) { } public static ItemStack displayItem(Material material, String displayName) { - ItemStack item = new ItemStack(material); + return displayItem(material, displayName, 1); + } + + public static ItemStack displayItem(Material material, String displayName, int amount) { + ItemStack item = new ItemStack(material, amount); ItemMeta itemMeta = item.getItemMeta(); itemMeta.setDisplayName(displayName); item.setItemMeta(itemMeta); diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java index 57c94c90b..894537adf 100644 --- a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/SamplePlugin.java @@ -17,7 +17,12 @@ public class SamplePlugin extends JavaPlugin { public void onEnable() { ViewFrame viewFrame = ViewFrame.create(this) .install(AnvilInputFeature.AnvilInput) - .with(new AnvilInputSample(), new Failing(), new SimplePagination(), new AutoUpdate()) + .with( + new AnvilInputSample(), + new Failing(), + new SimplePagination(), + new AutoUpdate(), + new PaginationOrientation()) .register(); IFExampleCommandExecutor command = new IFExampleCommandExecutor(viewFrame); diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java index aa9fd9efd..79599b6cb 100644 --- a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/commands/IFExampleCommandExecutor.java @@ -1,6 +1,7 @@ package me.devnatan.inventoryframework.runtime.commands; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import me.devnatan.inventoryframework.View; @@ -8,6 +9,7 @@ import me.devnatan.inventoryframework.runtime.view.AnvilInputSample; import me.devnatan.inventoryframework.runtime.view.AutoUpdate; import me.devnatan.inventoryframework.runtime.view.Failing; +import me.devnatan.inventoryframework.runtime.view.PaginationOrientation; import me.devnatan.inventoryframework.runtime.view.SimplePagination; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -19,11 +21,16 @@ public class IFExampleCommandExecutor implements CommandExecutor, TabCompleter { - private static final Map> views = Map.of( - "anvil", AnvilInputSample.class, - "failing", Failing.class, - "simple-pagination", SimplePagination.class, - "auto-update", AutoUpdate.class); + private static final Map> views; + + static { + views = new HashMap<>(); + views.put("anvil", AnvilInputSample.class); + views.put("failing", Failing.class); + views.put("simple-pagination", SimplePagination.class); + views.put("auto-update", AutoUpdate.class); + views.put("pagination", PaginationOrientation.class); + } private final ViewFrame viewFrame; diff --git a/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/PaginationOrientation.java b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/PaginationOrientation.java new file mode 100644 index 000000000..d706dd3cc --- /dev/null +++ b/examples/paper/src/main/java/me/devnatan/inventoryframework/runtime/view/PaginationOrientation.java @@ -0,0 +1,63 @@ +package me.devnatan.inventoryframework.runtime.view; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import me.devnatan.inventoryframework.View; +import me.devnatan.inventoryframework.ViewConfigBuilder; +import me.devnatan.inventoryframework.component.Pagination; +import me.devnatan.inventoryframework.context.RenderContext; +import me.devnatan.inventoryframework.runtime.ExampleUtil; +import me.devnatan.inventoryframework.state.State; +import org.bukkit.Material; +import org.jetbrains.annotations.NotNull; + +public class PaginationOrientation extends View { + + private final State paginationState = lazyPaginationState( + () -> IntStream.range(0, 50).boxed().collect(Collectors.toList()), (context, builder, index, value) -> { + builder.withItem(ExampleUtil.displayItem(Material.ARROW, "Item " + value, value + 1)); + builder.onClick((ctx) -> { + ctx.getPlayer().sendMessage("You clicked on item " + index); + }); + }); + + @Override + public void onInit(@NotNull ViewConfigBuilder config) { + config.cancelOnClick(); + config.size(6); + config.title("Pagination (HORIZONTAL)"); + config.layout(" ", " ", "OOOOOOOOO", "OOOOOOOOO", "OOOOOOOOO", "OOOOOOOOO"); + } + + @Override + public void onFirstRender(@NotNull RenderContext render) { + render.firstSlot(ExampleUtil.displayItem(Material.DIAMOND, "Change orientation")) + .onClick(click -> { + final Pagination pagination = paginationState.get(click); + pagination.setOrientation(pagination.getOrientation()); + + switch (pagination.getOrientation()) { + case VERTICAL: + pagination.setOrientation(Pagination.Orientation.HORIZONTAL); + break; + case HORIZONTAL: + pagination.setOrientation(Pagination.Orientation.ALTERNATING_COLUMNS); + break; + case ALTERNATING_COLUMNS: + pagination.setOrientation(Pagination.Orientation.ALTERNATING_ROWS); + break; + case ALTERNATING_ROWS: + pagination.setOrientation(Pagination.Orientation.TOP_BOTTOM_LEFT_RIGHT); + break; + case TOP_BOTTOM_LEFT_RIGHT: + pagination.setOrientation(Pagination.Orientation.VERTICAL); + break; + } + + pagination.forceUpdate(); + click.updateTitleForPlayer( + "Pagination (" + pagination.getOrientation().name() + ")"); + click.getPlayer().sendMessage("Pagination orientation set to " + pagination.getOrientation()); + }); + } +} diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ComponentBuilder.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ComponentBuilder.java index 32954a5ca..f97c8029d 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ComponentBuilder.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ComponentBuilder.java @@ -165,48 +165,48 @@ public interface ComponentBuilder, C extends IF */ S hideIf(Predicate condition); - /** - * Identifies this component with a constant key. - *

- * Components with explicit keys are only re-rendered when their key changes. - * This can be used to prevent unnecessary re-renders during updates. - * - *

This API is experimental and is not subject to the general compatibility guarantees. - * It may be changed or removed completely in any further release. - * - * @param key The constant key to identify this component - * @return This component builder - */ + /** + * Identifies this component with a constant key. + *

+ * Components with explicit keys are only re-rendered when their key changes. + * This can be used to prevent unnecessary re-renders during updates. + * + *

This API is experimental and is not subject to the general compatibility guarantees. + * It may be changed or removed completely in any further release. + * + * @param key The constant key to identify this component + * @return This component builder + */ @ApiStatus.Experimental S identifiedBy(String key); - /** - * Identifies this component with a key provided by a {@link Supplier}. - *

- * Components with explicit keys are only re-rendered when their key changes. - * This can be used to prevent unnecessary re-renders during scheduled updates. - * - *

This API is experimental and is not subject to the general compatibility guarantees. - * It may be changed or removed completely in any further release. - * - * @param keyProvider A supplier that provides the key to identify this component. - * @return This component builder. - */ + /** + * Identifies this component with a key provided by a {@link Supplier}. + *

+ * Components with explicit keys are only re-rendered when their key changes. + * This can be used to prevent unnecessary re-renders during scheduled updates. + * + *

This API is experimental and is not subject to the general compatibility guarantees. + * It may be changed or removed completely in any further release. + * + * @param keyProvider A supplier that provides the key to identify this component. + * @return This component builder. + */ @ApiStatus.Experimental S identifiedBy(Supplier keyProvider); - /** - * Identifies this component with a key provided by a {@link Function} based on the context. - *

- * Components with explicit keys are only re-rendered when their key changes. - * This can be used to prevent unnecessary re-renders during scheduled updates. - * - *

This API is experimental and is not subject to the general compatibility guarantees. - * It may be changed or removed completely in any further release. - * - * @param keyProvider A function that provides the key to identify this component based on the context. - * @return This component builder. - */ + /** + * Identifies this component with a key provided by a {@link Function} based on the context. + *

+ * Components with explicit keys are only re-rendered when their key changes. + * This can be used to prevent unnecessary re-renders during scheduled updates. + * + *

This API is experimental and is not subject to the general compatibility guarantees. + * It may be changed or removed completely in any further release. + * + * @param keyProvider A function that provides the key to identify this component based on the context. + * @return This component builder. + */ @ApiStatus.Experimental S identifiedBy(Function keyProvider); } diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java index d09772cac..daa203b04 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/ItemComponent.java @@ -189,8 +189,7 @@ public void render(@NotNull IFSlotRenderContext context) { public void updated(@NotNull IFSlotRenderContext context) { if (context.isCancelled()) return; // Key-based skip optimization should always take precedence - if (keyFactory != null - && lastKey != null) { + if (keyFactory != null && lastKey != null) { String currentKey = keyFactory.apply(context); if (Objects.equals(lastKey, currentKey)) return; } diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java index 06c3439ef..a3b97ac41 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java @@ -235,4 +235,106 @@ static List splitSourceForPage(int index, int pageSize, int pagesCount, List< int toIndex = Math.min(fromIndex + pageSize, src.size()); return src.subList(fromIndex, toIndex); } + + /** + * Returns the orientation used to determine how pagination slot positions + * are traversed when generating paginated components. + * + *

The orientation affects only the ordering of slot positions, + * not the page size. It controls whether items fill the pagination + * horizontally, vertically, or in one of the mixed cluster-based modes.

+ * + * 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. + * + * @return the currently configured {@link Orientation} + */ + @ApiStatus.Experimental + Orientation getOrientation(); + + /** + * Sets the orientation that defines how layout slots will be traversed + * when producing paginated components. + * + *

This setting does not affect the page size — only the ordering of + * component placement inside the layout.

+ * + * 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. + * + * @param orientation the {@link Orientation} value to use + */ + @ApiStatus.Experimental + void setOrientation(Orientation orientation); + + enum Orientation { + + /** + * Column-major ordering. + * + *

Slots are traversed from top to bottom within each column, + * and columns are processed from left to right.

+ * + *

This is used for vertical progression: + *

+         * (r0,c0), (r1,c0), (r2,c0), ...
+         * (r0,c1), (r1,c1), (r2,c1), ...
+         * 
+ *

+ */ + VERTICAL, + + /** + * Row-major ordering. + * + *

Slots are traversed from left to right within each row, + * and rows are processed from top to bottom.

+ * + *

This is the traditional horizontal progression: + *

+         * (r0,c0), (r0,c1), (r0,c2), ...
+         * (r1,c0), (r1,c1), (r1,c2), ...
+         * 
+ *

+ */ + HORIZONTAL, + + /** + * Iterates slot positions using an alternating row-major traversal. + * Elements are interleaved from both ends of the row-major ordered list: + *
+         * first, last, second, penultimate, ...
+         * 
+ * + *

Example for a 3×3 grid (row-major base order: 1–9): + *

+         * order = 1, 9, 2, 8, 3, 7, 4, 6, 5
+         * 
+ */ + ALTERNATING_ROWS, + + /** + * Iterates slot positions using an alternating column-major traversal. + * This variant applies the same interleaving strategy as {@link #ALTERNATING_ROWS} + * but operates on the column-major base order. + * + *

Example for a 3×3 grid (column-major base order: 1–6): + *

+         * order = 1, 9, 4, 6, 7, 3, 2, 8, 5
+         * 
+ */ + ALTERNATING_COLUMNS, + + /** + * Mixed column-major ordering. + * + *

Slots are traversed vertically (top to bottom, left to right), + * but processed sequence-by-sequence. A "sequence" is a contiguous group + * of valid slots in the layout.

+ * + *

This mode preserves logical grouping while following a + * vertical reading direction.

+ */ + TOP_BOTTOM_LEFT_RIGHT; + } } diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/PaginationStateBuilder.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/PaginationStateBuilder.java index 38cb6cbce..a71b215c5 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/PaginationStateBuilder.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/PaginationStateBuilder.java @@ -7,6 +7,7 @@ import me.devnatan.inventoryframework.internal.ElementFactory; import me.devnatan.inventoryframework.internal.LayoutSlot; import me.devnatan.inventoryframework.state.State; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; public final class PaginationStateBuilder< @@ -19,6 +20,7 @@ public final class PaginationStateBuilder< private PaginationElementFactory paginationElementFactory; private BiConsumer pageSwitchHandler; private final boolean async, computed; + private Pagination.Orientation orientation; public PaginationStateBuilder( Supplier internalElementFactoryProvider, @@ -31,6 +33,7 @@ public PaginationStateBuilder( this.sourceProvider = sourceProvider; this.async = async; this.computed = computed; + this.orientation = Pagination.Orientation.HORIZONTAL; } /** @@ -106,6 +109,32 @@ public PaginationStateBuilder onPageSwitch( return this; } + /** + * Defines the iteration order used by pagination. + * The default value is {@link Pagination.Orientation#HORIZONTAL}. + * + *

This controls how layout slot positions are traversed when generating + * paginated components. The orientation affects only the ordering of the + * slot iteration.

+ * + *

This API is experimental and is not subject to the general + * compatibility guarantees. It may be changed or removed entirely + * in a future release.

+ * + * @param orientation the pagination orientation to apply. + * @return this pagination builder. + * + * @see Pagination.Orientation + * @see + * Pagination Orientation on Wiki + * + */ + @ApiStatus.Experimental + public PaginationStateBuilder orientation(Pagination.Orientation orientation) { + this.orientation = orientation; + return this; + } + /** * Builds a pagination state based on this builder values. * @@ -144,4 +173,8 @@ public BiConsumer getPageSwitchHandler() { public PaginationElementFactory getPaginationElementFactory() { return paginationElementFactory; } + + public Pagination.Orientation getOrientation() { + return orientation; + } } diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFSlotContext.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFSlotContext.java index 46182c6d7..84f8ff1ba 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFSlotContext.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/context/IFSlotContext.java @@ -62,14 +62,14 @@ public interface IFSlotContext extends IFContext { @NotNull ViewContainer getContainer(); - /** - * The component associated with this slot context. - * - *

This is an internal inventory-framework API that should not be used from outside of - * this library. No compatibility guarantees are provided. - * - * @return The component associated with this slot context. - */ + /** + * The component associated with this slot context. + * + *

This is an internal inventory-framework API that should not be used from outside of + * this library. No compatibility guarantees are provided. + * + * @return The component associated with this slot context. + */ @ApiStatus.Internal @UnknownNullability Component getComponent(); 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..84298e16f 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 @@ -33,6 +33,10 @@ public LayoutSlot withFactory(@Nullable IntFunction factory) { return new LayoutSlot(character, factory, positions); } + public LayoutSlot withPositions(int[] positions) { + return new LayoutSlot(character, factory, positions); + } + public int[] getPositions() { return positions; } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java index 2237c51b4..382dc7538 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java @@ -41,6 +41,7 @@ public class PaginationImpl extends AbstractStateValue implements Pagination, In private final Object sourceProvider; private final PaginationElementFactory elementFactory; private final BiConsumer pageSwitchHandler; + private Pagination.Orientation orientation; // --- Internal --- private int currPageIndex; @@ -76,7 +77,8 @@ public PaginationImpl( PaginationElementFactory elementFactory, BiConsumer pageSwitchHandler, boolean isAsync, - boolean isComputed) { + boolean isComputed, + Pagination.Orientation orientation) { super(state); this.host = host; this.layoutTarget = layoutTarget; @@ -89,6 +91,7 @@ public PaginationImpl( this.isStatic = sourceProvider instanceof Collection; this.isLazy = !isStatic && !isComputed && (sourceProvider instanceof Function || sourceProvider instanceof Supplier); + this.orientation = orientation; } /** @@ -245,15 +248,17 @@ private void addComponentsForUnconstrainedPagination(IFRenderContext context, Li * @param pageContents Elements of the current page. */ private void addComponentsForLayeredPagination(IFRenderContext context, List pageContents) { - final LayoutSlot layoutSlot = getLayoutSlotForCurrentTarget(context); + LayoutSlot layoutSlot = getLayoutSlotForCurrentTarget(context); debug("[Pagination] Is layout slot defined by the user? %b", layoutSlot.isDefinedByTheUser()); final int contentSize = pageContents.size(); debug("[Pagination] Elements count: %d elements", contentSize); debug("[Pagination] Iterating over '%c' layout target", layoutSlot.getCharacter()); + final int[] orderedPositions = computeSlotOrder(context, layoutSlot.getPositions()); + int index = 0; - for (final int layoutPosition : layoutSlot.getPositions()) { + for (final int layoutPosition : orderedPositions) { if (index >= contentSize) { // A layout slot defined by the user mean the user probably want to add a placeholder // item to fill empty slots that couldn't be reached by the pagination. Happens when @@ -302,6 +307,106 @@ private void addComponentsForLayeredPagination(IFRenderContext context, List } } + private int[] computeSlotOrder(IFRenderContext context, int[] positions) { + Orientation orientation = getOrientation(); + String[] layout = context.getConfig().getLayout(); + + final int rows = layout.length; + final int cols = layout[0].length(); + final int totalSlots = rows * cols; + + boolean[] present = new boolean[totalSlots]; + for (int p : positions) { + if (p >= 0 && p < totalSlots) present[p] = true; + } + + List rowMajor = new ArrayList<>(positions.length); + for (int r = 0; r < rows; r++) { + for (int c = 0; c < cols; c++) { + int slot = r * cols + c; + if (present[slot]) rowMajor.add(slot); + } + } + + List colMajor = new ArrayList<>(positions.length); + for (int c = 0; c < cols; c++) { + for (int r = 0; r < rows; r++) { + int slot = r * cols + c; + if (present[slot]) colMajor.add(slot); + } + } + + if (orientation == Orientation.HORIZONTAL) { + return listToIntArray(rowMajor); + } + if (orientation == Orientation.VERTICAL) { + return listToIntArray(colMajor); + } + if (orientation == Orientation.ALTERNATING_ROWS) { + return interleaveList(rowMajor); + } + if (orientation == Orientation.ALTERNATING_COLUMNS) { + return interleaveList(colMajor); + } + + if (orientation == Orientation.TOP_BOTTOM_LEFT_RIGHT) { + boolean[] added = new boolean[totalSlots]; + List out = new ArrayList<>(positions.length); + + for (int c = 0; c < cols; c++) { + if (c == 0 || c == 2 || c == 4 || c == 6 || c == 8) { + // top -> bottom + for (int r = 0; r < rows; r++) { + int slot = r * cols + c; + if (slot >= 0 && slot < totalSlots && present[slot] && !added[slot]) { + out.add(slot); + added[slot] = true; + } + } + } else { + // bottom -> top + for (int r = rows - 1; r >= 0; r--) { + int slot = r * cols + c; + if (slot >= 0 && slot < totalSlots && present[slot] && !added[slot]) { + out.add(slot); + added[slot] = true; + } + } + } + } + + if (out.size() < positions.length) { + for (int rmSlot : rowMajor) { + if (!added[rmSlot]) { + out.add(rmSlot); + added[rmSlot] = true; + } + } + } + + return listToIntArray(out); + } + + return positions; + } + + private int[] listToIntArray(List list) { + int[] out = new int[list.size()]; + for (int i = 0; i < list.size(); i++) out[i] = list.get(i); + return out; + } + + private int[] interleaveList(List list) { + int n = list.size(); + int[] out = new int[n]; + int l = 0, r = n - 1, idx = 0; + while (l <= r) { + out[idx++] = list.get(l++); + if (l <= r) out[idx++] = list.get(r--); + } + return out; + } + /** * Updates the current page size. *

@@ -730,6 +835,16 @@ public List source() { return currSource; } + @Override + public Orientation getOrientation() { + return orientation; + } + + @Override + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -741,7 +856,8 @@ && getPageSize() == that.getPageSize() && isLazy() == that.isLazy() && pageWasChanged == that.pageWasChanged && Objects.equals(sourceProvider, that.sourceProvider) - && Objects.equals(pageSwitchHandler, that.pageSwitchHandler); + && Objects.equals(pageSwitchHandler, that.pageSwitchHandler) + && Objects.equals(orientation, that.orientation); } @Override @@ -753,7 +869,8 @@ public int hashCode() { currPageIndex, getPageSize(), isLazy(), - pageWasChanged); + pageWasChanged, + orientation); } @Override @@ -769,7 +886,8 @@ public String toString() { + isLazy + ", pageWasChanged=" + pageWasChanged + ", _srcFactory=" + _srcFactory + ", currSource=" - + currSource + "} " + + currSource + ", orientation=" + + orientation + "} " + super.toString(); } } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/StateAccessImpl.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/StateAccessImpl.java index c1783fb87..66d74f12f 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/StateAccessImpl.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/StateAccessImpl.java @@ -237,7 +237,8 @@ protected final State createPaginationState( (PaginationElementFactory) builder.getPaginationElementFactory(), (BiConsumer) builder.getPageSwitchHandler(), builder.isAsync(), - builder.isComputed()); + builder.isComputed(), + builder.getOrientation()); final State state = new PaginationState(id, factory); this.stateRegistry.registerState(state, caller); diff --git a/inventory-framework-platform/src/test/java/me/devnatan/inventoryframework/component/TestItemComponentBuilder.java b/inventory-framework-platform/src/test/java/me/devnatan/inventoryframework/component/TestItemComponentBuilder.java index 200e5dc80..3b4cf9fac 100644 --- a/inventory-framework-platform/src/test/java/me/devnatan/inventoryframework/component/TestItemComponentBuilder.java +++ b/inventory-framework-platform/src/test/java/me/devnatan/inventoryframework/component/TestItemComponentBuilder.java @@ -19,7 +19,7 @@ public TestItemComponentBuilder() { } protected TestItemComponentBuilder( - Function keyFactory, + Function keyFactory, Ref referenceKey, Map data, boolean cancelOnClick, @@ -29,7 +29,7 @@ protected TestItemComponentBuilder( boolean isManagedExternally, Predicate displayCondition) { super( - keyFactory, + keyFactory, referenceKey, data, cancelOnClick,