Support scrolling with mouse wheel in reader

This commit is contained in:
FooIbar committed 2024-08-21 15:20:16 +08:00
1 parent 876bb68873
commit 834cfc5e8c
1 file changed
+40 -1
@@ -5,13 +5,20 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.pager.PagerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.AwaitPointerEventScope
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastFold
import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.collectAsState
import com.hippo.ehviewer.gallery.PageLoader2
@@ -22,6 +29,9 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType.RIGHT_TO_LEFT
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType.VERTICAL
import eu.kanade.tachiyomi.ui.reader.setting.TappingInvertMode
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.receiveAsFlow
@Composable
fun GalleryPager(
@@ -58,6 +68,14 @@ fun GalleryPager(
}
val navigator by rememberUpdatedState(regions)
if (isPagerType) {
val channel = remember { Channel<Float>(Channel.CONFLATED) }
LaunchedEffect(channel) {
channel.receiveAsFlow().collectLatest { delta ->
if (delta != 0f) {
if (delta < 0) pagerState.moveToNext() else pagerState.moveToPrevious()
}
}
}
PagerViewer(
pagerState = pagerState,
isRtl = type == RIGHT_TO_LEFT,
@@ -67,7 +85,15 @@ fun GalleryPager(
onSelectPage = onSelectPage,
onMenuRegionClick = onMenuRegionClick,
contentPadding = contentPadding,
modifier = modifier,
modifier = modifier.pointerInput(channel) {
awaitPointerEventScope {
while (true) {
val event = awaitScrollEvent()
val delta = calculateMouseWheelScroll(event)
channel.trySend(delta)
}
}
},
)
} else {
WebtoonViewer(
@@ -83,3 +109,16 @@ fun GalleryPager(
}
NavigationOverlay(showNavigationOverlay, regions, modifier = Modifier.fillMaxSize())
}
private suspend fun AwaitPointerEventScope.awaitScrollEvent(): PointerEvent {
var event: PointerEvent
do {
event = awaitPointerEvent()
} while (event.type != PointerEventType.Scroll)
return event
}
private fun Density.calculateMouseWheelScroll(event: PointerEvent): Float {
// 64 dp value is taken from ViewConfiguration.java, replace with better solution
return event.changes.fastFold(0f) { acc, c -> acc + c.scrollDelta.y } * -64.dp.toPx()
}