mirror of
https://github.com/Insality/druid
synced 2025-09-27 18:12:21 +02:00
Update
This commit is contained in:
@@ -252,6 +252,7 @@ function M:add_container(node_or_container, mode, on_resize_callback)
|
||||
end
|
||||
|
||||
-- Covert node_id to node if needed
|
||||
---@cast node node
|
||||
node = self:get_node(node)
|
||||
|
||||
container = container or self.druid:new(M, node, mode)
|
||||
|
@@ -1,30 +1,16 @@
|
||||
-- Copyright (c) 2021 Maksim Tuprikov <insality@gmail.com>. This code is licensed under MIT license
|
||||
|
||||
--- Component to handle swipe gestures on node.
|
||||
-- Swipe will be triggered, if swipe was started and
|
||||
-- ended on one node
|
||||
--
|
||||
-- <a href="https://insality.github.io/druid/druid/index.html?example=general_swipe" target="_blank"><b>Example Link</b></a>
|
||||
-- @module Swipe
|
||||
-- @within BaseComponent
|
||||
-- @alias druid.swipe
|
||||
|
||||
--- Swipe node
|
||||
--@param node node
|
||||
|
||||
--- Restriction zone
|
||||
--@param click_zone node|nil
|
||||
|
||||
--- Trigger on swipe event(self, swipe_side, dist, delta_time)
|
||||
--@param event event on_swipe
|
||||
|
||||
---
|
||||
|
||||
local event = require("event.event")
|
||||
local const = require("druid.const")
|
||||
local helper = require("druid.helper")
|
||||
local component = require("druid.component")
|
||||
|
||||
---Component style params.
|
||||
---You can override this component styles params in druid styles table
|
||||
---or create your own style
|
||||
---@class druid.swipe.style
|
||||
---@field SWIPE_TIME number|nil Maximum time for swipe trigger. Default: 0.4
|
||||
---@field SWIPE_THRESHOLD number|nil Minimum distance for swipe trigger. Default: 50
|
||||
---@field SWIPE_TRIGGER_ON_MOVE boolean|nil If true, trigger on swipe moving, not only release action. Default: false
|
||||
|
||||
---@class druid.swipe: druid.component
|
||||
---@field node node
|
||||
---@field on_swipe event function(side, dist, dt), side - "left", "right", "up", "down"
|
||||
@@ -38,56 +24,6 @@ local component = require("druid.component")
|
||||
local M = component.create("swipe")
|
||||
|
||||
|
||||
local function start_swipe(self, action)
|
||||
self._swipe_start_time = socket.gettime()
|
||||
self._start_pos.x = action.x
|
||||
self._start_pos.y = action.y
|
||||
end
|
||||
|
||||
|
||||
local function reset_swipe(self, action)
|
||||
self._swipe_start_time = 0
|
||||
end
|
||||
|
||||
|
||||
local function check_swipe(self, action)
|
||||
local dx = action.x - self._start_pos.x
|
||||
local dy = action.y - self._start_pos.y
|
||||
local dist = helper.distance(self._start_pos.x, self._start_pos.y, action.x, action.y)
|
||||
local delta_time = socket.gettime() - self._swipe_start_time
|
||||
local is_swipe = self.style.SWIPE_THRESHOLD <= dist and delta_time <= self.style.SWIPE_TIME
|
||||
|
||||
if is_swipe then
|
||||
local is_x_swipe = math.abs(dx) >= math.abs(dy)
|
||||
local swipe_side = "undefined"
|
||||
|
||||
if is_x_swipe and dx > 0 then
|
||||
swipe_side = "right"
|
||||
end
|
||||
if is_x_swipe and dx < 0 then
|
||||
swipe_side = "left"
|
||||
end
|
||||
if not is_x_swipe and dy > 0 then
|
||||
swipe_side = "up"
|
||||
end
|
||||
if not is_x_swipe and dy < 0 then
|
||||
swipe_side = "down"
|
||||
end
|
||||
|
||||
self.on_swipe:trigger(self:get_context(), swipe_side, dist, delta_time)
|
||||
reset_swipe(self)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- Component style params.
|
||||
-- You can override this component styles params in druid styles table
|
||||
-- or create your own style
|
||||
---@class druid.swipe.style
|
||||
---@field SWIPE_TIME number|nil Maximum time for swipe trigger. Default: 0.4
|
||||
---@field SWIPE_THRESHOLD number|nil Minimum distance for swipe trigger. Default: 50
|
||||
---@field SWIPE_TRIGGER_ON_MOVE boolean|nil If true, trigger on swipe moving, not only release action. Default: false
|
||||
|
||||
---@param style druid.swipe.style
|
||||
function M:on_style_change(style)
|
||||
self.style = {}
|
||||
@@ -135,20 +71,20 @@ function M:on_input(action_id, action)
|
||||
|
||||
local is_pick = helper.pick_node(self.node, action.x, action.y, self.click_zone)
|
||||
if not is_pick then
|
||||
reset_swipe(self, action)
|
||||
self:_reset_swipe()
|
||||
return false
|
||||
end
|
||||
|
||||
if self._swipe_start_time ~= 0 and (self._trigger_on_move or action.released) then
|
||||
check_swipe(self, action)
|
||||
self:_check_swipe(action)
|
||||
end
|
||||
|
||||
if action.pressed then
|
||||
start_swipe(self, action)
|
||||
self:_start_swipe(action)
|
||||
end
|
||||
|
||||
if action.released then
|
||||
reset_swipe(self, action)
|
||||
self:_reset_swipe()
|
||||
end
|
||||
|
||||
return true
|
||||
@@ -156,7 +92,7 @@ end
|
||||
|
||||
|
||||
function M:on_input_interrupt()
|
||||
reset_swipe(self)
|
||||
self:_reset_swipe()
|
||||
end
|
||||
|
||||
|
||||
@@ -173,4 +109,54 @@ function M:set_click_zone(zone)
|
||||
end
|
||||
|
||||
|
||||
---Start swipe event
|
||||
---@param action action
|
||||
function M:_start_swipe(action)
|
||||
self._swipe_start_time = socket.gettime()
|
||||
self._start_pos.x = action.x
|
||||
self._start_pos.y = action.y
|
||||
end
|
||||
|
||||
|
||||
---Reset swipe event
|
||||
function M:_reset_swipe()
|
||||
self._swipe_start_time = 0
|
||||
end
|
||||
|
||||
|
||||
---Check swipe event
|
||||
---@param self druid.swipe
|
||||
---@param action action
|
||||
function M:_check_swipe(action)
|
||||
local dx = action.x - self._start_pos.x
|
||||
local dy = action.y - self._start_pos.y
|
||||
local dist = helper.distance(self._start_pos.x, self._start_pos.y, action.x, action.y)
|
||||
local delta_time = socket.gettime() - self._swipe_start_time
|
||||
local is_swipe = self.style.SWIPE_THRESHOLD <= dist and delta_time <= self.style.SWIPE_TIME
|
||||
|
||||
if is_swipe then
|
||||
local is_x_swipe = math.abs(dx) >= math.abs(dy)
|
||||
local swipe_side = "undefined"
|
||||
|
||||
if is_x_swipe and dx > 0 then
|
||||
swipe_side = "right"
|
||||
end
|
||||
if is_x_swipe and dx < 0 then
|
||||
swipe_side = "left"
|
||||
end
|
||||
if not is_x_swipe and dy > 0 then
|
||||
swipe_side = "up"
|
||||
end
|
||||
if not is_x_swipe and dy < 0 then
|
||||
swipe_side = "down"
|
||||
end
|
||||
|
||||
self.on_swipe:trigger(self:get_context(), swipe_side, dist, delta_time)
|
||||
self:_reset_swipe()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
return M
|
||||
|
Reference in New Issue
Block a user