From 06f682e8e4d290b634ff21cbb7daad21b956a837 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 23 Nov 2024 12:39:55 +0200 Subject: [PATCH] Update --- druid/helper.lua | 28 ++++++---- druid/widget/mini_graph/mini_graph.lua | 5 +- .../properties/property_slider.lua | 55 ++++++++++++++++--- .../properties_panel/properties_panel.lua | 2 +- 4 files changed, 66 insertions(+), 24 deletions(-) diff --git a/druid/helper.lua b/druid/helper.lua index ac49d43..163a75c 100644 --- a/druid/helper.lua +++ b/druid/helper.lua @@ -171,22 +171,26 @@ end ---Clamp value between min and max ----@param a number Value ----@param min number Min value ----@param max number Max value +---@param value number Value +---@param v1 number|nil Min value. If nil, value will be clamped to positive infinity +---@param v2 number|nil Max value If nil, value will be clamped to negative infinity ---@return number value Clamped value -function M.clamp(a, min, max) - if min > max then - min, max = max, min +function M.clamp(value, v1, v2) + if v1 and v2 then + if v1 > v2 then + v1, v2 = v2, v1 + end end - if a >= min and a <= max then - return a - elseif a < min then - return min - else - return max + if v1 and value < v1 then + return v1 end + + if v2 and value > v2 then + return v2 + end + + return value end diff --git a/druid/widget/mini_graph/mini_graph.lua b/druid/widget/mini_graph/mini_graph.lua index 3236850..eb4a37b 100644 --- a/druid/widget/mini_graph/mini_graph.lua +++ b/druid/widget/mini_graph/mini_graph.lua @@ -1,4 +1,5 @@ local color = require("druid.color") +local helper = require("druid.helper") ---@class widget.mini_graph: druid.widget local M = {} @@ -78,7 +79,7 @@ function M:set_line_value(index, value) self.values[index] = value - local normalized = vmath.clamp(value/self.max_value, 0, 1) + local normalized = helper.clamp(value/self.max_value, 0, 1) local target_color = color.lerp(normalized, self.color_zero, self.color_one) gui.set_color(line, target_color) self:set_line_height(index) @@ -115,7 +116,7 @@ end function M:set_line_height(index) local value = self.values[index] or 0 - local normalized = vmath.clamp(value / self.max_value, 0, 1) + local normalized = helper.clamp(value / self.max_value, 0, 1) local size_y = normalized * 70 gui.set(self.lines[index], SIZE_Y, size_y) end diff --git a/druid/widget/properties_panel/properties/property_slider.lua b/druid/widget/properties_panel/properties/property_slider.lua index 91b975c..805a183 100644 --- a/druid/widget/properties_panel/properties/property_slider.lua +++ b/druid/widget/properties_panel/properties/property_slider.lua @@ -1,3 +1,6 @@ +local event = require("event.event") +local helper = require("druid.helper") + ---@class widget.property_slider: druid.widget ---@field root node ---@field container druid.container @@ -14,11 +17,14 @@ function M:init() gui.set_alpha(self.selected, 0) self._value = 0 + self.min = 0 + self.max = 1 + self.text_name = self.druid:new_text("text_name") :set_text_adjust("scale_then_trim_left", 0.3) self.text_value = self.druid:new_text("text_value") - self.slider = self.druid:new_slider("slider_pin", vmath.vector3(55, 0, 0), self._on_slider_change_by_user) --[[@as druid.slider]] + self.slider = self.druid:new_slider("slider_pin", vmath.vector3(55, 0, 0), self.update_value) --[[@as druid.slider]] self.slider:set_input_node("slider") self:set_text_function(function(value) @@ -28,6 +34,8 @@ function M:init() self.container = self.druid:new_container(self.root) self.container:add_container("text_name") self.container:add_container("E_Anchor") + + self.on_change_value = event.create() end @@ -40,13 +48,17 @@ end ---@param value number function M:set_value(value, is_instant) - if self._value == value then + local diff = math.abs(self.max - self.min) + self.slider:set(value / diff, true) + + local is_changed = self._value ~= value + if not is_changed then return end self._value = value - self.slider:set(value, true) - self.text_value:set_to(self._text_function(value)) + self.text_value:set_text(self._text_function(value)) + self.on_change_value:trigger(value) if not is_instant then gui.set_alpha(self.selected, 1) @@ -61,12 +73,37 @@ function M:get_value() end -function M:_on_slider_change_by_user(value) - self._value = value - self.text_value:set_to(self._text_function(value)) +function M:update_value(value) + local current_value = self._value - gui.set_alpha(self.selected, 1) - gui.animate(self.selected, "color.w", 0, gui.EASING_INSINE, 0.16) + local diff = math.abs(self.max - self.min) + -- [0..1] To range + value = value * diff + self.min + + -- Round to steps value (0.1, or 5. Should be divided on this value) + value = math.floor(value / self.step + 0.5) * self.step + + value = helper.clamp(value, self.min, self.max) + + self:set_value(value) +end + + +function M:set_number_type(min, max, step) + self.min = min or 0 + self.max = max or 1 + self.step = step + + self:set_text_function(function(value) + return tostring(value) + end) + + self:set_value(self._value, true) +end + + +function M:_on_slider_change_by_user(value) + self:set_value(value) end diff --git a/druid/widget/properties_panel/properties_panel.lua b/druid/widget/properties_panel/properties_panel.lua index 6934dda..1569870 100644 --- a/druid/widget/properties_panel/properties_panel.lua +++ b/druid/widget/properties_panel/properties_panel.lua @@ -142,7 +142,7 @@ function M:add_slider(text, initial_value, on_change_callback) instance.text_name:set_text(text) instance:set_value(initial_value, true) - instance.slider.on_change_value:subscribe(function(_, value) + instance.on_change_value:subscribe(function(value) on_change_callback(value) end)