[orx-view-box] Add options to disable input translation, add mouse.position
This commit is contained in:
@@ -9,7 +9,12 @@ import org.openrndr.math.Vector2
|
|||||||
import org.openrndr.shape.Rectangle
|
import org.openrndr.shape.Rectangle
|
||||||
import kotlin.math.ceil
|
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
|
override var width: Int
|
||||||
get() {
|
get() {
|
||||||
@@ -26,92 +31,106 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
|
|||||||
|
|
||||||
override val extensions: MutableList<Extension> = mutableListOf<Extension>()
|
override val extensions: MutableList<Extension> = mutableListOf<Extension>()
|
||||||
|
|
||||||
override val mouse: MouseEvents = object :MouseEvents{
|
inner class TranslatedMouseEvents: MouseEvents {
|
||||||
override val buttonDown = Event<MouseEvent>()
|
override val buttonDown = Event<MouseEvent>()
|
||||||
override val buttonUp = Event<MouseEvent>()
|
override val buttonUp = Event<MouseEvent>()
|
||||||
override val dragged = Event<MouseEvent>()
|
override val dragged = Event<MouseEvent>()
|
||||||
override val entered = Event<MouseEvent>()
|
override val entered = Event<MouseEvent>()
|
||||||
override val exited = Event<MouseEvent>()
|
override val exited = Event<MouseEvent>()
|
||||||
override val moved = Event<MouseEvent>()
|
override val moved = Event<MouseEvent>()
|
||||||
override val position: Vector2
|
override var position: Vector2 = -clientArea.corner
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
override val pressedButtons: MutableSet<MouseButton>
|
override val pressedButtons: MutableSet<MouseButton>
|
||||||
get() = TODO("Not yet implemented")
|
get() = TODO("Not yet implemented")
|
||||||
override val scrolled = Event<MouseEvent>()
|
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 character: Event<CharacterEvent> = Event<CharacterEvent>()
|
||||||
override val keyDown: Event<KeyEvent> = Event<KeyEvent>()
|
override val keyDown: Event<KeyEvent> = Event<KeyEvent>()
|
||||||
override val keyRepeat: Event<KeyEvent> = Event<KeyEvent>()
|
override val keyRepeat: Event<KeyEvent> = Event<KeyEvent>()
|
||||||
override val keyUp: Event<KeyEvent> = Event<KeyEvent>()
|
override val keyUp: Event<KeyEvent> = Event<KeyEvent>()
|
||||||
|
} else {
|
||||||
|
program.keyboard
|
||||||
}
|
}
|
||||||
|
|
||||||
override val pointers: Pointers by lazy { program.pointers }
|
override val pointers: Pointers by lazy { program.pointers }
|
||||||
|
|
||||||
var hasInputFocus = false
|
var hasInputFocus = false
|
||||||
|
|
||||||
init {
|
init {
|
||||||
program.mouse.moved.listen {
|
if (translateMouse) {
|
||||||
if (it.position in clientArea && !it.propagationCancelled) {
|
program.mouse.moved.listen {
|
||||||
hasInputFocus = true
|
mouse as TranslatedMouseEvents
|
||||||
mouse.moved.trigger(it.copy(position = it.position - clientArea.corner))
|
mouse.position = it.position - clientArea.corner
|
||||||
it.cancelPropagation()
|
if (it.position in clientArea && !it.propagationCancelled) {
|
||||||
} else if (it.position !in clientArea) {
|
hasInputFocus = true
|
||||||
hasInputFocus = false
|
mouse.moved.trigger(it.copy(position = it.position - clientArea.corner))
|
||||||
|
it.cancelPropagation()
|
||||||
|
} else if (it.position !in clientArea) {
|
||||||
|
hasInputFocus = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
program.mouse.buttonUp.listen {
|
program.mouse.buttonUp.listen {
|
||||||
if (it.position in clientArea && !it.propagationCancelled) {
|
if (it.position in clientArea && !it.propagationCancelled) {
|
||||||
mouse.buttonUp.trigger(it.copy(position = it.position - clientArea.corner))
|
mouse.buttonUp.trigger(it.copy(position = it.position - clientArea.corner))
|
||||||
it.cancelPropagation()
|
it.cancelPropagation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
program.mouse.dragged.listen {
|
||||||
program.mouse.dragged.listen {
|
if (it.position in clientArea && !it.propagationCancelled) {
|
||||||
if (it.position in clientArea && !it.propagationCancelled) {
|
mouse.dragged.trigger(it.copy(position = it.position - clientArea.corner))
|
||||||
mouse.dragged.trigger(it.copy(position = it.position - clientArea.corner))
|
it.cancelPropagation()
|
||||||
it.cancelPropagation()
|
}
|
||||||
}
|
}
|
||||||
}
|
program.mouse.buttonDown.listen {
|
||||||
program.mouse.buttonDown.listen {
|
if (it.position in clientArea && !it.propagationCancelled) {
|
||||||
if (it.position in clientArea && !it.propagationCancelled) {
|
mouse.buttonDown.trigger(it.copy(position = it.position - clientArea.corner))
|
||||||
mouse.buttonDown.trigger(it.copy(position = it.position - clientArea.corner))
|
it.cancelPropagation()
|
||||||
it.cancelPropagation()
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
program.mouse.scrolled.listen {
|
program.mouse.scrolled.listen {
|
||||||
if (it.position in clientArea && !it.propagationCancelled) {
|
if (it.position in clientArea && !it.propagationCancelled) {
|
||||||
mouse.scrolled.trigger(it.copy(position = it.position - clientArea.corner))
|
mouse.scrolled.trigger(it.copy(position = it.position - clientArea.corner))
|
||||||
it.cancelPropagation()
|
it.cancelPropagation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (translateKeyboard) {
|
||||||
program.keyboard.keyDown.listen {
|
program.keyboard.keyDown.listen {
|
||||||
if (hasInputFocus && !it.propagationCancelled) {
|
if (hasInputFocus && !it.propagationCancelled) {
|
||||||
keyboard.keyDown.trigger(it)
|
keyboard.keyDown.trigger(it)
|
||||||
it.cancelPropagation()
|
it.cancelPropagation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
program.keyboard.keyUp.listen {
|
program.keyboard.keyUp.listen {
|
||||||
if (hasInputFocus && !it.propagationCancelled) {
|
if (hasInputFocus && !it.propagationCancelled) {
|
||||||
keyboard.keyUp.trigger(it)
|
keyboard.keyUp.trigger(it)
|
||||||
it.cancelPropagation()
|
it.cancelPropagation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
program.keyboard.keyRepeat.listen {
|
program.keyboard.keyRepeat.listen {
|
||||||
if (hasInputFocus && !it.propagationCancelled) {
|
if (hasInputFocus && !it.propagationCancelled) {
|
||||||
keyboard.keyRepeat.trigger(it)
|
keyboard.keyRepeat.trigger(it)
|
||||||
it.cancelPropagation()
|
it.cancelPropagation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
program.keyboard.character.listen {
|
program.keyboard.character.listen {
|
||||||
if (hasInputFocus && !it.propagationCancelled) {
|
if (hasInputFocus && !it.propagationCancelled) {
|
||||||
keyboard.character.trigger(it)
|
keyboard.character.trigger(it)
|
||||||
it.cancelPropagation()
|
it.cancelPropagation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,6 +157,7 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
|
|||||||
program.userDraw()
|
program.userDraw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtensionStage.BEFORE_DRAW ->
|
ExtensionStage.BEFORE_DRAW ->
|
||||||
object : Extension {
|
object : Extension {
|
||||||
override var enabled: Boolean = true
|
override var enabled: Boolean = true
|
||||||
@@ -145,6 +165,7 @@ class ViewBox(override val program: Program, var clientArea: Rectangle) : Progra
|
|||||||
program.userDraw()
|
program.userDraw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtensionStage.AFTER_DRAW ->
|
ExtensionStage.AFTER_DRAW ->
|
||||||
object : Extension {
|
object : Extension {
|
||||||
override var enabled: Boolean = true
|
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()
|
viewBox.f()
|
||||||
return viewBox
|
return viewBox
|
||||||
}
|
}
|
||||||
@@ -37,6 +37,7 @@ fun main() {
|
|||||||
extend(Camera2D())
|
extend(Camera2D())
|
||||||
extend {
|
extend {
|
||||||
drawer.rectangle(20.0, 20.0, 100.0, 100.0)
|
drawer.rectangle(20.0, 20.0, 100.0, 100.0)
|
||||||
|
drawer.circle(mouse.position, 10.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user