[orx-view-box] Add options to disable input translation, add mouse.position

This commit is contained in:
Edwin Jakobs
2022-11-30 22:19:30 +01:00
parent aa85a459ae
commit f849bb8e12
2 changed files with 90 additions and 57 deletions

View File

@@ -9,7 +9,12 @@ import org.openrndr.math.Vector2
import org.openrndr.shape.Rectangle
import kotlin.math.ceil
class ViewBox(override val program: Program, var clientArea: Rectangle) : Program by program {
class ViewBox(
override val program: Program, var clientArea: Rectangle,
translateMouse: Boolean = true,
translateKeyboard: Boolean = true,
) : Program by program {
override var width: Int
get() {
@@ -26,32 +31,44 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
override val extensions: MutableList<Extension> = mutableListOf<Extension>()
override val mouse: MouseEvents = object :MouseEvents{
inner class TranslatedMouseEvents: MouseEvents {
override val buttonDown = Event<MouseEvent>()
override val buttonUp = Event<MouseEvent>()
override val dragged = Event<MouseEvent>()
override val entered = Event<MouseEvent>()
override val exited = Event<MouseEvent>()
override val moved = Event<MouseEvent>()
override val position: Vector2
get() = TODO("Not yet implemented")
override var position: Vector2 = -clientArea.corner
override val pressedButtons: MutableSet<MouseButton>
get() = TODO("Not yet implemented")
override val scrolled = Event<MouseEvent>()
}
override val keyboard: KeyEvents = object: KeyEvents {
override val mouse: MouseEvents = if (translateMouse) {
TranslatedMouseEvents()
} else {
program.mouse
}
override val keyboard: KeyEvents = if (translateKeyboard) object : KeyEvents {
override val character: Event<CharacterEvent> = Event<CharacterEvent>()
override val keyDown: Event<KeyEvent> = Event<KeyEvent>()
override val keyRepeat: Event<KeyEvent> = Event<KeyEvent>()
override val keyUp: Event<KeyEvent> = Event<KeyEvent>()
} else {
program.keyboard
}
override val pointers: Pointers by lazy { program.pointers }
var hasInputFocus = false
init {
if (translateMouse) {
program.mouse.moved.listen {
mouse as TranslatedMouseEvents
mouse.position = it.position - clientArea.corner
if (it.position in clientArea && !it.propagationCancelled) {
hasInputFocus = true
mouse.moved.trigger(it.copy(position = it.position - clientArea.corner))
@@ -86,7 +103,8 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
it.cancelPropagation()
}
}
}
if (translateKeyboard) {
program.keyboard.keyDown.listen {
if (hasInputFocus && !it.propagationCancelled) {
keyboard.keyDown.trigger(it)
@@ -115,6 +133,7 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
}
}
}
}
override fun <T : Extension> extend(extension: T): T {
extensions.add(extension)
@@ -138,6 +157,7 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
program.userDraw()
}
}
ExtensionStage.BEFORE_DRAW ->
object : Extension {
override var enabled: Boolean = true
@@ -145,6 +165,7 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
program.userDraw()
}
}
ExtensionStage.AFTER_DRAW ->
object : Extension {
override var enabled: Boolean = true
@@ -206,8 +227,19 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
}
}
fun Program.viewBox(area: Rectangle, f: ViewBox.() -> Unit): ViewBox {
val viewBox = ViewBox(this, area)
/**
* Create a [ViewBox]
* @param area a [Rectangle] that indicates the position and size of the view box
* @param translateMouse should the view box translate mouse events? default is true
* @param translateKeyboard should the view box translate keyboard events? default is true
* @param f [ViewBox] configuration function
* @return a newly created [ViewBox]
*/
fun Program.viewBox(area: Rectangle,
translateMouse: Boolean = true,
translateKeyboard: Boolean = true,
f: ViewBox.() -> Unit): ViewBox {
val viewBox = ViewBox(this, area, translateMouse, translateKeyboard)
viewBox.f()
return viewBox
}

View File

@@ -37,6 +37,7 @@ fun main() {
extend(Camera2D())
extend {
drawer.rectangle(20.0, 20.0, 100.0, 100.0)
drawer.circle(mouse.position, 10.0)
}
}