diff --git a/frontend/ui/gesturedetector.lua b/frontend/ui/gesturedetector.lua index b28aed3a4..d4faa9a58 100644 --- a/frontend/ui/gesturedetector.lua +++ b/frontend/ui/gesturedetector.lua @@ -124,32 +124,31 @@ end --[[ compare last_pan with first_tev in this slot -if it is a swipe, return direction of swipe gesture. +return pan direction and distance --]] +function GestureDetector:getPath(tev) + local slot = tev.slot + local x_diff = self.last_tevs[slot].x - self.first_tevs[slot].x + local y_diff = self.last_tevs[slot].y - self.first_tevs[slot].y + local direction = nil + local distance = math.sqrt(x_diff*x_diff + y_diff*y_diff) + if x_diff == 0 and y_diff == 0 then + elseif (math.abs(x_diff) > math.abs(y_diff)) then + direction = x_diff < 0 and "left" or "right" + else + direction = y_diff < 0 and "up" or "down" + end + return direction, distance +end + function GestureDetector:isSwipe(tev) local slot = tev.slot local tv_diff = self.first_tevs[slot].timev - self.last_tevs[slot].timev if (tv_diff.sec == 0) and (tv_diff.usec < self.SWIPE_INTERVAL) then local x_diff = self.last_tevs[slot].x - self.first_tevs[slot].x local y_diff = self.last_tevs[slot].y - self.first_tevs[slot].y - if x_diff == 0 and y_diff == 0 then - return nil - end - - if (math.abs(x_diff) > math.abs(y_diff)) then - -- left or right - if x_diff < 0 then - return "left" - else - return "right" - end - else - -- up or down - if y_diff < 0 then - return "up" - else - return "down" - end + if x_diff ~= 0 or y_diff ~= 0 then + return true end end end @@ -195,7 +194,7 @@ end this method handles both single and double tap --]] function GestureDetector:tapState(tev) - DEBUG("in tap state...", tev) + DEBUG("in tap state...") local slot = tev.slot if tev.id == -1 then -- end of tap event @@ -276,13 +275,13 @@ function GestureDetector:tapState(tev) end function GestureDetector:panState(tev) - DEBUG("in pan state...", tev) + DEBUG("in pan state...") local slot = tev.slot if tev.id == -1 then -- end of pan, signal swipe gesture if necessary - local swipe_direct = self:isSwipe(tev) - if swipe_direct then - DEBUG("swipe", swipe_direct, "detected in slot", slot) + if self:isSwipe(tev) then + local swipe_direction, swipe_distance = self:getPath(tev) + DEBUG("swipe", swipe_direction, swipe_distance, "detected in slot", slot) local start_pos = Geom:new{ x = self.first_tevs[slot].x, y = self.first_tevs[slot].y, @@ -291,11 +290,11 @@ function GestureDetector:panState(tev) self:clearState(slot) return { ges = "swipe", - direction = swipe_direct, -- use first pan tev coordination as swipe start point pos = start_pos, + direction = swipe_direction, + distance = swipe_distance, time = tev.timev, - --@TODO add start and end points? (houqp) } end self:clearState(slot) @@ -303,7 +302,7 @@ function GestureDetector:panState(tev) if self.states[slot] ~= self.panState then self.states[slot] = self.panState end - + local pan_direction, pan_distance = self:getPath(tev) local pan_ev = { ges = "pan", relative = { @@ -312,6 +311,8 @@ function GestureDetector:panState(tev) y = 0, }, pos = nil, + direction = pan_direction, + distance = pan_distance, time = tev.timev, } pan_ev.relative.x = tev.x - self.last_tevs[slot].x @@ -326,7 +327,7 @@ function GestureDetector:panState(tev) end function GestureDetector:holdState(tev, hold) - DEBUG("in hold state...", tev, hold) + DEBUG("in hold state...") local slot = tev.slot -- when we switch to hold state, we pass additional param "hold" if tev.id ~= -1 and hold and self.last_tevs[slot].x and self.last_tevs[slot].y then