Added event consume when using custom context menu
This commit is contained in:
parent
61151e8571
commit
07bb331daf
@ -4,6 +4,7 @@ import androidx.compose.foundation.*
|
|||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.foundation.text.TextContextMenu
|
import androidx.compose.foundation.text.TextContextMenu
|
||||||
|
import androidx.compose.foundation.text.selection.DisableSelection
|
||||||
import androidx.compose.material.Icon
|
import androidx.compose.material.Icon
|
||||||
import androidx.compose.material.MaterialTheme
|
import androidx.compose.material.MaterialTheme
|
||||||
import androidx.compose.material.Text
|
import androidx.compose.material.Text
|
||||||
@ -66,21 +67,26 @@ fun DropdownMenu(items: () -> List<ContextMenuElement>, function: @Composable ()
|
|||||||
@Composable
|
@Composable
|
||||||
private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifier {
|
private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifier {
|
||||||
val (lastMouseEventState, setLastMouseEventState) = remember { mutableStateOf<MouseEvent?>(null) }
|
val (lastMouseEventState, setLastMouseEventState) = remember { mutableStateOf<MouseEvent?>(null) }
|
||||||
val mod = this.pointerInput(Unit) {
|
|
||||||
|
|
||||||
while (true) {
|
val modifier = this.pointerInput(Unit) {
|
||||||
val lastMouseEvent = awaitPointerEventScope { awaitFirstDownEvent() }
|
awaitPointerEventScope {
|
||||||
val mouseEvent = lastMouseEvent.awtEventOrNull
|
while (true) {
|
||||||
|
val lastMouseEvent = awaitFirstDownEvent()
|
||||||
|
val mouseEvent = lastMouseEvent.awtEventOrNull
|
||||||
|
|
||||||
if (mouseEvent != null) {
|
if (mouseEvent != null) {
|
||||||
if (lastMouseEvent.button.isSecondary) {
|
|
||||||
val currentCheck = System.currentTimeMillis()
|
|
||||||
if (lastCheck != 0L && currentCheck - lastCheck < MIN_TIME_BETWEEN_POPUPS_IN_MS) {
|
|
||||||
println("Popup ignored!")
|
|
||||||
} else {
|
|
||||||
lastCheck = currentCheck
|
|
||||||
|
|
||||||
setLastMouseEventState(mouseEvent)
|
if (lastMouseEvent.button.isSecondary) {
|
||||||
|
lastMouseEvent.changes.forEach { it.consume() }
|
||||||
|
|
||||||
|
val currentCheck = System.currentTimeMillis()
|
||||||
|
if (lastCheck != 0L && currentCheck - lastCheck < MIN_TIME_BETWEEN_POPUPS_IN_MS) {
|
||||||
|
println("Popup ignored!")
|
||||||
|
} else {
|
||||||
|
lastCheck = currentCheck
|
||||||
|
|
||||||
|
setLastMouseEventState(mouseEvent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,18 +94,19 @@ private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifie
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lastMouseEventState != null) {
|
if (lastMouseEventState != null) {
|
||||||
showPopup(
|
DisableSelection {
|
||||||
lastMouseEventState.x,
|
showPopup(
|
||||||
lastMouseEventState.y,
|
lastMouseEventState.x,
|
||||||
items(),
|
lastMouseEventState.y,
|
||||||
onDismissRequest = { setLastMouseEventState(null) }
|
items(),
|
||||||
)
|
onDismissRequest = { setLastMouseEventState(null) }
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return mod
|
return modifier
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalComposeUiApi::class)
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun Modifier.dropdownMenu(items: () -> List<ContextMenuElement>): Modifier {
|
private fun Modifier.dropdownMenu(items: () -> List<ContextMenuElement>): Modifier {
|
||||||
val (isClicked, setIsClicked) = remember { mutableStateOf(false) }
|
val (isClicked, setIsClicked) = remember { mutableStateOf(false) }
|
||||||
@ -127,9 +134,6 @@ private fun Modifier.dropdownMenu(items: () -> List<ContextMenuElement>): Modifi
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun showPopup(x: Int, y: Int, contextMenuElements: List<ContextMenuElement>, onDismissRequest: () -> Unit) {
|
fun showPopup(x: Int, y: Int, contextMenuElements: List<ContextMenuElement>, onDismissRequest: () -> Unit) {
|
||||||
LaunchedEffect(contextMenuElements) {
|
|
||||||
println("Items count ${contextMenuElements.count()}")
|
|
||||||
}
|
|
||||||
Popup(
|
Popup(
|
||||||
focusable = true,
|
focusable = true,
|
||||||
popupPositionProvider = object : PopupPositionProvider {
|
popupPositionProvider = object : PopupPositionProvider {
|
||||||
@ -178,7 +182,11 @@ fun showPopup(x: Int, y: Int, contextMenuElements: List<ContextMenuElement>, onD
|
|||||||
.widthIn(min = 180.dp)
|
.widthIn(min = 180.dp)
|
||||||
.run {
|
.run {
|
||||||
if (MaterialTheme.colors.isDark) {
|
if (MaterialTheme.colors.isDark) {
|
||||||
this.border(2.dp, MaterialTheme.colors.onBackground.copy(alpha = 0.2f), shape = RoundedCornerShape(BORDER_RADIUS.dp))
|
this.border(
|
||||||
|
2.dp,
|
||||||
|
MaterialTheme.colors.onBackground.copy(alpha = 0.2f),
|
||||||
|
shape = RoundedCornerShape(BORDER_RADIUS.dp)
|
||||||
|
)
|
||||||
} else
|
} else
|
||||||
this
|
this
|
||||||
}
|
}
|
||||||
@ -216,12 +224,6 @@ fun Separator() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
internal fun focusRequesterAndModifier(): Pair<FocusRequester, Modifier> {
|
|
||||||
val focusRequester = remember { FocusRequester() }
|
|
||||||
return focusRequester to Modifier.focusRequester(focusRequester)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun TextEntry(contextTextEntry: ContextMenuElement.ContextTextEntry, onDismissRequest: () -> Unit) {
|
fun TextEntry(contextTextEntry: ContextMenuElement.ContextTextEntry, onDismissRequest: () -> Unit) {
|
||||||
val icon = contextTextEntry.icon
|
val icon = contextTextEntry.icon
|
||||||
@ -343,14 +345,14 @@ class AppContextMenuRepresentation : ContextMenuRepresentation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
KeyEvent.VK_DOWN -> {
|
KeyEvent.VK_DOWN -> {
|
||||||
inputModeManager!!.requestInputMode(InputMode.Keyboard)
|
inputModeManager?.requestInputMode(InputMode.Keyboard)
|
||||||
focusManager!!.moveFocus(FocusDirection.Next)
|
focusManager?.moveFocus(FocusDirection.Next)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyEvent.VK_UP -> {
|
KeyEvent.VK_UP -> {
|
||||||
inputModeManager!!.requestInputMode(InputMode.Keyboard)
|
inputModeManager?.requestInputMode(InputMode.Keyboard)
|
||||||
focusManager!!.moveFocus(FocusDirection.Previous)
|
focusManager?.moveFocus(FocusDirection.Previous)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user