From 6e3b40e2bf6d6bc8aa2a15024ed05a6732a2c351 Mon Sep 17 00:00:00 2001 From: poire-z Date: Sun, 3 Feb 2019 09:58:48 +0100 Subject: [PATCH] Adds CreDocument:getScreenPositionFromXPointer() Factorize same code used by ReaderLink and ReaderRolling into CreDocument:getScreenPositionFromXPointer(). --- frontend/apps/reader/modules/readerlink.lua | 11 +------ .../apps/reader/modules/readerrolling.lua | 8 +---- frontend/document/credocument.lua | 31 ++++++++++++++----- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/frontend/apps/reader/modules/readerlink.lua b/frontend/apps/reader/modules/readerlink.lua index 273d41d2f..b0b02a3e7 100644 --- a/frontend/apps/reader/modules/readerlink.lua +++ b/frontend/apps/reader/modules/readerlink.lua @@ -289,16 +289,7 @@ end --- Check if a xpointer to 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 diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index ef1ede86f..10b12c720 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -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)) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index eb4507584..b44877631 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -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