Improved Page API

This commit is contained in:
Auxilor
2022-09-29 20:17:57 +01:00
parent 11685cd352
commit d7891e1218
4 changed files with 125 additions and 23 deletions

View File

@@ -2,6 +2,7 @@ package com.willfp.eco.core.gui.menu;
import com.willfp.eco.core.gui.component.GUIComponent;
import com.willfp.eco.core.gui.page.Page;
import com.willfp.eco.core.gui.page.PageBuilder;
import com.willfp.eco.core.gui.slot.FillerMask;
import com.willfp.eco.core.gui.slot.Slot;
import org.bukkit.entity.Player;
@@ -15,14 +16,7 @@ import java.util.function.Function;
/**
* Builder to create menus.
*/
public interface MenuBuilder {
/**
* Get the amount of rows.
*
* @return The amount of rows.
*/
int getRows();
public interface MenuBuilder extends PageBuilder {
/**
* Set the menu title.
*
@@ -39,11 +33,10 @@ public interface MenuBuilder {
* @param slot The slot.
* @return The builder.
*/
default MenuBuilder setSlot(final int row,
final int column,
@NotNull final Slot slot) {
return this.addComponent(row, column, slot);
}
@Override
MenuBuilder setSlot(final int row,
final int column,
@NotNull final Slot slot);
/**
@@ -55,6 +48,7 @@ public interface MenuBuilder {
* @param component The component.
* @return The builder.
*/
@Override
MenuBuilder addComponent(@NotNull MenuLayer layer,
int row,
int column,
@@ -69,11 +63,10 @@ public interface MenuBuilder {
* @param component The component.
* @return The builder.
*/
default MenuBuilder addComponent(final int row,
final int column,
@NotNull final GUIComponent component) {
return this.addComponent(MenuLayer.MIDDLE, row, column, component);
}
@Override
MenuBuilder addComponent(final int row,
final int column,
@NotNull final GUIComponent component);
/**
* Run function to modify the builder.
@@ -89,9 +82,8 @@ public interface MenuBuilder {
* @param mask The mask.
* @return The builder.
*/
default MenuBuilder setMask(@NotNull final FillerMask mask) {
return this.addComponent(MenuLayer.BACKGROUND, 1, 1, mask);
}
@Override
MenuBuilder setMask(@NotNull final FillerMask mask);
/**
* Add a page.

View File

@@ -3,12 +3,14 @@ package com.willfp.eco.core.gui.page;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.gui.component.GUIComponent;
import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.menu.MenuBuilder;
import com.willfp.eco.core.gui.slot.Slot;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.function.Consumer;
/**
* A page is a component representing another menu.
@@ -52,6 +54,20 @@ public final class Page implements GUIComponent {
this.page = page;
}
/**
* Create a new page.
*
* @param pageNumber The page number.
* @param page The base menu.
*/
public Page(final int pageNumber,
@NotNull final Consumer<PageBuilder> page) {
this.pageNumber = pageNumber;
MenuBuilder builder = Menu.builder(6);
page.accept(builder);
this.page = builder.build();
}
/**
* Get the current page number.
*

View File

@@ -0,0 +1,90 @@
package com.willfp.eco.core.gui.page;
import com.willfp.eco.core.gui.component.GUIComponent;
import com.willfp.eco.core.gui.menu.CloseHandler;
import com.willfp.eco.core.gui.menu.Menu;
import com.willfp.eco.core.gui.menu.MenuLayer;
import com.willfp.eco.core.gui.menu.OpenHandler;
import com.willfp.eco.core.gui.slot.FillerMask;
import com.willfp.eco.core.gui.slot.Slot;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.jetbrains.annotations.NotNull;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* Builder to create pages.
*/
public interface PageBuilder {
/**
* Get the amount of rows.
*
* @return The amount of rows.
*/
int getRows();
/**
* Set a slot.
*
* @param row The row.
* @param column The column.
* @param slot The slot.
* @return The builder.
*/
default PageBuilder setSlot(final int row,
final int column,
@NotNull final Slot slot) {
return this.addComponent(row, column, slot);
}
/**
* Add a component.
*
* @param layer The layer.
* @param row The row of the top left corner.
* @param column The column of the top left corner.
* @param component The component.
* @return The builder.
*/
PageBuilder addComponent(@NotNull MenuLayer layer,
int row,
int column,
@NotNull GUIComponent component);
/**
* Add a component.
*
* @param row The row of the top left corner.
* @param column The column of the top left corner.
* @param component The component.
* @return The builder.
*/
default PageBuilder addComponent(final int row,
final int column,
@NotNull final GUIComponent component) {
return this.addComponent(MenuLayer.MIDDLE, row, column, component);
}
/**
* Set the menu mask.
*
* @param mask The mask.
* @return The builder.
*/
default PageBuilder setMask(@NotNull final FillerMask mask) {
return this.addComponent(MenuLayer.BACKGROUND, 1, 1, mask);
}
/**
* Set the action to run on render.
*
* @param action The action.
* @return The builder.
*/
PageBuilder onRender(@NotNull BiConsumer<Player, Menu> action);
}

View File

@@ -5,6 +5,7 @@ package com.willfp.eco.core.gui
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuBuilder
import com.willfp.eco.core.gui.page.Page
import com.willfp.eco.core.gui.page.PageBuilder
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.core.gui.slot.SlotBuilder
import com.willfp.eco.core.items.TestableItem
@@ -133,8 +134,11 @@ fun MenuBuilder.onRender(action: (Player, Menu) -> Unit): MenuBuilder =
this.onRender { a, b -> action(a, b) }
/** @see MenuBuilder.addPage */
fun MenuBuilder.addPage(page: Int, creation: MenuBuilder.() -> MenuBuilder): MenuBuilder =
this.addPage(Page(page, Menu.builder(this.rows).creation().build()))
fun MenuBuilder.addPage(page: Int, creation: PageBuilder.() -> Unit): MenuBuilder {
val builder = Menu.builder(this.rows)
creation(builder)
return this.addPage(Page(page, builder.build()))
}
/** Kotlin builder for menus. */
fun menu(