Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ScrollConfig in web target (#569) #628

Merged
merged 1 commit into from
Jul 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,35 @@

package androidx.compose.foundation.gestures

import androidx.compose.foundation.fastFold
import androidx.compose.runtime.Composable
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import org.jetbrains.skiko.SkikoPointerEvent
import org.jetbrains.skiko.SkikoPointerEventKind

@Composable
internal actual fun platformScrollConfig(): ScrollConfig = JsConfig

private object JsConfig : ScrollConfig {
override fun Density.calculateMouseWheelScroll(event: PointerEvent, bounds: IntSize): Offset =
(event.nativeEvent as SkikoPointerEvent).takeIf { it.kind == SkikoPointerEventKind.SCROLL }?.let {
Offset(-it.deltaX.toFloat(), -it.deltaY.toFloat()) / 2f
} ?: Offset.Zero

override val isSmoothScrollingEnabled: Boolean
get() = true

override fun Density.calculateMouseWheelScroll(event: PointerEvent, bounds: IntSize): Offset {
// Note: The returned offset value here is not strictly accurate.
// However, it serves two primary purposes:
// 1. Ensures all related tests pass successfully.
// 2. Provides satisfactory UI behavior
// In future iterations, this value could be refined to enhance UI behavior.
// However, keep in mind that any modifications would also necessitate adjustments to the corresponding tests.
return event.totalScrollDelta * -1f
}
}

private val PointerEvent.totalScrollDelta
get() = this.changes.fastFold(Offset.Zero) { acc, c -> acc + c.scrollDelta }


/*
import androidx.compose.ui.input.mouse.MouseScrollOrientation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
Expand Down Expand Up @@ -53,7 +54,9 @@ private fun ExampleLazyColumn() {
}
LazyColumn(Modifier.fillMaxSize(), state = state) {
items(100) {
Box(Modifier.size(100.dp).background(remember { Color(Random.nextInt()) }))
Box(Modifier.size(100.dp).background(remember { Color(Random.nextInt()) })) {
Text("I = $it")
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import androidx.compose.ui.ComposeScene
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.focus.focusRect
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.input.pointer.PointerId
import androidx.compose.ui.input.pointer.PointerType
Expand All @@ -30,16 +29,11 @@ import androidx.compose.ui.platform.Platform
import androidx.compose.ui.unit.Density
import kotlinx.coroutines.CoroutineDispatcher
import org.jetbrains.skia.Canvas
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkikoView
import org.jetbrains.skiko.SkikoKeyboardEvent
import org.jetbrains.skiko.SkikoPointerEvent
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.DpRect
import androidx.compose.ui.unit.toDpRect
import org.jetbrains.skia.Point
import org.jetbrains.skiko.SkikoInput
import org.jetbrains.skiko.currentNanoTime
import org.jetbrains.skiko.*

internal class ComposeLayer(
internal val layer: SkiaLayer,
Expand Down Expand Up @@ -101,6 +95,7 @@ internal class ComposeLayer(
val scale = density.density
scene.sendPointerEvent(
eventType = event.kind.toCompose(),
scrollDelta = event.getScrollDelta(),
position = Offset(
x = event.x.toFloat() * scale,
y = event.y.toFloat() * scale
Expand Down Expand Up @@ -191,3 +186,11 @@ private fun currentMillis() = (currentNanoTime() / 1E6).toLong()


internal expect val supportsMultitouch: Boolean

internal fun SkikoPointerEvent.getScrollDelta(): Offset {
return this.takeIf {
it.kind == SkikoPointerEventKind.SCROLL
}?.let {
Offset(it.deltaX.toFloat(), it.deltaY.toFloat())
} ?: Offset.Zero
}