[New Reader] Hide menu on scroll

This commit is contained in:
FooIbar committed 2024-07-28 14:00:23 +08:00
1 parent 8ce16bc918
commit 7f8e4aa003
2 files changed
+16 -40

No files matched your search

@@ -107,10 +107,10 @@ fun ReaderScreen(info: BaseGalleryInfo, page: Int = -1, navigator: DestinationsN
val lazyListState = rememberLazyListState()
val pagerState = rememberPagerState { pageLoader.size }
val syncState = rememberSliderPagerDoubleSyncState(lazyListState, pagerState, pageLoader)
syncState.Sync(ReadingModeType.isWebtoon(readingMode))
Box {
var appbarVisible by remember { mutableStateOf(false) }
val bgColor by collectBackgroundColorAsState()
syncState.Sync(ReadingModeType.isWebtoon(readingMode)) { appbarVisible = false }
if (fullscreen) {
LaunchedEffect(Unit) {
snapshotFlow { appbarVisible }.collect {
@@ -8,12 +8,11 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.gallery.PageLoader2
import kotlin.math.absoluteValue
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.filterNotNull
@@ -23,8 +22,7 @@ class SliderPagerDoubleSync(
private val pagerState: PagerState,
private val pageLoader: PageLoader2,
) {
private var requestScroll = true
private var sliderFollowPager = true
private var sliderFollowPager by mutableStateOf(false)
var sliderValue by mutableIntStateOf(pageLoader.startPage + 1)
private set
@@ -34,12 +32,12 @@ class SliderPagerDoubleSync(
}
@Composable
fun Sync(webtoon: Boolean) {
fun Sync(webtoon: Boolean, onPageSelected: () -> Unit) {
val fling by lazyListState.interactionSource.collectIsDraggedAsState()
val pagerFling by pagerState.interactionSource.collectIsDraggedAsState()
if (fling || pagerFling) sliderFollowPager = true
val currentIndexFlow = remember(webtoon) {
requestScroll = true
sliderFollowPager = false
if (webtoon) {
snapshotFlow {
with(lazyListState.layoutInfo) {
@@ -52,41 +50,24 @@ class SliderPagerDoubleSync(
snapshotFlow { pagerState.currentPage }
}
}
LaunchedEffect(currentIndexFlow) {
currentIndexFlow.collect { index ->
if (sliderFollowPager && !requestScroll) {
if (sliderFollowPager) {
LaunchedEffect(currentIndexFlow) {
currentIndexFlow.collect { index ->
sliderValue = index + 1
pageLoader.startPage = index
onPageSelected()
}
}
}
LaunchedEffect(webtoon) {
snapshotFlow { sliderValue - 1 }.collectLatest { index ->
if (sliderFollowPager && !requestScroll) return@collectLatest
if (webtoon) {
if (requestScroll) {
lazyListState.requestScrollToItem(index)
requestScroll = false
} else {
LaunchedEffect(webtoon) {
snapshotFlow { sliderValue - 1 }.collectLatest { index ->
if (webtoon) {
lazyListState.scrollToItem(index)
} else {
if (smoothScroll((index - lazyListState.firstVisibleItemIndex))) {
lazyListState.animateScrollToItem(index)
} else {
lazyListState.scrollToItem(index)
}
}
} else {
if (requestScroll) {
pagerState.requestScrollToPage(index)
requestScroll = false
} else {
if (smoothScroll((index - pagerState.currentPage))) {
pagerState.animateScrollToPage(index)
} else {
pagerState.scrollToPage(index)
}
pagerState.animateScrollToPage(index)
}
pageLoader.startPage = index
}
pageLoader.startPage = index
}
}
}
@@ -101,8 +82,3 @@ fun rememberSliderPagerDoubleSyncState(
): SliderPagerDoubleSync = remember {
SliderPagerDoubleSync(lazyListState, pagerState, pageLoader)
}
private fun smoothScroll(distance: Int) =
distance.absoluteValue < SMOOTH_SCROLL_THRESHOLD && Settings.pageTransitions.value
private const val SMOOTH_SCROLL_THRESHOLD = 50