From da2a3ff7531ac0d691683ad62b09e19914f9d10f Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 12 Mar 2013 11:26:11 +0800 Subject: [PATCH 1/3] detect pan release gesture --- frontend/ui/gesturedetector.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frontend/ui/gesturedetector.lua b/frontend/ui/gesturedetector.lua index a256d5271..389e7a554 100644 --- a/frontend/ui/gesturedetector.lua +++ b/frontend/ui/gesturedetector.lua @@ -368,7 +368,19 @@ function GestureDetector:panState(tev) time = tev.timev, } end + DEBUG("pan release detected in slot", slot) + local release_pos = Geom:new{ + x = self.last_tevs[slot].x, + y = self.last_tevs[slot].y, + w = 0, h = 0, + } + local pan_release = { + ges = "pan_release", + pos = release_pos, + time = tev.timev, + } self:clearState(slot) + return pan_release else if self.states[slot] ~= self.panState then self.states[slot] = self.panState From 617613e7633fe01352834a8da2ecbc57319bcd48 Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 12 Mar 2013 11:27:41 +0800 Subject: [PATCH 2/3] bugfix: adjust coordinates of pan gesture --- frontend/ui/gesturedetector.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/ui/gesturedetector.lua b/frontend/ui/gesturedetector.lua index 389e7a554..e52304848 100644 --- a/frontend/ui/gesturedetector.lua +++ b/frontend/ui/gesturedetector.lua @@ -455,7 +455,7 @@ function GestureDetector:adjustGesCoordinate(ges) if ges.pos then ges.pos.x, ges.pos.y = (Screen.width - ges.pos.y), (ges.pos.x) end - if ges.ges == "swipe" then + if ges.ges == "swipe" or ges.ges == "pan" then if ges.direction == "down" then ges.direction = "left" elseif ges.direction == "up" then From 3660625cca6ddf8e20195f1f6ee4a65c94d2772b Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 12 Mar 2013 11:28:47 +0800 Subject: [PATCH 3/3] bugfix: detect pan release to update flipping page on which the page calculation of the following flip is based. --- frontend/ui/reader/readerpaging.lua | 85 ++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 26 deletions(-) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 52cc2d0bc..5709a3390 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -100,6 +100,16 @@ function ReaderPaging:initGesListener() rate = 4.0, } }, + PanRelease = { + GestureRange:new{ + ges = "pan_release", + range = Geom:new{ + x = 0, y = 0, + w = Screen:getWidth(), + h = Screen:getHeight(), + }, + } + }, } end @@ -128,45 +138,68 @@ end function ReaderPaging:onToggleFlipping() self.view.flipping_visible = not self.view.flipping_visible - self.flipping_page = self.view.flipping_visible and self.current_page or nil + self.flipping_mode = self.view.flipping_visible + self.flipping_page = self.current_page + if self.flipping_mode then + self:updateOriginalPage(self.current_page) + end + UIManager:setDirty(self.view.dialog, "partial") +end + +function ReaderPaging:updateOriginalPage(page) + self.original_page = page +end + +function ReaderPaging:updateFlippingPage(page) + self.flipping_page = page +end + +function ReaderPaging:flipping(flipping_page, flipping_ges) + local read = flipping_page - 1 + local unread = self.number_of_pages - flipping_page + local whole = self.number_of_pages + local rel_proportion = flipping_ges.distance / Screen:getWidth() + local abs_proportion = flipping_ges.distance / Screen:getHeight() + if flipping_ges.direction == "right" then + self:gotoPage(flipping_page - math.floor(read*rel_proportion)) + elseif flipping_ges.direction == "left" then + self:gotoPage(flipping_page + math.floor(unread*rel_proportion)) + elseif flipping_ges.direction == "down" then + self:gotoPage(flipping_page - math.floor(whole*abs_proportion)) + elseif flipping_ges.direction == "up" then + self:gotoPage(flipping_page + math.floor(whole*abs_proportion)) + end UIManager:setDirty(self.view.dialog, "partial") end function ReaderPaging:onSwipe(arg, ges) - if self.flipping_page == nil then - if ges.direction == "left" or ges.direction == "up" then - self:onPagingRel(1) - elseif ges.direction == "right" or ges.direction == "down" then - self:onPagingRel(-1) - end - elseif self.flipping_page then - self:gotoPage(self.flipping_page) + if self.flipping_mode then + self:flipping(self.flipping_page, ges) + self:updateFlippingPage(self.current_page) + elseif self.original_page then + self:gotoPage(self.original_page) + self:updateOriginalPage(nil) + elseif ges.direction == "left" or ges.direction == "up" then + self:onPagingRel(1) + elseif ges.direction == "right" or ges.direction == "down" then + self:onPagingRel(-1) end return true end function ReaderPaging:onPan(arg, ges) - if self.flipping_page then - local read = self.flipping_page - 1 - local unread = self.number_of_pages - self.flipping_page - local whole = self.number_of_pages - local rel_proportion = ges.distance / Screen:getWidth() - local abs_proportion = ges.distance / Screen:getHeight() - if ges.direction == "right" then - self:gotoPage(self.flipping_page - math.floor(read*rel_proportion)) - elseif ges.direction == "left" then - self:gotoPage(self.flipping_page + math.floor(unread*rel_proportion)) - elseif ges.direction == "down" then - self:gotoPage(self.flipping_page - math.floor(whole*abs_proportion)) - elseif ges.direction == "up" then - self:gotoPage(self.flipping_page + math.floor(whole*abs_proportion)) - end - - UIManager:setDirty(self.view.dialog, "partial") + if self.flipping_mode then + self:flipping(self.flipping_page, ges) end return true end +function ReaderPaging:onPanRelease(arg, ges) + if self.flipping_mode then + self:updateFlippingPage(self.current_page) + end +end + function ReaderPaging:onZoomModeUpdate(new_mode) -- we need to remember zoom mode to handle page turn event self.zoom_mode = new_mode