[orx-panel] Add isHidden method to skip hidden elements during event handling
This commit is contained in:
@@ -18,4 +18,5 @@ dependencies {
|
|||||||
testRuntimeOnly(libs.kotlin.reflect)
|
testRuntimeOnly(libs.kotlin.reflect)
|
||||||
demoImplementation(libs.openrndr.dialogs)
|
demoImplementation(libs.openrndr.dialogs)
|
||||||
demoImplementation(libs.gson)
|
demoImplementation(libs.gson)
|
||||||
|
demoImplementation(project(":orx-jvm:orx-panel"))
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ import org.openrndr.panel.layout.Layouter
|
|||||||
import org.openrndr.panel.style.*
|
import org.openrndr.panel.style.*
|
||||||
import org.openrndr.panel.style.Display
|
import org.openrndr.panel.style.Display
|
||||||
import org.openrndr.shape.Rectangle
|
import org.openrndr.shape.Rectangle
|
||||||
|
import org.w3c.dom.Node
|
||||||
import kotlin.contracts.ExperimentalContracts
|
import kotlin.contracts.ExperimentalContracts
|
||||||
import kotlin.contracts.InvocationKind
|
import kotlin.contracts.InvocationKind
|
||||||
import kotlin.contracts.contract
|
import kotlin.contracts.contract
|
||||||
@@ -63,6 +64,9 @@ class ControlManager : Extension {
|
|||||||
|
|
||||||
fun press(event: KeyEvent) {
|
fun press(event: KeyEvent) {
|
||||||
target?.let {
|
target?.let {
|
||||||
|
if (it.isHidden()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
var current: Element? = it
|
var current: Element? = it
|
||||||
while (current != null) {
|
while (current != null) {
|
||||||
if (!event.propagationCancelled) {
|
if (!event.propagationCancelled) {
|
||||||
@@ -96,6 +100,10 @@ class ControlManager : Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun release(event: KeyEvent) {
|
fun release(event: KeyEvent) {
|
||||||
|
if (target?.isHidden() == true) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
target?.keyboard?.released?.trigger(event)
|
target?.keyboard?.released?.trigger(event)
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
checkForManualRedraw()
|
checkForManualRedraw()
|
||||||
@@ -103,6 +111,10 @@ class ControlManager : Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun repeat(event: KeyEvent) {
|
fun repeat(event: KeyEvent) {
|
||||||
|
if (target?.isHidden() == true) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
target?.keyboard?.repeated?.trigger(event)
|
target?.keyboard?.repeated?.trigger(event)
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
checkForManualRedraw()
|
checkForManualRedraw()
|
||||||
@@ -110,6 +122,10 @@ class ControlManager : Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun character(event: CharacterEvent) {
|
fun character(event: CharacterEvent) {
|
||||||
|
if (target?.isHidden() == true) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
target?.keyboard?.character?.trigger(event)
|
target?.keyboard?.character?.trigger(event)
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
checkForManualRedraw()
|
checkForManualRedraw()
|
||||||
@@ -156,6 +172,9 @@ class ControlManager : Extension {
|
|||||||
logger.debug { "click target: $clickTarget" }
|
logger.debug { "click target: $clickTarget" }
|
||||||
|
|
||||||
clickTarget?.let {
|
clickTarget?.let {
|
||||||
|
if (it.isHidden()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
if (it.handlesDoubleClick) {
|
if (it.handlesDoubleClick) {
|
||||||
if (ct - lastClick > 500) {
|
if (ct - lastClick > 500) {
|
||||||
logger.debug { "normal click on $clickTarget" }
|
logger.debug { "normal click on $clickTarget" }
|
||||||
@@ -223,7 +242,14 @@ class ControlManager : Extension {
|
|||||||
|
|
||||||
fun drag(event: MouseEvent) {
|
fun drag(event: MouseEvent) {
|
||||||
logger.debug { "drag event $event" }
|
logger.debug { "drag event $event" }
|
||||||
dragTarget?.mouse?.dragged?.trigger(event)
|
dragTarget?.let {
|
||||||
|
if (it.isHidden()) {
|
||||||
|
dragTarget = null
|
||||||
|
return
|
||||||
|
}
|
||||||
|
it.mouse.dragged.trigger(event)
|
||||||
|
}
|
||||||
|
|
||||||
if (event.propagationCancelled) {
|
if (event.propagationCancelled) {
|
||||||
logger.debug { "propagation cancelled by $dragTarget setting clickTarget to null" }
|
logger.debug { "propagation cancelled by $dragTarget setting clickTarget to null" }
|
||||||
clickTarget = null
|
clickTarget = null
|
||||||
|
|||||||
@@ -140,6 +140,24 @@ open class Element(val type: ElementType) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether the current element, or any of its ancestors, has a display style of `Display.NONE`.
|
||||||
|
*
|
||||||
|
* @return `true` if the element or any of its ancestors is hidden (has `Display.NONE` style), `false` otherwise.
|
||||||
|
*/
|
||||||
|
fun isHidden() : Boolean {
|
||||||
|
var current: Element? = this
|
||||||
|
|
||||||
|
while (current != null) {
|
||||||
|
if (current.computedStyle.display == Display.NONE) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
current = current.parent
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fun root(): Element {
|
fun root(): Element {
|
||||||
return parent?.root() ?: this
|
return parent?.root() ?: this
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user