From 5ec736ae963639deac00c1273d4ec2349f1868d7 Mon Sep 17 00:00:00 2001 From: poire-z Date: Sun, 8 Oct 2023 17:51:39 +0200 Subject: [PATCH] ReaderToc: rework getChapterPageCount/Left/Done() Rework the way they are computed, fixing issues with hidden flows when they don't coincide with chapter starts. --- frontend/apps/reader/modules/readertoc.lua | 88 ++++++++-------------- spec/unit/readertoc_spec.lua | 5 +- 2 files changed, 36 insertions(+), 57 deletions(-) diff --git a/frontend/apps/reader/modules/readertoc.lua b/frontend/apps/reader/modules/readertoc.lua index a3046851b..80a363293 100644 --- a/frontend/apps/reader/modules/readertoc.lua +++ b/frontend/apps/reader/modules/readertoc.lua @@ -543,78 +543,54 @@ function ReaderToc:isChapterEnd(cur_pageno) end function ReaderToc:getChapterPageCount(pageno) - if self.ui.document:hasHiddenFlows() then - -- Count pages until new chapter, starting by going backwards to the beginning of the current chapter if necessary - local page_count = 1 - if not self:isChapterStart(pageno) then - local test_page = self.ui.document:getPrevPage(pageno) - while test_page > 0 do - page_count = page_count + 1 - if self:isChapterStart(test_page) then - break - end - test_page = self.ui.document:getPrevPage(test_page) + local next_chapter = self:getNextChapter(pageno) or self.ui.document:getPageCount() + 1 + local previous_chapter = self:isChapterStart(pageno) and pageno or self:getPreviousChapter(pageno) or 1 + local page_count = next_chapter - previous_chapter + if self.ui.document:hasHiddenFlows() and self.ui.document:getPageFlow(pageno) == 0 then + -- If current page in a hidden flow, return the full amount of pages in this chapter. + -- Otherwise, count only pages in the main flow + for page = previous_chapter, next_chapter - 1 do + if self.ui.document:getPageFlow(page) ~= 0 then + page_count = page_count - 1 end end - - -- Then forward - local test_page = self.ui.document:getNextPage(pageno) - while test_page > 0 do - page_count = page_count + 1 - if self:isChapterStart(test_page) then - return page_count - 1 - end - test_page = self.ui.document:getNextPage(test_page) - end - else - local next_chapter = self:getNextChapter(pageno) or self.ui.document:getPageCount() + 1 - local previous_chapter = self:isChapterStart(pageno) and pageno or self:getPreviousChapter(pageno) or 1 - local page_count = next_chapter - previous_chapter - return page_count end + return page_count end function ReaderToc:getChapterPagesLeft(pageno) - if self.ui.document:hasHiddenFlows() then - -- Count pages until new chapter - local pages_left = 0 - local test_page = self.ui.document:getNextPage(pageno) - while test_page > 0 do - pages_left = pages_left + 1 - if self:isChapterStart(test_page) then - return pages_left - 1 + local next_chapter = self:getNextChapter(pageno) + if not next_chapter then + -- (ReaderFooter deals itself with nil and pageno in last chapter) + return + end + local pages_left = next_chapter - pageno - 1 + if self.ui.document:hasHiddenFlows() and self.ui.document:getPageFlow(pageno) == 0 then + for page = pageno, next_chapter - 1 do + if self.ui.document:getPageFlow(page) ~= 0 then + pages_left = pages_left - 1 end - test_page = self.ui.document:getNextPage(test_page) - end - else - local next_chapter = self:getNextChapter(pageno) - if next_chapter then - next_chapter = next_chapter - pageno - 1 end - return next_chapter end + return pages_left end function ReaderToc:getChapterPagesDone(pageno) if self:isChapterStart(pageno) then return 0 end - if self.ui.document:hasHiddenFlows() then - -- Count pages until chapter start - local pages_done = 0 - local test_page = self.ui.document:getPrevPage(pageno) - while test_page > 0 do - pages_done = pages_done + 1 - if self:isChapterStart(test_page) then - return pages_done + local previous_chapter = self:getPreviousChapter(pageno) + if not previous_chapter then + -- (ReaderFooter deals itself with nil and pageno not yet in first chapter) + return + end + local pages_done = pageno - previous_chapter + if self.ui.document:hasHiddenFlows() and self.ui.document:getPageFlow(pageno) == 0 then + for page = previous_chapter, pageno - 1 do + if self.ui.document:getPageFlow(page) ~= 0 then + pages_done = pages_done - 1 end - test_page = self.ui.document:getPrevPage(test_page) - end - else - local previous_chapter = self:getPreviousChapter(pageno) - if previous_chapter then - previous_chapter = pageno - previous_chapter end - return previous_chapter end + return pages_done end function ReaderToc:updateCurrentNode() diff --git a/spec/unit/readertoc_spec.lua b/spec/unit/readertoc_spec.lua index 58f348852..6cb51c2c9 100644 --- a/spec/unit/readertoc_spec.lua +++ b/spec/unit/readertoc_spec.lua @@ -76,7 +76,10 @@ describe("Readertoc module", function() it("should get page left of chapter", function() assert.truthy(toc:getChapterPagesLeft(10) > 10) assert.truthy(toc:getChapterPagesLeft(95) > 10) - assert.are.same(nil, toc:getChapterPagesLeft(290)) + -- assert.are.same(nil, toc:getChapterPagesLeft(290)) + -- Previous line somehow fails, but not if written this way: + local pagesleft = toc:getChapterPagesLeft(290) + assert.are.same(nil, pagesleft) end) it("should get page done of chapter", function() assert.truthy(toc:getChapterPagesDone(11) < 5)