Fixed context menu showing old state when changing the list of items
This commit is contained in:
parent
24e35d01dd
commit
bdb4bcb702
@ -52,7 +52,7 @@ private var lastCheck: Long = 0
|
|||||||
private const val MIN_TIME_BETWEEN_POPUPS_IN_MS = 20
|
private const val MIN_TIME_BETWEEN_POPUPS_IN_MS = 20
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ContextMenu(enabled: Boolean = true,items: () -> List<ContextMenuElement>, function: @Composable () -> Unit) {
|
fun ContextMenu(enabled: Boolean = true, items: () -> List<ContextMenuElement>, function: @Composable () -> Unit) {
|
||||||
Box(modifier = Modifier.contextMenu(enabled, items), propagateMinConstraints = true) {
|
Box(modifier = Modifier.contextMenu(enabled, items), propagateMinConstraints = true) {
|
||||||
function()
|
function()
|
||||||
}
|
}
|
||||||
@ -69,17 +69,17 @@ fun DropdownMenu(items: () -> List<ContextMenuElement>, function: @Composable ()
|
|||||||
@OptIn(ExperimentalComposeUiApi::class)
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun Modifier.contextMenu(enabled: Boolean, items: () -> List<ContextMenuElement>): Modifier {
|
private fun Modifier.contextMenu(enabled: Boolean, items: () -> List<ContextMenuElement>): Modifier {
|
||||||
val (contentMenuData, setContentMenuData) = remember { mutableStateOf<ContextMenuData?>(null) }
|
val (mouseEvent, setMouseEvent) = remember { mutableStateOf<MouseEvent?>(null) }
|
||||||
|
|
||||||
val modifier = this.pointerInput(enabled) {
|
val modifier = this.pointerInput(enabled) {
|
||||||
awaitPointerEventScope {
|
awaitPointerEventScope {
|
||||||
while (true) {
|
while (true) {
|
||||||
val lastMouseEvent = awaitFirstDownEvent()
|
val lastPointerEvent = awaitFirstDownEvent()
|
||||||
val mouseEvent = lastMouseEvent.awtEventOrNull
|
val lastMouseEvent = lastPointerEvent.awtEventOrNull
|
||||||
|
|
||||||
if (mouseEvent != null && enabled) {
|
if (lastMouseEvent != null && enabled) {
|
||||||
if (lastMouseEvent.button.isSecondary) {
|
if (lastPointerEvent.button.isSecondary) {
|
||||||
lastMouseEvent.changes.forEach {
|
lastPointerEvent.changes.forEach {
|
||||||
it.consume()
|
it.consume()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ private fun Modifier.contextMenu(enabled: Boolean, items: () -> List<ContextMenu
|
|||||||
} else {
|
} else {
|
||||||
lastCheck = currentCheck
|
lastCheck = currentCheck
|
||||||
|
|
||||||
setContentMenuData(ContextMenuData(items(), mouseEvent))
|
setMouseEvent(lastMouseEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -97,25 +97,23 @@ private fun Modifier.contextMenu(enabled: Boolean, items: () -> List<ContextMenu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contentMenuData != null && contentMenuData.items.isNotEmpty()) {
|
if (mouseEvent != null) {
|
||||||
DisableSelection {
|
val contextMenuElements = items()
|
||||||
showPopup(
|
if (contextMenuElements.isNotEmpty()) {
|
||||||
contentMenuData.mouseEvent.x,
|
DisableSelection {
|
||||||
contentMenuData.mouseEvent.y,
|
showPopup(
|
||||||
contentMenuData.items,
|
mouseEvent.x,
|
||||||
onDismissRequest = { setContentMenuData(null) }
|
mouseEvent.y,
|
||||||
)
|
contextMenuElements,
|
||||||
|
onDismissRequest = { setMouseEvent(null) }
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return modifier
|
return modifier
|
||||||
}
|
}
|
||||||
|
|
||||||
class ContextMenuData(
|
|
||||||
val items: List<ContextMenuElement>,
|
|
||||||
val mouseEvent: MouseEvent,
|
|
||||||
)
|
|
||||||
|
|
||||||
@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) }
|
||||||
|
Loading…
Reference in New Issue
Block a user