Added menu pagination
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user