KeyEventHandler.kt 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (c) Milan Jurkulák 2024.
  3. * Contact:
  4. * e: mimoccc@gmail.com
  5. * e: mj@mjdev.org
  6. * w: https://mjdev.org
  7. */
  8. package eu.mjdev.desktop.helpers.internal
  9. import androidx.compose.ui.input.key.*
  10. @Suppress("CanBeParameter", "unused", "MemberVisibilityCanBePrivate")
  11. class KeyEventHandler(
  12. private val event: KeyEvent,
  13. private val block: KeyEventHandler.() -> Unit
  14. ) {
  15. private val listeners = mutableListOf<KeyEventListener>()
  16. fun addListener(key: Key?, block: (String) -> Unit) {
  17. listeners.add(KeyEventListener(key, block))
  18. }
  19. init {
  20. block()
  21. if (event.type == KeyEventType.KeyDown) {
  22. val char = Char(event.key.keyCode.toInt())
  23. when {
  24. char.isPrintable -> listeners.filter { l -> l.key == null }.forEach { l -> l.block(parseCharacter(event)) }
  25. else -> listeners.filter { l -> l.key == event.key }.forEach { l -> l.block(parseCharacter(event)) }
  26. }
  27. }
  28. }
  29. private val Char.isPrintable : Boolean get() {
  30. val block = Character.UnicodeBlock.of(this)
  31. return (!Character.isISOControl(this)) &&
  32. this != java.awt.event.KeyEvent.CHAR_UNDEFINED &&
  33. block != null &&
  34. block != Character.UnicodeBlock.SPECIALS
  35. }
  36. private fun parseCharacter(event: KeyEvent) = Char(event.key.keyCode.toInt()).let { c ->
  37. if (event.isShiftPressed) c.uppercase() else c.lowercase()
  38. }
  39. fun onChar(block: (String) -> Unit) = addListener(null, block)
  40. fun onEscape(block: (String) -> Unit) = addListener(Key.Escape, block)
  41. fun onDelete(block: (String) -> Unit) = addListener(Key.Delete, block)
  42. fun onEnter(block: (String) -> Unit) = addListener(Key.Enter, block)
  43. fun onBack(block: (String) -> Unit) = addListener(Key.Back, block)
  44. fun onBackSpace(block: (String) -> Unit) = addListener(Key.Back, block)
  45. class KeyEventListener(val key: Key?, val block: (String) -> Unit)
  46. companion object {
  47. fun keyEventHandler(
  48. event: KeyEvent,
  49. block: KeyEventHandler.() -> Unit
  50. ) = KeyEventHandler(event, block)
  51. }
  52. }