mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-06 08:38:30 +09:00
teleporter: list loading on separate thread
This commit is contained in:
@@ -550,7 +550,7 @@ object ModMgr {
|
|||||||
|
|
||||||
if (iconFile.exists()) {
|
if (iconFile.exists()) {
|
||||||
val iconSheet = TextureRegionPack(iconFile.path, 20, 20)
|
val iconSheet = TextureRegionPack(iconFile.path, 20, 20)
|
||||||
val iconPixmap = Pixmap(Gdx.files.internal(iconFile.path))
|
val iconPixmap = Pixmap(Gdx.files.absolute(iconFile.path))
|
||||||
for (k in 0 until iconPixmap.height step 20) {
|
for (k in 0 until iconPixmap.height step 20) {
|
||||||
val langCode = StringBuilder()
|
val langCode = StringBuilder()
|
||||||
for (c in 0 until 20) {
|
for (c in 0 until 20) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.*
|
|||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
import com.badlogic.gdx.utils.Disposable
|
import com.badlogic.gdx.utils.Disposable
|
||||||
|
import net.torvald.random.HQRNG
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
import net.torvald.terrarum.App.printdbg
|
import net.torvald.terrarum.App.printdbg
|
||||||
import net.torvald.terrarum.gameactors.AVKey
|
import net.torvald.terrarum.gameactors.AVKey
|
||||||
@@ -22,6 +23,7 @@ import net.torvald.terrarum.ui.UICanvas
|
|||||||
import net.torvald.terrarum.ui.UIItem
|
import net.torvald.terrarum.ui.UIItem
|
||||||
import net.torvald.terrarum.ui.UIItemTextButton
|
import net.torvald.terrarum.ui.UIItemTextButton
|
||||||
import net.torvald.terrarum.utils.JsonFetcher
|
import net.torvald.terrarum.utils.JsonFetcher
|
||||||
|
import net.torvald.terrarum.utils.PasswordBase32
|
||||||
import net.torvald.unicode.EMDASH
|
import net.torvald.unicode.EMDASH
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
@@ -148,13 +150,32 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
val seed: Long,
|
val seed: Long,
|
||||||
val lastPlayedString: String,
|
val lastPlayedString: String,
|
||||||
val totalPlayedString: String,
|
val totalPlayedString: String,
|
||||||
val screenshot: TextureRegion?,
|
val rawThumbnail: Pixmap?,
|
||||||
): Disposable {
|
): Disposable {
|
||||||
|
|
||||||
|
private var screenshot0: TextureRegion? = null
|
||||||
|
|
||||||
|
val screenshot: TextureRegion
|
||||||
|
get() {
|
||||||
|
if (screenshot0 == null) {
|
||||||
|
val thumbTex = Texture(rawThumbnail)
|
||||||
|
thumbTex.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear)
|
||||||
|
screenshot0 = TextureRegion(thumbTex)
|
||||||
|
}
|
||||||
|
return screenshot0!!
|
||||||
|
}
|
||||||
|
|
||||||
override fun dispose() {
|
override fun dispose() {
|
||||||
screenshot?.texture?.dispose()
|
screenshot0?.texture?.dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var showSpinner = true
|
||||||
|
private val spinner = CommonResourcePool.getAsTextureRegionPack("inline_loading_spinner")
|
||||||
|
private var spinnerTimer = 0f
|
||||||
|
private var spinnerFrame = 0
|
||||||
|
private val spinnerInterval = 1f / 60
|
||||||
|
|
||||||
private fun disableListEditButtons() {
|
private fun disableListEditButtons() {
|
||||||
buttonRename.isEnabled = false
|
buttonRename.isEnabled = false
|
||||||
buttonDelete.isEnabled = false
|
buttonDelete.isEnabled = false
|
||||||
@@ -194,6 +215,24 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
listPage = if (listPageCount == 0) 0 else (listPage + relativeAmount).fmod(listPageCount)
|
listPage = if (listPageCount == 0) 0 else (listPage + relativeAmount).fmod(listPageCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private lateinit var worldCells: Array<UIItemWorldCellsSimple>
|
||||||
|
|
||||||
|
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 readWorldList() {
|
private fun readWorldList() {
|
||||||
worldList.clear()
|
worldList.clear()
|
||||||
(INGAME.actorGamer.actorValue.getAsString(AVKey.WORLD_PORTAL_DICT) ?: "").split(",").filter { it.isNotBlank() }.map {
|
(INGAME.actorGamer.actorValue.getAsString(AVKey.WORLD_PORTAL_DICT) ?: "").split(",").filter { it.isNotBlank() }.map {
|
||||||
@@ -207,7 +246,7 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
var totalPlayed = 0L
|
var totalPlayed = 0L
|
||||||
var w = 0
|
var w = 0
|
||||||
var h = 0
|
var h = 0
|
||||||
var thumb: TextureRegion? = null
|
var thumb: Pixmap? = null
|
||||||
|
|
||||||
disk.rebuild()
|
disk.rebuild()
|
||||||
|
|
||||||
@@ -227,10 +266,7 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
val gzin = GZIPInputStream(ByteArray64InputStream(zippedTga))
|
val gzin = GZIPInputStream(ByteArray64InputStream(zippedTga))
|
||||||
val tgaFileContents = gzin.readAllBytes(); gzin.close()
|
val tgaFileContents = gzin.readAllBytes(); gzin.close()
|
||||||
|
|
||||||
val thumbPixmap = Pixmap(tgaFileContents, 0, tgaFileContents.size)
|
thumb = Pixmap(tgaFileContents, 0, tgaFileContents.size)
|
||||||
val thumbTex = Texture(thumbPixmap)
|
|
||||||
thumbTex.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear)
|
|
||||||
thumb = TextureRegion(thumbTex)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldInfo(uuid, disk, chunksCount, seed, lastPlayed.toTimestamp(), totalPlayed.toDurationStamp(), thumb)
|
WorldInfo(uuid, disk, chunksCount, seed, lastPlayed.toTimestamp(), totalPlayed.toDurationStamp(), thumb)
|
||||||
@@ -239,26 +275,10 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
}
|
}
|
||||||
full.chunksUsed = worldList.sumOf { it.dimensionInChunks }
|
full.chunksUsed = worldList.sumOf { it.dimensionInChunks }
|
||||||
listPageCount = ceil(worldList.size.toDouble() / listCount).toInt()
|
listPageCount = ceil(worldList.size.toDouble() / listCount).toInt()
|
||||||
|
|
||||||
|
|
||||||
|
printdbg(this, "worldList.size=${worldList.size}")
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var worldCells: Array<UIItemWorldCellsSimple>
|
|
||||||
|
|
||||||
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() {
|
private fun rebuildList() {
|
||||||
worldCells = Array(listCount) { it0 ->
|
worldCells = Array(listCount) { it0 ->
|
||||||
val it = it0 + listCount * listPage
|
val it = it0 + listCount * listPage
|
||||||
@@ -279,13 +299,12 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var threadFired = false
|
||||||
|
|
||||||
override fun show() {
|
override fun show() {
|
||||||
listPage = 0
|
listPage = 0
|
||||||
|
showSpinner = true
|
||||||
readWorldList()
|
|
||||||
|
|
||||||
rebuildList()
|
|
||||||
|
|
||||||
uiItems.forEach { it.show() }
|
uiItems.forEach { it.show() }
|
||||||
worldCells.forEach { it.show() }
|
worldCells.forEach { it.show() }
|
||||||
@@ -293,6 +312,16 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
|
|
||||||
disableListEditButtons()
|
disableListEditButtons()
|
||||||
updateUIbyButtonSelection()
|
updateUIbyButtonSelection()
|
||||||
|
|
||||||
|
if (!threadFired) {
|
||||||
|
threadFired = true
|
||||||
|
Thread {
|
||||||
|
readWorldList()
|
||||||
|
rebuildList()
|
||||||
|
showSpinner = false
|
||||||
|
threadFired = false
|
||||||
|
}.start()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Long.toTimestamp() = Instant.ofEpochSecond(this)
|
private fun Long.toTimestamp() = Instant.ofEpochSecond(this)
|
||||||
@@ -324,6 +353,14 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
if (currentWorldSelected) {
|
if (currentWorldSelected) {
|
||||||
INGAME.setTooltipMessage(if (buttonTeleport.mouseUp || buttonDelete.mouseUp) Lang["CONTEXT_THIS_IS_A_WORLD_CURRENTLY_PLAYING"] else null)
|
INGAME.setTooltipMessage(if (buttonTeleport.mouseUp || buttonDelete.mouseUp) Lang["CONTEXT_THIS_IS_A_WORLD_CURRENTLY_PLAYING"] else null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (showSpinner) {
|
||||||
|
spinnerTimer += delta
|
||||||
|
while (spinnerTimer > spinnerInterval) {
|
||||||
|
spinnerFrame = (spinnerFrame + 1) % 32
|
||||||
|
spinnerTimer -= spinnerInterval
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val iconGap = 12f
|
private val iconGap = 12f
|
||||||
@@ -410,7 +447,11 @@ class UIWorldPortalListing(val full: UIWorldPortal) : UICanvas() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// loading spinner
|
||||||
|
if (showSpinner) {
|
||||||
|
val spin = spinner.get(spinnerFrame % 8, spinnerFrame / 8)
|
||||||
|
batch.draw(spin, screencapX + (thumbw - spin.regionWidth) / 2f, y + (thumbh - spin.regionHeight) / 2f)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uiItems.forEach { it.render(batch, camera) }
|
uiItems.forEach { it.render(batch, camera) }
|
||||||
|
|||||||
Reference in New Issue
Block a user