From b85a39d3f6412f07ad6d12d0ba551b9c8fa209ad Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 27 Apr 2013 16:37:18 +0800 Subject: [PATCH] add reading position on each 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 page view will be roughly the same. --- frontend/ui/reader/readerpaging.lua | 67 +++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) 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