From fe2517ecd2181956ac518951aef6ec5ef27a219f Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Wed, 26 Sep 2012 19:53:26 +0200 Subject: [PATCH 1/2] recalculate pan offsets on page change Store last globalzoom_mode in self.pan_by_page so we can restore it to force offsets recalculation on page change This wasn't quite enough to trigger correct re-panning for page changes when using fiveway to move in two-column mode, issue #275 I considered adding callback to goto method and than transfering it through function calls, but this approach (allthough very questionable) seemed to provide simplier code. --- unireader.lua | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/unireader.lua b/unireader.lua index 933772603..4148f860b 100644 --- a/unireader.lua +++ b/unireader.lua @@ -1297,10 +1297,19 @@ function UniReader:setzoom(page, preCache) self.offset_y = -1 * y0 * self.globalzoom * 2 + margin self.globalzoom = width / (x1 - x0 + margin) * 2 Debug("column mode offset:", self.offset_x, self.offset_y, " zoom:", self.globalzoom); + self.pan_by_page = self.globalzoom_mode -- store for later and enable pan_by_page self.globalzoom_mode = self.ZOOM_BY_VALUE -- enable pan mode self.pan_x = self.offset_x self.pan_y = self.offset_y - self.pan_by_page = true + else + Debug("globalzoom_mode didn't modify params", self.globalzoom_mode) + end + + if self.adjust_offset then + Debug("self.ajdust_offset BEFORE ", self.globalzoom, " globalrotate:", self.globalrotate, " offset:", self.offset_x, self.offset_y, " pagesize:", self.fullwidth, self.fullheight, " min_offset:", self.min_offset_x, self.min_offset_y) + self.adjust_offset(self) + self.adjust_offset = nil + Debug("self.ajdust_offset AFTER ", self.globalzoom, " globalrotate:", self.globalrotate, " offset:", self.offset_x, self.offset_y, " pagesize:", self.fullwidth, self.fullheight, " min_offset:", self.min_offset_x, self.min_offset_y) end dc:setZoom(self.globalzoom) @@ -1542,9 +1551,8 @@ function UniReader:nextView() -- not in fit to content width pan mode, just do a page turn pageno = pageno + 1 if self.pan_by_page then - -- we are in two column mode - self.offset_x = self.pan_x - self.offset_y = self.pan_y + Debug("two-column pan_by_page", self.pan_by_page) + self.globalzoom_mode = self.pan_by_page end end @@ -1570,9 +1578,8 @@ function UniReader:prevView() -- not in fit to content width pan mode, just do a page turn pageno = pageno - 1 if self.pan_by_page then - -- we are in two column mode - self.offset_x = self.pan_x - self.offset_y = self.pan_y + Debug("two-column pan_by_page", self.pan_by_page) + self.globalzoom_mode = self.pan_by_page end end @@ -2743,8 +2750,11 @@ function UniReader:addAllCommands() unireader.offset_x = unireader.offset_x + x if unireader.pan_by_page then if unireader.offset_x > 0 and unireader.pageno > 1 then - unireader.offset_x = unireader.pan_x - unireader.offset_y = unireader.min_offset_y -- bottom + unireader.adjust_offset = function(unireader) + unireader.offset_x = unireader.pan_x + unireader.offset_y = unireader.min_offset_y + Debug("pan to right-bottom of previous page") + end unireader:goto(unireader.pageno - 1) else unireader.show_overlap = 0 @@ -2758,8 +2768,8 @@ function UniReader:addAllCommands() unireader.offset_x = unireader.offset_x - x if unireader.pan_by_page then if unireader.offset_x < unireader.min_offset_x - unireader.pan_margin and unireader.pageno < unireader.doc:getPages() then - unireader.offset_x = unireader.pan_x - unireader.offset_y = unireader.pan_y + Debug("pan to top-left of next page") + self.globalzoom_mode = self.pan_by_page unireader:goto(unireader.pageno + 1) else unireader.show_overlap = 0 From 850a77776038ced2a72440abfa1e3337cc7d76cd Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Thu, 27 Sep 2012 13:10:28 +0100 Subject: [PATCH 2/2] On pressing Back crereader loses last position This fix makes the behaviour of Back command handler in crereader identical with that in unireader, i.e. the last position is saved in Jump History when pressing Back, so you can return to it by pressing Shift-Back enough times. Also, with this change we would need to handle the need for redrawing the current page because the :addJump() method can force the call to fillToc() (if TOC is not already present) and this will display "Retrieving TOC..." message which will need clearing away. --- crereader.lua | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/crereader.lua b/crereader.lua index 90756ea1c..52a8587ff 100644 --- a/crereader.lua +++ b/crereader.lua @@ -636,12 +636,29 @@ function CREReader:adjustCreReaderCommands() self.commands:add(KEY_BACK, nil, "Back", "go backward in jump history", function(self) - local prev_jump_no = self.jump_history.cur - 1 + local prev_jump_no = 0 + local need_refresh = false + if self.jump_history.cur > #self.jump_history then + -- addJump() will cause a "Retrieving TOC..." msg, so we'll + -- need to redraw the page after our own + -- ifo msg "Already first jump!" below + if not self.toc then need_refresh = true end + + -- if cur points to head, put current page in history + self:addJump(self.doc:getXPointer()) + prev_jump_no = self.jump_history.cur - 2 + else + prev_jump_no = self.jump_history.cur - 1 + end + if prev_jump_no >= 1 then self.jump_history.cur = prev_jump_no self:goto(self.jump_history[prev_jump_no].page, true, "xpointer") else showInfoMsgWithDelay("Already first jump!", 2000, 1) + if need_refresh then + self:redrawCurrentPage() + end end end )