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