Răsfoiți Sursa

fix: 单章换源问题

HapeLee 4 luni în urmă
părinte
comite
7e66f7589d

+ 12 - 2
app/src/main/java/io/legado/app/domain/usecase/GetChapterContentUseCase.kt

@@ -42,7 +42,17 @@ class GetChapterContentUseCase(
     /**
      * Find the chapter index in a new TOC matching the current chapter.
      */
-    fun getDurChapterIndex(chapterIndex: Int, chapterTitle: String, toc: List<BookChapter>): Int {
-        return io.legado.app.help.book.BookHelp.getDurChapter(chapterIndex, chapterTitle, toc)
+    fun getDurChapterIndex(
+        chapterIndex: Int,
+        chapterTitle: String,
+        toc: List<BookChapter>,
+        totalChapterNum: Int = 0,
+    ): Int {
+        return io.legado.app.help.book.BookHelp.getDurChapter(
+            chapterIndex,
+            chapterTitle,
+            toc,
+            totalChapterNum,
+        )
     }
 }

+ 1 - 0
app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceContract.kt

@@ -24,6 +24,7 @@ data class ChangeChapterSourceUiState(
     val selectedSourceName: String = "",
     val tocItems: ImmutableList<BookChapter> = persistentListOf(),
     val isLoadingToc: Boolean = false,
+    val currentTocIndex: Int = -1,
     // Scope filter
     val scopeState: ScopeUiState = ScopeUiState(
         isAll = true,

+ 15 - 4
app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt

@@ -78,6 +78,7 @@ class ChangeChapterSourceViewModel(
                 showToc = false,
                 tocItems = persistentListOf(),
                 isLoadingToc = false,
+                currentTocIndex = -1,
                 selectedSourceName = "",
             )
         }
@@ -113,7 +114,8 @@ class ChangeChapterSourceViewModel(
                     it.copy(
                         showToc = false,
                         tocItems = persistentListOf(),
-                        isLoadingToc = false
+                        isLoadingToc = false,
+                        currentTocIndex = -1,
                     )
                 }
             }
@@ -313,23 +315,32 @@ class ChangeChapterSourceViewModel(
             it.copy(
                 showToc = true,
                 selectedSourceName = searchBook.originName,
-                isLoadingToc = true
+                isLoadingToc = true,
+                currentTocIndex = -1,
             )
         }
         viewModelScope.launch {
             try {
                 val (toc, _) = getChapterContentUseCase.getToc(book)
+                val currentTocIndex = getChapterContentUseCase.getDurChapterIndex(
+                    chapterIndex = chapterIndex,
+                    chapterTitle = chapterTitle,
+                    toc = toc,
+                    totalChapterNum = oldBook?.totalChapterNum ?: 0,
+                ).takeIf { it in toc.indices } ?: -1
                 _uiState.update {
                     it.copy(
                         tocItems = toc.toImmutableList(),
-                        isLoadingToc = false
+                        isLoadingToc = false,
+                        currentTocIndex = currentTocIndex,
                     )
                 }
             } catch (e: Exception) {
                 _uiState.update {
                     it.copy(
                         showToc = false,
-                        isLoadingToc = false
+                        isLoadingToc = false,
+                        currentTocIndex = -1,
                     )
                 }
                 _effects.tryEmit(ChangeChapterSourceEffect.ShowToast("获取目录失败"))

+ 12 - 2
app/src/main/java/io/legado/app/ui/book/read/sheet/ChangeChapterSourceSheet.kt

@@ -10,6 +10,8 @@ import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.foundation.lazy.rememberLazyListState
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.FilterList
 import androidx.compose.material.icons.filled.MoreVert
@@ -17,6 +19,7 @@ import androidx.compose.material.icons.filled.PauseCircleOutline
 import androidx.compose.material.icons.filled.PushPin
 import androidx.compose.material.icons.filled.Refresh
 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
@@ -175,16 +178,23 @@ private fun TocContent(
             AppCircularProgressIndicator()
         }
     } else {
+        val listState = rememberLazyListState()
+        LaunchedEffect(state.currentTocIndex, state.tocItems) {
+            if (state.currentTocIndex >= 0) {
+                listState.scrollToItem(state.currentTocIndex)
+            }
+        }
         LazyColumn(
             modifier = Modifier.fillMaxWidth(),
+            state = listState,
             verticalArrangement = Arrangement.spacedBy(4.dp)
         ) {
-            items(state.tocItems) { chapter ->
+            itemsIndexed(state.tocItems) { index, chapter ->
                 SelectionItemCard(
                     title = chapter.title,
                     containerColor = LegadoTheme.colorScheme.surfaceContainerLow,
                     selectedContainerColor = LegadoTheme.colorScheme.primaryContainer.copy(alpha = 0.32f),
-                    isSelected = false,
+                    isSelected = index == state.currentTocIndex,
                     onToggleSelection = {
                         onIntent(ChangeChapterSourceIntent.SelectChapter(chapter))
                     },