Просмотр исходного кода

fix: 修复阅读菜单滑块同步问题

HapeLee 4 месяцев назад
Родитель
Сommit
242fba70e8
1 измененных файлов с 37 добавлено и 14 удалено
  1. 37 14
      app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt

+ 37 - 14
app/src/main/java/io/legado/app/ui/book/read/ReadBookMenuBar.kt

@@ -1729,28 +1729,45 @@ private fun MenuBottomBar(
     val sliderMax = seekMax.toFloat().coerceAtLeast(1f)
     var sliderValue by remember { mutableFloatStateOf(state.seekProgress.coerceIn(0, seekMax).toFloat()) }
     var sliderDragging by remember { mutableStateOf(false) }
+    var previewPageIndex by remember { mutableIntStateOf(state.seekProgress.coerceIn(0, seekMax)) }
     val toolButtonsBottomPadding = if (buttonGlassEnabled) 6.dp else 0.dp
     val contentBottomPadding = if (bottomPadding > toolButtonsBottomPadding) {
         bottomPadding - toolButtonsBottomPadding
     } else {
         0.dp
     }
+    val progressBarBehavior = ReadConfig.progressBarBehavior
 
     fun commitSliderValue(value: Float) {
         val target = value.roundToInt().coerceIn(0, seekMax)
         sliderDragging = false
         sliderValue = target.toFloat()
-        val behavior = ReadConfig.progressBarBehavior
-        if (behavior == "page") {
+        previewPageIndex = target
+        if (progressBarBehavior == "page") {
             onIntent(ReadBookIntent.SkipToPage(target))
         } else {
             onIntent(ReadBookIntent.SeekToChapter(target))
         }
     }
 
-    LaunchedEffect(state.seekProgress, seekMax) {
-        if (!sliderDragging) {
-            sliderValue = state.seekProgress.coerceIn(0, seekMax).toFloat()
+    fun updateSliderValue(value: Float) {
+        val coercedValue = value.coerceIn(0f, sliderMax)
+        sliderDragging = true
+        sliderValue = coercedValue
+        if (progressBarBehavior == "page") {
+            val target = coercedValue.roundToInt().coerceIn(0, seekMax)
+            if (target != previewPageIndex) {
+                previewPageIndex = target
+                onIntent(ReadBookIntent.SkipToPage(target))
+            }
+        }
+    }
+
+    LaunchedEffect(state.seekProgress, seekMax, progressBarBehavior) {
+        val progress = state.seekProgress.coerceIn(0, seekMax)
+        previewPageIndex = progress
+        if (progressBarBehavior == "page" || !sliderDragging) {
+            sliderValue = progress.toFloat()
         }
     }
 
@@ -1810,10 +1827,7 @@ private fun MenuBottomBar(
 
                 ReadMenuSlider(
                     value = sliderValue.coerceIn(0f, sliderMax),
-                    onValueChange = { value ->
-                        sliderDragging = true
-                        sliderValue = value.coerceIn(0f, sliderMax)
-                    },
+                    onValueChange = ::updateSliderValue,
                     onValueChangeFinished = {
                         commitSliderValue(sliderValue)
                     },
@@ -2721,20 +2735,29 @@ private fun BrightnessBar(
     var sliderValue by remember { mutableFloatStateOf(brightness.toFloat()) }
     var sliderDragging by remember { mutableStateOf(false) }
 
-    LaunchedEffect(brightness) {
-        if (!sliderDragging) {
+    LaunchedEffect(brightness, brightnessAuto) {
+        if (brightnessAuto) {
+            sliderDragging = false
+            sliderValue = brightness.toFloat()
+        } else if (!sliderDragging) {
             sliderValue = brightness.toFloat()
         }
     }
 
     fun commitSliderValue(value: Float) {
-        if (brightnessAuto) return
         val target = value.roundToInt().coerceIn(0, 100)
         sliderDragging = false
         sliderValue = target.toFloat()
+        if (brightnessAuto) return
         onBrightnessChange(target)
     }
 
+    fun toggleAuto() {
+        sliderDragging = false
+        sliderValue = brightness.toFloat()
+        onToggleAuto()
+    }
+
     if (vertical) {
         Column(
             modifier = modifier
@@ -2744,7 +2767,7 @@ private fun BrightnessBar(
             verticalArrangement = Arrangement.spacedBy(10.dp),
         ) {
             ReadMenuGlassIconButton(
-                onClick = onToggleAuto,
+                onClick = ::toggleAuto,
                 icon = Icons.Filled.BrightnessAuto,
                 colors = colors,
                 backdrop = backdrop,
@@ -2787,7 +2810,7 @@ private fun BrightnessBar(
             horizontalArrangement = Arrangement.spacedBy(8.dp),
         ) {
             ReadMenuGlassIconButton(
-                onClick = onToggleAuto,
+                onClick = ::toggleAuto,
                 icon = Icons.Filled.BrightnessAuto,
                 colors = colors,
                 backdrop = backdrop,