From 391cbcff34d97511e6e8bb6bb59070040d2bd4ba Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 9 May 2018 19:41:04 +0900 Subject: [PATCH] scrollable inventory with up/down UI button --- assets/graphics/gui/inventory/category.tga | 4 +- src/net/torvald/terrarum/ui/UIHandler.kt | 8 +- src/net/torvald/terrarum/ui/UIItem.kt | 7 +- .../terrarum/ui/UIItemInventoryDynamicList.kt | 87 +++++++++++++++++-- 4 files changed, 95 insertions(+), 11 deletions(-) diff --git a/assets/graphics/gui/inventory/category.tga b/assets/graphics/gui/inventory/category.tga index 56ceb5999..b1322d41f 100644 --- a/assets/graphics/gui/inventory/category.tga +++ b/assets/graphics/gui/inventory/category.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:65fb603ab26dd765c6abae88760a7d005cdbf353735a0431acca94780ccb86cc -size 28844 +oid sha256:40f3c2ea92d308729401a05d922422caee528df41c2b259d2998d2a947142683 +size 33644 diff --git a/src/net/torvald/terrarum/ui/UIHandler.kt b/src/net/torvald/terrarum/ui/UIHandler.kt index 9d1afe30d..93307c1f8 100644 --- a/src/net/torvald/terrarum/ui/UIHandler.kt +++ b/src/net/torvald/terrarum/ui/UIHandler.kt @@ -100,8 +100,8 @@ class UIHandler(//var UI: UICanvas, } - if (openFired && openCloseCounter > 9) openFired = false - if (closeFired && openCloseCounter > 9) closeFired = false + //if (openFired && openCloseCounter > 9) openFired = false + //if (closeFired && openCloseCounter > 9) closeFired = false if (isVisible) { @@ -109,6 +109,8 @@ class UIHandler(//var UI: UICanvas, } if (isOpening) { + openFired = false + isVisible = true openCloseCounter += delta @@ -128,6 +130,8 @@ class UIHandler(//var UI: UICanvas, } } else if (isClosing) { + closeFired = false + openCloseCounter += delta // println("UI ${UI.javaClass.simpleName} (close)") diff --git a/src/net/torvald/terrarum/ui/UIItem.kt b/src/net/torvald/terrarum/ui/UIItem.kt index 94821da9b..e16dc25c4 100644 --- a/src/net/torvald/terrarum/ui/UIItem.kt +++ b/src/net/torvald/terrarum/ui/UIItem.kt @@ -61,15 +61,20 @@ abstract class UIItem(var parentUI: UICanvas) { // do not replace parentUI to UI // kind of listener implementation + /** Fired once for every update + * Parametre: delta */ open var updateListener: ((Float) -> Unit)? = null + /** Parametre: keycode */ open var keyDownListener: ((Int) -> Unit)? = null + /** Parametre: keycode */ open var keyUpListener: ((Int) -> Unit)? = null open var mouseMovedListener: ((Int, Int) -> Unit)? = null open var touchDraggedListener: ((Int, Int, Int) -> Unit)? = null + /** Parametres: screenX, screenY, pointer, button */ open var touchDownListener: ((Int, Int, Int, Int) -> Unit)? = null open var touchUpListener: ((Int, Int, Int, Int) -> Unit)? = null open var scrolledListener: ((Int) -> Unit)? = null - + /** Parametres: relative mouseX, relative mouseY, button */ open var clickOnceListener: ((Int, Int, Int) -> Unit)? = null open var clickOnceListenerFired = false diff --git a/src/net/torvald/terrarum/ui/UIItemInventoryDynamicList.kt b/src/net/torvald/terrarum/ui/UIItemInventoryDynamicList.kt index 77f605f22..69c706705 100644 --- a/src/net/torvald/terrarum/ui/UIItemInventoryDynamicList.kt +++ b/src/net/torvald/terrarum/ui/UIItemInventoryDynamicList.kt @@ -9,6 +9,7 @@ import net.torvald.terrarum.UIItemInventoryElem import net.torvald.terrarum.UIItemInventoryElemSimple import net.torvald.terrarum.gameactors.ActorInventory import net.torvald.terrarum.gameactors.InventoryPair +import net.torvald.terrarum.gameactors.ceilInt import net.torvald.terrarum.itemproperties.GameItem import net.torvald.terrarum.itemproperties.ItemCodex import java.util.ArrayList @@ -62,6 +63,7 @@ class UIItemInventoryDynamicList( var itemPage = 0 var itemPageCount = 1 // TODO total size of current category / items.size + private set var inventorySortList = ArrayList() private var rebuildList = true @@ -117,22 +119,45 @@ class UIItemInventoryDynamicList( field = value } + + private val iconPosX = posX - 12 - parentUI.catIcons.tileW + 2 + private fun getIconPosY(index: Int) = + posY - 2 + (4 + UIItemInventoryElem.height - (parentUI as UIInventoryFull).catIcons.tileH) * index + /** Long/compact mode buttons */ private val gridModeButtons = Array(2, { index -> - val iconPosX = posX - 12 - parentUI.catIcons.tileW + 2 - val iconPosY = posY - 2 + (4 + UIItemInventoryElem.height - parentUI.catIcons.tileH) * index - UIItemImageButton( parentUI, parentUI.catIcons.get(index + 14, 0), activeBackCol = Color(0), activeBackBlendMode = BlendMode.NORMAL, posX = iconPosX, - posY = iconPosY, + posY = getIconPosY(index), highlightable = true ) }) + private val scrollUpButton = UIItemImageButton( + parentUI, + parentUI.catIcons.get(18, 0), + activeBackCol = Color(0), + activeBackBlendMode = BlendMode.NORMAL, + posX = iconPosX, + posY = getIconPosY(2), + highlightable = false + ) + + private val scrollDownButton = UIItemImageButton( + parentUI, + parentUI.catIcons.get(19, 0), + activeBackCol = Color(0), + activeBackBlendMode = BlendMode.NORMAL, + posX = iconPosX, + posY = getIconPosY(3), + highlightable = false + ) + + init { // initially highlight grid mode buttons gridModeButtons[if (isCompactMode) 1 else 0].highlighted = true @@ -142,22 +167,58 @@ class UIItemInventoryDynamicList( isCompactMode = false gridModeButtons[0].highlighted = true gridModeButtons[1].highlighted = false + itemPage = 0 + rebuild() } gridModeButtons[1].touchDownListener = { _, _, _, _ -> isCompactMode = true gridModeButtons[0].highlighted = false gridModeButtons[1].highlighted = true + itemPage = 0 + rebuild() + } + + scrollUpButton.clickOnceListener = { _, _, _ -> + if (itemPage > 0) itemPage-- + scrollUpButton.highlighted = false + rebuild() + } + scrollDownButton.clickOnceListener = { _, _, _ -> + if (itemPage < itemPageCount - 1) itemPage++ + scrollDownButton.highlighted = false + rebuild() } // if (is.mouseUp) handled by this.touchDown() } + private val upDownButtonGapToDots = 7 // apparent gap may vary depend on the texture itself + override fun render(batch: SpriteBatch, camera: Camera) { + fun getScrollDotYHeight(i: Int) = scrollUpButton.posY + 10 + upDownButtonGapToDots + 10 * i + + scrollDownButton.posY = getScrollDotYHeight(itemPageCount) + upDownButtonGapToDots + + items.forEach { it.render(batch, camera) } gridModeButtons.forEach { it.render(batch, camera) } + scrollUpButton.render(batch, camera) + scrollDownButton.render(batch, camera) + + // draw scroll dots + for (i in 0 until itemPageCount) { + val colour = if (i == itemPage) Color.WHITE else Color(0xffffff7f.toInt()) + + batch.color = colour + batch.draw( + (parentUI as UIInventoryFull).catIcons.get(20,0), + scrollUpButton.posX.toFloat(), + getScrollDotYHeight(i).toFloat() + ) + } super.render(batch, camera) } @@ -188,11 +249,17 @@ class UIItemInventoryDynamicList( gridModeButtons.forEach { it.update(delta) } + scrollUpButton.update(delta) + scrollDownButton.update(delta) } internal fun rebuild() { + //println("Rebuilt inventory") + //println("rebuild: actual itempage: $itemPage") + + val filter = catIconsMeaning[selectedIcon] inventorySortList = ArrayList() @@ -203,8 +270,6 @@ class UIItemInventoryDynamicList( inventorySortList.add(it) } - rebuildList = false - // sort if needed // test sort by name inventorySortList.sortBy { it.item.name } @@ -249,12 +314,20 @@ class UIItemInventoryDynamicList( items[k].equippedSlot = null } } + + + itemPageCount = (inventorySortList.size.toFloat() / items.size.toFloat()).ceilInt() + + + rebuildList = false } override fun dispose() { itemList.forEach { it.dispose() } itemGrid.forEach { it.dispose() } gridModeButtons.forEach { it.dispose() } + scrollUpButton.dispose() + scrollDownButton.dispose() } override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { @@ -262,6 +335,8 @@ class UIItemInventoryDynamicList( items.forEach { if (it.mouseUp) it.touchDown(screenX, screenY, pointer, button) } gridModeButtons.forEach { if (it.mouseUp) it.touchDown(screenX, screenY, pointer, button) } + if (scrollUpButton.mouseUp) scrollUpButton.touchDown(screenX, screenY, pointer, button) + if (scrollDownButton.mouseUp) scrollDownButton.touchDown(screenX, screenY, pointer, button) return true }