LLS refactor

This commit is contained in:
Insality 2025-03-07 21:09:01 +02:00
parent 3bb8705444
commit be03a5bd50
18 changed files with 244 additions and 169 deletions

View File

@ -4,6 +4,8 @@
Button component is a basic component that can be used to create a clickable button. It provides various interaction callbacks such as click, long click, double click, and more. The component makes any GUI node clickable and allows you to define different behaviors for various user interactions.
Button component is not support multitouch. In case of multitouch required (ex. on screen control) the custom component should be written with own input handling.
## Features
- Regular click handling

View File

@ -38,8 +38,6 @@ local helper = require("druid.helper")
---@field private _meta druid.component.meta
local M = {}
local INTERESTS = {} -- Cache interests per component class in runtime
local uid = 0
---@private
@ -234,6 +232,13 @@ function M:set_input_enabled(state)
end
---Get component input state. By default it's enabled. Can be disabled by `set_input_enabled` function.
---@return boolean
function M:get_input_enabled()
return self._meta.input_enabled
end
---Get parent component
---@return druid.component|nil parent_component The parent component if exist or nil
function M:get_parent_component()
@ -286,28 +291,6 @@ function M:_reset_input_priority_changed()
end
---Get current component interests
---@return table List of component interests
---@private
function M:__get_interests()
local instance_class = self._meta.instance_class
if INTERESTS[instance_class] then
return INTERESTS[instance_class]
end
local interests = {}
for index = 1, #const.ALL_INTERESTS do
local interest = const.ALL_INTERESTS[index]
if self[interest] and type(self[interest]) == "function" then
table.insert(interests, interest)
end
end
INTERESTS[instance_class] = interests
return INTERESTS[instance_class]
end
---Get current component nodes
---@return table<hash, node>|nil
function M:get_nodes()
@ -333,7 +316,6 @@ function M:__add_child(child)
end
---Remove child from component children list
---@generic T: druid.component
---@param child T The druid component instance
@ -394,4 +376,45 @@ function M.create(name, input_priority)
end
local WIDGET_METATABLE = { __index = M }
---Create the Druid component instance
---@param self druid.instance
---@param widget_class druid.widget
---@param context table
---@return druid.widget
function M.create_widget(self, widget_class, context)
local instance = setmetatable({}, {
__index = setmetatable(widget_class, WIDGET_METATABLE)
})
instance._component = {
_uid = M.create_uid(),
name = "Druid Widget",
input_priority = const.PRIORITY_INPUT,
default_input_priority = const.PRIORITY_INPUT,
_is_input_priority_changed = true, -- Default true for sort once time after GUI init
}
instance._meta = {
druid = self,
template = "",
nodes = nil,
context = context,
style = nil,
input_enabled = true,
children = {},
parent = type(context) ~= "userdata" and context or nil,
instance_class = widget_class
}
-- Register
if instance._meta.parent then
instance._meta.parent:__add_child(instance)
end
---@cast instance druid.widget
return instance
end
return M

View File

