mirror of
https://github.com/Insality/druid
synced 2025-06-27 18:37:45 +02:00
Add set_steps to the slider component
This commit is contained in:
parent
84d2f3bf17
commit
05af3801d7
@ -30,6 +30,12 @@ local function on_change_value(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function set_position(self, value)
|
||||||
|
value = helper.clamp(value, 0, 1)
|
||||||
|
gui.set_position(self.node, self.start_pos + self.dist * value)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Component init function
|
--- Component init function
|
||||||
-- @function slider:init
|
-- @function slider:init
|
||||||
-- @tparam node node Gui pin node
|
-- @tparam node node Gui pin node
|
||||||
@ -76,9 +82,8 @@ function M.on_input(self, action_id, action)
|
|||||||
self.target_pos.x = helper.clamp(self.pos.x, self.start_pos.x, self.end_pos.x)
|
self.target_pos.x = helper.clamp(self.pos.x, self.start_pos.x, self.end_pos.x)
|
||||||
self.target_pos.y = helper.clamp(self.pos.y, self.start_pos.y, self.end_pos.y)
|
self.target_pos.y = helper.clamp(self.pos.y, self.start_pos.y, self.end_pos.y)
|
||||||
|
|
||||||
gui.set_position(self.node, self.target_pos)
|
|
||||||
|
|
||||||
if prev_x ~= self.target_pos.x or prev_y ~= self.target_pos.y then
|
if prev_x ~= self.target_pos.x or prev_y ~= self.target_pos.y then
|
||||||
|
local prev_value = self.value
|
||||||
|
|
||||||
if self.dist.x > 0 then
|
if self.dist.x > 0 then
|
||||||
self.value = (self.target_pos.x - self.start_pos.x) / self.dist.x
|
self.value = (self.target_pos.x - self.start_pos.x) / self.dist.x
|
||||||
@ -88,10 +93,29 @@ function M.on_input(self, action_id, action)
|
|||||||
self.value = (self.target_pos.y - self.start_pos.y) / self.dist.y
|
self.value = (self.target_pos.y - self.start_pos.y) / self.dist.y
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self.steps then
|
||||||
|
local closest_dist = 1000
|
||||||
|
local closest = nil
|
||||||
|
for i = 1, #self.steps do
|
||||||
|
local dist = math.abs(self.value - self.steps[i])
|
||||||
|
if dist < closest_dist then
|
||||||
|
closest = self.steps[i]
|
||||||
|
closest_dist = dist
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if closest then
|
||||||
|
self.value = closest
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if prev_value ~= self.value then
|
||||||
on_change_value(self)
|
on_change_value(self)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
set_position(self, self.value)
|
||||||
|
end
|
||||||
|
|
||||||
if action.released then
|
if action.released then
|
||||||
self.is_drag = false
|
self.is_drag = false
|
||||||
end
|
end
|
||||||
@ -106,8 +130,7 @@ end
|
|||||||
-- @tparam[opt] bool is_silent Don't trigger event if true
|
-- @tparam[opt] bool is_silent Don't trigger event if true
|
||||||
function M.set(self, value, is_silent)
|
function M.set(self, value, is_silent)
|
||||||
value = helper.clamp(value, 0, 1)
|
value = helper.clamp(value, 0, 1)
|
||||||
|
set_position(self, value)
|
||||||
gui.set_position(self.node, self.start_pos + self.dist * value)
|
|
||||||
self.value = value
|
self.value = value
|
||||||
if not is_silent then
|
if not is_silent then
|
||||||
on_change_value(self)
|
on_change_value(self)
|
||||||
@ -115,4 +138,14 @@ function M.set(self, value, is_silent)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Set slider steps. Pin node will
|
||||||
|
-- apply closest step position
|
||||||
|
-- @function slider:set_steps
|
||||||
|
-- @tparam number[] steps Array of steps
|
||||||
|
-- @usage slider:set_steps({0, 0.2, 0.6, 1})
|
||||||
|
function M.set_steps(self, steps)
|
||||||
|
self.steps = steps
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
Loading…
x
Reference in New Issue
Block a user