Skip to content

Commit bdb4bcb

Browse files
committed
Fixed context menu showing old state when changing the list of items
1 parent 24e35d0 commit bdb4bcb

File tree

1 file changed

+19
-21
lines changed

1 file changed

+19
-21
lines changed

src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/ContextMenu.kt

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private var lastCheck: Long = 0
5252
private const val MIN_TIME_BETWEEN_POPUPS_IN_MS = 20
5353

5454
@Composable
55-
fun ContextMenu(enabled: Boolean = true,items: () -> List<ContextMenuElement>, function: @Composable () -> Unit) {
55+
fun ContextMenu(enabled: Boolean = true, items: () -> List<ContextMenuElement>, function: @Composable () -> Unit) {
5656
Box(modifier = Modifier.contextMenu(enabled, items), propagateMinConstraints = true) {
5757
function()
5858
}
@@ -69,17 +69,17 @@ fun DropdownMenu(items: () -> List<ContextMenuElement>, function: @Composable ()
6969
@OptIn(ExperimentalComposeUiApi::class)
7070
@Composable
7171
private fun Modifier.contextMenu(enabled: Boolean, items: () -> List<ContextMenuElement>): Modifier {
72-
val (contentMenuData, setContentMenuData) = remember { mutableStateOf<ContextMenuData?>(null) }
72+
val (mouseEvent, setMouseEvent) = remember { mutableStateOf<MouseEvent?>(null) }
7373

7474
val modifier = this.pointerInput(enabled) {
7575
awaitPointerEventScope {
7676
while (true) {
77-
val lastMouseEvent = awaitFirstDownEvent()
78-
val mouseEvent = lastMouseEvent.awtEventOrNull
77+
val lastPointerEvent = awaitFirstDownEvent()
78+
val lastMouseEvent = lastPointerEvent.awtEventOrNull
7979

80-
if (mouseEvent != null && enabled) {
81-
if (lastMouseEvent.button.isSecondary) {
82-
lastMouseEvent.changes.forEach {
80+
if (lastMouseEvent != null && enabled) {
81+
if (lastPointerEvent.button.isSecondary) {
82+
lastPointerEvent.changes.forEach {
8383
it.consume()
8484
}
8585

@@ -89,33 +89,31 @@ private fun Modifier.contextMenu(enabled: Boolean, items: () -> List<ContextMenu
8989
} else {
9090
lastCheck = currentCheck
9191

92-
setContentMenuData(ContextMenuData(items(), mouseEvent))
92+
setMouseEvent(lastMouseEvent)
9393
}
9494
}
9595
}
9696
}
9797
}
9898
}
9999

100-
if (contentMenuData != null && contentMenuData.items.isNotEmpty()) {
101-
DisableSelection {
102-
showPopup(
103-
contentMenuData.mouseEvent.x,
104-
contentMenuData.mouseEvent.y,
105-
contentMenuData.items,
106-
onDismissRequest = { setContentMenuData(null) }
107-
)
100+
if (mouseEvent != null) {
101+
val contextMenuElements = items()
102+
if (contextMenuElements.isNotEmpty()) {
103+
DisableSelection {
104+
showPopup(
105+
mouseEvent.x,
106+
mouseEvent.y,
107+
contextMenuElements,
108+
onDismissRequest = { setMouseEvent(null) }
109+
)
110+
}
108111
}
109112
}
110113

111114
return modifier
112115
}
113116

114-
class ContextMenuData(
115-
val items: List<ContextMenuElement>,
116-
val mouseEvent: MouseEvent,
117-
)
118-
119117
@Composable
120118
private fun Modifier.dropdownMenu(items: () -> List<ContextMenuElement>): Modifier {
121119
val (isClicked, setIsClicked) = remember { mutableStateOf(false) }

0 commit comments

Comments
 (0)