mirror of
https://github.com/Insality/druid.git
synced 2025-09-28 02:22:18 +02:00
More widgets, additional adjusts for text
This commit is contained in:
@@ -3,8 +3,9 @@ local property_slider = require("druid.widget.properties_panel.properties.proper
|
||||
local property_button = require("druid.widget.properties_panel.properties.property_button")
|
||||
local property_input = require("druid.widget.properties_panel.properties.property_input")
|
||||
local property_text = require("druid.widget.properties_panel.properties.property_text")
|
||||
local property_left_right_selector = require("druid.widget.properties_panel.properties.property_left_right_selector")
|
||||
|
||||
---@class properties_panel: druid.widget
|
||||
---@class widget.properties_panel: druid.widget
|
||||
---@field root node
|
||||
---@field scroll druid.scroll
|
||||
---@field druid druid_instance
|
||||
@@ -24,6 +25,9 @@ function M:init()
|
||||
self.default_size = self.container:get_size()
|
||||
|
||||
self.properties = {}
|
||||
self.properties_constructors = {}
|
||||
self.current_page = 1
|
||||
self.properties_per_page = 15
|
||||
|
||||
self.text_header = self.druid:new_text("text_header")
|
||||
self.scroll = self.druid:new_scroll("scroll_view", "scroll_content")
|
||||
@@ -51,6 +55,23 @@ function M:init()
|
||||
|
||||
self.property_text_prefab = self:get_node("property_text/root")
|
||||
gui.set_enabled(self.property_text_prefab, false)
|
||||
|
||||
self.property_left_right_selector_prefab = self:get_node("property_left_right_selector/root")
|
||||
gui.set_enabled(self.property_left_right_selector_prefab, false)
|
||||
|
||||
self.paginator = self:add_left_right_selector("Page", self.current_page, function(value)
|
||||
self.current_page = value
|
||||
self:refresh_page()
|
||||
end):set_number_type(1, 1, true)
|
||||
gui.set_enabled(self.paginator.root, false)
|
||||
|
||||
-- Remove paginator from properties
|
||||
for index = 1, #self.properties do
|
||||
if self.properties[index] == self.paginator then
|
||||
table.remove(self.properties, index)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -66,7 +87,12 @@ function M:clear()
|
||||
self.druid:remove(self.properties[index])
|
||||
end
|
||||
self.layout:clear_layout()
|
||||
self.layout:add(self.paginator.root)
|
||||
|
||||
self.properties = {}
|
||||
self.properties_constructors = {}
|
||||
|
||||
self:refresh_page()
|
||||
end
|
||||
|
||||
|
||||
@@ -88,15 +114,11 @@ end
|
||||
---@param text string
|
||||
---@param initial_value boolean
|
||||
---@param on_change_callback function
|
||||
---@return property_checkbox
|
||||
---@return widget.property_checkbox
|
||||
function M:add_checkbox(text, initial_value, on_change_callback)
|
||||
text = tostring(text)
|
||||
local instance = self:create_from_prefab(property_checkbox, "property_checkbox", self.property_checkbox_prefab)
|
||||
|
||||
local nodes = gui.clone_tree(self.property_checkbox_prefab)
|
||||
local instance = self.druid:new_widget(property_checkbox, "property_checkbox", nodes)
|
||||
self:add_property(instance)
|
||||
|
||||
instance.text_name:set_to(text)
|
||||
instance.text_name:set_text(text)
|
||||
instance:set_value(initial_value, true)
|
||||
instance.button.on_click:subscribe(function()
|
||||
on_change_callback(instance:get_value())
|
||||
@@ -109,12 +131,9 @@ end
|
||||
---@param text string
|
||||
---@param initial_value number
|
||||
---@param on_change_callback function
|
||||
---@return property_slider
|
||||
---@return widget.property_slider
|
||||
function M:add_slider(text, initial_value, on_change_callback)
|
||||
text = tostring(text)
|
||||
local nodes = gui.clone_tree(self.property_slider_prefab)
|
||||
local instance = self.druid:new_widget(property_slider, "property_slider", nodes)
|
||||
self:add_property(instance)
|
||||
local instance = self:create_from_prefab(property_slider, "property_slider", self.property_slider_prefab)
|
||||
|
||||
instance.text_name:set_text(text)
|
||||
instance:set_value(initial_value, true)
|
||||
@@ -129,10 +148,9 @@ end
|
||||
---@param text string
|
||||
---@param on_click_callback function|nil
|
||||
---@param callback_context any|nil
|
||||
---@return widget.property_button
|
||||
function M:add_button(text, on_click_callback, callback_context)
|
||||
local nodes = gui.clone_tree(self.property_button_prefab)
|
||||
local instance = self.druid:new_widget(property_button, "property_button", nodes)
|
||||
self:add_property(instance)
|
||||
local instance = self:create_from_prefab(property_button, "property_button", self.property_button_prefab)
|
||||
|
||||
instance.text_name:set_text(text)
|
||||
if on_click_callback then
|
||||
@@ -143,11 +161,12 @@ function M:add_button(text, on_click_callback, callback_context)
|
||||
end
|
||||
|
||||
|
||||
---@param text string
|
||||
---@param initial_value string
|
||||
---@param on_change_callback function
|
||||
---@return widget.property_input
|
||||
function M:add_input(text, initial_value, on_change_callback)
|
||||
text = tostring(text)
|
||||
local nodes = gui.clone_tree(self.property_input_prefab)
|
||||
local instance = self.druid:new_widget(property_input, "property_input", nodes)
|
||||
self:add_property(instance)
|
||||
local instance = self:create_from_prefab(property_input, "property_input", self.property_input_prefab)
|
||||
|
||||
instance.text_name:set_text(text)
|
||||
instance.rich_input:set_text(initial_value)
|
||||
@@ -155,20 +174,44 @@ function M:add_input(text, initial_value, on_change_callback)
|
||||
instance.rich_input.input.on_input_unselect:subscribe(function(_, value)
|
||||
on_change_callback(value)
|
||||
end)
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
|
||||
---@param text string
|
||||
---@param right_text string|nil
|
||||
---@return property_text
|
||||
---@return widget.property_text
|
||||
function M:add_text(text, right_text)
|
||||
text = tostring(text)
|
||||
local nodes = gui.clone_tree(self.property_text_prefab)
|
||||
local instance = self.druid:new_widget(property_text, "property_text", nodes)
|
||||
self:add_property(instance)
|
||||
local instance = self:create_from_prefab(property_text, "property_text", self.property_text_prefab)
|
||||
|
||||
instance:set_text(text)
|
||||
instance:set_right_text(right_text)
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
|
||||
---@param text string
|
||||
---@param value string|number|nil
|
||||
---@param on_change_callback fun(value: string|number)
|
||||
---@return widget.property_left_right_selector
|
||||
function M:add_left_right_selector(text, value, on_change_callback)
|
||||
local instance = self:create_from_prefab(property_left_right_selector, "property_left_right_selector", self.property_left_right_selector_prefab)
|
||||
|
||||
instance:set_text(text)
|
||||
instance:set_value(value or 0, true)
|
||||
instance.on_change_value:subscribe(on_change_callback)
|
||||
|
||||
return instance
|
||||
end
|
||||
|
||||
|
||||
---@private
|
||||
function M:create_from_prefab(widget_class, widget_name, prefab)
|
||||
local nodes = gui.clone_tree(prefab)
|
||||
local instance = self.druid:new_widget(widget_class, widget_name, nodes)
|
||||
self:add_property(instance)
|
||||
return instance
|
||||
end
|
||||
|
||||
@@ -177,14 +220,36 @@ end
|
||||
function M:add_property(widget)
|
||||
gui.set_enabled(widget.root, true)
|
||||
self.layout:add(widget.root)
|
||||
|
||||
table.insert(self.properties, widget)
|
||||
local width = self.layout:get_size().x - self.layout.padding.x - self.layout.padding.z
|
||||
widget.container:set_size(width)
|
||||
|
||||
if #self.properties > self.properties_per_page then
|
||||
self:refresh_page()
|
||||
end
|
||||
|
||||
return widget
|
||||
end
|
||||
|
||||
|
||||
function M:refresh_page()
|
||||
local start_index = (self.current_page - 1) * self.properties_per_page + 1
|
||||
local end_index = start_index + self.properties_per_page - 1
|
||||
|
||||
for index = 1, #self.properties do
|
||||
local is_visible = index >= start_index and index <= end_index
|
||||
gui.set_enabled(self.properties[index].root, is_visible)
|
||||
end
|
||||
|
||||
gui.set_enabled(self.paginator.root, #self.properties > self.properties_per_page)
|
||||
self.paginator:set_number_type(1, math.ceil(#self.properties / self.properties_per_page), true)
|
||||
self.paginator.text_value:set_text(self.current_page .. " / " .. math.ceil(#self.properties / self.properties_per_page))
|
||||
|
||||
self.layout:set_dirty()
|
||||
end
|
||||
|
||||
|
||||
function M:remove(widget)
|
||||
for index = 1, #self.properties do
|
||||
if self.properties[index] == widget then
|
||||
@@ -206,9 +271,14 @@ function M:toggle_hide()
|
||||
self.container:set_size(new_size.x, new_size.y, gui.PIVOT_N)
|
||||
|
||||
gui.set_enabled(self.content, not self.is_hidden)
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
---@param properties_per_page number
|
||||
function M:set_properties_per_page(properties_per_page)
|
||||
self.properties_per_page = properties_per_page
|
||||
end
|
||||
|
||||
|
||||
return M
|
||||
|
Reference in New Issue
Block a user