diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/extensions/AwaitPointerEventScopeExtensions.kt b/src/main/kotlin/com/jetpackduba/gitnuro/extensions/AwaitPointerEventScopeExtensions.kt new file mode 100644 index 0000000..280a3e4 --- /dev/null +++ b/src/main/kotlin/com/jetpackduba/gitnuro/extensions/AwaitPointerEventScopeExtensions.kt @@ -0,0 +1,16 @@ +package com.jetpackduba.gitnuro.extensions + +import androidx.compose.ui.input.pointer.AwaitPointerEventScope +import androidx.compose.ui.input.pointer.PointerEvent +import androidx.compose.ui.input.pointer.changedToDown +import androidx.compose.ui.util.fastAll + +suspend fun AwaitPointerEventScope.awaitFirstDownEvent(): PointerEvent { + var event: PointerEvent + do { + event = awaitPointerEvent() + } while ( + !event.changes.fastAll { it.changedToDown() } + ) + return event +} \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/extensions/ModifierExtensions.kt b/src/main/kotlin/com/jetpackduba/gitnuro/extensions/ModifierExtensions.kt index 8bb732d..c106383 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/extensions/ModifierExtensions.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/extensions/ModifierExtensions.kt @@ -4,10 +4,10 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.awt.awtEventOrNull import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.key.onPreviewKeyEvent -import androidx.compose.ui.input.pointer.PointerIconDefaults -import androidx.compose.ui.input.pointer.pointerHoverIcon +import androidx.compose.ui.input.pointer.* fun Modifier.backgroundIf(condition: Boolean, color: Color): Modifier { return if (condition) { @@ -34,4 +34,21 @@ fun Modifier.ignoreKeyEvents(): Modifier { @OptIn(ExperimentalComposeUiApi::class) fun Modifier.handOnHover(): Modifier { return this.pointerHoverIcon(PointerIconDefaults.Hand) -} \ No newline at end of file +} + +// TODO Try to restore hover that was shown with clickable modifier +@OptIn(ExperimentalComposeUiApi::class) +fun Modifier.fastClickable(onClick: () -> Unit) = + this.handOnHover() + .pointerInput(Unit) { + while (true) { + val lastMouseEvent = awaitPointerEventScope { awaitFirstDownEvent() } + val mouseEvent = lastMouseEvent.awtEventOrNull + + if (mouseEvent != null) { + if (lastMouseEvent.button.isPrimary) { + onClick() + } + } + } + } \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt index b5de8fc..c9be71d 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/Blame.kt @@ -21,15 +21,11 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.input.key.onPreviewKeyEvent -import androidx.compose.ui.input.pointer.PointerIconDefaults -import androidx.compose.ui.input.pointer.pointerHoverIcon +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp -import com.jetpackduba.gitnuro.extensions.handMouseClickable -import com.jetpackduba.gitnuro.extensions.handOnHover -import com.jetpackduba.gitnuro.extensions.lineAt -import com.jetpackduba.gitnuro.extensions.toStringWithSpaces +import com.jetpackduba.gitnuro.extensions.* import com.jetpackduba.gitnuro.keybindings.KeybindingOption import com.jetpackduba.gitnuro.keybindings.matchesBinding import com.jetpackduba.gitnuro.theme.headerBackground @@ -98,7 +94,7 @@ fun Blame( .width(200.dp) .fillMaxHeight() .background(MaterialTheme.colors.secondarySurface) - .handMouseClickable { if (commit != null) onSelectCommit(commit) }, + .fastClickable { if (commit != null) onSelectCommit(commit) }, verticalArrangement = Arrangement.Center, ) { Text( diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/ContextMenu.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/ContextMenu.kt index 7ca6a4f..05bac7e 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/ContextMenu.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/context_menu/ContextMenu.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.unit.* import androidx.compose.ui.util.fastAll import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupPositionProvider +import com.jetpackduba.gitnuro.extensions.awaitFirstDownEvent import com.jetpackduba.gitnuro.keybindings.KeybindingOption import com.jetpackduba.gitnuro.keybindings.matchesBinding @@ -44,7 +45,7 @@ private fun Modifier.contextMenu(items: () -> List): Modifie val mod = this.pointerInput(Unit) { while (true) { - val lastMouseEvent = awaitPointerEventScope { awaitEventFirstDown() } + val lastMouseEvent = awaitPointerEventScope { awaitFirstDownEvent() } val mouseEvent = lastMouseEvent.awtEventOrNull if (mouseEvent != null) { @@ -208,14 +209,4 @@ sealed interface ContextMenuElement { ) : ContextMenuElement object ContextSeparator : ContextMenuElement -} - -private suspend fun AwaitPointerEventScope.awaitEventFirstDown(): PointerEvent { - var event: PointerEvent - do { - event = awaitPointerEvent() - } while ( - !event.changes.fastAll { it.changedToDown() } - ) - return event } \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt index 458db78..157f794 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt @@ -619,7 +619,7 @@ fun UncommitedChangesLine( modifier = Modifier .height(40.dp) .fillMaxWidth() - .clickable { onUncommitedChangesSelected() } + .fastClickable { onUncommitedChangesSelected() } .padding(start = graphWidth) .backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected) .padding(DIVIDER_WIDTH.dp), @@ -742,7 +742,7 @@ fun CommitLine( ) { Box( modifier = Modifier - .clickable { onRevCommitSelected() } + .fastClickable { onRevCommitSelected() } .padding(start = graphWidth) .height(LINE_HEIGHT.dp) .backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected)