This commit is contained in:
Insality 2025-03-06 00:27:51 +02:00
parent 9bb7c6e8bd
commit 1a138f7020
53 changed files with 367 additions and 81 deletions

View File

@ -0,0 +1,6 @@
# Back Handler Quick API reference
```lua
back_handler:init([callback], [params])
back_handler:on_input([action_id], [action])
```

View File

@ -0,0 +1,8 @@
# Blocker Quick API reference
```lua
blocker:init(node)
blocker:is_enabled()
blocker:on_input([action_id], [action])
blocker:set_enabled([state])
```

View File

View File

View File

@ -0,0 +1,14 @@
# Drag Quick API reference
```lua
drag:init(node_or_node_id, on_drag_callback)
drag:is_enabled()
drag:on_input([action_id], [action])
drag:on_input_interrupt()
drag:on_late_init()
drag:on_style_change(style)
drag:on_window_resized()
drag:set_click_zone([node])
drag:set_drag_cursors([is_enabled])
drag:set_enabled([is_enabled])
```

View File

View File

@ -0,0 +1,16 @@
# Hover Quick API reference
```lua
hover:init(node, on_hover_callback, on_mouse_hover)
hover:is_enabled()
hover:is_hovered()
hover:is_mouse_hovered()
hover:on_input([action_id], [action])
hover:on_input_interrupt()
hover:on_late_init()
hover:on_style_change(style)
hover:set_click_zone([zone])
hover:set_enabled([state])
hover:set_hover([state])
hover:set_mouse_hover([state])
```

View File

View File

@ -0,0 +1,20 @@
# Scroll Quick API reference
```lua
scroll:init(view_node, content_node)
scroll:bind_grid([grid], [callback])
scroll:get_percent()
scroll:on_input([action_id], [action])
scroll:on_layout_change()
scroll:on_late_init()
scroll:on_remove()
scroll:on_style_change(style)
scroll:scroll_to(point, [is_instant])
scroll:scroll_to_index(index, [skip_cb])
scroll:scroll_to_percent(percent, [is_instant])
scroll:set_click_zone([zone])
scroll:set_horizontal_scroll([is_horizontal])
scroll:set_size(size, [offset])
scroll:set_vertical_scroll([is_vertical])
scroll:update(dt)
```

View File

View File

@ -0,0 +1,17 @@
# Static Grid Quick API reference
```lua
static_grid:init(parent, element, [in_row])
static_grid:add(item, [index], [shift_policy], [is_instant])
static_grid:get_index(pos)
static_grid:get_index_by_node(node)
static_grid:get_pos(index)
static_grid:get_size()
static_grid:get_size_for(count)
static_grid:on_layout_change()
static_grid:on_style_change(style)
static_grid:refresh()
static_grid:remove(index, [shift_policy], [is_instant])
static_grid:set_anchor(anchor)
static_grid:set_items(nodes, [is_instant])
static_grid:set_pivot(pivot)

View File

@ -0,0 +1,17 @@
# Text Quick API reference
```lua
text:init(node, [value], [adjust_type])
text:get_text()
text:get_text_index_by_width(width)
text:get_text_size([text])
text:is_multiline()
text:on_layout_change()
text:on_style_change(style)
text:set_alpha(alpha)
text:set_color(color)
text:set_pivot(pivot)
text:set_scale(scale)
text:set_size(size)
text:set_text(new_text)
text:set_text_adjust([adjust_type], [minimal_scale])

View File

View File

@ -0,0 +1,12 @@
## Rich Input Quick API reference
```lua
rich_input:get_text()
rich_input:init(template, nodes)
rich_input:on_input([action_id], [action])
rich_input:select()
rich_input:set_allowed_characters(characters)
rich_input:set_font(font)
rich_input:set_placeholder(placeholder_text)
rich_input:set_text(text)
```

View File

@ -0,0 +1,15 @@
## Rich Text Quick API reference
```lua
rich_text:characters(word)
rich_text:clear()
rich_text:get_line_metric()
rich_text:get_text()
rich_text:get_words()
rich_text:init(text_node, [value])
rich_text:on_layout_change()
rich_text:on_remove()
rich_text:on_style_change(style)
rich_text:set_text([text])
rich_text:tagged(tag)
```

View File

@ -0,0 +1,26 @@
# Container Quick API reference
```lua
container:add_container(node_or_container, [mode], [on_resize_callback])
container:clear_draggable_corners()
container:fit_into_size(target_size)
container:fit_into_window()
container:get_position()
container:get_scale()
container:get_size()
container:init(node, [mode], [callback])
container:on_late_init()
container:on_remove()
container:on_style_change(style)
container:on_window_resized()
container:refresh()
container:refresh_origins()
container:set_draggable_corners([is_draggable])
container:set_min_size([min_size_x], [min_size_y])
container:set_node_fill([fill_x], [fill_y])
container:set_node_offset([offset])
container:set_parent_container([container])
container:set_pivot(pivot)
container:set_position(pos_x, pos_y)
container:set_size([width], [height], [anchor_pivot])
container:update_child_containers()

View File

@ -0,0 +1,16 @@
# Data List Quick API reference
```lua
data_list:add(data, [index], [shift_policy])
data_list:clear()
data_list:get_created_components()
data_list:get_created_nodes()
data_list:get_data()
data_list:get_index(data)
data_list:init(scroll, grid, create_function)
data_list:on_remove()
data_list:remove([index], [shift_policy])
data_list:remove_by_data(data, [shift_policy])
data_list:scroll_to_index(index)
data_list:set_data(data)
data_list:set_use_cache(is_use_cache)

View File

@ -0,0 +1,10 @@
# Hotkey Quick API reference
```lua
hotkey:add_hotkey(keys, [callback_argument])
hotkey:init(keys, callback, [callback_argument])
hotkey:is_processing()
hotkey:on_focus_gained()
hotkey:on_input([action_id], [action])
hotkey:on_style_change(style)
hotkey:set_repeat(is_enabled_repeated)

View File

@ -0,0 +1,23 @@
# Input Quick API reference
```lua
input:get_text()
input:get_text_selected()
input:get_text_selected_replaced(text)
input:init(click_node, text_node, [keyboard_type])
input:is_empty()
input:is_full()
input:is_selected()
input:on_focus_lost()
input:on_input([action_id], [action])
input:on_input_interrupt()
input:on_style_change(style)
input:select()
input:select_cursor([index])
input:set_allowed_characters([pattern])
input:set_keyboard_type([keyboard_type])
input:set_marked_text([text])
input:set_max_length([length])
input:set_text([text])
input:unselect()
```

View File

@ -0,0 +1,9 @@
# Lang Text Quick API reference
```lua
lang_text:format(...)
lang_text:init(node, [locale_id], [adjust_type])
lang_text:on_language_change()
lang_text:set_text(text)
lang_text:set_to(text)
lang_text:translate(locale_id, ...)

View File

@ -0,0 +1,18 @@
# Layout Quick API reference
```lua
layout:add(node_or_node_id)
layout:get_content_size()
layout:get_entities()
layout:get_size()
layout:init(node_or_node_id, layout_type)
layout:refresh_layout()
layout:remove(node_or_node_id)
layout:set_dirty()
layout:set_hug_content(is_hug_width, is_hug_height)
layout:set_justify(is_justify)
layout:set_margin([margin_x], [margin_y])
layout:set_node_index(node, index)
layout:set_padding([padding_x], [padding_y], [padding_z], [padding_w])
layout:set_type(type)
layout:update()

View File

@ -0,0 +1,16 @@
# Progress Quick API reference
```lua
progress:empty()
progress:fill()
progress:get()
progress:init(node, key, [init_value])
progress:on_layout_change()
progress:on_remove()
progress:on_style_change(style)
progress:set_max_size(max_size)
progress:set_steps(steps, callback)
progress:set_to(to)
progress:to(to, [callback])
progress:update(dt)
```

View File

@ -0,0 +1,13 @@
# Slider Quick API reference
```lua
slider:init(node, end_pos, [callback])
slider:is_enabled()
slider:on_input([action_id], [action])
slider:on_layout_change()
slider:on_remove()
slider:on_window_resized()
slider:set(value, [is_silent])
slider:set_enabled(is_enabled)
slider:set_input_node([input_node])
slider:set_steps(steps)

View File

