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.foundation.clickable
|
||||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.awt.awtEventOrNull
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
||||||
import androidx.compose.ui.input.pointer.PointerIconDefaults
|
import androidx.compose.ui.input.pointer.*
|
||||||
import androidx.compose.ui.input.pointer.pointerHoverIcon
|
|
||||||
|
|
||||||
fun Modifier.backgroundIf(condition: Boolean, color: Color): Modifier {
|
fun Modifier.backgroundIf(condition: Boolean, color: Color): Modifier {
|
||||||
return if (condition) {
|
return if (condition) {
|
||||||
@ -35,3 +35,20 @@ fun Modifier.ignoreKeyEvents(): Modifier {
|
|||||||
fun Modifier.handOnHover(): Modifier {
|
fun Modifier.handOnHover(): Modifier {
|
||||||
return this.pointerHoverIcon(PointerIconDefaults.Hand)
|
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.focus.focusRequester
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
||||||
import androidx.compose.ui.input.pointer.PointerIconDefaults
|
import androidx.compose.ui.input.pointer.pointerInput
|
||||||
import androidx.compose.ui.input.pointer.pointerHoverIcon
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.font.FontFamily
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.jetpackduba.gitnuro.extensions.handMouseClickable
|
import com.jetpackduba.gitnuro.extensions.*
|
||||||
import com.jetpackduba.gitnuro.extensions.handOnHover
|
|
||||||
import com.jetpackduba.gitnuro.extensions.lineAt
|
|
||||||
import com.jetpackduba.gitnuro.extensions.toStringWithSpaces
|
|
||||||
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
||||||
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
||||||
import com.jetpackduba.gitnuro.theme.headerBackground
|
import com.jetpackduba.gitnuro.theme.headerBackground
|
||||||
@ -98,7 +94,7 @@ fun Blame(
|
|||||||
.width(200.dp)
|
.width(200.dp)
|
||||||
.fillMaxHeight()
|
.fillMaxHeight()
|
||||||
.background(MaterialTheme.colors.secondarySurface)
|
.background(MaterialTheme.colors.secondarySurface)
|
||||||
.handMouseClickable { if (commit != null) onSelectCommit(commit) },
|
.fastClickable { if (commit != null) onSelectCommit(commit) },
|
||||||
verticalArrangement = Arrangement.Center,
|
verticalArrangement = Arrangement.Center,
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
|
@ -20,6 +20,7 @@ import androidx.compose.ui.unit.*
|
|||||||
import androidx.compose.ui.util.fastAll
|
import androidx.compose.ui.util.fastAll
|
||||||
import androidx.compose.ui.window.Popup
|
import androidx.compose.ui.window.Popup
|
||||||
import androidx.compose.ui.window.PopupPositionProvider
|
import androidx.compose.ui.window.PopupPositionProvider
|
||||||
|
import com.jetpackduba.gitnuro.extensions.awaitFirstDownEvent
|
||||||
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
||||||
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
||||||
|
|
||||||
@ -44,7 +45,7 @@ private fun Modifier.contextMenu(items: () -> List<ContextMenuElement>): Modifie
|
|||||||
val mod = this.pointerInput(Unit) {
|
val mod = this.pointerInput(Unit) {
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
val lastMouseEvent = awaitPointerEventScope { awaitEventFirstDown() }
|
val lastMouseEvent = awaitPointerEventScope { awaitFirstDownEvent() }
|
||||||
val mouseEvent = lastMouseEvent.awtEventOrNull
|
val mouseEvent = lastMouseEvent.awtEventOrNull
|
||||||
|
|
||||||
if (mouseEvent != null) {
|
if (mouseEvent != null) {
|
||||||
@ -209,13 +210,3 @@ sealed interface ContextMenuElement {
|
|||||||
|
|
||||||
object ContextSeparator : 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
|
modifier = Modifier
|
||||||
.height(40.dp)
|
.height(40.dp)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.clickable { onUncommitedChangesSelected() }
|
.fastClickable { onUncommitedChangesSelected() }
|
||||||
.padding(start = graphWidth)
|
.padding(start = graphWidth)
|
||||||
.backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected)
|
.backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected)
|
||||||
.padding(DIVIDER_WIDTH.dp),
|
.padding(DIVIDER_WIDTH.dp),
|
||||||
@ -742,7 +742,7 @@ fun CommitLine(
|
|||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.clickable { onRevCommitSelected() }
|
.fastClickable { onRevCommitSelected() }
|
||||||
.padding(start = graphWidth)
|
.padding(start = graphWidth)
|
||||||
.height(LINE_HEIGHT.dp)
|
.height(LINE_HEIGHT.dp)
|
||||||
.backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected)
|
.backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected)
|
||||||
|
Loading…
Reference in New Issue
Block a user