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

fix: restore TXT TOC volume collapse

HapeLee 3 месяцев назад
Родитель
Сommit
59fe67ada5

+ 5 - 0
app/src/main/java/io/legado/app/model/localBook/TextFile.kt

@@ -106,6 +106,11 @@ class TextFile(private var book: Book) {
             bookChapter.bookUrl = book.bookUrl
             bookChapter.url = MD5Utils.md5Encode16(book.originName + index + bookChapter.title)
         }
+        var tocLevel = 0
+        toc.forEach { chapter ->
+            chapter.tocLevel = tocLevel
+            if (chapter.isVolume) tocLevel = 1
+        }
         return toc
     }
 

+ 12 - 0
app/src/main/java/io/legado/app/ui/book/toc/TocHierarchy.kt

@@ -7,6 +7,18 @@ internal fun filterCollapsedToc(
     items: List<TocDomainItem>,
     collapsedIds: Set<Int>,
 ): List<TocDomainItem> = buildList {
+    if (items.none { it.chapter.tocLevel > 0 }) {
+        var collapsed = false
+        for (item in items) {
+            if (item.chapter.isVolume) {
+                add(item)
+                collapsed = item.chapter.index in collapsedIds
+            } else if (!collapsed) {
+                add(item)
+            }
+        }
+        return@buildList
+    }
     val collapsedAncestorLevels = ArrayDeque<Int>()
     for (item in items) {
         val level = item.chapter.tocLevel

+ 13 - 0
app/src/test/java/io/legado/app/ui/book/toc/TocHierarchyTest.kt

@@ -28,6 +28,19 @@ class TocHierarchyTest {
         assertEquals(listOf(0, 1, 2, 4, 5, 6), visible.map { it.chapter.index })
     }
 
+    @Test
+    fun flatTxtVolumes_collapseUntilNextVolume() {
+        val items = listOf(
+            chapter(0, "第一卷", level = 0, isVolume = true),
+            chapter(1, "第一章", level = 0),
+            chapter(2, "第二章", level = 0),
+            chapter(3, "第二卷", level = 0, isVolume = true),
+            chapter(4, "第三章", level = 0),
+        ).map { TocDomainItem(it, it.title, DownloadState.LOCAL) }
+
+        assertEquals(listOf(0, 3, 4), filterCollapsedToc(items, setOf(0)).map { it.chapter.index })
+    }
+
     @Test
     fun reverse_reversesSiblingsAtEveryLevelAndPreservesPreorder() {
         val reversed = chapters().reverseTocHierarchy()