mirror of
https://github.com/Insality/druid
synced 2025-06-27 10:27:48 +02:00
87 lines
2.9 KiB
Lua
87 lines
2.9 KiB
Lua
local component = require("druid.component")
|
|
|
|
---@class examples.scroll: druid.widget
|
|
---@field root node
|
|
---@field scroll druid.scroll
|
|
local M = {}
|
|
|
|
function M:init()
|
|
self.scroll = self.druid:new_scroll("scroll_view", "scroll_content")
|
|
|
|
self.button_tutorial = self.druid:new_button("button_tutorial/root")
|
|
self.button_stencil = self.druid:new_button("button_stencil/root")
|
|
end
|
|
|
|
|
|
---@param output_log output_list
|
|
function M:on_example_created(output_log)
|
|
self.button_tutorial.on_click:subscribe(function()
|
|
output_log:add_log_text("Button Tutorial Clicked")
|
|
end)
|
|
self.button_stencil.on_click:subscribe(function()
|
|
output_log:add_log_text("Button Stencil Clicked")
|
|
end)
|
|
end
|
|
|
|
|
|
---@param properties_panel properties_panel
|
|
function M:properties_control(properties_panel)
|
|
local scroll = self.scroll
|
|
local is_stretch = self.scroll.style.EXTRA_STRETCH_SIZE > 0
|
|
properties_panel:add_checkbox("ui_elastic_scroll", is_stretch, function(value)
|
|
self.scroll:set_extra_stretch_size(value and 100 or 0)
|
|
end)
|
|
|
|
local view_node = self.scroll.view_node
|
|
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
|
|
properties_panel:add_checkbox("ui_clipping", is_stencil, function(value)
|
|
gui.set_clipping_mode(view_node, value and gui.CLIPPING_MODE_STENCIL or gui.CLIPPING_MODE_NONE)
|
|
end)
|
|
|
|
local slider_frict = properties_panel:add_slider("ui_slider_friction", 0, function(value)
|
|
scroll.style.FRICT = 1 - ((1 - value) * 0.1)
|
|
end)
|
|
slider_frict:set_text_function(function(value)
|
|
return string.format("%.2f", 1 - ((1 - value) * 0.1))
|
|
end)
|
|
slider_frict:set_value(1 - (1 - scroll.style.FRICT) / 0.1)
|
|
|
|
local slider_speed = properties_panel:add_slider("ui_slider_speed", 0, function(value)
|
|
scroll.style.INERT_SPEED = value * 50
|
|
end)
|
|
slider_speed:set_value(scroll.style.INERT_SPEED / 50)
|
|
slider_speed:set_text_function(function(value)
|
|
return string.format("%.1f", value * 50)
|
|
end)
|
|
|
|
local slider_wheel_speed = properties_panel:add_slider("ui_slider_wheel_speed", 0, function(value)
|
|
scroll.style.WHEEL_SCROLL_SPEED = value * 30
|
|
end)
|
|
slider_wheel_speed:set_value(scroll.style.WHEEL_SCROLL_SPEED / 30)
|
|
slider_wheel_speed:set_text_function(function(value)
|
|
return string.format("%.1f", value * 30)
|
|
end)
|
|
|
|
local wheel_by_inertion = properties_panel:add_checkbox("ui_wheel_by_inertion", scroll.style.WHEEL_SCROLL_BY_INERTION, function(value)
|
|
scroll.style.WHEEL_SCROLL_BY_INERTION = value
|
|
end)
|
|
wheel_by_inertion:set_value(scroll.style.WHEEL_SCROLL_BY_INERTION)
|
|
end
|
|
|
|
|
|
---@return string
|
|
function M:get_debug_info()
|
|
local info = ""
|
|
|
|
local s = self.scroll
|
|
info = info .. "View Size Y: " .. gui.get(s.view_node, "size.y") .. "\n"
|
|
info = info .. "Content Size Y: " .. gui.get(s.content_node, "size.y") .. "\n"
|
|
info = info .. "Content position Y: " .. math.ceil(s.position.y) .. "\n"
|
|
info = info .. "Content Range Y: " .. s.available_pos.y .. " - " .. s.available_pos.w .. "\n"
|
|
|
|
return info
|
|
end
|
|
|
|
|
|
return M
|