2
0
mirror of https://github.com/koreader/koreader synced 2024-11-16 06:12:56 +00:00
koreader/frontend/ui/gesturerange.lua

70 lines
2.0 KiB
Lua
Raw Normal View History

local TimeVal = require("ui/timeval")
2013-10-18 20:38:07 +00:00
local GestureRange = {
-- gesture matching type
2014-03-13 13:52:43 +00:00
ges = nil,
-- spatial range limits the gesture emitting position
range = nil,
-- temproal range limits the gesture emitting rate
rate = nil,
-- scale limits of this gesture
2014-03-13 13:52:43 +00:00
scale = nil,
2013-10-18 20:38:07 +00:00
}
function GestureRange:new(from_o)
local o = from_o or {}
2014-03-13 13:52:43 +00:00
setmetatable(o, self)
self.__index = self
return o
2013-10-18 20:38:07 +00:00
end
function GestureRange:match(gs)
2014-03-13 13:52:43 +00:00
if gs.ges ~= self.ges then
return false
end
if self.range then
-- sometimes widget dimenension is not available when creating a gesturerage
-- for some action, now we accept a range function that will be later called
-- and the result of which will be used to check gesture match
-- e.g. range = function() return self.dimen end
-- for inputcontainer given that the x and y field of `self.dimen` is only
-- filled when the inputcontainer is painted into blitbuffer
local range
if type(self.range) == "function" then
range = self.range()
else
range = self.range
end
if not range:contains(gs.pos) then
2014-03-13 13:52:43 +00:00
return false
end
end
2014-03-13 13:52:43 +00:00
if self.rate then
-- This filed restraints the upper limit rate(matches per second).
-- It's most useful for e-ink devices with less powerfull CPUs and
-- screens that cannot handle gesture events that otherwise will be
-- generated
2014-03-13 13:52:43 +00:00
local last_time = self.last_time or TimeVal:new{}
if gs.time - last_time > TimeVal:new{usec = 1000000 / self.rate} then
self.last_time = gs.time
else
return false
end
end
if self.scale then
local scale = gs.distance or gs.span
if self.scale[1] > scale or self.scale[2] < scale then
2014-03-13 13:52:43 +00:00
return false
end
end
if self.direction then
if self.direction ~= gs.direction then
return false
end
end
return true
2013-10-18 20:38:07 +00:00
end
return GestureRange