From 0ff71f39fed67f588de4c479d70e411d3227e68d Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 17 Jun 2023 17:10:13 +0900 Subject: [PATCH] list scroll for portallisting --- .../ui/UIItemListNavBarVertical.kt | 8 +- .../modulebasegame/ui/UIWorldPortalListing.kt | 81 +++++++++++++++---- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt index d64560fcf..04536e136 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt @@ -17,7 +17,7 @@ import net.torvald.terrarum.ui.UIItemImageButton class UIItemListNavBarVertical( parentUI: UICanvas, initialX: Int, initialY: Int, override val height: Int, - hasGridModeButtons: Boolean, initialModeSelection: Int = 0, + val hasGridModeButtons: Boolean, initialModeSelection: Int = 0, private val colourTheme: InventoryCellColourTheme = UIItemInventoryCellCommonRes.defaultInventoryCellTheme, var extraDrawOpOnBottom: (UIItemListNavBarVertical, SpriteBatch) -> Unit = { _,_ -> } ) : UIItem(parentUI, initialX, initialY) { @@ -130,7 +130,7 @@ class UIItemListNavBarVertical( batch.color = colourTheme.cellHighlightNormalCol Toolkit.drawBoxBorder(batch, iconPosX - 4, getIconPosY(0) - 8, width, height) - gridModeButtons.forEach { it.render(batch, camera) } + if (hasGridModeButtons) gridModeButtons.forEach { it.render(batch, camera) } scrollUpButton.render(batch, camera) scrollDownButton.render(batch, camera) @@ -155,7 +155,7 @@ class UIItemListNavBarVertical( override fun update(delta: Float) { - gridModeButtons.forEach { it.update(delta) } + if (hasGridModeButtons) gridModeButtons.forEach { it.update(delta) } scrollUpButton.update(delta) scrollDownButton.update(delta) @@ -163,7 +163,7 @@ class UIItemListNavBarVertical( } override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { - gridModeButtons.forEach { if (it.mouseUp) it.touchDown(screenX, screenY, pointer, button) } + if (hasGridModeButtons) 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 super.touchDown(screenX, screenY, pointer, button) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalListing.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalListing.kt index 1483267fa..93e71e164 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalListing.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWorldPortalListing.kt @@ -9,6 +9,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.utils.GdxRuntimeException import net.torvald.terrarum.* import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull.Companion.INVENTORY_CELLS_OFFSET_Y import net.torvald.terrarum.modulebasegame.ui.UIInventoryFull.Companion.getCellCountVertically @@ -28,6 +29,7 @@ import java.time.Instant import java.time.format.DateTimeFormatter import java.util.* import java.util.zip.GZIPInputStream +import kotlin.math.ceil /** * Created by minjaesong on 2023-05-19. @@ -98,6 +100,8 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() { } } + private val navRemoCon = UIItemListNavBarVertical(full, hx + 6 + UIItemWorldCellsSimple.width, y + 7, listHeight, false) + private val worldList = ArrayList() data class WorldInfo( val uuid: UUID, @@ -119,23 +123,21 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() { } CommonResourcePool.loadAll() + navRemoCon.scrollUpListener = { _,_ -> scrollItemPage(-1) } + navRemoCon.scrollDownListener = { _,_ -> scrollItemPage(1) } addUIitem(buttonRenameWorld) addUIitem(buttonDeleteWorld) addUIitem(buttonTeleport) addUIitem(buttonCancel) - + addUIitem(navRemoCon) } - private var chunksUsed = 0 - private val chunksMax = 100000 + fun scrollItemPage(relativeAmount: Int) { + listPage = if (listPageCount == 0) 0 else (listPage + relativeAmount).fmod(listPageCount) + } - private lateinit var worldCells: Array - - private var selected: UIItemWorldCellsSimple? = null - private var selectedIndex: Int? = null - - override fun show() { + private fun readWorldList() { worldList.clear() (INGAME.actorGamer.actorValue.getAsString(AVKey.WORLD_PORTAL_DICT) ?: "").split(",").filter { it.isNotBlank() }.map { it.ascii85toUUID().let { it to App.savegameWorlds[it] } @@ -175,16 +177,38 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() { }.let { worldList.addAll(it) } - - - chunksUsed = worldList.sumOf { it.dimensionInChunks } + listPageCount = ceil(worldList.size.toDouble() / listCount).toInt() + } - worldCells = Array(maxOf(worldList.size, listCount)) { + private var chunksUsed = 0 + private val chunksMax = 100000 + + private lateinit var worldCells: Array + + private var selected: UIItemWorldCellsSimple? = null + private var selectedIndex: Int? = null + + var listPage + set(value) { + navRemoCon.itemPage = if (listPageCount == 0) 0 else (value).fmod(listPageCount) + rebuildList() + } + get() = navRemoCon.itemPage + + var listPageCount // TODO total size of current category / items.size + protected set(value) { + navRemoCon.itemPageCount = value + } + get() = navRemoCon.itemPageCount + + private fun rebuildList() { + worldCells = Array(listCount) { it0 -> + val it = it0 + listCount * listPage UIItemWorldCellsSimple( this, hx + gridGap / 2, - y + (gridGap + UIItemWorldCellsSimple.height) * it, + y + (gridGap + UIItemWorldCellsSimple.height) * it0, worldList.getOrNull(it), worldList.getOrNull(it)?.diskSkimmer?.getDiskName(Common.CHARSET) ).also { button -> @@ -195,6 +219,14 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() { } } } + } + + override fun show() { + listPage = 0 + + readWorldList() + + rebuildList() uiItems.forEach { it.show() } worldCells.forEach { it.show() } @@ -358,11 +390,21 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() { } else return false } + + override fun scrolled(amountX: Float, amountY: Float): Boolean { + if (this.isVisible) { + uiItems.forEach { it.scrolled(amountX, amountY) } + worldCells.forEach { it.scrolled(amountX, amountY) } + handler.subUIs.forEach { it.scrolled(amountX, amountY) } + return true + } + else return false + } } class UIItemWorldCellsSimple( - parent: UIWorldPortalListing, + val parent: UIWorldPortalListing, initialX: Int, initialY: Int, internal val worldInfo: UIWorldPortalListing.WorldInfo? = null, @@ -423,6 +465,15 @@ class UIItemWorldCellsSimple( } + override fun scrolled(amountX: Float, amountY: Float): Boolean { + + if (mouseUp) { + parent.scrollItemPage(amountY.toInt()) + } + + return true + } + override fun dispose() { } } \ No newline at end of file