Added event consume when using custom context menu

This commit is contained in:
Abdelilah El Aissaoui 2023-04-25 23:30:24 +02:00
parent 61151e8571
commit 07bb331daf
No known key found for this signature in database
GPG Key ID: 7587FC860F594869

View File

@ -4,6 +4,7 @@ import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.TextContextMenu
import androidx.compose.foundation.text.selection.DisableSelection
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
@ -66,14 +67,18 @@ fun DropdownMenu(items: () -> List<ContextMenuElement>, function: @Composable ()
@Composable
private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifier {
val (lastMouseEventState, setLastMouseEventState) = remember { mutableStateOf<MouseEvent?>(null) }
val mod = this.pointerInput(Unit) {
val modifier = this.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val lastMouseEvent = awaitPointerEventScope { awaitFirstDownEvent() }
val lastMouseEvent = awaitFirstDownEvent()
val mouseEvent = lastMouseEvent.awtEventOrNull
if (mouseEvent != null) {
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!")
@ -86,8 +91,10 @@ private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifie
}
}
}
}
if (lastMouseEventState != null) {
DisableSelection {
showPopup(
lastMouseEventState.x,
lastMouseEventState.y,
@ -95,11 +102,11 @@ private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifie
onDismissRequest = { setLastMouseEventState(null) }
)
}
return mod
}
@OptIn(ExperimentalComposeUiApi::class)
return modifier
}
@Composable
private fun Modifier.dropdownMenu(items: () -> List<ContextMenuElement>): Modifier {
val (isClicked, setIsClicked) = remember { mutableStateOf(false) }
@ -127,9 +134,6 @@ private fun Modifier.dropdownMenu(items: () -> List<ContextMenuElement>): Modifi
@Composable
fun showPopup(x: Int, y: Int, contextMenuElements: List<ContextMenuElement>, onDismissRequest: () -> Unit) {
LaunchedEffect(contextMenuElements) {
println("Items count ${contextMenuElements.count()}")
}
Popup(
focusable = true,
popupPositionProvider = object : PopupPositionProvider {
@ -178,7 +182,11 @@ fun showPopup(x: Int, y: Int, contextMenuElements: List<ContextMenuElement>, onD
.widthIn(min = 180.dp)
.run {
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
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
fun TextEntry(contextTextEntry: ContextMenuElement.ContextTextEntry, onDismissRequest: () -> Unit) {
val icon = contextTextEntry.icon
@ -343,14 +345,14 @@ class AppContextMenuRepresentation : ContextMenuRepresentation {
}
KeyEvent.VK_DOWN -> {
inputModeManager!!.requestInputMode(InputMode.Keyboard)
focusManager!!.moveFocus(FocusDirection.Next)
inputModeManager?.requestInputMode(InputMode.Keyboard)
focusManager?.moveFocus(FocusDirection.Next)
true
}
KeyEvent.VK_UP -> {
inputModeManager!!.requestInputMode(InputMode.Keyboard)
focusManager!!.moveFocus(FocusDirection.Previous)
inputModeManager?.requestInputMode(InputMode.Keyboard)
focusManager?.moveFocus(FocusDirection.Previous)
true
}