mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Merge pull request #88 from chrox/reading_pos
save/restore reading position on each page
This commit is contained in:
@@ -117,6 +117,7 @@ function KoptInterface:getOCRWord(doc, pageno, rect)
|
||||
if cached then
|
||||
local kc = self:waitForContext(cached.kctx)
|
||||
local fullwidth, fullheight = kc:getPageDim()
|
||||
--os.execute("echo 3 > /proc/sys/vm/drop_caches")
|
||||
local ok, word = pcall(
|
||||
kc.getOCRWord, kc,
|
||||
self.tessocr_data,
|
||||
|
||||
@@ -77,11 +77,11 @@ function ReaderHighlight:onHold(arg, ges)
|
||||
else
|
||||
UIManager:scheduleIn(0.1, function()
|
||||
local word_box = self.word_info.box
|
||||
word_box.x = word_box.x - math.floor(word_box.h * 0.02)
|
||||
word_box.y = word_box.y - math.floor(word_box.h * 0.02)
|
||||
word_box.w = word_box.w + math.floor(word_box.h * 0.04)
|
||||
word_box.h = word_box.h + math.floor(word_box.h * 0.04)
|
||||
-- local word = self.ui.document:getOCRWord(self.pos.page, word_box)
|
||||
word_box.x = word_box.x - math.floor(word_box.h * 0.1)
|
||||
word_box.y = word_box.y - math.floor(word_box.h * 0.1)
|
||||
word_box.w = word_box.w + math.floor(word_box.h * 0.2)
|
||||
word_box.h = word_box.h + math.floor(word_box.h * 0.2)
|
||||
--local word = self.ui.document:getOCRWord(self.pos.page, word_box)
|
||||
DEBUG("OCRed word:", word)
|
||||
self.ui:handleEvent(Event:new("LookupWord", word))
|
||||
end)
|
||||
|
||||
@@ -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,34 @@ 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 page view 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 +282,7 @@ function ReaderPaging:onPagingRel(diff)
|
||||
else
|
||||
self:onGotoPageRel(diff)
|
||||
end
|
||||
self:setPagePosition(self:getTopPage(), self:getTopPosition())
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -264,18 +290,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