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:
Abdelilah El Aissaoui 2022-10-09 20:46:30 +02:00
parent 9109f179df
commit 5eada2e2a6
5 changed files with 43 additions and 23 deletions

View File

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

View File

@ -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()
}
}
}
}

View File

@ -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(

View File

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

View File

@ -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)