mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Adds CreDocument:getScreenPositionFromXPointer()
Factorize same code used by ReaderLink and ReaderRolling into CreDocument:getScreenPositionFromXPointer().
This commit is contained in:
@@ -289,16 +289,7 @@ end
|
||||
--- Check if a xpointer to <a> node really points to itself
|
||||
function ReaderLink:isXpointerCoherent(a_xpointer)
|
||||
-- Get screen coordinates of xpointer
|
||||
local doc_margins = self.ui.document:getPageMargins()
|
||||
local header_height = self.ui.document:getHeaderHeight() -- top full status bar (0 when bottom mini bar used)
|
||||
local doc_y, doc_x = self.ui.document:getPosFromXPointer(a_xpointer)
|
||||
local top_y = self.ui.document:getCurrentPos()
|
||||
-- (strange, but using doc_margins.top is accurate even in scroll mode)
|
||||
local screen_y = doc_y - top_y
|
||||
if self.view.view_mode == "page" then
|
||||
screen_y = screen_y + doc_margins["top"] + header_height
|
||||
end
|
||||
local screen_x = doc_x + doc_margins["left"]
|
||||
local screen_y, screen_x = self.ui.document:getScreenPositionFromXPointer(a_xpointer)
|
||||
-- Get again link and a_xpointer from this position
|
||||
local re_link_xpointer, re_a_xpointer = self.ui.document:getLinkFromPosition({x = screen_x, y = screen_y}) -- luacheck: no unused
|
||||
-- We should get the same a_xpointer. If not, crengine has messed up
|
||||
|
||||
@@ -508,14 +508,8 @@ function ReaderRolling:onGotoXPointer(xp, marker_xp)
|
||||
if marker_xp and marker_setting then
|
||||
-- Show a mark on left side of screen to give a visual feedback of
|
||||
-- where xpointer target is (and remove if after 1s)
|
||||
local doc_y = self.ui.document:getPosFromXPointer(marker_xp)
|
||||
local top_y = self.ui.document:getCurrentPos()
|
||||
local screen_y = doc_y - top_y
|
||||
local screen_y = self.ui.document:getScreenPositionFromXPointer(marker_xp)
|
||||
local doc_margins = self.ui.document:getPageMargins()
|
||||
local header_height = self.ui.document:getHeaderHeight() -- top full status bar (0 when bottom mini bar used)
|
||||
if self.view.view_mode == "page" then
|
||||
screen_y = screen_y + doc_margins["top"] + header_height
|
||||
end
|
||||
local marker_h = Screen:scaleBySize(self.ui.font.font_size * 1.1 * self.ui.font.line_space_percent/100.0)
|
||||
-- Make it 4/5 of left margin wide (and bigger when huge margin)
|
||||
local marker_w = math.floor(math.max(doc_margins["left"] - Screen:scaleBySize(5), doc_margins["left"] * 4/5))
|
||||
|
||||
@@ -21,6 +21,7 @@ local CreDocument = Document:new{
|
||||
|
||||
_document = false,
|
||||
_loaded = false,
|
||||
_view_mode = nil,
|
||||
|
||||
line_space_percent = 100,
|
||||
default_font = "Noto Serif",
|
||||
@@ -114,12 +115,11 @@ function CreDocument:init()
|
||||
self.default_css = "./data/fb2.css"
|
||||
end
|
||||
|
||||
-- @TODO check the default view_mode to a global user configurable
|
||||
-- variable 22.12 2012 (houqp)
|
||||
-- This mode must be the same as the default one set as ReaderView.view_mode
|
||||
self._view_mode = DCREREADER_VIEW_MODE == "scroll" and self.SCROLL_VIEW_MODE or self.PAGE_VIEW_MODE
|
||||
|
||||
local ok
|
||||
ok, self._document = pcall(cre.newDocView, Screen:getWidth(), Screen:getHeight(),
|
||||
DCREREADER_VIEW_MODE == "scroll" and self.SCROLL_VIEW_MODE or self.PAGE_VIEW_MODE
|
||||
) -- this mode must be the same as the default one set as ReaderView.view_mode
|
||||
ok, self._document = pcall(cre.newDocView, Screen:getWidth(), Screen:getHeight(), self._view_mode)
|
||||
if not ok then
|
||||
error(self._document) -- will contain error message
|
||||
end
|
||||
@@ -375,6 +375,22 @@ function CreDocument:getPageFromXPointer(xp)
|
||||
return self._document:getPageFromXPointer(xp)
|
||||
end
|
||||
|
||||
function CreDocument:getScreenPositionFromXPointer(xp)
|
||||
-- We do not ensure xp is in the current page: we may return
|
||||
-- a negative screen_y, which could be useful in some contexts
|
||||
local doc_margins = self:getPageMargins()
|
||||
local doc_y, doc_x = self:getPosFromXPointer(xp)
|
||||
local top_y = self:getCurrentPos()
|
||||
local screen_y = doc_y - top_y
|
||||
if self._view_mode == self.PAGE_VIEW_MODE then
|
||||
screen_y = screen_y + doc_margins["top"] + self:getHeaderHeight()
|
||||
end
|
||||
local screen_x = doc_x + doc_margins["left"]
|
||||
-- Just as getPosFromXPointer() does, we return y first and x second,
|
||||
-- as callers most often just need the y
|
||||
return screen_y, screen_x
|
||||
end
|
||||
|
||||
function CreDocument:getFontFace()
|
||||
return self._document:getFontFace()
|
||||
end
|
||||
@@ -554,10 +570,11 @@ function CreDocument:setViewMode(new_mode)
|
||||
if new_mode then
|
||||
logger.dbg("CreDocument: set view mode", new_mode)
|
||||
if new_mode == "scroll" then
|
||||
self._document:setViewMode(self.SCROLL_VIEW_MODE)
|
||||
self._view_mode = self.SCROLL_VIEW_MODE
|
||||
else
|
||||
self._document:setViewMode(self.PAGE_VIEW_MODE)
|
||||
self._view_mode = self.PAGE_VIEW_MODE
|
||||
end
|
||||
self._document:setViewMode(self._view_mode)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user