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.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
} }