From 8c01835458e1e1891ac19bd1831641e8e1bc0c99 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sun, 21 Feb 2016 17:46:19 -0800 Subject: [PATCH] fix: only show reader status at the end of the book --- .ci/after_success.sh | 6 +- frontend/apps/reader/modules/readerpaging.lua | 59 ++++++++++--------- .../apps/reader/modules/readerrolling.lua | 8 +++ frontend/apps/reader/modules/readerstatus.lua | 17 ++---- kodev | 2 +- spec/unit/readerpaging_spec.lua | 50 ++++++++++++++++ spec/unit/readerrolling_spec.lua | 22 +++++++ 7 files changed, 118 insertions(+), 46 deletions(-) create mode 100644 spec/unit/readerpaging_spec.lua diff --git a/.ci/after_success.sh b/.ci/after_success.sh index 58f02660a..9b92f74a2 100755 --- a/.ci/after_success.sh +++ b/.ci/after_success.sh @@ -10,8 +10,7 @@ pushd koreader-*/koreader luajit $(which luacov-coveralls) -v popd -if [ $TRAVIS_BRANCH == 'master' ]; then - +if [ ${TRAVIS_PULL_REQUEST} = false ] && [ ${TRAVIS_BRANCH} = 'master' ]; then travis_retry luarocks --local install ldoc # get deploy key for doc repo openssl aes-256-cbc -k $doc_build_secret -in .ci/koreader_doc.enc -out ~/.ssh/koreader_doc -d @@ -37,5 +36,6 @@ if [ $TRAVIS_BRANCH == 'master' ]; then commit -a --amend -m 'Automated documentation build from travis-ci.' git push -f --quiet origin gh-pages > /dev/null echo -e "\n${ANSI_GREEN}Document update pushed." - +else + echo -e "\n${ANSI_GREEN}Not on official master branch, skip document update." fi diff --git a/frontend/apps/reader/modules/readerpaging.lua b/frontend/apps/reader/modules/readerpaging.lua index 860d26c93..c4d3dfccf 100644 --- a/frontend/apps/reader/modules/readerpaging.lua +++ b/frontend/apps/reader/modules/readerpaging.lua @@ -429,7 +429,6 @@ function ReaderPaging:getTopPage() end function ReaderPaging:onInitScrollPageStates(orig) - --DEBUG.traceback() DEBUG("init scroll page states", orig) if self.view.page_scroll and self.view.state.page then self.orig_page = self.current_page @@ -447,7 +446,6 @@ function ReaderPaging:onInitScrollPageStates(orig) offset.y = page_area.h * self:getPagePosition(self.current_page) end local state = self:getNextPageState(blank_area, offset) - --DEBUG("init new state", state) table.insert(self.view.page_states, state) if blank_area.h > 0 then blank_area.h = blank_area.h - self.view.page_gap.height @@ -559,12 +557,10 @@ function ReaderPaging:genPageStatesFromTop(top_page_state, blank_area, offset) -- page undrawn. This should also be true for generating from bottom. if offset.y < 0 then offset.y = 0 end local state = self:updateTopPageState(top_page_state, blank_area, offset) - --DEBUG("updated state", state) local page_states = {} if state.visible_area.h > 0 then table.insert(page_states, state) end - --DEBUG("blank area", blank_area) local current_page = state.page while blank_area.h > 0 do blank_area.h = blank_area.h - self.view.page_gap.height @@ -573,7 +569,6 @@ function ReaderPaging:genPageStatesFromTop(top_page_state, blank_area, offset) self:gotoPage(current_page + 1, "scrolling") current_page = current_page + 1 local state = self:getNextPageState(blank_area, Geom:new{}) - --DEBUG("new state", state) table.insert(page_states, state) end end @@ -584,12 +579,10 @@ function ReaderPaging:genPageStatesFromBottom(bottom_page_state, blank_area, off -- scroll up offset should always be less than 0 if offset.y > 0 then offset.y = 0 end local state = self:updateBottomPageState(bottom_page_state, blank_area, offset) - --DEBUG("updated state", state) local page_states = {} if state.visible_area.h > 0 then table.insert(page_states, state) end - --DEBUG("blank area", blank_area) local current_page = state.page while blank_area.h > 0 do blank_area.h = blank_area.h - self.view.page_gap.height @@ -598,7 +591,6 @@ function ReaderPaging:genPageStatesFromBottom(bottom_page_state, blank_area, off self:gotoPage(current_page - 1, "scrolling") current_page = current_page - 1 local state = self:getPrevPageState(blank_area, Geom:new{}) - --DEBUG("new state", state) table.insert(page_states, 1, state) end end @@ -637,29 +629,41 @@ function ReaderPaging:calculateOverlap() end function ReaderPaging:onScrollPageRel(diff) - DEBUG("scroll relative page:", diff) - local blank_area = Geom:new{} - blank_area:setSizeTo(self.view.dimen) - local overlap = self:calculateOverlap() if diff > 0 then local last_page_state = table.remove(self.view.page_states) - local offset = Geom:new{ - x = 0, - y = last_page_state.visible_area.h - overlap - } - self.view.page_states = self:genPageStatesFromTop(last_page_state, blank_area, offset) - end - if diff < 0 then + local last_visible_area = last_page_state.visible_area + if last_page_state.page == self.number_of_pages and + last_visible_area.y + last_visible_area.h >= last_page_state.page_area.h then + table.insert(self.view.page_states, last_page_state) + self.ui:handleEvent(Event:new("EndOfBook")) + return true + else + local blank_area = Geom:new{} + blank_area:setSizeTo(self.view.dimen) + local overlap = self:calculateOverlap() + local offset = Geom:new{ + x = 0, + y = last_visible_area.h - overlap + } + self.view.page_states = self:genPageStatesFromTop(last_page_state, blank_area, offset) + end + elseif diff < 0 then + local blank_area = Geom:new{} + blank_area:setSizeTo(self.view.dimen) + local overlap = self:calculateOverlap() local first_page_state = table.remove(self.view.page_states, 1) local offset = Geom:new{ x = 0, y = -first_page_state.visible_area.h + overlap } self.view.page_states = self:genPageStatesFromBottom(first_page_state, blank_area, offset) + else + return true end -- update current pageno to the very last part in current view self:gotoPage(self.view.page_states[#self.view.page_states].page, "scrolling") UIManager:setDirty(self.view.dialog, "partial") + return true end function ReaderPaging:onGotoPageRel(diff) @@ -693,7 +697,12 @@ function ReaderPaging:onGotoPageRel(diff) if new_va:notIntersectWith(self.page_area) then -- view area out of page area, do a page turn - self:gotoPage(self.current_page + diff) + local new_page = self.current_page + diff + if diff > 0 and new_page == self.number_of_pages + 1 then + self.ui:handleEvent(Event:new("EndOfBook")) + else + self:gotoPage(new_page) + end -- if we are going back to previous page, reset -- view area to bottom of previous page if x_pan_off < 0 then @@ -701,10 +710,6 @@ function ReaderPaging:onGotoPageRel(diff) elseif y_pan_off < 0 then self.view:PanningUpdate(0, self.page_area.h) end - -- reset dim_area - --self.view.dim_area.h = 0 - --self.view.dim_area.w = 0 - -- else -- not end of page yet, goto next view -- adjust panning step according to overlap @@ -773,17 +778,13 @@ end -- wrapper for bounds checking function ReaderPaging:gotoPage(number, orig) - --DEBUG.traceback() if number == self.current_page or not number then return true end - if number > self.number_of_pages - or number < 1 then + if number > self.number_of_pages or number < 1 then DEBUG("wrong page number: "..number.."!") return false end - DEBUG("going to page number", number) - -- this is an event to allow other controllers to be aware of this change self.ui:handleEvent(Event:new("PageUpdate", number, orig)) return true diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index 1500038bb..3bb568a90 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -339,6 +339,11 @@ end function ReaderRolling:onGotoViewRel(diff) DEBUG("goto relative screen:", diff, ", in mode: ", self.view.view_mode) + local prev_xp + -- save xpointer to check whether we reach the end of the book + if diff > 0 then + prev_xp = self.xpointer + end if self.view.view_mode == "scroll" then local pan_diff = diff * self.ui.dimen.h if self.show_overlap_enable then @@ -354,6 +359,9 @@ function ReaderRolling:onGotoViewRel(diff) self:gotoPage(self.current_page + diff*page_count) end self.xpointer = self.ui.document:getXPointer() + if self.xpointer == prev_xp then + self.ui:handleEvent(Event:new("EndOfBook")) + end return true end diff --git a/frontend/apps/reader/modules/readerstatus.lua b/frontend/apps/reader/modules/readerstatus.lua index f8baeddb2..3542be215 100644 --- a/frontend/apps/reader/modules/readerstatus.lua +++ b/frontend/apps/reader/modules/readerstatus.lua @@ -21,6 +21,10 @@ function ReaderStatus:init() self.enabled = false return end + -- register event listener if enabled + self.onEndOfBook = function() + self:showStatus() + end self.total_pages = self.document:getPageCount() self.ui:registerPostInitCallback(function() self.ui.menu:registerToMainMenu(self) @@ -48,19 +52,6 @@ function ReaderStatus:showStatus() UIManager:show(status_page) end -function ReaderStatus:onPageUpdate(pageno) - if self.enabled then - --in case when pageUpdate event generated before _document:render() - if pageno > self.total_pages or self.total_pages == 1 then - self.total_pages = self.document:getPageCount() - end - - if pageno == self.total_pages and self.total_pages ~= 1 then - self:showStatus() - end - end -end - function ReaderStatus:onReadSettings(config) self.settings = config end diff --git a/kodev b/kodev index 28fd38f2e..6d65fb239 100755 --- a/kodev +++ b/kodev @@ -12,7 +12,7 @@ function assert_ret_zero { } function setup_env { - files=("./koreader-emulator-*/koreader") + files=`ls -d ./koreader-emulator-*/koreader` export EMU_DIR=${files[0]} } diff --git a/spec/unit/readerpaging_spec.lua b/spec/unit/readerpaging_spec.lua new file mode 100644 index 000000000..e00cc3af8 --- /dev/null +++ b/spec/unit/readerpaging_spec.lua @@ -0,0 +1,50 @@ +describe("Readerpaging module", function() + local sample_pdf = "spec/front/unit/data/sample.pdf" + local readerui + local paging + + setup(function() require("commonrequire") end) + + describe("Page mode", function() + setup(function() + readerui = require("apps/reader/readerui"):new{ + document = require("document/documentregistry"):openDocument(sample_pdf), + } + paging = readerui.paging + end) + + it("should emit EndOfBook event at the end", function() + readerui.zooming:setZoomMode("pageheight") + paging:gotoPage(readerui.document:getPageCount()) + local called = false + readerui.onEndOfBook = function() + called = true + end + paging:onPagingRel(1) + assert.is.truthy(called) + readerui.onEndOfBook = nil + end) + end) + + describe("Scroll mode", function() + setup(function() + readerui = require("apps/reader/readerui"):new{ + document = require("document/documentregistry"):openDocument(sample_pdf), + } + paging = readerui.paging + end) + + it("should emit EndOfBook event at the end", function() + paging:gotoPage(readerui.document:getPageCount()) + readerui.zooming:setZoomMode("pageheight") + readerui.view:onToggleScrollMode(true) + local called = false + readerui.onEndOfBook = function() + called = true + end + paging:onPagingRel(1) + assert.is.truthy(called) + readerui.onEndOfBook = nil + end) + end) +end) diff --git a/spec/unit/readerrolling_spec.lua b/spec/unit/readerrolling_spec.lua index 16efc6e6b..31cd662f7 100644 --- a/spec/unit/readerrolling_spec.lua +++ b/spec/unit/readerrolling_spec.lua @@ -45,6 +45,17 @@ describe("Readerrolling module", function() assert.are.same(toc:getPreviousChapter(i, 0), rolling.current_page) end end) + it("should emit EndOfBook event at the end", function() + rolling:gotoPage(readerui.document:getPageCount()) + local called = false + readerui.onEndOfBook = function() + called = true + end + rolling:onGotoViewRel(1) + rolling:onGotoViewRel(1) + assert.is.truthy(called) + readerui.onEndOfBook = nil + end) end) describe("test in landscape screen mode", function() it("should go to landscape screen mode", function() @@ -81,6 +92,17 @@ describe("Readerrolling module", function() assert.are.same(toc:getPreviousChapter(i, 0), rolling.current_page) end end) + it("should emit EndOfBook event at the end", function() + rolling:gotoPage(readerui.document:getPageCount()) + local called = false + readerui.onEndOfBook = function() + called = true + end + rolling:onGotoViewRel(1) + rolling:onGotoViewRel(1) + assert.is.truthy(called) + readerui.onEndOfBook = nil + end) end) describe("switching screen mode should not change current page number", function() it("for portrait-landscape-portrait switching", function()