diff --git a/frontend/ui/reader/readerrolling.lua b/frontend/ui/reader/readerrolling.lua index f9b40a8fd..beb439cbb 100644 --- a/frontend/ui/reader/readerrolling.lua +++ b/frontend/ui/reader/readerrolling.lua @@ -3,7 +3,6 @@ require "ui/reader/readerpanning" ReaderRolling = InputContainer:new{ old_doc_height = nil, old_page = nil, - view_mode = "page", current_pos = 0, -- only used for page view mode current_page= nil, @@ -59,9 +58,11 @@ function ReaderRolling:init() } end - self.doc_height = self.ui.document.info.doc_height - self.old_doc_height = self.doc_height - self.old_page = self.ui.document.info.number_of_pages + table.insert(self.ui.postInitCallback, function() + self.doc_height = self.ui.document.info.doc_height + self.old_doc_height = self.doc_height + self.old_page = self.ui.document.info.number_of_pages + end) end -- This method will be called in onSetDimensions handler @@ -99,6 +100,17 @@ function ReaderRolling:initGesListener() } } }, + Pan = { + GestureRange:new{ + ges = "pan", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + }, + rate = 4.0, + } + }, } end @@ -128,7 +140,7 @@ function ReaderRolling:onReadSettings(config) end) end end - if self.view_mode == "page" then + if self.view.view_mode == "page" then self.ui:handleEvent(Event:new("PageUpdate", self.ui.document:getCurrentPage())) end end @@ -141,11 +153,12 @@ function ReaderRolling:onCloseDocument() end function ReaderRolling:getLastPercent() - if self.view_mode == "page" then + if self.view.view_mode == "page" then return self.current_page / self.old_page else -- FIXME: the calculated percent is not accurate in "scroll" mode. - return self.ui.document:getPosFromXPointer(self.ui.document:getXPointer()) / self.doc_height + return self.ui.document:getPosFromXPointer( + self.ui.document:getXPointer()) / self.doc_height end end @@ -168,6 +181,17 @@ function ReaderRolling:onSwipe(arg, ges) return true end +function ReaderRolling:onPan(arg, ges) + if self.view.view_mode == "scroll" then + if ges.direction == "north" then + self:gotoPos(self.current_pos + ges.distance) + elseif ges.direction == "south" then + self:gotoPos(self.current_pos - ges.distance) + end + end + return true +end + function ReaderRolling:onPosUpdate(new_pos) self.current_pos = new_pos end @@ -183,8 +207,8 @@ function ReaderRolling:onGotoPercent(percent) end function ReaderRolling:onGotoViewRel(diff) - DEBUG("goto relative screen:", diff) - if self.view_mode ~= "page" then + DEBUG("goto relative screen:", diff, ", in mode: ", self.view.view_mode) + if self.view.view_mode == "scroll" then local pan_diff = diff * self.ui.dimen.h if self.show_overlap_enable then if pan_diff > self.overlap then @@ -194,7 +218,7 @@ function ReaderRolling:onGotoViewRel(diff) end end self:gotoPos(self.current_pos + pan_diff) - else + elseif self.view.view_mode == "page" then self:gotoPage(self.current_page + diff) end return true @@ -232,12 +256,8 @@ function ReaderRolling:onUpdatePos() return true end -function ReaderRolling:onSetViewMode(new_mode) - self.ui.view_mode = new_mode -end - function ReaderRolling:onRedrawCurrentView() - if self.view_mode == "page" then + if self.view.view_mode == "page" then self.ui:handleEvent(Event:new("PageUpdate", self.current_page)) else self.ui:handleEvent(Event:new("PosUpdate", self.current_pos)) @@ -260,7 +280,7 @@ function ReaderRolling:gotoPos(new_pos) if new_pos < 0 then new_pos = 0 end if new_pos > self.doc_height then new_pos = self.doc_height end -- adjust dim_area according to new_pos - if self.view_mode ~= "page" and self.show_overlap_enable then + if self.view.view_mode ~= "page" and self.show_overlap_enable then local panned_step = new_pos - self.current_pos self.view.dim_area.x = 0 self.view.dim_area.h = self.ui.dimen.h - math.abs(panned_step) @@ -280,7 +300,7 @@ function ReaderRolling:gotoPage(new_page) end function ReaderRolling:gotoXPointer(xpointer) - if self.view_mode == "page" then + if self.view.view_mode == "page" then self:gotoPage(self.ui.document:getPageFromXPointer(xpointer)) else self:gotoPos(self.ui.document:getPosFromXPointer(xpointer))