Removed "Inventory" from the GUI API names

This commit is contained in:
bluefireoly
2020-10-24 23:25:32 +02:00
parent 3c029eb292
commit 7ba75f3250
25 changed files with 262 additions and 262 deletions

View File

@@ -218,7 +218,7 @@ firstAsync {
Inventories are great for viewing GUI information. However, they are not designed for developing GUIs. The KSpigot Inventory GUI API provides an easy way to build inventory GUIs the way you would expect such an API to be. In addition, it offers full type safety for slots.
```kotlin
val gui = kSpigotGUI(InventoryGUIType.FIVE_BY_NINE) {
val gui = kSpigotGUI(GUIType.FIVE_BY_NINE) {
title = "Example Inventory"
@@ -231,8 +231,8 @@ val gui = kSpigotGUI(InventoryGUIType.FIVE_BY_NINE) {
page(1) {
// define fancy transitions
transitionFrom = InventoryGUIPageChangeEffect.SLIDE_HORIZONTALLY
transitionTo = InventoryGUIPageChangeEffect.SLIDE_HORIZONTALLY
transitionFrom = PageChangeEffect.SLIDE_HORIZONTALLY
transitionTo = PageChangeEffect.SLIDE_HORIZONTALLY
// get special slot compounds easily with constants like Slots.Border
placeholder(Slots.Border, ItemStack(Material.GLASS_PANE))

View File

@@ -1,23 +1,23 @@
@file:Suppress("MemberVisibilityCanBePrivate")
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.ItemStack
private const val DEFAULT_PAGE = 1
class InventoryGUIData<T : ForInventory>(
val inventoryType: InventoryType<T>,
val title: String?,
internal val pages: Map<Int, InventoryGUIPage<T>>,
val transitionTo: InventoryChangeEffect?,
val transitionFrom: InventoryChangeEffect?,
internal val generalOnClick: ((InventoryGUIClickEvent<T>) -> Unit)?
class GUIData<T : ForInventory>(
val guiType: GUIType<T>,
val title: String?,
internal val pages: Map<Int, GUIPage<T>>,
val transitionTo: InventoryChangeEffect?,
val transitionFrom: InventoryChangeEffect?,
internal val generalOnClick: ((GUIClickEvent<T>) -> Unit)?
)
abstract class InventoryGUI<T : ForInventory>(
val data: InventoryGUIData<T>
abstract class GUI<T : ForInventory>(
val data: GUIData<T>
) {
var currentPageInt: Int = DEFAULT_PAGE; protected set
@@ -29,7 +29,7 @@ abstract class InventoryGUI<T : ForInventory>(
internal var isInMove: Boolean = false
internal val currentElements = HashSet<InventoryGUIElement<*>>()
internal val currentElements = HashSet<GUIElement<*>>()
internal abstract fun loadPageUnsafe(
page: Int,
@@ -38,13 +38,13 @@ abstract class InventoryGUI<T : ForInventory>(
)
internal abstract fun loadPageUnsafe(
page: InventoryGUIPage<*>,
page: GUIPage<*>,
offsetHorizontally: Int = 0,
offsetVertically: Int = 0
)
internal abstract fun loadContent(
content: Map<Int, InventoryGUISlot<*>>,
content: Map<Int, GUISlot<*>>,
offsetHorizontally: Int = 0,
offsetVertically: Int = 0
)
@@ -55,23 +55,23 @@ abstract class InventoryGUI<T : ForInventory>(
abstract fun isThisInv(inventory: Inventory): Boolean
/**
* Registers this InventoryGUI.
* Registers this GUI.
* (KSpigot will listen for actions in the inventory.)
*/
@Suppress("UNCHECKED_CAST")
fun register() = InventoryGUIHolder.register(this as InventoryGUI<ForInventory>)
fun register() = GUIHolder.register(this as GUI<ForInventory>)
/**
* Stops KSpigot from listening to actions in this
* InventoryGUI anymore.
* GUI anymore.
*/
@Suppress("UNCHECKED_CAST")
fun unregister() = InventoryGUIHolder.unregister(this as InventoryGUI<ForInventory>)
fun unregister() = GUIHolder.unregister(this as GUI<ForInventory>)
/**
* Loads the specified page in order to display it in the GUI.
*/
fun loadPage(page: InventoryGUIPage<T>) = loadPageUnsafe(page)
fun loadPage(page: GUIPage<T>) = loadPageUnsafe(page)
/**
* Temporarily sets the given item at the given slots.
@@ -95,11 +95,11 @@ abstract class InventoryGUI<T : ForInventory>(
// Inventory GUI implementations
class InventoryGUIShared<T : ForInventory>(
inventoryGUIData: InventoryGUIData<T>
) : InventoryGUI<T>(inventoryGUIData) {
class GUIShared<T : ForInventory>(
GUIData: GUIData<T>
) : GUI<T>(GUIData) {
override val bukkitInventory = data.inventoryType.createBukkitInv(null, data.title)
override val bukkitInventory = data.guiType.createBukkitInv(null, data.title)
init {
loadPageUnsafe(DEFAULT_PAGE)
@@ -111,7 +111,7 @@ class InventoryGUIShared<T : ForInventory>(
data.pages[page]?.let { loadPageUnsafe(it, offsetHorizontally, offsetVertically) }
}
override fun loadPageUnsafe(page: InventoryGUIPage<*>, offsetHorizontally: Int, offsetVertically: Int) {
override fun loadPageUnsafe(page: GUIPage<*>, offsetHorizontally: Int, offsetVertically: Int) {
val ifOffset = offsetHorizontally != 0 || offsetVertically != 0
@@ -122,7 +122,7 @@ class InventoryGUIShared<T : ForInventory>(
currentElements.clear()
// register this inv for all new elements
HashSet(page.slots.values).forEach { if (it is InventoryGUIElement) {
HashSet(page.slots.values).forEach { if (it is GUIElement) {
currentElements += it
it.startUsing(this)
} }
@@ -136,14 +136,14 @@ class InventoryGUIShared<T : ForInventory>(
}
override fun loadContent(
content: Map<Int, InventoryGUISlot<*>>,
content: Map<Int, GUISlot<*>>,
offsetHorizontally: Int,
offsetVertically: Int
) {
val ifOffset = offsetHorizontally != 0 || offsetVertically != 0
val dimensions = data.inventoryType.dimensions
val dimensions = data.guiType.dimensions
// clear the space which will be redefined
if (ifOffset) {
@@ -157,7 +157,7 @@ class InventoryGUIShared<T : ForInventory>(
content.forEach {
val slot = it.value
if (slot is InventoryGUIElement) {
if (slot is GUIElement) {
if (ifOffset) {
val invSlot = InventorySlot.fromRealSlot(it.key, dimensions)
@@ -174,7 +174,7 @@ class InventoryGUIShared<T : ForInventory>(
}
override operator fun set(slot: InventorySlotCompound<T>, value: ItemStack) {
slot.realSlotsWithInvType(data.inventoryType).forEach {
slot.realSlotsWithInvType(data.guiType).forEach {
bukkitInventory.setItem(it, value)
}
}

View File

@@ -1,20 +1,20 @@
@file:Suppress("MemberVisibilityCanBePrivate", "unused")
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import net.axay.kspigot.inventory.elements.*
import net.axay.kspigot.gui.elements.*
import org.bukkit.inventory.ItemStack
import kotlin.math.absoluteValue
fun <T : ForInventory> kSpigotGUI(
type: InventoryType<T>,
shared: Boolean = true,
builder: InventoryGUIBuilder<T>.() -> Unit,
) = InventoryGUIBuilder(type, shared).apply(builder).build()
type: GUIType<T>,
shared: Boolean = true,
builder: GUIBuilder<T>.() -> Unit,
) = GUIBuilder(type, shared).apply(builder).build()
class InventoryGUIBuilder<T : ForInventory>(
val type: InventoryType<T>,
val shared: Boolean
class GUIBuilder<T : ForInventory>(
val type: GUIType<T>,
val shared: Boolean
) {
var title: String = ""
@@ -22,45 +22,45 @@ class InventoryGUIBuilder<T : ForInventory>(
var transitionTo: InventoryChangeEffect? = null
var transitionFrom: InventoryChangeEffect? = null
private val guiSlots = HashMap<Int, InventoryGUIPage<T>>()
private val guiSlots = HashMap<Int, GUIPage<T>>()
private var onClickElement: ((InventoryGUIClickEvent<T>) -> Unit)? = null
private var onClickElement: ((GUIClickEvent<T>) -> Unit)? = null
/**
* Opens the builder for a new page and adds
* the new page to the GUI.
* @param page The index of the page.
*/
fun page(page: Int, builder: InventoryGUIPageBuilder<T>.() -> Unit) {
guiSlots[page] = InventoryGUIPageBuilder(type, page).apply(builder).build()
fun page(page: Int, builder: GUIPageBuilder<T>.() -> Unit) {
guiSlots[page] = GUIPageBuilder(type, page).apply(builder).build()
}
fun onClickElement(onClick: (InventoryGUIClickEvent<T>) -> Unit) {
fun onClickElement(onClick: (GUIClickEvent<T>) -> Unit) {
onClickElement = onClick
}
internal fun build(): InventoryGUI<T> {
val guiData = InventoryGUIData(type, title, guiSlots, transitionTo, transitionFrom, onClickElement)
internal fun build(): GUI<T> {
val guiData = GUIData(type, title, guiSlots, transitionTo, transitionFrom, onClickElement)
val gui =
if (shared) InventoryGUIShared(guiData) else TODO("Currently, there is no non-shared GUI implementation available.")
if (shared) GUIShared(guiData) else TODO("Currently, there is no non-shared GUI implementation available.")
return gui.apply { register() }
}
}
class InventoryGUIPageBuilder<T : ForInventory>(
private val type: InventoryType<T>,
val page: Int
class GUIPageBuilder<T : ForInventory>(
private val type: GUIType<T>,
val page: Int
) {
private val guiSlots = HashMap<Int, InventoryGUISlot<T>>()
private val guiSlots = HashMap<Int, GUISlot<T>>()
var transitionTo: PageChangeEffect? = null
var transitionFrom: PageChangeEffect? = null
internal fun build() = InventoryGUIPage(page, guiSlots, transitionTo, transitionFrom)
internal fun build() = GUIPage(page, guiSlots, transitionTo, transitionFrom)
private fun defineSlots(slots: InventorySlotCompound<T>, element: InventoryGUISlot<T>) =
private fun defineSlots(slots: InventorySlotCompound<T>, element: GUISlot<T>) =
slots.withInvType(type).forEach { curSlot ->
curSlot.realSlotIn(type.dimensions)?.let { guiSlots[it] = element }
}
@@ -70,22 +70,22 @@ class InventoryGUIPageBuilder<T : ForInventory>(
* actions. If clicked, the specified [onClick]
* function is invoked.
*/
fun button(slots: InventorySlotCompound<T>, itemStack: ItemStack, onClick: (InventoryGUIClickEvent<T>) -> Unit) =
defineSlots(slots, InventoryGUIButton(itemStack, onClick))
fun button(slots: InventorySlotCompound<T>, itemStack: ItemStack, onClick: (GUIClickEvent<T>) -> Unit) =
defineSlots(slots, GUIButton(itemStack, onClick))
/**
* An item protected from any player actions.
* This is not a button.
*/
fun placeholder(slots: InventorySlotCompound<T>, itemStack: ItemStack) =
defineSlots(slots, InventoryGUIPlaceholder(itemStack))
defineSlots(slots, GUIPlaceholder(itemStack))
/**
* A free slot does not block any player actions.
* The player can put items in this slot or take
* items out of it.
*/
fun freeSlot(slots: InventorySlotCompound<T>) = defineSlots(slots, InventoryGUIFreeSlot())
fun freeSlot(slots: InventorySlotCompound<T>) = defineSlots(slots, GUIFreeSlot())
/**
* This is a button which loads the specified
@@ -95,11 +95,11 @@ class InventoryGUIPageBuilder<T : ForInventory>(
slots: InventorySlotCompound<T>,
icon: ItemStack,
toPage: Int,
onChange: ((InventoryGUIClickEvent<T>) -> Unit)? = null
onChange: ((GUIClickEvent<T>) -> Unit)? = null
) = defineSlots(
slots, InventoryGUIButtonPageChange(
slots, GUIButtonPageChange(
icon,
InventoryGUIPageChangeCalculator.InventoryGUIConsistentPageCalculator(toPage),
GUIPageChangeCalculator.GUIConsistentPageCalculator(toPage),
onChange
)
)
@@ -112,11 +112,11 @@ class InventoryGUIPageBuilder<T : ForInventory>(
fun previousPage(
slots: InventorySlotCompound<T>,
icon: ItemStack,
onChange: ((InventoryGUIClickEvent<T>) -> Unit)? = null
onChange: ((GUIClickEvent<T>) -> Unit)? = null
) = defineSlots(
slots, InventoryGUIButtonPageChange(
slots, GUIButtonPageChange(
icon,
InventoryGUIPageChangeCalculator.InventoryGUIPreviousPageCalculator,
GUIPageChangeCalculator.GUIPreviousPageCalculator,
onChange
)
)
@@ -129,27 +129,27 @@ class InventoryGUIPageBuilder<T : ForInventory>(
fun nextPage(
slots: InventorySlotCompound<T>,
icon: ItemStack,
onChange: ((InventoryGUIClickEvent<T>) -> Unit)? = null
onChange: ((GUIClickEvent<T>) -> Unit)? = null
) = defineSlots(
slots, InventoryGUIButtonPageChange(
slots, GUIButtonPageChange(
icon,
InventoryGUIPageChangeCalculator.InventoryGUINextPageCalculator,
GUIPageChangeCalculator.GUINextPageCalculator,
onChange
)
)
/**
* By pressing this button, the player switches to another
* InventoryGUI. The transition effect is applied.
* GUI. The transition effect is applied.
*/
fun changeGUI(
slots: InventorySlotCompound<T>,
icon: ItemStack,
newGUI: () -> InventoryGUI<*>,
newGUI: () -> GUI<*>,
newPage: Int? = null,
onChange: ((InventoryGUIClickEvent<T>) -> Unit)? = null
onChange: ((GUIClickEvent<T>) -> Unit)? = null
) = defineSlots(
slots, InventoryGUIButtonInventoryChange(
slots, GUIButtonInventoryChange(
icon,
newGUI,
newPage,
@@ -163,8 +163,8 @@ class InventoryGUIPageBuilder<T : ForInventory>(
*/
fun <E> createCompound(
iconGenerator: (E) -> ItemStack,
onClick: (clickEvent: InventoryGUIClickEvent<T>, element: E) -> Unit
) = InventoryGUISpaceCompound(type, iconGenerator, onClick)
onClick: (clickEvent: GUIClickEvent<T>, element: E) -> Unit
) = GUISpaceCompound(type, iconGenerator, onClick)
/**
* Creates a new compound, holding data which can be displayed
@@ -176,10 +176,10 @@ class InventoryGUIPageBuilder<T : ForInventory>(
fromSlot: SingleInventorySlot<out T>,
toSlot: SingleInventorySlot<out T>,
iconGenerator: (E) -> ItemStack,
onClick: (clickEvent: InventoryGUIClickEvent<T>, element: E) -> Unit
): InventoryGUIRectSpaceCompound<T, E> {
onClick: (clickEvent: GUIClickEvent<T>, element: E) -> Unit
): GUIRectSpaceCompound<T, E> {
val rectSlotCompound = fromSlot rectTo toSlot
return InventoryGUIRectSpaceCompound(
return GUIRectSpaceCompound(
type,
iconGenerator,
onClick,
@@ -188,7 +188,7 @@ class InventoryGUIPageBuilder<T : ForInventory>(
addSlots(rectSlotCompound)
defineSlots(
rectSlotCompound,
InventoryGUISpaceCompoundElement(this)
GUISpaceCompoundElement(this)
)
}
}
@@ -199,12 +199,12 @@ class InventoryGUIPageBuilder<T : ForInventory>(
*/
fun <E> compoundSpace(
slots: InventorySlotCompound<T>,
compound: AbstractInventoryGUISpaceCompound<T, E>
compound: AbstractGUISpaceCompound<T, E>
) {
compound.addSlots(slots)
defineSlots(
slots,
InventoryGUISpaceCompoundElement(compound)
GUISpaceCompoundElement(compound)
)
}
@@ -215,13 +215,13 @@ class InventoryGUIPageBuilder<T : ForInventory>(
fun compoundScroll(
slots: InventorySlotCompound<T>,
icon: ItemStack,
compound: InventoryGUISpaceCompound<T, *>,
compound: GUISpaceCompound<T, *>,
scrollDistance: Int = 1,
scrollTimes: Int = 1,
reverse: Boolean = false
) = defineSlots(
slots,
InventoryGUISpaceCompoundScrollButton(
GUISpaceCompoundScrollButton(
icon,
compound,
scrollDistance.absoluteValue,
@@ -237,12 +237,12 @@ class InventoryGUIPageBuilder<T : ForInventory>(
fun compoundScroll(
slots: InventorySlotCompound<T>,
icon: ItemStack,
compound: InventoryGUIRectSpaceCompound<T, *>,
compound: GUIRectSpaceCompound<T, *>,
scrollTimes: Int = 1,
reverse: Boolean = false
) = defineSlots(
slots,
InventoryGUISpaceCompoundScrollButton(
GUISpaceCompoundScrollButton(
icon,
compound,
compound.compoundWidth,

View File

@@ -0,0 +1,8 @@
package net.axay.kspigot.gui
import org.bukkit.event.inventory.InventoryClickEvent
class GUIClickEvent<T : ForInventory>(
val bukkitEvent: InventoryClickEvent,
val gui: GUI<T>
)

View File

@@ -0,0 +1,25 @@
package net.axay.kspigot.gui
import org.bukkit.inventory.ItemStack
abstract class GUISlot<T : ForInventory> {
abstract fun onClick(clickEvent: GUIClickEvent<T>)
}
// ELEMENT
abstract class GUIElement<T : ForInventory> : GUISlot<T>() {
abstract fun getItemStack(slot: Int): ItemStack
final override fun onClick(clickEvent: GUIClickEvent<T>) {
clickEvent.gui.data.generalOnClick?.invoke(clickEvent)
onClickElement(clickEvent)
}
protected abstract fun onClickElement(clickEvent: GUIClickEvent<T>)
internal open fun startUsing(gui: GUI<*>) { }
internal open fun stopUsing(gui: GUI<*>) { }
}

View File

@@ -1,9 +1,9 @@
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import org.bukkit.entity.HumanEntity
import org.bukkit.inventory.InventoryView
fun HumanEntity.openGUI(gui: InventoryGUI<*>, page: Int? = null): InventoryView? {
fun HumanEntity.openGUI(gui: GUI<*>, page: Int? = null): InventoryView? {
closeInventory()

View File

@@ -1,19 +1,19 @@
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import net.axay.kspigot.event.listen
import org.bukkit.event.inventory.InventoryAction
import org.bukkit.event.inventory.InventoryClickEvent
object InventoryGUIHolder : AutoCloseable {
object GUIHolder : AutoCloseable {
private val registered = HashSet<InventoryGUI<ForInventory>>()
private val registered = HashSet<GUI<ForInventory>>()
fun register(inventoryGUI: InventoryGUI<ForInventory>) {
registered.add(inventoryGUI)
fun register(GUI: GUI<ForInventory>) {
registered.add(GUI)
}
fun unregister(inventoryGUI: InventoryGUI<ForInventory>) {
registered.remove(inventoryGUI)
fun unregister(GUI: GUI<ForInventory>) {
registered.remove(GUI)
}
init {
@@ -30,7 +30,7 @@ object InventoryGUIHolder : AutoCloseable {
}
if (it.action.isGUIClick)
inv.currentPage.slots[it.slot]?.onClick(InventoryGUIClickEvent(it, inv)) ?: kotlin.run {
inv.currentPage.slots[it.slot]?.onClick(GUIClickEvent(it, inv)) ?: kotlin.run {
it.isCancelled = true
}
else

View File

@@ -0,0 +1,8 @@
package net.axay.kspigot.gui
class GUIPage<T : ForInventory>(
val number: Int,
internal val slots: Map<Int, GUISlot<T>>,
val transitionTo: PageChangeEffect?,
val transitionFrom: PageChangeEffect?
)

View File

@@ -1,22 +1,22 @@
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import net.axay.kspigot.runnables.task
abstract class InventoryGUIPageChangeCalculator {
abstract class GUIPageChangeCalculator {
abstract fun calculateNewPage(currentPage: Int, pages: Collection<Int>): Int?
object InventoryGUIPreviousPageCalculator : InventoryGUIPageChangeCalculator() {
object GUIPreviousPageCalculator : GUIPageChangeCalculator() {
override fun calculateNewPage(currentPage: Int, pages: Collection<Int>) =
pages.sortedDescending().find { it < currentPage }
}
object InventoryGUINextPageCalculator : InventoryGUIPageChangeCalculator() {
object GUINextPageCalculator : GUIPageChangeCalculator() {
override fun calculateNewPage(currentPage: Int, pages: Collection<Int>) =
pages.sorted().find { it > currentPage }
}
class InventoryGUIConsistentPageCalculator(private val toPage: Int) : InventoryGUIPageChangeCalculator() {
class GUIConsistentPageCalculator(private val toPage: Int) : GUIPageChangeCalculator() {
override fun calculateNewPage(currentPage: Int, pages: Collection<Int>) = toPage
}
@@ -36,10 +36,10 @@ enum class InventoryChangeEffect(
INSTANT(PageChangeEffect.INSTANT)
}
internal fun InventoryGUI<*>.changePage(
internal fun GUI<*>.changePage(
effect: PageChangeEffect,
fromPage: InventoryGUIPage<*>,
toPage: InventoryGUIPage<*>
fromPage: GUIPage<*>,
toPage: GUIPage<*>
) {
val fromPageInt = fromPage.number
@@ -51,7 +51,7 @@ internal fun InventoryGUI<*>.changePage(
PageChangeEffect.SLIDE_HORIZONTALLY -> {
val width = data.inventoryType.dimensions.width
val width = data.guiType.dimensions.width
changePageEffect(fromPageInt, toPageInt, width) { currentOffset, ifInverted ->
if (ifInverted) {
@@ -67,7 +67,7 @@ internal fun InventoryGUI<*>.changePage(
PageChangeEffect.SLIDE_VERTICALLY -> {
val height = data.inventoryType.dimensions.height
val height = data.guiType.dimensions.height
changePageEffect(fromPageInt, toPageInt, height) { currentOffset, ifInverted ->
if (ifInverted) {
@@ -83,7 +83,7 @@ internal fun InventoryGUI<*>.changePage(
PageChangeEffect.SWIPE_HORIZONTALLY -> {
val width = data.inventoryType.dimensions.width
val width = data.guiType.dimensions.width
changePageEffect(fromPageInt, toPageInt, width) { currentOffset, ifInverted ->
if (ifInverted) {
@@ -97,7 +97,7 @@ internal fun InventoryGUI<*>.changePage(
PageChangeEffect.SWIPE_VERTICALLY -> {
val height = data.inventoryType.dimensions.height
val height = data.guiType.dimensions.height
changePageEffect(fromPageInt, toPageInt, height) { currentOffset, ifInverted ->
if (ifInverted) {
@@ -112,10 +112,10 @@ internal fun InventoryGUI<*>.changePage(
}
}
internal fun InventoryGUI<*>.changeGUI(
internal fun GUI<*>.changeGUI(
effect: InventoryChangeEffect,
fromPage: InventoryGUIPage<*>,
toPage: InventoryGUIPage<*>
fromPage: GUIPage<*>,
toPage: GUIPage<*>
) = changePage(effect.effect, fromPage, toPage)
private inline fun changePageEffect(

View File

@@ -1,6 +1,6 @@
@file:Suppress("unused", "MemberVisibilityCanBePrivate")
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import net.axay.kspigot.languageextensions.kotlinextensions.MinMaxPair
@@ -70,9 +70,9 @@ data class InventorySlot(val row: Int, val slotInRow: Int) : Comparable<Inventor
interface InventorySlotCompound<out T : ForInventory> {
fun withInvType(invType: InventoryType<T>): Collection<InventorySlot>
fun withInvType(invType: GUIType<T>): Collection<InventorySlot>
fun realSlotsWithInvType(invType: InventoryType<T>) =
fun realSlotsWithInvType(invType: GUIType<T>) =
withInvType(invType).mapNotNull { it.realSlotIn(invType.dimensions) }
}
@@ -85,7 +85,7 @@ open class SingleInventorySlot<T : ForInventory> internal constructor(
private val slotAsList = listOf(inventorySlot)
override fun withInvType(invType: InventoryType<T>) = slotAsList
override fun withInvType(invType: GUIType<T>) = slotAsList
}
@@ -112,7 +112,7 @@ class InventorySlotRange<out T : ForInventory> internal constructor(
endInclusive = minMaxPair.max
}
override fun withInvType(invType: InventoryType<T>) = LinkedHashSet<InventorySlot>().apply {
override fun withInvType(invType: GUIType<T>) = LinkedHashSet<InventorySlot>().apply {
when (type) {
InventorySlotRangeType.RECTANGLE -> {
@@ -166,7 +166,7 @@ class InventoryRowSlots<T : ForInventory> internal constructor(
val row: Int
) : InventorySlotCompound<T> {
override fun withInvType(invType: InventoryType<T>) = HashSet<InventorySlot>().apply {
override fun withInvType(invType: GUIType<T>) = HashSet<InventorySlot>().apply {
for (slotInRow in 1..invType.dimensions.width)
this += InventorySlot(row, slotInRow)
}
@@ -177,7 +177,7 @@ class InventoryColumnSlots<T : ForInventory> internal constructor(
val column: Int
) : InventorySlotCompound<T> {
override fun withInvType(invType: InventoryType<T>) = HashSet<InventorySlot>().apply {
override fun withInvType(invType: GUIType<T>) = HashSet<InventorySlot>().apply {
for (row in 1..invType.dimensions.height)
this += InventorySlot(row, column)
}
@@ -188,7 +188,7 @@ class InventoryBorderSlots<T : ForInventory> internal constructor(
val padding: Int
) : InventorySlotCompound<T> {
override fun withInvType(invType: InventoryType<T>) = HashSet<InventorySlot>().apply {
override fun withInvType(invType: GUIType<T>) = HashSet<InventorySlot>().apply {
val dimensions = invType.dimensions
@@ -214,7 +214,7 @@ class InventoryCornerSlots<T : ForInventory> internal constructor(
val ifTopRight: Boolean = false
) : InventorySlotCompound<T> {
override fun withInvType(invType: InventoryType<T>) = HashSet<InventorySlot>().apply {
override fun withInvType(invType: GUIType<T>) = HashSet<InventorySlot>().apply {
val dimensions = invType.dimensions

View File

@@ -1,29 +1,29 @@
@file:Suppress("MemberVisibilityCanBePrivate", "CanBeParameter")
package net.axay.kspigot.inventory
package net.axay.kspigot.gui
import org.bukkit.Bukkit
import org.bukkit.event.inventory.InventoryType
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.InventoryHolder
class InventoryType<in T : ForInventory>(
class GUIType<in T : ForInventory>(
val dimensions: InventoryDimensions,
val bukkitType: InventoryType? = null
) {
companion object {
val ONE_BY_NINE = InventoryType<ForInventoryOneByNine>(InventoryDimensions(9, 1))
val TWO_BY_NINE = InventoryType<ForInventoryTwoByNine>(InventoryDimensions(9, 2))
val THREE_BY_NINE = InventoryType<ForInventoryThreeByNine>(InventoryDimensions(9, 3))
val FOUR_BY_NINE = InventoryType<ForInventoryFourByNine>(InventoryDimensions(9, 4))
val FIVE_BY_NINE = InventoryType<ForInventoryFiveByNine>(InventoryDimensions(9, 5))
val SIX_BY_NINE = InventoryType<ForInventorySixByNine>(InventoryDimensions(9, 6))
val ONE_BY_NINE = GUIType<ForInventoryOneByNine>(InventoryDimensions(9, 1))
val TWO_BY_NINE = GUIType<ForInventoryTwoByNine>(InventoryDimensions(9, 2))
val THREE_BY_NINE = GUIType<ForInventoryThreeByNine>(InventoryDimensions(9, 3))
val FOUR_BY_NINE = GUIType<ForInventoryFourByNine>(InventoryDimensions(9, 4))
val FIVE_BY_NINE = GUIType<ForInventoryFiveByNine>(InventoryDimensions(9, 5))
val SIX_BY_NINE = GUIType<ForInventorySixByNine>(InventoryDimensions(9, 6))
val ONE_BY_FIVE =
InventoryType<ForInventoryOneByFive>(InventoryDimensions(5, 1), bukkitType = InventoryType.HOPPER)
GUIType<ForInventoryOneByFive>(InventoryDimensions(5, 1), bukkitType = InventoryType.HOPPER)
val THREE_BY_THREE =
InventoryType<ForInventoryThreeByThree>(InventoryDimensions(3, 3), bukkitType = InventoryType.DROPPER)
GUIType<ForInventoryThreeByThree>(InventoryDimensions(3, 3), bukkitType = InventoryType.DROPPER)
}

View File

@@ -0,0 +1,18 @@
package net.axay.kspigot.gui.elements
import net.axay.kspigot.gui.*
import org.bukkit.inventory.ItemStack
open class GUIButton<T : ForInventory>(
private val icon: ItemStack,
private val action: (GUIClickEvent<T>) -> Unit,
) : GUIElement<T>() {
final override fun getItemStack(slot: Int) = icon
override fun onClickElement(clickEvent: GUIClickEvent<T>) {
clickEvent.bukkitEvent.isCancelled = true
action(clickEvent)
}
}

View File

@@ -1,14 +1,14 @@
package net.axay.kspigot.inventory.elements
package net.axay.kspigot.gui.elements
import net.axay.kspigot.inventory.*
import net.axay.kspigot.gui.*
import org.bukkit.inventory.ItemStack
class InventoryGUIButtonInventoryChange<T : ForInventory>(
class GUIButtonInventoryChange<T : ForInventory>(
icon: ItemStack,
changeToGUICallback: () -> InventoryGUI<*>,
changeToGUICallback: () -> GUI<*>,
changeToPageInt: Int?,
onChange: ((InventoryGUIClickEvent<T>) -> Unit)?
) : InventoryGUIButton<T>(icon, {
onChange: ((GUIClickEvent<T>) -> Unit)?
) : GUIButton<T>(icon, {
val changeToGUI = changeToGUICallback.invoke()

View File

@@ -1,13 +1,13 @@
package net.axay.kspigot.inventory.elements
package net.axay.kspigot.gui.elements
import net.axay.kspigot.inventory.*
import net.axay.kspigot.gui.*
import org.bukkit.inventory.ItemStack
class InventoryGUIButtonPageChange<T : ForInventory>(
class GUIButtonPageChange<T : ForInventory>(
icon: ItemStack,
calculator: InventoryGUIPageChangeCalculator,
onChange: ((InventoryGUIClickEvent<T>) -> Unit)?
) : InventoryGUIButton<T>(icon, {
calculator: GUIPageChangeCalculator,
onChange: ((GUIClickEvent<T>) -> Unit)?
) : GUIButton<T>(icon, {
val currentPage = it.gui.currentPage
val newPage = it.gui.getPage(calculator.calculateNewPage(it.gui.currentPageInt, it.gui.data.pages.keys))

View File

@@ -0,0 +1,11 @@
package net.axay.kspigot.gui.elements
import net.axay.kspigot.gui.ForInventory
import net.axay.kspigot.gui.GUIClickEvent
import net.axay.kspigot.gui.GUISlot
class GUIFreeSlot<T : ForInventory> : GUISlot<T>() {
override fun onClick(clickEvent: GUIClickEvent<T>) {
/* do nothing */
}
}

View File

@@ -0,0 +1,16 @@
package net.axay.kspigot.gui.elements
import net.axay.kspigot.gui.*
import org.bukkit.inventory.ItemStack
class GUIPlaceholder<T : ForInventory>(
private val icon: ItemStack
) : GUIElement<T>() {
override fun getItemStack(slot: Int) = icon
override fun onClickElement(clickEvent: GUIClickEvent<T>) {
clickEvent.bukkitEvent.isCancelled = true
}
}

View File

@@ -1,53 +1,53 @@
@file:Suppress("MemberVisibilityCanBePrivate")
package net.axay.kspigot.inventory.elements
package net.axay.kspigot.gui.elements
import net.axay.kspigot.inventory.*
import net.axay.kspigot.gui.*
import org.bukkit.Material
import org.bukkit.inventory.ItemStack
class InventoryGUISpaceCompoundElement<T : ForInventory, E> internal constructor(
private val compound: AbstractInventoryGUISpaceCompound<T, E>
) : InventoryGUIElement<T>() {
class GUISpaceCompoundElement<T : ForInventory, E> internal constructor(
private val compound: AbstractGUISpaceCompound<T, E>
) : GUIElement<T>() {
override fun getItemStack(slot: Int) = compound.getItemStack(slot)
override fun onClickElement(clickEvent: InventoryGUIClickEvent<T>) {
override fun onClickElement(clickEvent: GUIClickEvent<T>) {
compound.onClickElement(clickEvent)
}
override fun startUsing(gui: InventoryGUI<*>) = compound.registerGUI(gui)
override fun startUsing(gui: GUI<*>) = compound.registerGUI(gui)
override fun stopUsing(gui: InventoryGUI<*>) = compound.unregisterGUI(gui)
override fun stopUsing(gui: GUI<*>) = compound.unregisterGUI(gui)
}
class InventoryGUIRectSpaceCompound<T : ForInventory, E>(
invType: InventoryType<T>,
iconGenerator: (E) -> ItemStack,
onClick: (InventoryGUIClickEvent<T>, E) -> Unit,
internal val compoundWidth: Int
) : AbstractInventoryGUISpaceCompound<T, E>(invType, iconGenerator, onClick) {
class GUIRectSpaceCompound<T : ForInventory, E>(
invType: GUIType<T>,
iconGenerator: (E) -> ItemStack,
onClick: (GUIClickEvent<T>, E) -> Unit,
internal val compoundWidth: Int
) : AbstractGUISpaceCompound<T, E>(invType, iconGenerator, onClick) {
override fun handleScrollEndReached(newProgress: Int, internalSlotsSize: Int, contentSize: Int) =
(internalSlotsSize + newProgress <= contentSize + (compoundWidth - (contentSize % compoundWidth)))
}
class InventoryGUISpaceCompound<T : ForInventory, E>(
invType: InventoryType<T>,
iconGenerator: (E) -> ItemStack,
onClick: (InventoryGUIClickEvent<T>, E) -> Unit
) : AbstractInventoryGUISpaceCompound<T, E>(invType, iconGenerator, onClick) {
class GUISpaceCompound<T : ForInventory, E>(
invType: GUIType<T>,
iconGenerator: (E) -> ItemStack,
onClick: (GUIClickEvent<T>, E) -> Unit
) : AbstractGUISpaceCompound<T, E>(invType, iconGenerator, onClick) {
override fun handleScrollEndReached(newProgress: Int, internalSlotsSize: Int, contentSize: Int) = false
}
abstract class AbstractInventoryGUISpaceCompound<T : ForInventory, E> internal constructor(
val invType: InventoryType<T>,
private val iconGenerator: (E) -> ItemStack,
private val onClick: (InventoryGUIClickEvent<T>, E) -> Unit
abstract class AbstractGUISpaceCompound<T : ForInventory, E> internal constructor(
val guiType: GUIType<T>,
private val iconGenerator: (E) -> ItemStack,
private val onClick: (GUIClickEvent<T>, E) -> Unit
) {
private val content = ArrayList<E>()
@@ -59,7 +59,7 @@ abstract class AbstractInventoryGUISpaceCompound<T : ForInventory, E> internal c
private var contentSort: () -> Unit = { }
private val registeredGUIs = HashSet<InventoryGUI<*>>()
private val registeredGUIs = HashSet<GUI<*>>()
private fun contentAtSlot(slot: Int) = currentContent.getOrNull(internalSlots.indexOf(slot))
@@ -107,7 +107,7 @@ abstract class AbstractInventoryGUISpaceCompound<T : ForInventory, E> internal c
?: ItemStack(Material.AIR)
}
internal fun onClickElement(clickEvent: InventoryGUIClickEvent<T>) {
internal fun onClickElement(clickEvent: GUIClickEvent<T>) {
val element = contentAtSlot(clickEvent.bukkitEvent.slot) ?: kotlin.run {
clickEvent.bukkitEvent.isCancelled = true
return
@@ -116,18 +116,18 @@ abstract class AbstractInventoryGUISpaceCompound<T : ForInventory, E> internal c
}
internal fun addSlots(slots: InventorySlotCompound<T>) {
slots.realSlotsWithInvType(invType).forEach {
slots.realSlotsWithInvType(guiType).forEach {
if (!internalSlots.contains(it))
internalSlots.add(it)
}
internalSlots.sort()
}
internal fun registerGUI(gui: InventoryGUI<*>) {
internal fun registerGUI(gui: GUI<*>) {
registeredGUIs += gui
}
internal fun unregisterGUI(gui: InventoryGUI<*>) {
internal fun unregisterGUI(gui: GUI<*>) {
registeredGUIs -= gui
}

View File

@@ -1,16 +1,16 @@
package net.axay.kspigot.inventory.elements
package net.axay.kspigot.gui.elements
import net.axay.kspigot.inventory.ForInventory
import net.axay.kspigot.gui.ForInventory
import net.axay.kspigot.runnables.task
import org.bukkit.inventory.ItemStack
class InventoryGUISpaceCompoundScrollButton<T : ForInventory>(
class GUISpaceCompoundScrollButton<T : ForInventory>(
icon: ItemStack,
private val compound: AbstractInventoryGUISpaceCompound<T, *>,
private val compound: AbstractGUISpaceCompound<T, *>,
private val scrollDistance: Int,
private val scrollTimes: Int,
private val reverse: Boolean = false
) : InventoryGUIButton<T>(icon, {
) : GUIButton<T>(icon, {
if (scrollTimes > 1) {
task(
period = 1,

View File

@@ -1,8 +0,0 @@
package net.axay.kspigot.inventory
import org.bukkit.event.inventory.InventoryClickEvent
class InventoryGUIClickEvent<T : ForInventory>(
val bukkitEvent: InventoryClickEvent,
val gui: InventoryGUI<T>
)

View File

@@ -1,25 +0,0 @@
package net.axay.kspigot.inventory
import org.bukkit.inventory.ItemStack
abstract class InventoryGUISlot<T : ForInventory> {
abstract fun onClick(clickEvent: InventoryGUIClickEvent<T>)
}
// ELEMENT
abstract class InventoryGUIElement<T : ForInventory> : InventoryGUISlot<T>() {
abstract fun getItemStack(slot: Int): ItemStack
final override fun onClick(clickEvent: InventoryGUIClickEvent<T>) {
clickEvent.gui.data.generalOnClick?.invoke(clickEvent)
onClickElement(clickEvent)
}
protected abstract fun onClickElement(clickEvent: InventoryGUIClickEvent<T>)
internal open fun startUsing(gui: InventoryGUI<*>) { }
internal open fun stopUsing(gui: InventoryGUI<*>) { }
}

View File

@@ -1,8 +0,0 @@
package net.axay.kspigot.inventory
class InventoryGUIPage<T : ForInventory>(
val number: Int,
internal val slots: Map<Int, InventoryGUISlot<T>>,
val transitionTo: PageChangeEffect?,
val transitionFrom: PageChangeEffect?
)

View File

@@ -1,18 +0,0 @@
package net.axay.kspigot.inventory.elements
import net.axay.kspigot.inventory.*
import org.bukkit.inventory.ItemStack
open class InventoryGUIButton<T : ForInventory>(
private val icon: ItemStack,
private val action: (InventoryGUIClickEvent<T>) -> Unit,
) : InventoryGUIElement<T>() {
final override fun getItemStack(slot: Int) = icon
override fun onClickElement(clickEvent: InventoryGUIClickEvent<T>) {
clickEvent.bukkitEvent.isCancelled = true
action(clickEvent)
}
}

View File

@@ -1,11 +0,0 @@
package net.axay.kspigot.inventory.elements
import net.axay.kspigot.inventory.ForInventory
import net.axay.kspigot.inventory.InventoryGUIClickEvent
import net.axay.kspigot.inventory.InventoryGUISlot
class InventoryGUIFreeSlot<T : ForInventory> : InventoryGUISlot<T>() {
override fun onClick(clickEvent: InventoryGUIClickEvent<T>) {
/* do nothing */
}
}

View File

@@ -1,16 +0,0 @@
package net.axay.kspigot.inventory.elements
import net.axay.kspigot.inventory.*
import org.bukkit.inventory.ItemStack
class InventoryGUIPlaceholder<T : ForInventory>(
private val icon: ItemStack
) : InventoryGUIElement<T>() {
override fun getItemStack(slot: Int) = icon
override fun onClickElement(clickEvent: InventoryGUIClickEvent<T>) {
clickEvent.bukkitEvent.isCancelled = true
}
}

View File

@@ -1,6 +1,6 @@
package net.axay.kspigot.main
import net.axay.kspigot.inventory.InventoryGUIHolder
import net.axay.kspigot.gui.GUIHolder
import net.axay.kspigot.languageextensions.kotlinextensions.closeIfInitialized
import net.axay.kspigot.runnables.KRunnableHolder
import org.bukkit.plugin.java.JavaPlugin
@@ -22,10 +22,10 @@ abstract class KSpigot : JavaPlugin() {
// lazy properties
private val kRunnableHolderProperty = lazy { KRunnableHolder }
private val inventoryGUIHolderProperty = lazy { InventoryGUIHolder }
private val guiHolderProperty = lazy { GUIHolder }
internal val kRunnableHolder by kRunnableHolderProperty
internal val inventoryGUIHolder by inventoryGUIHolderProperty
internal val guiHolder by guiHolderProperty
/**
* Called when the plugin was loaded
@@ -57,7 +57,7 @@ abstract class KSpigot : JavaPlugin() {
// avoid unnecessary load of lazy properties
kRunnableHolderProperty.closeIfInitialized()
inventoryGUIHolderProperty.closeIfInitialized()
guiHolderProperty.closeIfInitialized()
}