Unverified Commit 248c4970 authored by Shagen Ogandzhanian's avatar Shagen Ogandzhanian Committed by GitHub

JS Input event (#460)

* Minor refactoring character in insert Text can be val

* Preparations for minimal js input examplt

* White-Listing special keys in SkiaLayer.js.kt proof of concept

* proof-of-concept toSkikoTypeEvent

* proof-of-concept toSkikoTypeEvent in Convertors.js.kt
Co-authored-by: 's avatarRoman Sedaikin <roman.sedaikin@jetbrains.com>
parent bf60d5f3
...@@ -5,6 +5,60 @@ import org.w3c.dom.events.KeyboardEvent ...@@ -5,6 +5,60 @@ import org.w3c.dom.events.KeyboardEvent
import org.w3c.dom.events.WheelEvent import org.w3c.dom.events.WheelEvent
import org.w3c.dom.events.InputEvent import org.w3c.dom.events.InputEvent
private val SPECIAL_KEYS = setOf(
"Unidentified",
"Alt",
"AltGraph",
"Backspace",
"CapsLock",
"Control",
"Fn",
"FnLock",
"Hyper",
"Meta",
"NumLock",
"ScrollLock",
"Shift",
"Super",
"Symbol",
"SymbolLock",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
"F7",
"F8",
"F9",
"F10",
"F11",
"F12",
"F13",
"F14",
"F15",
"F16",
"F17",
"F18",
"F19",
"F20",
"F21",
"F22",
"ArrowLeft",
"ArrowUp",
"ArrowRight",
"ArrowDown",
"Help",
"Home",
"Delete",
"End",
"PageUp",
"PageDown",
"Escape",
"Clear",
"Clear"
)
fun toSkikoEvent( fun toSkikoEvent(
event: MouseEvent, event: MouseEvent,
buttons: Boolean, buttons: Boolean,
...@@ -35,6 +89,31 @@ fun toSkikoDragEvent( ...@@ -35,6 +89,31 @@ fun toSkikoDragEvent(
) )
} }
fun toSkikoTypeEvent(
character: String,
event: KeyboardEvent?,
): SkikoInputEvent? {
return if (SPECIAL_KEYS.contains(character)) {
null
} else {
val input = when (character) {
"Enter" -> "\n"
"Tab" -> "\t"
else -> character
}
val key = if (event != null) SkikoKey.valueOf(event.keyCode) else SkikoKey.KEY_UNKNOWN
val modifiers = if (event != null) toSkikoModifiers(event) else SkikoInputModifiers.EMPTY
SkikoInputEvent(
input,
key,
modifiers,
SkikoKeyboardEventKind.TYPE,
event
)
}
}
fun toSkikoEvent( fun toSkikoEvent(
event: KeyboardEvent, event: KeyboardEvent,
kind: SkikoKeyboardEventKind kind: SkikoKeyboardEventKind
......
...@@ -90,6 +90,10 @@ actual open class SkiaLayer { ...@@ -90,6 +90,10 @@ actual open class SkiaLayer {
htmlCanvas.addEventListener("keydown", { event -> htmlCanvas.addEventListener("keydown", { event ->
event as KeyboardEvent event as KeyboardEvent
skikoView?.onKeyboardEvent(toSkikoEvent(event, SkikoKeyboardEventKind.DOWN)) skikoView?.onKeyboardEvent(toSkikoEvent(event, SkikoKeyboardEventKind.DOWN))
toSkikoTypeEvent(event.key, event)?.let { inputEvent ->
skikoView?.onInputEvent(inputEvent)
}
}) })
htmlCanvas.addEventListener("keyup", { event -> htmlCanvas.addEventListener("keyup", { event ->
event as KeyboardEvent event as KeyboardEvent
...@@ -112,9 +116,7 @@ var onContentScaleChanged: ((Float) -> Unit)? = null ...@@ -112,9 +116,7 @@ var onContentScaleChanged: ((Float) -> Unit)? = null
actual typealias SkikoTouchPlatformEvent = Any actual typealias SkikoTouchPlatformEvent = Any
actual typealias SkikoGesturePlatformEvent = Any actual typealias SkikoGesturePlatformEvent = Any
actual typealias SkikoPlatformInputEvent = InputEvent actual typealias SkikoPlatformInputEvent = KeyboardEvent
actual typealias SkikoPlatformKeyboardEvent = KeyboardEvent actual typealias SkikoPlatformKeyboardEvent = KeyboardEvent
// MouseEvent is base class of PointerEvent // MouseEvent is base class of PointerEvent
actual typealias SkikoPlatformPointerEvent = MouseEvent actual typealias SkikoPlatformPointerEvent = MouseEvent
...@@ -147,11 +147,9 @@ actual open class SkiaLayer { ...@@ -147,11 +147,9 @@ actual open class SkiaLayer {
return NSMakeRect(x, y, 0.0, 0.0) return NSMakeRect(x, y, 0.0, 0.0)
} }
override fun insertText(string: Any, replacementRange: CValue<NSRange>) { override fun insertText(string: Any, replacementRange: CValue<NSRange>) {
var character = "" val character = when(string) {
if (string is NSAttributedString) { is NSAttributedString -> string.string
character = string.string else -> string as String
} else {
character = string as String
} }
skikoView?.onInputEvent(toSkikoTypeEvent(character, keyEvent)) skikoView?.onInputEvent(toSkikoTypeEvent(character, keyEvent))
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment