Replaced compose clickable modifier with custom pointerInput implementation
Should improve scrolling performance greatly while this issue still persists https://issuetracker.google.com/issues/228995735
This commit is contained in:
parent
9109f179df
commit
5eada2e2a6
@ -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
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
// 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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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(
|
||||
|
@ -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<ContextMenuElement>): 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
|
||||
}
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user