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.
pull/88/head
chrox 11 years ago
parent 41329658a8
commit b85a39d3f6

@ -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

Loading…
Cancel
Save