diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 154ea37c..53b4c266 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -41,7 +41,9 @@ class InventoryGUIHolder(kSpigot: KSpigot) : AutoCloseable { kSpigot.listen { - val inv = registered.find { search -> search.isThisInv(it.inventory) } ?: return@listen + val clickedInv = it.clickedInventory ?: return@listen + + val inv = registered.find { search -> search.isThisInv(clickedInv) } ?: return@listen val invPage = inv.currentPageInt val slot = inv.data.pages[invPage]?.slots?.get(it.slot) @@ -74,13 +76,13 @@ class InventoryGUIClickEvent( private const val DEFAULT_PAGE = 1 class InventoryGUIData( - val plugin: KSpigot, - val inventoryType: InventoryType, - val title: String?, - internal val pages: Map>, - val transitionTo: InventoryGUIPageChangeEffect?, - val transitionFrom: InventoryGUIPageChangeEffect?, - internal val generalOnClick: ((InventoryGUIClickEvent) -> Unit)? + val plugin: KSpigot, + val inventoryType: InventoryType, + val title: String?, + internal val pages: Map>, + val transitionTo: InventoryChangeEffect?, + val transitionFrom: InventoryChangeEffect?, + internal val generalOnClick: ((InventoryGUIClickEvent) -> Unit)? ) abstract class InventoryGUI( @@ -93,7 +95,7 @@ abstract class InventoryGUI( internal abstract val bukkitInventory: Inventory - internal abstract fun loadPageUnsafe(page: InventoryGUIPage<*>?, offsetHorizontally: Int = 0, offsetVertically: Int = 0) + internal abstract fun loadPageUnsafe(page: InventoryGUIPage<*>, offsetHorizontally: Int = 0, offsetVertically: Int = 0) internal abstract fun loadPageUnsafe(page: Int, offsetHorizontally: Int = 0, offsetVertically: Int = 0) /** @@ -144,9 +146,7 @@ class InventoryGUIShared( override fun isThisInv(inventory: Inventory) = inventory == bukkitInventory - override fun loadPageUnsafe(page: InventoryGUIPage<*>?, offsetHorizontally: Int, offsetVertically: Int) { - - if (page == null) return + override fun loadPageUnsafe(page: InventoryGUIPage<*>, offsetHorizontally: Int, offsetVertically: Int) { val ifOffset = offsetHorizontally != 0 || offsetVertically != 0 @@ -204,8 +204,8 @@ class InventoryGUIShared( } class InventoryGUIPage( - val number: Int, - internal val slots: Map>, - val transitionTo: InventoryGUIPageChangeEffect?, - val transitionFrom: InventoryGUIPageChangeEffect? + val number: Int, + internal val slots: Map>, + val transitionTo: PageChangeEffect?, + val transitionFrom: PageChangeEffect? ) \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index c871aafb..ae50709e 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -17,8 +17,8 @@ class InventoryGUIBuilder( var title: String = "" - var transitionTo: InventoryGUIPageChangeEffect? = null - var transitionFrom: InventoryGUIPageChangeEffect? = null + var transitionTo: InventoryChangeEffect? = null + var transitionFrom: InventoryChangeEffect? = null private val guiSlots = HashMap>() @@ -50,8 +50,8 @@ class InventoryGUIPageBuilder( private val guiSlots = HashMap>() - var transitionTo: InventoryGUIPageChangeEffect? = null - var transitionFrom: InventoryGUIPageChangeEffect? = null + var transitionTo: PageChangeEffect? = null + var transitionFrom: PageChangeEffect? = null internal fun build() = InventoryGUIPage(page, guiSlots, transitionTo, transitionFrom) @@ -117,7 +117,7 @@ class InventoryGUIPageBuilder( * By pressing this button, the player switches to another * InventoryGUI. The transition effect is applied. */ - fun changeGUI(slots: InventorySlotCompound, itemStack: ItemStack, newGUI: InventoryGUI<*>, newPage: Int? = null, onChange: ((InventoryGUIClickEvent) -> Unit)? = null) + fun changeGUI(slots: InventorySlotCompound, itemStack: ItemStack, newGUI: () -> InventoryGUI<*>, newPage: Int? = null, onChange: ((InventoryGUIClickEvent) -> Unit)? = null) = defineSlots(slots, InventoryGUIButtonInventoryChange( InventoryGUIElementData(itemStack), newGUI, diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt index 0f586cc8..5be704da 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt @@ -61,7 +61,7 @@ class InventoryGUIButtonPageChange( if (newPage != null) { val effect = (newPage.transitionTo ?: currentPage.transitionFrom) - ?: InventoryGUIPageChangeEffect.INSTANT + ?: PageChangeEffect.INSTANT it.gui.changePage(effect, currentPage, newPage) @@ -73,18 +73,20 @@ class InventoryGUIButtonPageChange( class InventoryGUIButtonInventoryChange( inventoryGUIElementData: InventoryGUIElementData, - changeToGUI: InventoryGUI<*>, + changeToGUICallback: () -> InventoryGUI<*>, changeToPageInt: Int?, onChange: ((InventoryGUIClickEvent) -> Unit)? ) : InventoryGUIButton(inventoryGUIElementData, { + val changeToGUI = changeToGUICallback.invoke() + val effect = (changeToGUI.data.transitionTo ?: it.gui.data.transitionFrom) - ?: InventoryGUIPageChangeEffect.INSTANT + ?: InventoryChangeEffect.INSTANT val changeToPage = changeToGUI.getPage(changeToPageInt) ?: changeToGUI.currentPage - changeToGUI.changePage(effect, it.gui.currentPage, changeToPage) + changeToGUI.changeGUI(effect, it.gui.currentPage, changeToPage) it.bukkitEvent.whoClicked.openGUI(changeToGUI) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt index f8c4b6bb..edbbb3b8 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt @@ -23,7 +23,7 @@ abstract class InventoryGUIPageChangeCalculator { } -enum class InventoryGUIPageChangeEffect { +enum class PageChangeEffect { INSTANT, SLIDE_HORIZONTALLY, SLIDE_VERTICALLY, @@ -31,16 +31,26 @@ enum class InventoryGUIPageChangeEffect { SWIPE_VERTICALLY, } -internal fun InventoryGUI<*>.changePage(effect: InventoryGUIPageChangeEffect, fromPage: InventoryGUIPage<*>?, toPage: InventoryGUIPage<*>?) { +enum class InventoryChangeEffect( + val effect: PageChangeEffect +) { + INSTANT(PageChangeEffect.INSTANT) +} - val fromPageInt = fromPage?.number ?: 0 - val toPageInt = toPage?.number ?: 0 +internal fun InventoryGUI<*>.changePage( + effect: PageChangeEffect, + fromPage: InventoryGUIPage<*>, + toPage: InventoryGUIPage<*> +) { + + val fromPageInt = fromPage.number + val toPageInt = toPage.number when (effect) { - InventoryGUIPageChangeEffect.INSTANT -> loadPageUnsafe(toPage) + PageChangeEffect.INSTANT -> loadPageUnsafe(toPage) - InventoryGUIPageChangeEffect.SLIDE_HORIZONTALLY -> { + PageChangeEffect.SLIDE_HORIZONTALLY -> { val width = data.inventoryType.dimensions.width @@ -56,7 +66,7 @@ internal fun InventoryGUI<*>.changePage(effect: InventoryGUIPageChangeEffect, fr } - InventoryGUIPageChangeEffect.SLIDE_VERTICALLY -> { + PageChangeEffect.SLIDE_VERTICALLY -> { val height = data.inventoryType.dimensions.heigth @@ -72,7 +82,7 @@ internal fun InventoryGUI<*>.changePage(effect: InventoryGUIPageChangeEffect, fr } - InventoryGUIPageChangeEffect.SWIPE_HORIZONTALLY -> { + PageChangeEffect.SWIPE_HORIZONTALLY -> { val width = data.inventoryType.dimensions.width @@ -86,7 +96,7 @@ internal fun InventoryGUI<*>.changePage(effect: InventoryGUIPageChangeEffect, fr } - InventoryGUIPageChangeEffect.SWIPE_VERTICALLY -> { + PageChangeEffect.SWIPE_VERTICALLY -> { val height = data.inventoryType.dimensions.heigth @@ -103,6 +113,12 @@ internal fun InventoryGUI<*>.changePage(effect: InventoryGUIPageChangeEffect, fr } } +internal fun InventoryGUI<*>.changeGUI( + effect: InventoryChangeEffect, + fromPage: InventoryGUIPage<*>, + toPage: InventoryGUIPage<*> +) = changePage(effect.effect, fromPage, toPage) + private inline fun changePageEffect( kSpigot: KSpigot, fromPage: Int,