diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java index 5b467a57..0c0c9d77 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java @@ -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. diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/page/Page.java b/eco-api/src/main/java/com/willfp/eco/core/gui/page/Page.java index 83591807..8cbfc18b 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/page/Page.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/page/Page.java @@ -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 page) { + this.pageNumber = pageNumber; + MenuBuilder builder = Menu.builder(6); + page.accept(builder); + this.page = builder.build(); + } + /** * Get the current page number. * diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageBuilder.java b/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageBuilder.java new file mode 100644 index 00000000..f82fb462 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageBuilder.java @@ -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 action); +} diff --git a/eco-api/src/main/kotlin/com/willfp/eco/core/gui/GUIHelpers.kt b/eco-api/src/main/kotlin/com/willfp/eco/core/gui/GUIHelpers.kt index 83e456cb..2092df24 100644 --- a/eco-api/src/main/kotlin/com/willfp/eco/core/gui/GUIHelpers.kt +++ b/eco-api/src/main/kotlin/com/willfp/eco/core/gui/GUIHelpers.kt @@ -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(