diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt new file mode 100644 index 00000000..bb3a1527 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt @@ -0,0 +1,79 @@ +@file:Suppress("MemberVisibilityCanBePrivate", "unused") + +package net.axay.kspigot.inventory.elements + +import net.axay.kspigot.inventory.* +import org.bukkit.Material +import org.bukkit.inventory.ItemStack + +class InventoryGUISpaceCompoundElement( + private val compound: InventoryGUISpaceCompound +) : InventoryGUIElement() { + + override fun getItemStack(slot: Int) = compound.getItemStack(slot) + + override fun onClickElement(clickEvent: InventoryGUIClickEvent) { + compound.onClickElement(clickEvent) + } + +} + +class InventoryGUISpaceCompound internal constructor( + private val invType: InventoryType, + private val iconGenerator: (E) -> ItemStack, + private val onClick: (InventoryGUIClickEvent, E) -> Unit +) { + + private val content = ArrayList() + private val internalSlots = ArrayList() + + private var contentSort: () -> Unit = { } + + // TODO add "scrolling" functionality + + // TODO take current scroll progress into account + private fun contentAtSlot(slot: Int) = content.getOrNull(internalSlots.indexOf(slot)) + + internal fun getItemStack(slot: Int): ItemStack { + return contentAtSlot(slot)?.let { return@let iconGenerator.invoke(it) } + ?: ItemStack(Material.AIR) + } + + internal fun onClickElement(clickEvent: InventoryGUIClickEvent) { + val element = contentAtSlot(clickEvent.bukkitEvent.slot) ?: return + onClick.invoke(clickEvent, element) + } + + internal fun addSlots(slots: InventorySlotCompound) { + internalSlots += slots.realSlotsWithInvType(invType) + internalSlots.sort() + } + + /** + * Defines the sort behaviour which gets applied to the content + * automatically. + */ + fun > sortContentBy(reverse: Boolean = false, selector: (E) -> R?) { + contentSort = { + if (!reverse) content.sortBy(selector) else content.sortByDescending(selector) + } + contentSort.invoke() + } + + /** + * Adds a new element to the compound. + */ + fun addContent(element: E) { + addContent(listOf(element)) + } + + /** + * Adds new elements to the compound. + */ + fun addContent(elements: Collection) { + content += elements + contentSort.invoke() + // TODO reload GUIs using this compound at this time + } + +} \ No newline at end of file