You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
packageme.devnatan.inventoryframework.context;
importstaticme.devnatan.inventoryframework.utils.SlotConverter.convertSlot;
importjava.util.function.BiConsumer;
importjava.util.function.Supplier;
importme.devnatan.inventoryframework.InventoryFrameworkException;
importme.devnatan.inventoryframework.ViewType;
importme.devnatan.inventoryframework.VirtualView;
importme.devnatan.inventoryframework.component.Component;
importme.devnatan.inventoryframework.component.ComponentBuilder;
importme.devnatan.inventoryframework.component.ItemComponentBuilder;
importme.devnatan.inventoryframework.component.PlatformComponentBuilder;
importme.devnatan.inventoryframework.internal.LayoutSlot;
importme.devnatan.inventoryframework.utils.SlotConverter;
importorg.jetbrains.annotations.ApiStatus;
importorg.jetbrains.annotations.NotNull;
@SuppressWarnings("unchecked")
publicfinalclassDefaultPublicSlotComponentRenderer<CONTEXT, BUILDERextendsComponentBuilder, ITEM>
implementsPublicSlotComponentRenderer<CONTEXT, BUILDER, ITEM> {
privatefinalVirtualViewroot;
privatefinalIFRenderContextrenderContext;
privatefinalSupplier<BUILDER> builderFactory;
publicDefaultPublicSlotComponentRenderer(
VirtualViewroot, IFRenderContextrenderContext, Supplier<BUILDER> builderFactory) {
this.root = root;
this.renderContext = renderContext;
this.builderFactory = builderFactory;
}
privateItemComponentBuildercreateRegisteredBuilder() {
finalBUILDERbuilder = builderFactory.get();
if (!(builderinstanceofItemComponentBuilder))
thrownewIllegalArgumentException(
"slot(int) is only available in builders that extends ItemComponentBuilder");
renderContext.getNotRenderedComponents().add(builder);
return (ItemComponentBuilder) builder;
}
/** * Creates a new item builder without a specified slot. * <p> * This function is for creating items whose slot is set dynamically during item rendering. * <pre>{@code * unsetSlot().onRender(render -> { * render.setItem(...); * render.setSlot(...); * }); * }</pre> * * <p><b><i> 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. </i></b> * * @return An item builder to configure the item. */@ApiStatus.ExperimentalpublicBUILDERunsetSlot() {
return (BUILDER) createRegisteredBuilder();
}
/** * Adds an item to a specific slot in the context container. * * @param slot The slot in which the item will be positioned. * @return An item builder to configure the item. */public@NotNullBUILDERslot(intslot) {
return (BUILDER) createRegisteredBuilder().withPosition(slot);
}
/** * Adds an item at the specific column and ROW (X, Y) in that context's container. * * @param row The row (Y) in which the item will be positioned. * @param column The column (X) in which the item will be positioned. * @return An item builder to configure the item. */@NotNullpublicfinalBUILDERslot(introw, intcolumn) {
checkAlignedContainerTypeForSlotAssignment();
returnslot(convertSlot(
row,
column,
renderContext.getContainer().getRowsCount(),
renderContext.getContainer().getColumnsCount()));
}
@SuppressWarnings("unchecked")
@OverridepublicBUILDERslot(intslot, ITEMitem) {
return (BUILDER) createRegisteredBuilder().withPosition(slot).withPlatformItem(item);
}
@OverridepublicBUILDERslot(introw, intcolumn, ITEMitem) {
returnslot(
SlotConverter.convertSlot(
row,
column,
renderContext.getContainer().getRowsCount(),
renderContext.getContainer().getColumnsCount()),
item);
}
@Overridepublic <TextendsPlatformComponentBuilder<T, CONTEXT>> voidslot(intslot, Tbuilder) {
slotComponent(slot, builder);
}
@Overridepublic <TextendsPlatformComponentBuilder<T, CONTEXT>> voidslot(introw, intcolumn, Tbuilder) {
slotComponent(
SlotConverter.convertSlot(
row,
column,
renderContext.getContainer().getRowsCount(),
renderContext.getContainer().getColumnsCount()),
builder);
}
/** * Sets an item in the first slot of this context's container. * * @return An item builder to configure the item. */publicBUILDERfirstSlot() {
returnslot(renderContext.getContainer().getFirstSlot());
}
@OverridepublicBUILDERfirstSlot(ITEMitem) {
returnslot(renderContext.getContainer().getFirstSlot(), item);
}
@Overridepublic <TextendsPlatformComponentBuilder<T, CONTEXT>> voidfirstSlot(Tbuilder) {
slotComponent(renderContext.getContainer().getFirstSlot(), builder);
}
/** * Sets an item in the last slot of this context's container. * * @return An item builder to configure the item. */publicBUILDERlastSlot() {
returnslot(renderContext.getContainer().getLastSlot());
}
@OverridepublicBUILDERlastSlot(ITEMitem) {
returnslot(renderContext.getContainer().getLastSlot(), item);
}
@Overridepublic <TextendsPlatformComponentBuilder<T, CONTEXT>> voidlastSlot(Tbuilder) {
slotComponent(renderContext.getContainer().getLastSlot(), builder);
}
/** * <p><b><i> 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. </i></b> */@ApiStatus.ExperimentalpublicBUILDERresultSlot() {
finalViewTypecontainerType = renderContext.getContainer().getType();
finalint[] resultSlots = containerType.getResultSlots();
if (resultSlots == null) thrownewInventoryFrameworkException("No result slots available: " + containerType);
if (resultSlots.length > 1)
thrownewInventoryFrameworkException("#resultSlot() do not support types with more than one result slot.");
returnslot(resultSlots[0]);
}
@OverridepublicBUILDERresultSlot(ITEMitem) {
returnnull;
}
/** * Adds an item in the next available slot of this context's container. * * @return An item builder to configure the item. */publicBUILDERavailableSlot() {
finalBUILDERbuilder = builderFactory.get();
renderContext.getAvailableSlotFactories().add((index, slot) -> {
((ItemComponentBuilder) builder).setPosition(slot);
returnbuilder;
});
returnbuilder;
}
/** * Adds an item in the next available slot of this context's container. * * <pre>{@code * availableSlot((index, builder) -> builder.withItem(...)); * }</pre> * * @param factory A factory to create the item builder to configure the item. * The first parameter is the iteration index of the available slot. */publicvoidavailableSlot(@NotNullBiConsumer<Integer, BUILDER> factory) {
renderContext.getAvailableSlotFactories().add((index, slot) -> {
finalBUILDERbuilder = builderFactory.get();
((ItemComponentBuilder) builder).setPosition(slot);
factory.accept(index, builder);
returnbuilder;
});
}
@Overridepublic <TextendsPlatformComponentBuilder<T, CONTEXT>> voidavailableSlot(Tbuilder) {}
@OverridepublicBUILDERavailableSlot(ITEMitem) {
finalBUILDERbuilder = builderFactory.get();
renderContext.getAvailableSlotFactories().add((index, slot) -> ((ItemComponentBuilder) builder)
.withPlatformItem(item)
.withPosition(slot));
returnbuilder;
}
/** * Defines the item that will represent a character provided in the context layout. * * @param character The layout character target. * @return An item builder to configure the item. */publicBUILDERlayoutSlot(charcharacter) {
// TODO More detailed exception messagefinalLayoutSlotlayoutSlot = renderContext.getLayoutSlots().stream()
.filter(value -> value.getCharacter() == character)
.findFirst()
.orElseThrow(() -> newInventoryFrameworkException("Missing layout character: " + character));
finalBUILDERbuilder = builderFactory.get();
renderContext.getLayoutSlots().add(layoutSlot.withBuilderFactory($ -> builder));
returnbuilder;
}
@SuppressWarnings("unchecked")
@OverridepublicBUILDERlayoutSlot(charcharacter, ITEMitem) {
return (BUILDER) ((ItemComponentBuilder) layoutSlot(character)).withPlatformItem(item);
}
/** * Defines the item that will represent a character provided in the context layout. * * <pre>{@code * layoutSlot('F', (index, builder) -> builder.withItem(...)); * }</pre> * * @param character The layout character target. */publicvoidlayoutSlot(charcharacter, @NotNullBiConsumer<Integer, BUILDER> factory) {
// TODO More detailed exception messagefinalLayoutSlotlayoutSlot = renderContext.getLayoutSlots().stream()
.filter(value -> value.getCharacter() == character)
.findFirst()
.orElseThrow(() -> newInventoryFrameworkException("Missing layout character: " + character));
renderContext.getLayoutSlots().add(layoutSlot.withBuilderFactory(index -> {
finalBUILDERbuilder = builderFactory.get();
factory.accept(index, builder);
returnbuilder;
}));
}
@Overridepublic <TextendsPlatformComponentBuilder<T, CONTEXT>> voidlayoutSlotComponent(charcharacter, Tbuilder) {
finalLayoutSlotlayoutSlot = renderContext.getLayoutSlots().stream()
.filter(value -> value.getCharacter() == character)
.findFirst()
.orElseThrow(() -> newInventoryFrameworkException("Missing layout character: " + character));
renderContext.getLayoutSlots().add(layoutSlot.withComponentFactory(index -> {
finalComponentcomponent = builder.buildComponent(root);
component.setHandle(builder.buildHandle());
returncomponent;
}));
}
// endregion// region Component Assignment Methodsprivate <BextendsPlatformComponentBuilder<B, CONTEXT>> voidslotComponent(intposition, Bbuilder) {
if (position > 0 && builderinstanceofItemComponentBuilder)
((ItemComponentBuilder) builder).setPosition(position);
finalComponentcomponent = builder.buildComponent(root);
component.setHandle(builder.buildHandle());
renderContext.addComponent(component);
}
// endregion// region Internals/** * Throws an {@link IllegalStateException} if container type is not aligned. */privatevoidcheckAlignedContainerTypeForSlotAssignment() {
if (!renderContext.getContainer().getType().isAligned())
thrownewIllegalStateException(String.format(
"Non-aligned container type %s cannot use row-column slots, use absolute %s instead",
renderContext.getContainer().getType().getIdentifier(), "#slot(n)"));
}
// endregion
}
The text was updated successfully, but these errors were encountered:
inventory-framework/inventory-framework-platform/src/main/java/me/devnatan/inventoryframework/context/DefaultPublicSlotComponentRenderer.java
Line 235 in 53b12b8
The text was updated successfully, but these errors were encountered: