mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
add page status to readerrolling for better page view_mode support
* now when rendering in page view mode, we only keep track of page number instead of pos inside document. Because using pos inside document for page view mode is really a bad idea and will lead to many unsovlabe bugs...
This commit is contained in:
@@ -2,7 +2,10 @@ require "ui/reader/readerpanning"
|
||||
|
||||
ReaderRolling = InputContainer:new{
|
||||
old_doc_height = nil,
|
||||
view_mode = "page",
|
||||
current_pos = 0,
|
||||
-- only used for page view mode
|
||||
current_page= nil,
|
||||
doc_height = nil,
|
||||
panning_steps = ReaderPanning.panning_steps,
|
||||
show_overlap_enable = true,
|
||||
@@ -90,11 +93,18 @@ function ReaderRolling:onReadSettings(config)
|
||||
self.show_overlap_enable = soe
|
||||
end
|
||||
self:gotoPercent(config:readSetting("last_percent") or 0)
|
||||
-- we have to do a real pos change in self.ui.document._document to
|
||||
-- update status information in CREngine.
|
||||
self.ui.document:gotoPos(self.current_pos)
|
||||
if self.view_mode == "page" then
|
||||
self.ui:handleEvent(Event:new("PageUpdate", self.ui.document:getCurrentPage()))
|
||||
end
|
||||
end
|
||||
|
||||
function ReaderRolling:onCloseDocument()
|
||||
local cur_xp = self.ui.document:getXPointer()
|
||||
self.ui.doc_settings:saveSetting("last_percent",
|
||||
10000 * self.current_pos / self.doc_height)
|
||||
10000 * self.ui.document:getPosFromXPointer(cur_xp) / self.doc_height)
|
||||
end
|
||||
|
||||
function ReaderRolling:onTapForward()
|
||||
@@ -111,6 +121,10 @@ function ReaderRolling:onPosUpdate(new_pos)
|
||||
self.current_pos = new_pos
|
||||
end
|
||||
|
||||
function ReaderRolling:onPageUpdate(new_page)
|
||||
self.current_page = new_page
|
||||
end
|
||||
|
||||
function ReaderRolling:onGotoPercent(percent)
|
||||
DEBUG("goto document offset in percent:", percent)
|
||||
self:gotoPercent(percent)
|
||||
@@ -119,19 +133,24 @@ end
|
||||
|
||||
function ReaderRolling:onGotoViewRel(diff)
|
||||
DEBUG("goto relative screen:", diff)
|
||||
local pan_diff = diff * self.ui.dimen.h
|
||||
if self.ui.document.view_mode ~= "page" and self.show_overlap_enable then
|
||||
if pan_diff > self.overlap then
|
||||
pan_diff = pan_diff - self.overlap
|
||||
elseif pan_diff < -self.overlap then
|
||||
pan_diff = pan_diff + self.overlap
|
||||
if self.ui.document.view_mode ~= "page" then
|
||||
local pan_diff = diff * self.ui.dimen.h
|
||||
if self.show_overlap_enable then
|
||||
if pan_diff > self.overlap then
|
||||
pan_diff = pan_diff - self.overlap
|
||||
elseif pan_diff < -self.overlap then
|
||||
pan_diff = pan_diff + self.overlap
|
||||
end
|
||||
end
|
||||
self:gotoPos(self.current_pos + pan_diff)
|
||||
else
|
||||
self:gotoPage(self.current_page + diff)
|
||||
end
|
||||
self:gotoPos(self.current_pos + pan_diff)
|
||||
return true
|
||||
end
|
||||
|
||||
function ReaderRolling:onPanning(args, key)
|
||||
--@TODO disable panning in page view_mode? 22.12 2012 (houqp)
|
||||
local _, dy = unpack(args)
|
||||
DEBUG("key =", key)
|
||||
self:gotoPos(self.current_pos + dy * self.panning_steps.normal)
|
||||
@@ -143,21 +162,25 @@ function ReaderRolling:onZoom()
|
||||
self:onUpdatePos()
|
||||
end
|
||||
|
||||
-- remember to signal this event the document has been zoomed,
|
||||
-- font has been changed, or line height has been changed.
|
||||
--[[
|
||||
remember to signal this event the document has been zoomed,
|
||||
font has been changed, or line height has been changed.
|
||||
--]]
|
||||
function ReaderRolling:onUpdatePos()
|
||||
-- reread document height
|
||||
self.ui.document:_readMetadata()
|
||||
-- update self.current_pos if the height of document has been changed.
|
||||
if self.old_doc_height ~= self.ui.document.info.doc_height then
|
||||
self:gotoPos(self.current_pos *
|
||||
(self.ui.document.info.doc_height - self.dialog.dimen.h) /
|
||||
(self.old_doc_height - self.dialog.dimen.h))
|
||||
self.old_doc_height = self.ui.document.info.doc_height
|
||||
local new_height = self.ui.document.info.doc_height
|
||||
if self.old_doc_height ~= new_height then
|
||||
self:gotoXPointer(self.ui.document:getXPointer())
|
||||
self.old_doc_height = new_height
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
--[[
|
||||
PosUpdate event is used to signal other widgets that pos has been changed.
|
||||
--]]
|
||||
function ReaderRolling:gotoPos(new_pos)
|
||||
if new_pos == self.current_pos then return end
|
||||
if new_pos < 0 then new_pos = 0 end
|
||||
@@ -177,6 +200,19 @@ function ReaderRolling:gotoPos(new_pos)
|
||||
self.ui:handleEvent(Event:new("PosUpdate", new_pos))
|
||||
end
|
||||
|
||||
function ReaderRolling:gotoPage(new_page)
|
||||
self.ui.document:gotoPage(new_page)
|
||||
self.ui:handleEvent(Event:new("PageUpdate", new_page))
|
||||
end
|
||||
|
||||
function ReaderRolling:gotoXPointer(xpointer)
|
||||
if self.view_mode == "page" then
|
||||
self:gotoPage(self.ui.document:getPageFromXPointer(xpointer))
|
||||
else
|
||||
self:gotoPos(self.ui.document:getPosFromXPointer(xpointer))
|
||||
end
|
||||
end
|
||||
|
||||
function ReaderRolling:gotoPercent(new_percent)
|
||||
self:gotoPos(new_percent * self.doc_height / 10000)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user