diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 3100424fb..5d55c1308 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -125,6 +125,7 @@ function ReaderPaging:initGesListener() end function ReaderPaging:onReadSettings(config) + self.page_positions = config:readSetting("page_positions") or {} self:gotoPage(config:readSetting("last_page") or 1) local soe = config:readSetting("show_overlap_enable") if not soe then @@ -133,10 +134,35 @@ function ReaderPaging:onReadSettings(config) end function ReaderPaging:onCloseDocument() - self.ui.doc_settings:saveSetting("last_page", self.current_page) + self.ui.doc_settings:saveSetting("page_positions", self.page_positions) + self.ui.doc_settings:saveSetting("last_page", self:getTopPage()) self.ui.doc_settings:saveSetting("percent_finished", self.current_page/self.number_of_pages) end +--[[ +Set reading position on certain page +Page position is a fractional number ranging from 0 to 1, indicating the read percentage on +certain page. With the position information on each page whenever users change font size, +page margin or line spacing or close and reopen the book, the reading position will be +roughly the same. +--]] +function ReaderPaging:setPagePosition(page, pos) + DEBUG("set page position", pos) + self.page_positions[page] = pos +end + +--[[ +Get reading position on certain page +--]] +function ReaderPaging:getPagePosition(page) + -- Page number ought to be integer, somehow I notice that with + -- fractional page number the reader runs silently well, but the + -- number won't fit to retrieve page position. + page = math.floor(page) + DEBUG("get page position", self.page_positions[page]) + return self.page_positions[page] or 0 +end + function ReaderPaging:onTapForward() self:onPagingRel(1) return true @@ -257,6 +283,7 @@ function ReaderPaging:onPagingRel(diff) else self:onGotoPageRel(diff) end + self:setPagePosition(self:getTopPage(), self:getTopPosition()) return true end @@ -264,18 +291,52 @@ function ReaderPaging:onPanningRel(diff) if self.view.page_scroll then self:onScrollPanRel(diff) end + self:setPagePosition(self:getTopPage(), self:getTopPosition()) return true end +--[[ +Get read percentage on current page. +--]] +function ReaderPaging:getTopPosition() + if self.view.page_scroll then + local state = self.view.page_states[1] + return (state.visible_area.y - state.page_area.y)/state.page_area.h + else + return 0 + end +end + +--[[ +Get page number of the page drawn at the very top part of the screen. +--]] +function ReaderPaging:getTopPage() + if self.view.page_scroll then + local state = self.view.page_states[1] + return state.page + else + return self.current_page + end +end + function ReaderPaging:onInitScrollPageStates(orig) - DEBUG("init scroll page states") + DEBUG("init scroll page states", orig) if self.view.page_scroll then self.orig_page = self.current_page self.view.page_states = {} local blank_area = Geom:new{} blank_area:setSizeTo(self.view.dimen) while blank_area.h > 0 do - local state = self:getNextPageState(blank_area, Geom:new{}) + local offset = Geom:new{} + -- caculate position in current page + if self.current_page == self.orig_page then + local page_area = self.view:getPageArea( + self.view.state.page, + self.view.state.zoom, + self.view.state.rotation) + 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