mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
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.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user