Added menu pagination

This commit is contained in:
Auxilor
2022-09-29 17:17:13 +01:00
parent 97adae7b32
commit 40b4c26e0f
11 changed files with 336 additions and 34 deletions

View File

@@ -1,10 +1,12 @@
package com.willfp.eco.internal.gui
import com.willfp.eco.core.gui.GUIFactory
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuBuilder
import com.willfp.eco.core.gui.slot.SlotBuilder
import com.willfp.eco.core.gui.slot.functional.SlotProvider
import com.willfp.eco.internal.gui.menu.EcoMenuBuilder
import com.willfp.eco.internal.gui.page.DelegateMenu
import com.willfp.eco.internal.gui.slot.EcoSlotBuilder
object EcoGUIFactory : GUIFactory {
@@ -15,4 +17,8 @@ object EcoGUIFactory : GUIFactory {
override fun createMenuBuilder(rows: Int): MenuBuilder {
return EcoMenuBuilder(rows)
}
}
override fun blendMenuState(base: Menu, additional: Menu): Menu {
return DelegateMenu(base, additional)
}
}

View File

@@ -21,9 +21,9 @@ class EcoMenu(
private val rows: Int,
private val componentsAtPoints: Map<Anchor, List<OffsetComponent>>,
private val title: String,
private val onClose: CloseHandler,
private val onRender: (Player, Menu) -> Unit,
private val onOpen: OpenHandler
private val onClose: List<CloseHandler>,
private val onRender: List<(Player, Menu) -> Unit>,
private val onOpen: List<OpenHandler>
) : Menu {
private fun getPossiblyReactiveSlot(row: Int, column: Int, player: Player?, menu: Menu?): Slot {
if (row < 1 || row > this.rows || column < 1 || column > 9) {
@@ -65,14 +65,14 @@ class EcoMenu(
player.openInventory(inventory)
onOpen.handle(player, this)
onOpen.forEach { it.handle(player, this) }
inventory.asRenderedInventory()?.generateCaptive()
return inventory
}
fun handleClose(event: InventoryCloseEvent) {
onClose.handle(event, this)
onClose.forEach { it.handle(event, this) }
event.inventory.asRenderedInventory()?.generateCaptive()
MenuHandler.unregisterInventory(event.inventory)
}
@@ -137,7 +137,8 @@ class EcoMenu(
player.openInventory.topInventory.asRenderedInventory()?.render()
}
fun runOnRender(player: Player) = onRender(player, this)
fun runOnRender(player: Player) =
onRender.forEach { it(player, this) }
}
data class OffsetComponent(

View File

@@ -13,9 +13,9 @@ import java.util.function.Consumer
class EcoMenuBuilder(private val rows: Int) : MenuBuilder {
private var title = "Menu"
private val components = mutableMapOf<Anchor, MutableList<GUIComponent>>()
private var onClose = CloseHandler { _, _ -> }
private var onOpen = OpenHandler { _, _ -> }
private var onRender: (Player, Menu) -> Unit = { _, _ -> }
private var onClose = mutableListOf<CloseHandler>()
private var onOpen = mutableListOf<OpenHandler>()
private var onRender = mutableListOf<(Player, Menu) -> Unit>()
override fun getRows() = rows
@@ -42,17 +42,17 @@ class EcoMenuBuilder(private val rows: Int) : MenuBuilder {
}
override fun onClose(action: CloseHandler): MenuBuilder {
onClose = action
onClose += action
return this
}
override fun onOpen(action: OpenHandler): MenuBuilder {
onOpen = action
onOpen += action
return this
}
override fun onRender(action: BiConsumer<Player, Menu>): MenuBuilder {
onRender = { a, b -> action.accept(a, b) }
onRender += { a, b -> action.accept(a, b) }
return this
}

View File

@@ -0,0 +1,25 @@
package com.willfp.eco.internal.gui.page
import com.willfp.eco.core.gui.menu.Menu
import org.bukkit.entity.Player
class DelegateMenu(
private val base: Menu,
private val additional: Menu
) : Menu by base {
override fun getState(player: Player): Map<String, Any> {
return base.getState(player) + additional.getState(player)
}
override fun addState(player: Player, key: String, value: Any?) {
base.addState(player, key, value)
}
override fun clearState(player: Player) {
base.clearState(player)
}
override fun removeState(player: Player, key: String) {
base.removeState(player, key)
}
}

View File

@@ -33,15 +33,6 @@ open class EcoSlot(
return updater.update(player, menu, prev) ?: ItemStack(Material.AIR)
}
fun getItemStack(
player: Player,
menu: Menu
): ItemStack {
val prev = provider.provide(player, menu)
val updated = updater.update(player, menu, prev)
return updated ?: ItemStack(Material.AIR)
}
override fun isCaptive(): Boolean {
return false
}