Unverified Commit 2b7826d1 authored by dima.avdeev's avatar dima.avdeev Committed by GitHub

Fix text input in samples (#591)

parent 47c33a3e
......@@ -7,7 +7,7 @@ import javax.swing.*
fun main() {
val skiaLayer = SkiaLayer()
skiaLayer.addView( GenericSkikoView(skiaLayer, Clocks(skiaLayer)))
skiaLayer.addView(GenericSkikoView(skiaLayer, AwtClocks(skiaLayer)))
SwingUtilities.invokeLater {
val window = JFrame("Skiko example").apply {
defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE
......
package org.jetbrains.skiko.sample
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkikoInputEvent
class AwtClocks(layer: SkiaLayer) : Clocks(layer) {
override var inputText: String = "Hello, AwtClocks"
override fun handleBackspace() {
if (inputText.isNotEmpty()) {
inputText = inputText.dropLast(1)
}
}
override fun onInputEvent(event: SkikoInputEvent) {
if (event.input != "\b") {
inputText += event.input
}
}
}
\ No newline at end of file
......@@ -10,7 +10,7 @@ import kotlin.math.cos
import kotlin.math.sin
import kotlin.math.PI
class Clocks(private val layer: SkiaLayer): SkikoView {
abstract class Clocks(private val layer: SkiaLayer): SkikoView {
private val cursorManager = CursorManager()
private val withFps = true
private val fpsCounter = FPSCounter()
......@@ -26,7 +26,9 @@ class Clocks(private val layer: SkiaLayer): SkikoView {
private val fontCollection = FontCollection()
.setDefaultFontManager(FontMgr.default)
private val style = ParagraphStyle()
private var inputText = ""
abstract val inputText:String
abstract fun handleBackspace()
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
if (withFps) fpsCounter.tick()
......@@ -159,12 +161,6 @@ class Clocks(private val layer: SkiaLayer): SkikoView {
}
}
override fun onInputEvent(event: SkikoInputEvent) {
if (event.input != "\b") {
inputText += event.input
}
}
override fun onKeyboardEvent(event: SkikoKeyboardEvent) {
if (event.kind == SkikoKeyboardEventKind.DOWN) {
when (event.key) {
......@@ -200,9 +196,7 @@ class Clocks(private val layer: SkiaLayer): SkikoView {
SkikoKey.KEY_DOWN -> yOffset += 5.0
SkikoKey.KEY_SPACE -> { reset() }
SkikoKey.KEY_BACKSPACE -> {
if (inputText.isNotEmpty()) {
inputText = inputText.dropLast(1)
}
handleBackspace()
}
else -> {}
}
......
package org.jetbrains.skiko.sample
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkikoUIView
import org.jetbrains.skiko.SkikoInput
class IosClocks(layer: SkiaLayer) : Clocks(layer) {
override var inputText: String = "Hello, IosClocks"
override fun handleBackspace() {
if (inputText.isNotEmpty()) {
inputText = inputText.dropLast(1)
}
}
override val input: SkikoInput = object : SkikoInput by SkikoInput.Empty {
override fun insertText(text: String) {
inputText += text
}
override fun deleteBackward() {
handleBackspace()
}
}
}
......@@ -6,7 +6,7 @@ import org.jetbrains.skiko.sample.*
import platform.Foundation.*
import platform.UIKit.*
fun makeApp(skiaLayer: SkiaLayer) = Clocks(skiaLayer)
fun makeApp(skiaLayer: SkiaLayer) = IosClocks(skiaLayer)
fun getSkikoViewContoller(): UIViewController = SkikoViewController(
SkikoUIView(
......
package org.jetbrains.skiko.sample
import kotlinx.browser.document
import org.jetbrains.skiko.GenericSkikoView
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.onContentScaleChanged
import org.jetbrains.skiko.*
import org.jetbrains.skiko.wasm.onWasmReady
import org.w3c.dom.HTMLCanvasElement
......@@ -11,7 +9,7 @@ fun main() {
onWasmReady {
val skiaLayer = SkiaLayer()
onContentScaleChanged = { scale -> println(scale) }
val game = Clocks(skiaLayer)
val game = JsClocks(skiaLayer)
skiaLayer.skikoView = GenericSkikoView(skiaLayer, game)
val canvas = document.getElementById("SkikoTarget") as HTMLCanvasElement
canvas.setAttribute("tabindex", "0")
......
package org.jetbrains.skiko.sample
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkikoInput
import org.jetbrains.skiko.SkikoInputEvent
class JsClocks(layer: SkiaLayer) : Clocks(layer) {
override var inputText: String = "Hello, JsClocks"
override fun handleBackspace() {
if (inputText.isNotEmpty()) {
inputText = inputText.dropLast(1)
}
}
override val input: SkikoInput = object : SkikoInput {
override fun onInputEvent(event: SkikoInputEvent) {
inputText += event.input
}
}
}
......@@ -7,7 +7,7 @@ import platform.Foundation.NSMakeRect
import platform.Foundation.NSSelectorFromString
import platform.darwin.NSObject
fun makeApp(skiaLayer: SkiaLayer) = Clocks(skiaLayer)
fun makeApp(skiaLayer: SkiaLayer) = MacosClocks(skiaLayer)
fun main() {
val app = NSApplication.sharedApplication()
......
package org.jetbrains.skiko.sample
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkikoInputEvent
class MacosClocks(layer: SkiaLayer): Clocks(layer) {
override var inputText: String = ""
override fun handleBackspace() {
if (inputText.isNotEmpty()) {
inputText = inputText.dropLast(1)
}
}
override fun onInputEvent(event: SkikoInputEvent) {
inputText += event.input
}
}
......@@ -250,8 +250,11 @@ class SkikoUIView : UIView, UIKeyInputProtocol, UITextInputProtocol, UITextPaste
)
}
/**
* Attention! position may be null
*/
override fun positionFromPosition(position: UITextPosition, offset: NSInteger): UITextPosition? {
val p = (position as IntermediateTextPosition).position
val p = (position as? IntermediateTextPosition)?.position ?: return null
val endOfDocument = skiaLayer?.skikoView?.input?.endOfDocument()
return if (endOfDocument != null) {
IntermediateTextPosition(max(min(p + offset, endOfDocument), 0))
......
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