Fix scroll events while animating

Fix slider issue with negative distance
Add bunch of new functions to grid
More accurate progress bar scaling with 9-slice images
This commit is contained in:
Insality
2024-09-10 21:46:29 +03:00
parent 986a4695f6
commit d533e5ee2d
6 changed files with 131 additions and 17 deletions

View File

@@ -76,15 +76,29 @@ end
local function set_bar_to(self, set_to, is_silent)
local prev_value = self.last_value
local other_side = self.key == const.SIDE.X and const.SIDE.Y or const.SIDE.X
self.last_value = set_to
local total_width = set_to * self.max_size
local total_width = set_to * self.max_size[self.key]
local scale = math.min(total_width / self.slice_size, 1)
local size = math.max(total_width, self.slice_size)
local scale = 1
if self.slice_size[self.key] > 0 then
scale = math.min(total_width / self.slice_size[self.key], 1)
end
local size = math.max(total_width, self.slice_size[self.key])
do -- Scale other side
-- Decrease other side of progress bar to match the oppotize slice_size
local minimal_size = self.size[other_side] - self.slice_size[other_side]
local maximum_size = self.size[other_side]
local scale_diff = (maximum_size - minimal_size) / maximum_size
local other_scale = 1 - (scale_diff * (1 - scale))
self.scale[other_side] = other_scale
end
self.scale[self.key] = scale
gui.set_scale(self.node, self.scale)
self.size[self.key] = size
gui.set_size(self.node, self.size)
@@ -125,15 +139,15 @@ function Progress.init(self, node, key, init_value)
self.node = self:get_node(node)
self.scale = gui.get_scale(self.node)
self.size = gui.get_size(self.node)
self.max_size = self.size[self.key]
self.max_size = gui.get_size(self.node)
self.slice = gui.get_slice9(self.node)
self.last_value = self._init_value
if self.key == const.SIDE.X then
self.slice_size = self.slice.x + self.slice.z
else
self.slice_size = self.slice.y + self.slice.w
end
self.slice_size = vmath.vector3(
self.slice.x + self.slice.z,
self.slice.y + self.slice.w,
0
)
self.on_change = Event()
@@ -146,6 +160,12 @@ function Progress.on_layout_change(self)
end
function Progress.on_remove(self)
-- Return default size
gui.set_size(self.node, self.max_size)
end
function Progress.update(self, dt)
if self.target then
local prev_value = self.last_value
@@ -231,7 +251,7 @@ end
-- @tparam vector3 max_size The new node maximum (full) size
-- @treturn Progress @{Progress}
function Progress.set_max_size(self, max_size)
self.max_size = max_size[self.key]
self.max_size[self.key] = max_size[self.key]
self:set_to(self.last_value)
return self
end

View File

@@ -26,7 +26,7 @@
-- @tfield vector3 end_pos
--- Length between start and end position
-- @tfield number dist
-- @tfield vector3 dist
--- Current drag state
-- @tfield boolean is_drag
@@ -68,6 +68,7 @@ function Slider.init(self, node, end_pos, callback)
self.pos = gui.get_position(self.node)
self.target_pos = vmath.vector3(self.pos)
self.end_pos = end_pos
self._is_enabled = true
self.dist = self.end_pos - self.start_pos
self.is_drag = false
@@ -104,6 +105,10 @@ function Slider.on_input(self, action_id, action)
return false
end
if not self._is_enabled or not gui.is_enabled(self.node, true) then
return false
end
if gui.pick_node(self.node, action.x, action.y) then
if action.pressed then
self.pos = gui.get_position(self.node)
@@ -138,11 +143,11 @@ function Slider.on_input(self, action_id, action)
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 math.abs(self.dist.x) > 0 then
self.value = (self.target_pos.x - self.start_pos.x) / self.dist.x
end
if self.dist.y > 0 then
if math.abs(self.dist.y) > 0 then
self.value = (self.target_pos.y - self.start_pos.y) / self.dist.y
end
@@ -216,4 +221,20 @@ function Slider.set_input_node(self, input_node)
end
--- Set Slider input enabled or disabled
-- @tparam Slider self @{Slider}
-- @tparam boolean is_enabled
function Slider.set_enabled(self, is_enabled)
self._is_enabled = is_enabled
end
--- Check if Slider component is enabled
-- @tparam Slider self @{Slider}
-- @treturn boolean
function Slider.is_enabled(self)
return self._is_enabled
end
return Slider