@ -44,7 +44,7 @@ local CORNER_PIVOTS = {
---@field fit_size vector3
---@field min_size_x number|nil
---@field min_size_y number|nil
---@field on_size_changed event @function on_size_changed(size)
---@field on_size_changed event fun(self: druid.container, size: vector3)
---@field _parent_container druid.container
---@field _containers table
---@field _draggable_corners table
@ -244,7 +244,7 @@ function M:add_container(node_or_container, mode, on_resize_callback)
local node = node_or_container
-- Check it's a container components instead of node
if type(node_or_container) == "table" and node_or_container._component then
if type(node_or_container) == "table" and node_or_container.add_container then
node = node_or_container.node
container = node_or_container
mode = mode or container.mode

View File

@ -148,8 +148,6 @@ function M:set_max_size(max_size)
end
---@private
function M:_check_steps(from, to, exactly)
if not self.steps then

View File

@ -298,7 +298,7 @@ end
---@param node node
---@param x number
---@param y number
---@param node_click_area node|nil
---@param node_click_area node|nil Additional node to check for click area. If nil, only node will be checked
---@local
function M.pick_node(node, x, y, node_click_area)
local is_pick = gui_pick_node(node, x, y)

View File

@ -1,6 +1,5 @@
---@class druid.widget: druid.component
---@field druid druid.instance Ready to use druid instance
---@field root node Is it really needed?
---@class GUITextMetrics
---@field width number

View File

@ -1,18 +1,16 @@
-- Hello! Wish you a good day!
-- Hello, Defolder! Wish you a good day!
local events = require("event.events")
local const = require("druid.const")
local helper = require("druid.helper")
local settings = require("druid.system.settings")
local base_component = require("druid.component")
local druid_component = require("druid.component")
---@class druid.instance
---@field components_all druid.component[] All created components
---@field components_interest table<string, druid.component[]> All components sorted by interest
---@field url url
---@field private _context table Druid context
---@field private _context table Druid context, usually a self of gui script
---@field private _style table Druid style table
---@field private _deleted boolean
---@field private _is_late_remove_enabled boolean
---@field private _late_remove druid.component[]
---@field private _input_blacklist druid.component[]|nil
@ -25,6 +23,7 @@ local M = {}
local MSG_ADD_FOCUS = hash("acquire_input_focus")
local MSG_REMOVE_FOCUS = hash("release_input_focus")
local IS_NO_AUTO_INPUT = sys.get_config_int("druid.no_auto_input", 0) == 1
local INTERESTS_CACHE = {} -- Cache interests per component class in runtime
local function set_input_state(self, is_input_inited)
if IS_NO_AUTO_INPUT or (self.input_inited == is_input_inited) then
@ -36,17 +35,19 @@ local function set_input_state(self, is_input_inited)
end
-- The a and b - two Druid components
---@private
local function sort_input_comparator(a, b)
local a_priority = a:get_input_priority()
local b_priority = b:get_input_priority()
---@param component_a druid.component
---@param component_b druid.component
---@return boolean
local function sort_input_comparator(component_a, component_b)
local a_priority = component_a:get_input_priority()
local b_priority = component_b:get_input_priority()
if a_priority ~= b_priority then
return a_priority < b_priority
end
return a:get_uid() < b:get_uid()
return component_a:get_uid() < component_b:get_uid()
end
@ -60,64 +61,62 @@ local function sort_input_stack(self)
end
-- Create the Druid component instance
local function create(self, instance_class)
local instance = instance_class()
instance:setup_component(self, self._context, self._style, instance_class)
---Get current component interests
---@param instance druid.component
---@return table interest_list List of component interests
local function get_component_interests(instance)
---@diagnostic disable-next-line: invisible
local instance_class = instance._meta.instance_class
if INTERESTS_CACHE[instance_class] then
return INTERESTS_CACHE[instance_class]
end
local interests = {}
for index = 1, #const.ALL_INTERESTS do
local interest = const.ALL_INTERESTS[index]
if instance[interest] and type(instance[interest]) == "function" then
table.insert(interests, interest)
end
end
INTERESTS_CACHE[instance_class] = interests
return INTERESTS_CACHE[instance_class]
end
---@private
---@param self druid.instance
---@param instance druid.component
local function register_interests(self, instance)
table.insert(self.components_all, instance)
local register_to = instance:__get_interests()
for i = 1, #register_to do
local interest = register_to[i]
local interest_list = get_component_interests(instance)
for i = 1, #interest_list do
local interest = interest_list[i]
table.insert(self.components_interest[interest], instance)
end
end
-- Create the Druid component instance
---@param self druid.instance
---@param instance_class druid.component
---@return druid.component
local function create(self, instance_class)
local instance = instance_class()
instance:setup_component(self, self:get_context(), self:get_style(), instance_class)
register_interests(self, instance)
return instance
end
local WIDGET_METATABLE = { __index = base_component }
---Create the Druid component instance
---@private
---@param self druid.instance
---@param widget_class druid.component
---@param widget_class druid.widget
---@return druid.widget
local function create_widget(self, widget_class)
local instance = setmetatable({}, {
__index = setmetatable(widget_class, WIDGET_METATABLE)
})
instance._component = {
_uid = base_component.create_uid(),
name = "Druid Widget",
input_priority = const.PRIORITY_INPUT,
default_input_priority = const.PRIORITY_INPUT,
_is_input_priority_changed = true, -- Default true for sort once time after GUI init
}
instance._meta = {
druid = self,
template = "",
nodes = nil,
context = self._context,
style = nil,
input_enabled = true,
children = {},
parent = type(self._context) ~= "userdata" and self._context,
instance_class = widget_class
}
-- Register
if instance._meta.parent then
instance._meta.parent:__add_child(instance)
end
table.insert(self.components_all, instance)
local register_to = instance:__get_interests()
for i = 1, #register_to do
local interest = register_to[i]
table.insert(self.components_interest[interest], instance)
end
local instance = druid_component.create_widget(self, widget_class, self:get_context())
register_interests(self, instance)
return instance
end
@ -176,8 +175,9 @@ function M:_process_input(action_id, action, components)
for i = #components, 1, -1 do
local component = components[i]
local meta = component._meta
if meta.input_enabled and self:_can_use_input_component(component) then
local input_enabled = component:get_input_enabled()
if input_enabled and self:_can_use_input_component(component) then
if not is_input_consumed then
is_input_consumed = component:on_input(action_id, action) or false
else
@ -210,7 +210,6 @@ end
function M:initialize(context, style)
self._context = context
self._style = style or settings.default_style
self._deleted = false
self._is_late_remove_enabled = false
self._late_remove = {}
@ -257,8 +256,6 @@ function M:final()
end
end
self._deleted = true
set_input_state(self, false)
events.unsubscribe("druid.window_event", self.on_window_event, self)
@ -303,9 +300,9 @@ function M:remove(component)
end
end
local interests = component:__get_interests()
for i = 1, #interests do
local interest = interests[i]
local interest_list = get_component_interests(component)
for i = 1, #interest_list do
local interest = interest_list[i]
local components = self.components_interest[interest]
for j = #components, 1, -1 do
if components[j] == component then
@ -318,6 +315,22 @@ function M:remove(component)
end
---Get a context of Druid instance (usually a self of gui script)
---@package
---@return any
function M:get_context()
return self._context
end
---Get a style of Druid instance
---@package
---@return table
function M:get_style()
return self._style
end
---Druid late update function called after initialization and before the regular update step.
---This function is used to check the GUI state and perform actions after all components and nodes have been created.
---An example use case is performing an auto stencil check in the GUI hierarchy for input components.
@ -506,7 +519,7 @@ end
local button = require("druid.base.button")
---Create Button component
---@param node string|node The node_id or gui.get_node(node_id)
---@param callback function|nil Button callback
---@param callback function|event|nil Button callback
---@param params any|nil Button callback params
---@param anim_node node|string|nil Button anim node (node, if not provided)
---@return druid.button Button component

View File

@ -102,13 +102,16 @@ end
function M:clear_created_properties()
for index = 1, #self.properties do
local property = self.properties[index]
local root = property.root --[[@as node]]
if root then
-- If prefab used clone nodes we can remove it
if property:get_nodes() then
gui.delete_node(property.root)
gui.delete_node(root)
else
-- Probably we have component placed on scene directly
gui.set_enabled(property.root, false)
gui.set_enabled(root, false)
end
end
self.druid:remove(self.properties[index])

View File

@ -13,7 +13,7 @@ function M.get_examples()
code_url = "example/examples/basic/button/basic_button.lua",
component_class = require("example.examples.basic.button.basic_button"),
properties_control = function(instance, properties_panel)
---@cast instance basic_button
---@cast instance examples.basic_button
local checkbox = properties_panel:add_checkbox("ui_enabled", false, function(value)
instance.button:set_enabled(value)
@ -21,7 +21,7 @@ function M.get_examples()
checkbox:set_value(true)
end,
on_create = function(instance, output_log)
---@cast instance basic_button
---@cast instance examples.basic_button
instance.button.on_click:subscribe(function()
output_log:add_log_text("Button Clicked")
end)
@ -35,7 +35,7 @@ function M.get_examples()
code_url = "example/examples/basic/button/basic_button_double_click.lua",
component_class = require("example.examples.basic.button.basic_button_double_click"),
on_create = function(instance, output_log)
---@cast instance basic_button_double_click
---@cast instance examples.basic_button_double_click
instance.button.on_click:subscribe(function()
output_log:add_log_text("Clicked")
end)
@ -52,7 +52,7 @@ function M.get_examples()
code_url = "example/examples/basic/button/basic_button_hold.lua",
component_class = require("example.examples.basic.button.basic_button_hold"),
on_create = function(instance, output_log)
---@cast instance basic_button_hold
---@cast instance examples.basic_button_hold
instance.button.on_click:subscribe(function()
output_log:add_log_text("Clicked")
end)
@ -69,7 +69,7 @@ function M.get_examples()
code_url = "example/examples/basic/text/basic_text.lua",
component_class = require("example.examples.basic.text.basic_text"),
properties_control = function(instance, properties_panel)
---@cast instance basic_text
---@cast instance examples.basic_text
local adjust_index = 1
local adjust_types = {
@ -100,7 +100,7 @@ function M.get_examples()
gui.PIVOT_NW,
}
---@cast instance rich_text_tags
---@cast instance examples.rich_text_tags
properties_panel:add_button("ui_pivot_next", function()
pivot_index = pivot_index + 1
if pivot_index > #pivot_list then
@ -110,7 +110,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance multiline_text
---@cast instance examples.multiline_text
local info = ""
info = info .. "Text Adjust: " .. instance.text.adjust_type .. "\n"
@ -127,7 +127,7 @@ function M.get_examples()
code_url = "example/examples/basic/text/multiline_text.lua",
component_class = require("example.examples.basic.text.multiline_text"),
properties_control = function(instance, properties_panel)
---@cast instance multiline_text
---@cast instance examples.multiline_text
local adjust_index = 1
local adjust_types = {
@ -167,7 +167,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance multiline_text
---@cast instance examples.multiline_text
local info = ""
info = info .. "Text Adjust: " .. instance.text.adjust_type .. "\n"
@ -208,7 +208,7 @@ function M.get_examples()
code_url = "example/examples/basic/slider/basic_slider.lua",
component_class = require("example.examples.basic.slider.basic_slider"),
on_create = function(instance, output_log)
---@cast instance basic_slider
---@cast instance examples.basic_slider
instance.slider.on_change_value:subscribe(function(_, value)
local value = helper.round(value, 2)
output_log:add_log_text("Slider Value: " .. value)
@ -223,7 +223,7 @@ function M.get_examples()
code_url = "example/examples/basic/slider/basic_slider_vertical.lua",
component_class = require("example.examples.basic.slider.basic_slider_vertical"),
on_create = function(instance, output_log)
---@cast instance basic_slider_vertical
---@cast instance examples.basic_slider_vertical
instance.slider.on_change_value:subscribe(function(_, value)
local value = helper.round(value, 2)
output_log:add_log_text("Slider Value: " .. value)
@ -238,7 +238,7 @@ function M.get_examples()
code_url = "example/examples/basic/slider/basic_slider_stepped.lua",
component_class = require("example.examples.basic.slider.basic_slider_stepped"),
on_create = function(instance, output_log)
---@cast instance basic_slider
---@cast instance examples.basic_slider_stepped
instance.slider.on_change_value:subscribe(function(_, value)
local value = helper.round(value, 2)
output_log:add_log_text("Slider Value: " .. value)
@ -253,7 +253,7 @@ function M.get_examples()
code_url = "example/examples/basic/progress_bar/basic_progress_bar.lua",
component_class = require("example.examples.basic.progress_bar.basic_progress_bar"),
properties_control = function(instance, properties_panel)
---@cast instance basic_progress_bar
---@cast instance examples.basic_progress_bar
properties_panel:add_slider("ui_value", 1, function(value)
instance:set_value(value)
end)
@ -267,7 +267,7 @@ function M.get_examples()
code_url = "example/examples/basic/progress_bar/basic_progress_bar_slice9.lua",
component_class = require("example.examples.basic.progress_bar.basic_progress_bar_slice9"),
properties_control = function(instance, properties_panel)
---@cast instance basic_progress_bar_slice9
---@cast instance examples.basic_progress_bar_slice9
properties_panel:add_slider("ui_value", 1, function(value)
instance:set_value(value)
end)
@ -281,7 +281,7 @@ function M.get_examples()
code_url = "example/examples/basic/blocker/basic_blocker.lua",
component_class = require("example.examples.basic.blocker.basic_blocker"),
on_create = function(instance, output_log)
---@cast instance basic_blocker
---@cast instance examples.basic_blocker
instance.button_root.on_click:subscribe(function()
output_log:add_log_text("Root Clicked")
end)
@ -306,7 +306,7 @@ function M.get_examples()
code_url = "example/examples/basic/timer/basic_timer.lua",
component_class = require("example.examples.basic.timer.basic_timer"),
on_create = function(instance, output_log)
---@cast instance basic_timer
---@cast instance examples.basic_timer
instance.on_cycle_end:subscribe(function()
output_log:add_log_text("Timer Cycle End")
end)
@ -320,7 +320,7 @@ function M.get_examples()
code_url = "example/examples/basic/hotkey/basic_hotkey.lua",
component_class = require("example.examples.basic.hotkey.basic_hotkey"),
on_create = function(instance, output_log)
---@cast instance basic_hotkey
---@cast instance examples.basic_hotkey
instance.hotkey.on_hotkey_released:subscribe(function()
output_log:add_log_text("Hotkey Released")
end)
@ -334,7 +334,7 @@ function M.get_examples()
code_url = "example/examples/basic/scroll/scroll.lua",
component_class = require("example.examples.basic.scroll.scroll"),
on_create = function(instance, output_log)
---@cast instance scroll
---@cast instance examples.scroll
instance.button_tutorial.on_click:subscribe(function()
output_log:add_log_text("Button Tutorial Clicked")
end)
@ -343,7 +343,7 @@ function M.get_examples()
end)
end,
properties_control = function(instance, properties_panel)
---@cast instance scroll
---@cast instance examples.scroll
local scroll = instance.scroll
local is_stretch = instance.scroll.style.EXTRA_STRETCH_SIZE > 0
properties_panel:add_checkbox("ui_elastic_scroll", is_stretch, function(value)
@ -386,7 +386,7 @@ function M.get_examples()
wheel_by_inertion:set_value(scroll.style.WHEEL_SCROLL_BY_INERTION)
end,
get_debug_info = function(instance)
---@cast instance scroll
---@cast instance examples.scroll
local info = ""
local s = instance.scroll
@ -406,7 +406,7 @@ function M.get_examples()
code_url = "example/examples/basic/scroll_slider/scroll_slider.lua",
component_class = require("example.examples.basic.scroll_slider.scroll_slider"),
get_debug_info = function(instance)
---@cast instance scroll_slider
---@cast instance examples.scroll_slider
local info = ""
local s = instance.scroll
@ -426,7 +426,7 @@ function M.get_examples()
code_url = "example/examples/basic/grid/grid.lua",
component_class = require("example.examples.basic.grid.grid"),
properties_control = function(instance, properties_panel)
---@cast instance grid
---@cast instance examples.grid
local grid = instance.grid
@ -495,7 +495,7 @@ function M.get_examples()
slider_size:set_value(0.5)
end,
get_debug_info = function(instance)
---@cast instance grid
---@cast instance examples.grid
local info = ""
local grid = instance.grid
@ -514,7 +514,7 @@ function M.get_examples()
code_url = "example/examples/basic/scroll_bind_grid/scroll_bind_grid.lua",
component_class = require("example.examples.basic.scroll_bind_grid.scroll_bind_grid"),
properties_control = function(instance, properties_panel)
---@cast instance scroll_bind_grid
---@cast instance examples.scroll_bind_grid
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -538,7 +538,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance scroll_bind_grid
---@cast instance examples.scroll_bind_grid
local info = ""
local s = instance.scroll
@ -567,7 +567,7 @@ function M.get_examples()
code_url = "example/examples/basic/scroll_bind_grid/scroll_bind_grid_horizontal.lua",
component_class = require("example.examples.basic.scroll_bind_grid.scroll_bind_grid_horizontal"),
properties_control = function(instance, properties_panel)
---@cast instance scroll_bind_grid_horizontal
---@cast instance examples.scroll_bind_grid_horizontal
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -593,7 +593,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance scroll_bind_grid_horizontal
---@cast instance examples.scroll_bind_grid_horizontal
local info = ""
local s = instance.scroll
@ -621,7 +621,7 @@ function M.get_examples()
code_url = "example/examples/basic/scroll_bind_grid/scroll_bind_grid_points.lua",
component_class = require("example.examples.basic.scroll_bind_grid.scroll_bind_grid_points"),
properties_control = function(instance, properties_panel)
---@cast instance scroll_bind_grid_points
---@cast instance examples.scroll_bind_grid_points
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -645,7 +645,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance scroll_bind_grid_points
---@cast instance examples.scroll_bind_grid_points
local info = ""
local s = instance.scroll
@ -674,12 +674,18 @@ function M.get_examples()
code_url = "example/examples/basic/input/basic_input.lua",
component_class = require("example.examples.basic.input.basic_input"),
on_create = function(instance, output_log)
---@cast instance basic_input
---@cast instance examples.basic_input
instance.input.on_input_select:subscribe(function()
output_log:add_log_text("Input Selected")
end)
instance.input_2.on_input_select:subscribe(function()
output_log:add_log_text("Input 2 Selected")
end)
instance.input.on_input_unselect:subscribe(function(_, text)
output_log:add_log_text("Input: " .. text)
output_log:add_log_text("Input Deselected. Text: " .. text)
end)
instance.input_2.on_input_unselect:subscribe(function(_, text)
output_log:add_log_text("Input 2: " .. text)
output_log:add_log_text("Input Deselected. Text: " .. text)
end)
end,
},
@ -691,7 +697,7 @@ function M.get_examples()
code_url = "example/examples/basic/input/input_password.lua",
component_class = require("example.examples.basic.input.input_password"),
on_create = function(instance, output_log)
---@cast instance input_password
---@cast instance examples.input_password
instance.input.on_input_unselect:subscribe(function(_, text)
output_log:add_log_text("Input: " .. text)
end)
@ -705,7 +711,7 @@ function M.get_examples()
code_url = "example/examples/basic/input/rich_input.lua",
component_class = require("example.examples.basic.input.rich_input"),
on_create = function(instance, output_log)
---@cast instance rich_input
---@cast instance examples.rich_input
instance.rich_input.input.on_input_unselect:subscribe(function(_, text)
output_log:add_log_text("Input: " .. text)
end)
@ -743,7 +749,7 @@ function M.get_examples()
gui.PIVOT_NW,
}
---@cast instance rich_text_tags
---@cast instance examples.rich_text_tags
properties_panel:add_button("ui_pivot_next", function()
pivot_index = pivot_index + 1
if pivot_index > #pivot_list then
@ -799,7 +805,7 @@ function M.get_examples()
code_url = "example/examples/basic/swipe/basic_swipe.lua",
component_class = require("example.examples.basic.swipe.basic_swipe"),
on_create = function(instance, output_log)
---@cast instance basic_swipe
---@cast instance examples.basic_swipe
instance.swipe.on_swipe:subscribe(function(_, side, dist, delta_time)
output_log:add_log_text("Swipe Side: " .. side)
end)
@ -813,7 +819,7 @@ function M.get_examples()
code_url = "example/examples/basic/checkbox/checkbox.lua",
component_class = require("example.examples.basic.checkbox.checkbox"),
on_create = function(instance, output_log)
---@cast instance checkbox
---@cast instance examples.checkbox
instance.button.on_click:subscribe(function()
output_log:add_log_text("Checkbox Clicked: " .. tostring(instance.is_enabled))
end)
@ -827,7 +833,7 @@ function M.get_examples()
code_url = "example/examples/basic/checkbox_group/checkbox_group.lua",
component_class = require("example.examples.basic.checkbox_group.checkbox_group"),
on_create = function(instance, output_log)
---@cast instance checkbox_group
---@cast instance examples.checkbox_group
instance.on_state_changed:subscribe(function(state1, state2, state3)
output_log:add_log_text("State: " .. tostring(state1) .. " " .. tostring(state2) .. " " .. tostring(state3))
end)
@ -841,7 +847,7 @@ function M.get_examples()
code_url = "example/examples/basic/radio_group/radio_group.lua",
component_class = require("example.examples.basic.radio_group.radio_group"),
on_create = function(instance, output_log)
---@cast instance radio_group
---@cast instance examples.radio_group
instance.on_state_changed:subscribe(function(selected)
output_log:add_log_text("Selected: " .. selected)
end)

View File

@ -34,6 +34,37 @@ nodes {
inherit_alpha: true
template: "/example/templates/slider.gui"
}
nodes {
size {
x: 40.0
y: 260.0
}
type: TYPE_BOX
id: "slider/root"
parent: "slider"
overridden_fields: 4
template_node_child: true
}
nodes {
rotation {
z: 90.0
}
type: TYPE_BOX
id: "slider/slider_back"
parent: "slider/root"
overridden_fields: 2
template_node_child: true
}
nodes {
position {
y: 118.0
}
type: TYPE_BOX
id: "slider/slider_pin"
parent: "slider/root"
overridden_fields: 1
template_node_child: true
}
nodes {
position {
y: 170.0

View File

@ -48,7 +48,7 @@ end
---@param index number
---@param node node
---@param instance button_component
---@param instance examples.button_component
---@param data table
function M:on_element_add(index, node, instance, data)
instance.text:set_text("Data Item " .. index)
@ -62,7 +62,7 @@ function M:on_element_remove(index, node, instance, data)
end
---@param instance button_component
---@param instance examples.button_component
function M:on_button_click(instance)
local data = instance:get_data()
self.on_item_click:trigger(data)

View File

@ -11,13 +11,13 @@ function M.get_examples()
code_url = "example/examples/data_list/basic/data_list_basic.lua",
component_class = require("example.examples.data_list.basic.data_list_basic"),
on_create = function(instance, output_list)
---@cast instance data_list_basic
---@cast instance examples.data_list_basic
instance.on_item_click:subscribe(function(index)
output_list:add_log_text("Item clicked: " .. index)
end)
end,
properties_control = function(instance, properties_panel)
---@cast instance data_list_basic
---@cast instance examples.data_list_basic
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -31,7 +31,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance data_list_basic
---@cast instance examples.data_list_basic
local data_list = instance.data_list
local data = data_list:get_data()
@ -59,7 +59,7 @@ function M.get_examples()
code_url = "example/examples/data_list/basic/data_list_horizontal_basic.lua",
component_class = require("example.examples.data_list.basic.data_list_horizontal_basic"),
properties_control = function(instance, properties_panel)
---@cast instance data_list_horizontal_basic
---@cast instance examples.data_list_horizontal_basic
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -69,7 +69,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance data_list_horizontal_basic
---@cast instance examples.data_list_horizontal_basic
local data_list = instance.data_list
local data = data_list:get_data()
@ -97,14 +97,14 @@ function M.get_examples()
code_url = "example/examples/data_list/add_remove_clear/data_list_add_remove_clear.lua",
component_class = require("example.examples.data_list.add_remove_clear.data_list_add_remove_clear"),
on_create = function(instance, output_list)
---@cast instance data_list_add_remove_clear
---@cast instance examples.data_list_add_remove_clear
instance.on_item_click:subscribe(function(index)
instance:remove_item(index)
output_list:add_log_text("Item removed: " .. index)
end)
end,
properties_control = function(instance, properties_panel)
---@cast instance data_list_add_remove_clear
---@cast instance examples.data_list_add_remove_clear
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -130,7 +130,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance data_list_add_remove_clear
---@cast instance examples.data_list_add_remove_clear
local data_list = instance.data_list
local data = data_list:get_data()
@ -158,13 +158,13 @@ function M.get_examples()
code_url = "example/examples/data_list/cache_with_component/cache_with_component.lua",
component_class = require("example.examples.data_list.cache_with_component.cache_with_component"),
on_create = function(instance, output_list)
---@cast instance data_list_cache_with_component
---@cast instance examples.data_list_cache_with_component
instance.on_item_click:subscribe(function(index)
output_list:add_log_text("Item clicked: " .. index)
end)
end,
properties_control = function(instance, properties_panel)
---@cast instance data_list_cache_with_component
---@cast instance examples.data_list_cache_with_component
local view_node = instance.scroll.view_node
local is_stencil = gui.get_clipping_mode(view_node) == gui.CLIPPING_MODE_STENCIL
@ -178,7 +178,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance data_list_cache_with_component
---@cast instance examples.data_list_cache_with_component
local data_list = instance.data_list
local data = data_list:get_data()

View File

@ -12,7 +12,7 @@ function M.get_examples()
code_url = "example/examples/gamepad/gamepad_tester/gamepad_tester.lua",
component_class = require("example.examples.gamepad.gamepad_tester.gamepad_tester"),
on_create = function(instance, output_list)
---@cast instance gamepad_tester
---@cast instance examples.gamepad_tester
instance.button_left.on_click:subscribe(function()
output_list:add_log_text("Button Left Clicked")
end)

View File

@ -3,7 +3,7 @@ local on_screen_input = require("example.examples.gamepad.on_screen_control.on_s
---@class examples.on_screen_control: druid.component
---@field druid druid.instance
---@field on_screen_input on_screen_input
---@field on_screen_input examples.on_screen_input
local M = component.create("on_screen_control")
local CHARACTER_SPEED = 700
@ -19,7 +19,7 @@ function M:init(template, nodes)
self.character_eye_left = self:get_node("eye_left")
self.character_eye_right = self:get_node("eye_right")
self.on_screen_input = self.druid:new(on_screen_input, "on_screen_input") --[[@as on_screen_input]]
self.on_screen_input = self.druid:new(on_screen_input, "on_screen_input")
self.on_screen_input.on_action:subscribe(self.on_action_button, self)
self.on_screen_input.on_movement:subscribe(self.on_movement, self)

View File

@ -12,7 +12,7 @@ function M.get_examples()
code_url = "example/examples/layout/basic/basic_layout.lua",
component_class = require("example.examples.layout.basic.basic_layout"),
properties_control = function(instance, properties_panel)
---@cast instance basic_layout
---@cast instance examples.basic_layout
properties_panel:add_slider("ui_padding", 0, function(value)
local padding = math.floor((value * 64) * 100) / 100
@ -71,7 +71,7 @@ function M.get_examples()
end)
end,
get_debug_info = function(instance)
---@cast instance basic_layout
---@cast instance examples.basic_layout
local layout = instance.layout
local p = layout.padding
local info = ""

View File

@ -20,7 +20,7 @@ function M.get_examples()
code_url = "example/examples/panthera/animation_blend/animation_blend.lua",
component_class = require("example.examples.panthera.animation_blend.animation_blend"),
properties_control = function(instance, properties_panel)
---@cast instance animation_blend
---@cast instance examples.animation_blend
local vertical_time = panthera.get_time(instance.animation_vertical)
local vertical_slider = properties_panel:add_slider("ui_animation_vertical", vertical_time, function(value)

View File

@ -12,7 +12,7 @@ function M.get_examples()
code_url = "example/examples/windows/window_language/window_language.lua",
component_class = require("example.examples.windows.window_language.window_language"),
on_create = function(instance, output_list)
---@cast instance window_language
---@cast instance examples.window_language
instance.on_language_change:subscribe(function(language)
output_list:add_log_text("Language changed to " .. language)
end)
@ -26,7 +26,7 @@ function M.get_examples()
code_url = "example/examples/windows/window_confirmation/window_confirmation.lua",
component_class = require("example.examples.windows.window_confirmation.window_confirmation"),
on_create = function(instance, output_list)
---@cast instance window_confirmation
---@cast instance examples.window_confirmation
instance.text_header:translate("ui_confirmation")
instance.text_button_accept:translate("ui_confirm")
instance.text_button_decline:translate("ui_cancel")
@ -48,7 +48,7 @@ function M.get_examples()
code_url = "example/examples/windows/window_info/window_info.lua",
component_class = require("example.examples.windows.window_info.window_info"),
on_create = function(instance, output_list)
---@cast instance window_info
---@cast instance examples.window_info
instance.text_header:translate("ui_information")
instance.text_button_accept:translate("ui_confirm")
instance.text_description:translate("ui_example_window_information_text")