diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index a67162d14..4c852470a 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -23,7 +23,6 @@ import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension import net.torvald.terrarum.modulebasegame.ui.UIRemoCon import net.torvald.terrarum.serialise.ReadLayerData import net.torvald.terrarum.ui.UICanvas -import net.torvald.terrarum.modulebasegame.ui.UITitleRemoConRoot import net.torvald.terrarum.modulebasegame.ui.UITitleRemoConYaml import net.torvald.terrarum.modulebasegame.weather.WeatherMixer import net.torvald.terrarum.worlddrawer.* diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt index 96754be92..0c8b2d5c6 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIRemoCon.kt @@ -16,7 +16,7 @@ import kotlin.collections.ArrayList /** * Created by minjaesong on 2018-08-29. */ -class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { +open class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { override var openCloseTime = 0f @@ -28,14 +28,38 @@ class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { get() = remoConTray.height set(value) {} + private val screens = ArrayList>() + + private val yamlSep = Regex(" : ") + init { remoConTray = generateNewRemoCon(currentRemoConContents) + + treeRepresentation.traversePreorder { node, _ -> + val splittedNodeName = node.data?.split(yamlSep) + + if (splittedNodeName?.size == 2) { + val attachedClass = loadClass(splittedNodeName[1]) + + attachedClass.posX = 0 + attachedClass.posY = 0 + + screens.add((node.data ?: "(null)") to attachedClass) + } + } + } + + private fun loadClass(name: String): UICanvas { + val newClass = Class.forName(name) + val newClassConstructor = newClass.getConstructor(/* no args defined */) + val newClassInstance = newClassConstructor.newInstance(/* no args defined */) + return newClassInstance as UICanvas } private var mouseActionAvailable = true private fun generateNewRemoCon(node: QNDTreeNode): UIRemoConElement { - val dynamicStrArray = Array(node.children.size, { node.children[it].data ?: "(null)" }) + val dynamicStrArray = Array(node.children.size, { node.children[it].data?.split(yamlSep)?.get(0) ?: "(null)" }) return UIRemoConElement(this, dynamicStrArray) } @@ -50,7 +74,11 @@ class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { val selectedIndex = remoConTray.selectedIndex selectedItem?.let { - if (it.labelText == "MENU_LABEL_RETURN") { + // selection change + if (it.labelText == "MENU_LABEL_QUIT") { + System.exit(0) + } + else if (it.labelText == "MENU_LABEL_RETURN") { if (currentRemoConContents.parent != null) { remoConTray.consume() @@ -79,6 +107,23 @@ class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { throw RuntimeException("Index: $selectedIndex, Size: ${currentRemoConContents.children.size}") } } + + + // do something with the actual selection + println(currentRemoConContents.data) + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.setAsOpen() + + } + else { + it.second.setAsClose() + } + + it.second.update(delta) // update is required anyway + // but this is not updateUI, so whenever the UI is completely hidden, + // underlying handler will block any update until the UI is open again + } } @@ -90,6 +135,11 @@ class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { override fun renderUI(batch: SpriteBatch, camera: Camera) { remoConTray.render(batch, camera) + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.render(batch, camera) // again, underlying handler will block unnecessary renders + } + } } override fun doOpening(delta: Float) { @@ -112,6 +162,88 @@ class UIRemoCon(treeRepresentation: QNDTreeNode) : UICanvas() { } + override fun mouseMoved(screenX: Int, screenY: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.mouseMoved(screenX, screenY) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun touchDragged(screenX: Int, screenY: Int, pointer: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.touchDragged(screenX, screenY, pointer) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.touchDown(screenX, screenY, pointer, button) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun touchUp(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.touchUp(screenX, screenY, pointer, button) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun scrolled(amount: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.scrolled(amount) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun keyDown(keycode: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.keyDown(keycode) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun keyUp(keycode: Int): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.keyUp(keycode) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + override fun keyTyped(character: Char): Boolean { + screens.forEach { + if (currentRemoConContents.data == it.first) { + it.second.keyTyped(character) // again, underlying handler will block unnecessary renders + } + } + + return true + } + + + class UIRemoConElement(uiRemoCon: UIRemoCon, val labels: Array) { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConModules.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt similarity index 55% rename from src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConModules.kt rename to src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt index c43df0c81..783fca76d 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConModules.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleModules.kt @@ -14,39 +14,19 @@ import net.torvald.terrarum.ui.UIItemTextButtonList /** * Created by minjaesong on 2017-08-01. */ -class UITitleRemoConModules(val superMenu: UICanvas) : UICanvas() { +class UITitleModules : UICanvas() { - val menuLabels = arrayOf( - "MENU_LABEL_RETURN" - ) - - - override var width: Int = UITitleRemoConRoot.remoConWidth - override var height: Int = UITitleRemoConRoot.getRemoConHeight(menuLabels) override var openCloseTime: Second = 0f - private val menubar = UIItemTextButtonList( - this, - menuLabels, - 0, UITitleRemoConRoot.menubarOffY, - this.width, this.height, - textAreaWidth = this.width, - readFromLang = true, - activeBackCol = Color(0), - highlightBackCol = Color(0), - backgroundCol = Color(0), - inactiveCol = Color.WHITE, - defaultSelection = null - ) - private val moduleAreaHMargin = 48 private val moduleAreaBorder = 8 - private val moduleAreaWidth = (Terrarum.WIDTH * 0.75).toInt() - moduleAreaHMargin - private val moduleAreaHeight = Terrarum.HEIGHT - moduleAreaHMargin * 2 + override var width = (Terrarum.WIDTH * 0.75).toInt() - moduleAreaHMargin + override var height = Terrarum.HEIGHT - moduleAreaHMargin * 2 + private val moduleInfoCells = ArrayList() // build module list @@ -55,7 +35,7 @@ class UITitleRemoConModules(val superMenu: UICanvas) : UICanvas() { moduleInfoCells.add(UIItemModuleInfoCell( this, it.first, - moduleAreaWidth - 2 * moduleAreaBorder, + width - 2 * moduleAreaBorder, 0, 0 // placeholder )) } @@ -65,41 +45,22 @@ class UITitleRemoConModules(val superMenu: UICanvas) : UICanvas() { this, moduleInfoCells, (Terrarum.WIDTH * 0.25f).toInt(), moduleAreaHMargin, - moduleAreaWidth, - moduleAreaHeight, + width, + height, inactiveCol = Color.WHITE, border = moduleAreaBorder ) init { - uiItems.add(menubar) uiItems.add(mouduleArea) - - - //////////////////////////// - - - - - // attach listeners - - menubar.buttons[menuLabels.indexOf("MENU_LABEL_RETURN")].clickOnceListener = { _, _, _ -> - this.setAsClose() - Thread.sleep(50) - menubar.selectedIndex = menubar.defaultSelection - superMenu.setAsOpen() - } } override fun updateUI(delta: Float) { - menubar.update(delta) mouduleArea.update(delta) } override fun renderUI(batch: SpriteBatch, camera: Camera) { - menubar.render(batch, camera) - batch.color = Color.WHITE blendNormal() mouduleArea.render(batch, camera) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConCredits.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConCredits.kt deleted file mode 100644 index 8a7cde65b..000000000 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConCredits.kt +++ /dev/null @@ -1,116 +0,0 @@ -package net.torvald.terrarum.modulebasegame.ui - -import com.badlogic.gdx.graphics.Camera -import com.badlogic.gdx.graphics.Color -import com.badlogic.gdx.graphics.g2d.SpriteBatch -import net.torvald.terrarum.CreditSingleton -import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.Second -import net.torvald.terrarum.ui.UICanvas -import net.torvald.terrarum.ui.UIItemTextArea -import net.torvald.terrarum.ui.UIItemTextButtonList - -class UITitleRemoConCredits(val superMenu: UICanvas) : UICanvas() { - - - val menuLabels = arrayOf( - "MENU_LABEL_CREDITS", - "MENU_CREDIT_GPL_DNT", - "MENU_LABEL_RETURN" - ) - - - override var width: Int = UITitleRemoConRoot.remoConWidth - override var height: Int = UITitleRemoConRoot.getRemoConHeight(menuLabels) - override var openCloseTime: Second = 0f - - - private val textAreaHMargin = 48 - private val textAreaWidth = (Terrarum.WIDTH * 0.75).toInt() - private val textAreaHeight = Terrarum.HEIGHT - textAreaHMargin * 2 - private val textArea = UIItemTextArea(this, - Terrarum.WIDTH - textAreaWidth, textAreaHMargin, - textAreaWidth, textAreaHeight - ) - private var drawTextArea = true - - - private val menubar = UIItemTextButtonList( - this, - menuLabels, - 0, UITitleRemoConRoot.menubarOffY, - this.width, this.height, - textAreaWidth = this.width, - readFromLang = true, - activeBackCol = Color(0), - highlightBackCol = Color(0), - backgroundCol = Color(0), - inactiveCol = Color.WHITE, - defaultSelection = 0 // show CREDITS - ) - - init { - uiItems.add(menubar) - uiItems.add(textArea) - - - - //////////////////////////// - - - - // attach listeners - menubar.buttons[menuLabels.indexOf("MENU_LABEL_RETURN")].clickOnceListener = { _, _, _ -> - this.setAsClose() - Thread.sleep(50) - menubar.selectedIndex = menubar.defaultSelection - superMenu.setAsOpen() - } - - menubar.selectionChangeListener = { _, newIndex -> - textArea.scrollPos = 0 - - if (newIndex == menuLabels.indexOf("MENU_LABEL_CREDITS")) { - textArea.setWallOfText(CreditSingleton.credit) - drawTextArea = true - } - else if (newIndex == menuLabels.indexOf("MENU_CREDIT_GPL_DNT")) { - textArea.setWallOfText(CreditSingleton.gpl3) - drawTextArea = true - } - else { - drawTextArea = false - } - } - } - - override fun updateUI(delta: Float) { - menubar.update(delta) - if (drawTextArea) { - textArea.update(delta) - } - } - - override fun renderUI(batch: SpriteBatch, camera: Camera) { - menubar.render(batch, camera) - if (drawTextArea) { - batch.color = Color.WHITE - textArea.render(batch, camera) - } - } - - override fun doOpening(delta: Float) { - } - - override fun doClosing(delta: Float) { - } - - override fun endOpening(delta: Float) { - } - - override fun endClosing(delta: Float) { - } - - override fun dispose() { - } -} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConLanguage.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConLanguage.kt index f9005016b..66eac1d96 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConLanguage.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConLanguage.kt @@ -17,40 +17,19 @@ class UITitleRemoConLanguage(val superMenu: UICanvas) : UICanvas() { ) - override var width: Int = UITitleRemoConRoot.remoConWidth - override var height: Int = UITitleRemoConRoot.getRemoConHeight(menuLabels) override var openCloseTime: Second = 0f - private val menubar = UIItemTextButtonList( - this, - menuLabels, - 0, UITitleRemoConRoot.menubarOffY, - this.width, this.height, - textAreaWidth = this.width, - readFromLang = true, - activeBackCol = Color(0), - highlightBackCol = Color(0), - backgroundCol = Color(0), - inactiveCol = Color.WHITE, - defaultSelection = null - ) - - private val textAreaHMargin = 48 - private val textAreaWidth = (Terrarum.WIDTH * 0.75).toInt() - private val textAreaHeight = Terrarum.HEIGHT - textAreaHMargin * 2 - /*private val textArea = UIItemTextArea(this, - Terrarum.WIDTH - textAreaWidth, textAreaHMargin, - textAreaWidth, textAreaHeight, - align = UIItemTextArea.Align.CENTRE - )*/ + override var width = (Terrarum.WIDTH * 0.75).toInt() + override var height = Terrarum.HEIGHT - textAreaHMargin * 2 + private val localeList = Lang.languageList.toList().sorted() private val textArea = UIItemTextButtonList(this, localeList.map { Lang.langpack["MENU_LANGUAGE_THIS_$it"] ?: "!ERR: $it" }.toTypedArray(), - Terrarum.WIDTH - textAreaWidth, textAreaHMargin, - textAreaWidth, textAreaHeight, - textAreaWidth = textAreaWidth, + Terrarum.WIDTH - width, textAreaHMargin, + width, height, + textAreaWidth = width, readFromLang = false, activeBackCol = Color(0), highlightBackCol = Color(0), @@ -61,7 +40,6 @@ class UITitleRemoConLanguage(val superMenu: UICanvas) : UICanvas() { init { - uiItems.add(menubar) //textArea.entireText = Lang.languageList.toList().sorted().map { Lang.langpack["MENU_LANGUAGE_THIS_$it"] ?: "!ERR: $it" } @@ -76,21 +54,14 @@ class UITitleRemoConLanguage(val superMenu: UICanvas) : UICanvas() { AppLoader.GAME_LOCALE = localeList[newSelectionIndex] } - menubar.buttons[menuLabels.indexOf("MENU_LABEL_RETURN")].clickOnceListener = { _, _, _ -> - this.setAsClose() - Thread.sleep(50) - menubar.selectedIndex = menubar.defaultSelection - superMenu.setAsOpen() - } + } override fun updateUI(delta: Float) { - menubar.update(delta) textArea.update(delta) } override fun renderUI(batch: SpriteBatch, camera: Camera) { - menubar.render(batch, camera) batch.color = Color.WHITE textArea.render(batch, camera) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConRoot.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConRoot.kt index 2d10c4360..77b572f60 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConRoot.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConRoot.kt @@ -11,7 +11,7 @@ import net.torvald.terrarum.modulebasegame.BuildingMaker import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UIItemTextButtonList -class UITitleRemoConRoot : UICanvas() { +/*class UITitleRemoConRoot : UICanvas() { companion object { val remoConWidth = 240 @@ -63,7 +63,7 @@ class UITitleRemoConRoot : UICanvas() { private val remoConCredits = UITitleRemoConCredits(this) private val remoConLanguage = UITitleRemoConLanguage(this) - private val remoConModules = UITitleRemoConModules(this) + private val remoConModules = UITitleModules(this) init { remoConLanguage.setPosition(0, 0) @@ -159,4 +159,4 @@ class UITitleRemoConRoot : UICanvas() { } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConYaml.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConYaml.kt index 40df382e2..d5d763286 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConYaml.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleRemoConYaml.kt @@ -6,7 +6,7 @@ import java.util.* object UITitleRemoConYaml { - // YAML indent with a space! + // YAML indent with a space, separate label and class with " : " verbatim! val menus = """ - MENU_MODE_SINGLEPLAYER @@ -18,13 +18,13 @@ object UITitleRemoConYaml { - MENU_OPTIONS_CONTROLS - MENU_OPTIONS_SOUND - MENU_LABEL_RETURN - - MENU_MODULES + - MENU_MODULES : net.torvald.terrarum.modulebasegame.ui.UITitleModules - MENU_LABEL_RETURN - MENU_LABEL_LANGUAGE - MENU_LABEL_RETURN - - MENU_LABEL_CREDITS - - MENU_LABEL_CREDITS - - MENU_CREDIT_GPL_DNT + - MENU_LABEL_CREDITS : net.torvald.terrarum.modulebasegame.ui.UITitleCredits + - MENU_LABEL_CREDITS : net.torvald.terrarum.modulebasegame.ui.UITitleCredits + - MENU_CREDIT_GPL_DNT : net.torvald.terrarum.modulebasegame.ui.UITitleGPL3 - MENU_LABEL_RETURN - MENU_LABEL_QUIT """.trimIndent() @@ -74,16 +74,11 @@ object UITitleRemoConYaml { // test traverse resulting tree - fun preorder(node: QNDTreeNode, depth: Int = 1) { - //if (node == null) return - - repeat(depth) { print("-") } + /*root.traversePreorder { node, depth -> + repeat(depth + 1) { print("-") } println("${node.data} -> ${node.parent}") + }*/ - node.children.forEach { preorder(it, depth + 1) } - } - - preorder(root) return root } @@ -103,4 +98,25 @@ object UITitleRemoConYaml { class QNDTreeNode(var data: T? = null, var parent: QNDTreeNode? = null) { var children = ArrayList>() + + + private fun traverse1(node: QNDTreeNode, action: (QNDTreeNode, Int) -> Unit, depth: Int = 0) { + //if (node == null) return + action(node, depth) + node.children.forEach { traverse1(it, action, depth + 1) } + } + + private fun traverse2(node: QNDTreeNode, action: (QNDTreeNode, Int) -> Unit, depth: Int = 0) { + //if (node == null) return + node.children.forEach { traverse2(it, action, depth + 1) } + action(node, depth) + } + + fun traversePreorder(action: (QNDTreeNode, Int) -> Unit) { + this.traverse1(this, action) + } + + fun traversePostorder(action: (QNDTreeNode, Int) -> Unit) { + this.traverse2(this, action) + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITitleWallOfText.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITitleWallOfText.kt new file mode 100644 index 000000000..cc3342b40 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITitleWallOfText.kt @@ -0,0 +1,59 @@ +package net.torvald.terrarum.modulebasegame.ui + +import com.badlogic.gdx.graphics.Camera +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.CreditSingleton +import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.Second +import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UIItemTextArea +import net.torvald.terrarum.ui.UIItemTextButtonList + +open class UITitleWallOfText(text: List) : UICanvas() { + + override var openCloseTime: Second = 0f + + + private val textAreaHMargin = 48 + override var width = (Terrarum.WIDTH * 0.75).toInt() + override var height = Terrarum.HEIGHT - textAreaHMargin * 2 + private val textArea = UIItemTextArea(this, + Terrarum.WIDTH - width, textAreaHMargin, + width, height + ) + + + init { + uiItems.add(textArea) + + textArea.setWallOfText(text) + } + + override fun updateUI(delta: Float) { + textArea.update(delta) + } + + override fun renderUI(batch: SpriteBatch, camera: Camera) { + batch.color = Color.WHITE + textArea.render(batch, camera) + } + + override fun doOpening(delta: Float) { + } + + override fun doClosing(delta: Float) { + } + + override fun endOpening(delta: Float) { + } + + override fun endClosing(delta: Float) { + } + + override fun dispose() { + } +} + +class UITitleCredits : UITitleWallOfText(CreditSingleton.credit) +class UITitleGPL3 : UITitleWallOfText(CreditSingleton.gpl3) \ No newline at end of file diff --git a/src/net/torvald/terrarum/ui/UIItemTextArea.kt b/src/net/torvald/terrarum/ui/UIItemTextArea.kt index 493f40c4a..bcfd243f1 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextArea.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextArea.kt @@ -23,7 +23,7 @@ class UIItemTextArea( - var entireText: List = listOf("") // placeholder + private var entireText: List = listOf("") // placeholder var scrollPos = 0