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

feat(toc): 添加更新目录按钮并修复卷目录层级逻辑

1. 为阅读器目录菜单添加更新目录按钮
2. 修复文本文件卷的目录层级重置逻辑,遇到卷时先重置层级再设置
3. 新增测试用例验证卷目录折叠行为
52fisher 3 месяцев назад
Родитель
Сommit
e781f80dad

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

@@ -108,6 +108,7 @@ class TextFile(private var book: Book) {
         }
         var tocLevel = 0
         toc.forEach { chapter ->
+            if (chapter.isVolume) tocLevel = 0
             chapter.tocLevel = tocLevel
             if (chapter.isVolume) tocLevel = 1
         }

+ 4 - 0
app/src/main/java/io/legado/app/ui/book/read/sheet/ReaderBookSheet.kt

@@ -911,6 +911,10 @@ private fun ReaderBookTocMenu(
             onClick = { dispatch(TocIntent.CollapseAllVolumes) },
         )
     }
+    RoundDropdownMenuItem(
+        text = stringResource(R.string.update_toc),
+        onClick = { dispatch(TocIntent.UpdateToc) },
+    )
     RoundDropdownMenuItem(
         text = stringResource(R.string.replace_rule_title),
         onClick = {

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

@@ -41,6 +41,19 @@ class TocHierarchyTest {
         assertEquals(listOf(0, 3, 4), filterCollapsedToc(items, setOf(0)).map { it.chapter.index })
     }
 
+    @Test
+    fun txtVolumesWithProperLevels_collapseUntilNextVolume() {
+        val items = listOf(
+            chapter(0, "第一卷", level = 0, isVolume = true),
+            chapter(1, "第一章", level = 1),
+            chapter(2, "第二章", level = 1),
+            chapter(3, "第二卷", level = 0, isVolume = true),
+            chapter(4, "第三章", level = 1),
+        ).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()