mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-11 19:14:05 +09:00
working text selector; text input needs more work
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package net.torvald.terrarum.gamecontroller
|
||||
|
||||
import com.badlogic.gdx.Gdx
|
||||
import net.torvald.terrarum.App.printdbg
|
||||
import java.io.File
|
||||
|
||||
data class TerrarumKeyLayout(
|
||||
val name: String,
|
||||
@@ -24,9 +25,9 @@ data class TerrarumKeyLayout(
|
||||
object IME {
|
||||
|
||||
const val KEYLAYOUT_DIR = "assets/keylayout/"
|
||||
const val KEYLAYOUT_EXTENSION = ".key"
|
||||
const val KEYLAYOUT_EXTENSION = "key"
|
||||
|
||||
private val cached = HashMap<String, TerrarumKeyLayout>()
|
||||
private val lowLayers = HashMap<String, TerrarumKeyLayout>()
|
||||
|
||||
private val context = org.graalvm.polyglot.Context.newBuilder("js")
|
||||
.allowHostAccess(org.graalvm.polyglot.HostAccess.NONE)
|
||||
@@ -34,16 +35,28 @@ object IME {
|
||||
.allowIO(false)
|
||||
.build()
|
||||
|
||||
init {
|
||||
File(KEYLAYOUT_DIR).listFiles { file, s -> s.endsWith(".$KEYLAYOUT_EXTENSION") }.forEach {
|
||||
printdbg(this, "Registering Low layer ${it.nameWithoutExtension.lowercase()}")
|
||||
lowLayers[it.nameWithoutExtension.lowercase()] = parseKeylayoutFile(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun invoke() {}
|
||||
|
||||
fun getLowLayerByName(name: String): TerrarumKeyLayout {
|
||||
return cached.getOrPut(name) { parseKeylayoutFile("$KEYLAYOUT_DIR$name$KEYLAYOUT_EXTENSION") }
|
||||
return lowLayers[name.lowercase()]!!
|
||||
}
|
||||
|
||||
fun getAllLowLayers(): List<String> {
|
||||
return lowLayers.keys.toList()
|
||||
}
|
||||
|
||||
|
||||
|
||||
private fun parseKeylayoutFile(path: String): TerrarumKeyLayout {
|
||||
val file = Gdx.files.internal(path)
|
||||
val src = file.readString("UTF-8")
|
||||
val jsval = context.eval("js", "let t=$src;Object.freeze(t)")
|
||||
private fun parseKeylayoutFile(file: File): TerrarumKeyLayout {
|
||||
val src = file.readText(Charsets.UTF_8)
|
||||
val jsval = context.eval("js", "Object.freeze($src)")
|
||||
val name = jsval.getMember("n").asString()
|
||||
val out = Array(256) { Array<String?>(4) { null } }
|
||||
for (keycode in 0L until 256L) {
|
||||
|
||||
@@ -289,7 +289,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
|
||||
private var repeatCount = 0
|
||||
private var oldKeys = IntArray(N_KEY_ROLLOVER) { 0 }
|
||||
/** always Low Layer */
|
||||
private var keymap = IME.getLowLayerByName(App.getConfigString("basekeyboardlayout"))
|
||||
// private var keymap = IME.getLowLayerByName(App.getConfigString("basekeyboardlayout"))
|
||||
|
||||
fun resetKeyboardStrobo() {
|
||||
stroboStatus = 0
|
||||
@@ -301,6 +301,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
|
||||
val keys = strobeKeys()
|
||||
var keyChanged = !arrayEq(keys, oldKeys)
|
||||
val keyDiff = arrayDiff(keys, oldKeys)
|
||||
val keymap = IME.getLowLayerByName(App.getConfigString("basekeyboardlayout"))
|
||||
|
||||
if (stroboStatus % 2 == 0 && keys[0] != 0) {
|
||||
stroboStatus += 1
|
||||
@@ -308,8 +309,8 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
|
||||
repeatCount += 1
|
||||
|
||||
val shiftin = keys.contains(Keys.SHIFT_LEFT) || keys.contains(Keys.SHIFT_RIGHT)
|
||||
val keysym0 = keysToStr(keys)
|
||||
val newKeysym0 = keysToStr(keyDiff)
|
||||
val keysym0 = keysToStr(keymap, keys)
|
||||
val newKeysym0 = keysToStr(keymap, keyDiff)
|
||||
val keysym = if (keysym0 == null) null
|
||||
else if (shiftin && keysym0[1]?.isNotBlank() == true) keysym0[1]
|
||||
else keysym0[0]
|
||||
@@ -342,7 +343,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun keysToStr(keys: IntArray): Array<String?>? {
|
||||
private fun keysToStr(keymap: TerrarumKeyLayout, keys: IntArray): Array<String?>? {
|
||||
if (keys.size == 0) return null
|
||||
val headkey = keys[0]
|
||||
return if (keymap.symbols!![headkey] == null) null else keymap.symbols!![headkey]
|
||||
|
||||
Reference in New Issue
Block a user