@ -0,0 +1,9 @@
# Swipe Quick API reference
```lua
swipe:init(node_or_node_id, on_swipe_callback)
swipe:on_input([action_id], [action])
swipe:on_input_interrupt()
swipe:on_late_init()
swipe:on_style_change(style)
swipe:set_click_zone([zone])

View File

@ -0,0 +1,10 @@
# Timer Quick API reference
```lua
timer:init(node, [seconds_from], [seconds_to], [callback])
timer:on_layout_change()
timer:set_interval(from, to)
timer:set_state([is_on])
timer:set_to(set_to)
timer:update(dt)
```

View File

@ -44,34 +44,37 @@ self.druid = druid.new(context, [style])
## Druid Instance
```lua
-- Lifecycle
self.druid:final()
self.druid:update(dt)
self.druid:on_input(action_id, action)
self.druid:on_message(message_id, message, sender)
self.druid:on_window_event([window_event])
-- Component creation
self.druid:new(component, ...)
self.druid:new_widget(widget, [template], [nodes], ...)
self.druid:new_button(node, [callback], [params], [anim_node])
self.druid:new_text(node, [value], [no_adjust])
self.druid:new_grid(parent_node, item, [in_row])
self.druid:new_scroll(view_node, content_node)
self.druid:new_data_list(druid_scroll, druid_grid, create_function)
self.druid:new_progress(node, key, [init_value])
self.druid:new_lang_text(node, [locale_id], [adjust_type])
self.druid:new_rich_text(text_node, [value])
self.druid:new_back_handler([callback], [params])
self.druid:new_blocker(node)
self.druid:new_button(node, [callback], [params], [anim_node])
self.druid:new_container(node, [mode], [callback])
self.druid:new_data_list(druid_scroll, druid_grid, create_function)
self.druid:new_drag(node, [on_drag_callback])
self.druid:new_grid(parent_node, item, [in_row])
self.druid:new_hotkey(keys_array, [callback], [callback_argument])
self.druid:new_hover(node, [on_hover_callback], [on_mouse_hover_callback])
self.druid:new_input(click_node, text_node, [keyboard_type])
self.druid:new_lang_text(node, [locale_id], [adjust_type])
self.druid:new_layout(node, [mode])
self.druid:new_progress(node, key, [init_value])
self.druid:new_rich_input(template, [nodes])
self.druid:new_rich_text(text_node, [value])
self.druid:new_scroll(view_node, content_node)
self.druid:new_slider(pin_node, end_pos, [callback])
self.druid:new_drag(node, [on_drag_callback])
self.druid:new_swipe(node, [on_swipe_callback])
self.druid:new_text(node, [value], [no_adjust])
self.druid:new_input(click_node, text_node, [keyboard_type])
self.druid:new_rich_input(template, [nodes])
self.druid:new_layout(node, [mode])
self.druid:new_container(node, [mode], [callback])
self.druid:new_hotkey(keys_array, [callback], [callback_argument])
self.druid:new_slider(pin_node, end_pos, [callback])
self.druid:new_timer(node, [seconds_from], [seconds_to], [callback])
self.druid:new_widget(widget, [template], [nodes], ...)
self.druid:on_window_event([window_event])
self.druid:remove(component)
self.druid:set_blacklist(blacklist_components)
self.druid:set_whitelist(whitelist_components)
@ -81,6 +84,8 @@ self.druid:set_whitelist(whitelist_components)
### Base Component
Basic methods for all components.
```lua
component:get_childrens()
component:get_context()

View File

@ -5,6 +5,7 @@ local druid_instance = require("druid.system.druid_instance")
local default_style = require("druid.styles.default.style")
---Entry point for Druid UI Framework. Create a new Druid instance and adjust the settings.
---@class druid
local M = {}
@ -87,7 +88,7 @@ end
local WRAPPED_WIDGETS = {}
---Set a widget to the current game object. The game object can acquire the widget by calling `bindings.get_widget`
---It wraps with events only top level functions cross-context, so no access to nested widgets functions
---It wraps with events only top level functions cross-context, so you will have no access to nested widgets functions
---@param widget druid.widget
function M.set_widget(widget)
local object = msg.url()

View File

@ -16,65 +16,6 @@ local component = require("druid.component")
local M = component.create("progress")
local function check_steps(self, from, to, exactly)
if not self.steps then
return
end
for i = 1, #self.steps do
local step = self.steps[i]
local v1, v2 = from, to
if v1 > v2 then
v1, v2 = v2, v1
end
if v1 < step and step < v2 then
self.step_callback(self:get_context(), step)
end
if exactly and exactly == step then
self.step_callback(self:get_context(), step)
end
end
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[self.key]
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)
if not is_silent then
check_steps(self, prev_value, set_to)
if prev_value ~= self.last_value then
self.on_change:trigger(self:get_context(), self.last_value)
end
end
end
---@param node string|node Node name or GUI Node itself.
---@param key string Progress bar direction: const.SIDE.X or const.SIDE.Y
---@param init_value number|nil Initial value of progress bar. Default: 1
@ -132,7 +73,7 @@ function M:update(dt)
self:set_to(helper.step(self.last_value, self.target, step))
if self.last_value == self.target then
check_steps(self, prev_value, self.target, self.target)
self:_check_steps(prev_value, self.target, self.target)
if self.target_callback then
self.target_callback(self:get_context(), self.target)
@ -146,13 +87,13 @@ end
---Fill a progress bar and stop progress animation
function M:fill()
set_bar_to(self, 1, true)
self:_set_bar_to(1, true)
end
---Empty a progress bar
function M:empty()
set_bar_to(self, 0, true)
self:_set_bar_to(0, true)
end
@ -160,7 +101,7 @@ end
---@param to number Progress bar value, from 0 to 1
function M:set_to(to)
to = helper.clamp(to, 0, 1)
set_bar_to(self, to)
self:_set_bar_to(to)
end
@ -207,4 +148,68 @@ function M:set_max_size(max_size)
end
---@private
function M:_check_steps(from, to, exactly)
if not self.steps then
return
end
for i = 1, #self.steps do
local step = self.steps[i]
local v1, v2 = from, to
if v1 > v2 then
v1, v2 = v2, v1
end
if v1 < step and step < v2 then
self.step_callback(self:get_context(), step)
end
if exactly and exactly == step then
self.step_callback(self:get_context(), step)
end
end
end
---@private
function M:_set_bar_to(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[self.key]
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)
if not is_silent then
self:_check_steps(prev_value, set_to)
if prev_value ~= self.last_value then
self.on_change:trigger(self:get_context(), self.last_value)
end
end
end
return M