local const = require("druid.const") local helper = require("druid.helper") local M = {} function M.get_examples() ---@type druid.example.data[] return { { name_id = "ui_example_basic_button", information_text_id = "ui_example_basic_button_description", template = "basic_button", root = "basic_button/root", 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 local checkbox = properties_panel:add_checkbox("ui_enabled", false, function(value) instance.button:set_enabled(value) end) checkbox:set_value(true) end, on_create = function(instance, output_log) ---@cast instance basic_button instance.button.on_click:subscribe(function() output_log:add_log_text("Button Clicked") end) end, }, { name_id = "ui_example_basic_button_double_click", information_text_id = "ui_example_basic_button_double_click_description", template = "basic_button_double_click", root = "basic_button_double_click/root", 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 instance.button.on_click:subscribe(function() output_log:add_log_text("Clicked") end) instance.button.on_double_click:subscribe(function() output_log:add_log_text("Double Clicked") end) end, }, { name_id = "ui_example_basic_button_hold", information_text_id = "ui_example_basic_button_hold_description", template = "basic_button_hold", root = "basic_button_hold/root", 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 instance.button.on_click:subscribe(function() output_log:add_log_text("Clicked") end) instance.button.on_long_click:subscribe(function() output_log:add_log_text("On long click") end) end, }, { name_id = "ui_example_basic_text", information_text_id = "ui_example_basic_text_description", template = "basic_text", root = "basic_text/root", 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 local adjust_index = 1 local adjust_types = { const.TEXT_ADJUST.DOWNSCALE, const.TEXT_ADJUST.DOWNSCALE_LIMITED, --const.TEXT_ADJUST.SCALE_THEN_SCROLL, -- works bad with container for some reason --const.TEXT_ADJUST.SCROLL, -- works bad with container for some reason const.TEXT_ADJUST.TRIM, } properties_panel:add_button("ui_adjust_next", function() adjust_index = adjust_index + 1 if adjust_index > #adjust_types then adjust_index = 1 end instance.text:set_text_adjust(adjust_types[adjust_index], 0.5) end) local pivot_index = 1 local pivot_list = { gui.PIVOT_CENTER, gui.PIVOT_W, gui.PIVOT_SW, gui.PIVOT_S, gui.PIVOT_SE, gui.PIVOT_E, gui.PIVOT_NE, gui.PIVOT_N, gui.PIVOT_NW, } ---@cast instance rich_text_tags properties_panel:add_button("ui_pivot_next", function() pivot_index = pivot_index + 1 if pivot_index > #pivot_list then pivot_index = 1 end instance:set_pivot(pivot_list[pivot_index]) end) end, get_debug_info = function(instance) ---@cast instance multiline_text local info = "" info = info .. "Text Adjust: " .. instance.text.adjust_type .. "\n" info = info .. "Pivot: " .. gui.get_pivot(instance.text.node) .. "\n" return info end }, { name_id = "ui_example_basic_multiline_text", information_text_id = "ui_example_basic_multiline_text_description", template = "multiline_text", root = "multiline_text/root", 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 local adjust_index = 1 local adjust_types = { const.TEXT_ADJUST.DOWNSCALE, const.TEXT_ADJUST.DOWNSCALE_LIMITED, --const.TEXT_ADJUST.SCALE_THEN_SCROLL, -- works bad with container for some reason --const.TEXT_ADJUST.SCROLL, -- works bad with container for some reason const.TEXT_ADJUST.TRIM, } properties_panel:add_button("ui_adjust_next", function() adjust_index = adjust_index + 1 if adjust_index > #adjust_types then adjust_index = 1 end instance.text:set_text_adjust(adjust_types[adjust_index], 0.8) end) end, get_debug_info = function(instance) ---@cast instance multiline_text local info = "" info = info .. "Text Adjust: " .. instance.text.adjust_type .. "\n" info = info .. "Pivot: " .. gui.get_pivot(instance.text.node) .. "\n" return info end }, { name_id = "ui_example_basic_hover", information_text_id = "ui_example_basic_hover_description", template = "hover", root = "hover/root", code_url = "example/examples/basic/hover/hover.lua", component_class = require("example.examples.basic.hover.hover"), }, { name_id = "ui_example_basic_drag", information_text_id = "ui_example_basic_drag_description", template = "drag", root = "drag/root", code_url = "example/examples/basic/drag/drag.lua", component_class = require("example.examples.basic.drag.drag"), }, { name_id = "ui_example_basic_drag_to_node", information_text_id = "ui_example_basic_drag_to_node_description", template = "drag_to_node", root = "drag_to_node/root", code_url = "example/examples/basic/drag/drag_to_node.lua", component_class = require("example.examples.basic.drag.drag_to_node"), }, { name_id = "ui_example_basic_slider", information_text_id = "ui_example_basic_slider_description", template = "basic_slider", root = "basic_slider/root", 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 instance.slider.on_change_value:subscribe(function(_, value) local value = helper.round(value, 2) output_log:add_log_text("Slider Value: " .. value) end) end, }, { name_id = "ui_example_basic_slider_vertical", information_text_id = "ui_example_basic_slider_vertical_description", template = "basic_slider_vertical", root = "basic_slider_vertical/root", 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 instance.slider.on_change_value:subscribe(function(_, value) local value = helper.round(value, 2) output_log:add_log_text("Slider Value: " .. value) end) end, }, { name_id = "ui_example_basic_slider_stepped", information_text_id = "ui_example_basic_slider_stepped_description", template = "basic_slider_stepped", root = "basic_slider_stepped/root", 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 instance.slider.on_change_value:subscribe(function(_, value) local value = helper.round(value, 2) output_log:add_log_text("Slider Value: " .. value) end) end, }, { name_id = "ui_example_basic_progress_bar", information_text_id = "ui_example_basic_progress_bar_description", template = "basic_progress_bar", root = "basic_progress_bar/root", 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 properties_panel:add_slider("ui_value", 1, function(value) instance:set_value(value) end) end, }, { name_id = "ui_example_basic_progress_bar_slice9", information_text_id = "ui_example_basic_progress_bar_slice9_description", template = "basic_progress_bar_slice9", root = "basic_progress_bar_slice9/root", 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 properties_panel:add_slider("ui_value", 1, function(value) instance:set_value(value) end) end, }, { name_id = "ui_example_basic_blocker", information_text_id = "ui_example_basic_blocker_description", template = "basic_blocker", root = "basic_blocker/root", 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 instance.button_root.on_click:subscribe(function() output_log:add_log_text("Root Clicked") end) instance.button.on_click:subscribe(function() output_log:add_log_text("Button Clicked") end) end, }, { name_id = "ui_example_basic_back_handler", information_text_id = "ui_example_basic_back_handler_description", template = "basic_back_handler", root = "basic_back_handler/root", code_url = "example/examples/basic/back_handler/basic_back_handler.lua", component_class = require("example.examples.basic.back_handler.basic_back_handler"), }, { name_id = "ui_example_basic_timer", information_text_id = "ui_example_basic_timer_description", template = "basic_timer", root = "basic_timer/root", 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 instance.on_cycle_end:subscribe(function() output_log:add_log_text("Timer Cycle End") end) end, }, { name_id = "ui_example_basic_hotkey", information_text_id = "ui_example_basic_hotkey_description", template = "basic_hotkey", root = "basic_hotkey/root", 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 instance.hotkey.on_hotkey_released:subscribe(function() output_log:add_log_text("Hotkey Released") end) end, }, { name_id = "ui_example_basic_scroll", information_text_id = "ui_example_basic_scroll_description", template = "scroll", root = "scroll/root", 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 instance.button_tutorial.on_click:subscribe(function() output_log:add_log_text("Button Tutorial Clicked") end) instance.button_stencil.on_click:subscribe(function() output_log:add_log_text("Button Stencil Clicked") end) end, properties_control = function(instance, properties_panel) ---@cast instance scroll local is_stretch = instance.scroll.style.EXTRA_STRETCH_SIZE > 0 properties_panel:add_checkbox("ui_elastic_scroll", is_stretch, function(value) instance.scroll:set_extra_stretch_size(value and 100 or 0) end) local view_node = instance.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) end, get_debug_info = function(instance) ---@cast instance scroll local info = "" local s = instance.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 }, { name_id = "ui_example_basic_scroll_slider", information_text_id = "ui_example_basic_scroll_slider_description", template = "scroll_slider", root = "scroll_slider/root", 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 local info = "" local s = instance.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 }, { name_id = "ui_example_basic_grid", information_text_id = "ui_example_basic_grid_description", template = "grid", root = "grid/root", 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 local slider = properties_panel:add_slider("ui_grid_in_row", 0.3, function(value) local in_row_amount = math.ceil(value * 10) in_row_amount = math.max(1, in_row_amount) instance.grid:set_in_row(in_row_amount) end) slider:set_text_function(function(value) return tostring(math.ceil(value * 10)) end) properties_panel:add_button("ui_add_element", function() if #instance.created_nodes >= 36 then return end instance:add_element() end) properties_panel:add_button("ui_remove_element", function() instance:remove_element() end) properties_panel:add_button("ui_clear_elements", function() instance:clear() end) end, }, { name_id = "ui_example_basic_scroll_bind_grid", information_text_id = "ui_example_basic_scroll_bind_grid_description", template = "scroll_bind_grid", root = "scroll_bind_grid/root", 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 local view_node = instance.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) properties_panel:add_button("ui_add_element", function() if #instance.created_nodes >= 100 then return end instance:add_element() end) properties_panel:add_button("ui_remove_element", function() instance:remove_element() end) properties_panel:add_button("ui_clear_elements", function() instance:clear() end) end, get_debug_info = function(instance) ---@cast instance scroll_bind_grid local info = "" local s = instance.scroll local view_node_size = gui.get(s.view_node, "size.y") local scroll_position = -s.position local scroll_bottom_position = vmath.vector3(scroll_position.x, scroll_position.y - view_node_size, scroll_position.z) 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" info = info .. "Grid Items: " .. #instance.grid.nodes .. "\n" info = info .. "Grid Item Size: " .. instance.grid.node_size.x .. " x " .. instance.grid.node_size.y .. "\n" info = info .. "Top Scroll Pos Grid Index: " .. instance.grid:get_index(scroll_position) .. "\n" info = info .. "Bottm Scroll Pos Grid Index: " .. instance.grid:get_index(scroll_bottom_position) .. "\n" return info end }, { name_id = "ui_example_basic_scroll_bind_grid_horizontal", information_text_id = "ui_example_basic_scroll_bind_grid_horizontal_description", template = "scroll_bind_grid_horizontal", root = "scroll_bind_grid_horizontal/root", 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 local view_node = instance.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) properties_panel:add_button("ui_add_element", function() if #instance.created_nodes >= 100 then return end instance:add_element() end) properties_panel:add_button("ui_remove_element", function() instance:remove_element() end) properties_panel:add_button("ui_clear_elements", function() instance:clear() end) end, get_debug_info = function(instance) ---@cast instance scroll_bind_grid_horizontal local info = "" local s = instance.scroll local view_node_size = gui.get(s.view_node, "size.x") local scroll_position = -s.position local scroll_bottom_position = vmath.vector3(scroll_position.x + view_node_size, scroll_position.y, scroll_position.z) info = info .. "View Size X: " .. gui.get(s.view_node, "size.x") .. "\n" info = info .. "Content Size X: " .. gui.get(s.content_node, "size.x") .. "\n" info = info .. "Content position X: " .. math.ceil(s.position.x) .. "\n" info = info .. "Content Range X: " .. s.available_pos.x .. " - " .. s.available_pos.z .. "\n" info = info .. "Grid Items: " .. #instance.grid.nodes .. "\n" info = info .. "Grid Item Size: " .. instance.grid.node_size.x .. " x " .. instance.grid.node_size.y .. "\n" info = info .. "Left Scroll Pos Grid Index: " .. instance.grid:get_index(scroll_position) .. "\n" info = info .. "Right Scroll Pos Grid Index: " .. instance.grid:get_index(scroll_bottom_position) .. "\n" return info end }, { name_id = "ui_example_basic_scroll_bind_grid_points", information_text_id = "ui_example_basic_scroll_bind_grid_points_description", template = "scroll_bind_grid_points", root = "scroll_bind_grid_points/root", 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 local view_node = instance.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) properties_panel:add_button("ui_add_element", function() if #instance.created_nodes >= 100 then return end instance:add_element() end) properties_panel:add_button("ui_remove_element", function() instance:remove_element() end) properties_panel:add_button("ui_clear_elements", function() instance:clear() end) end, get_debug_info = function(instance) ---@cast instance scroll_bind_grid_points local info = "" local s = instance.scroll local view_node_size = gui.get(s.view_node, "size.y") local scroll_position = -s.position local scroll_bottom_position = vmath.vector3(scroll_position.x, scroll_position.y - view_node_size, scroll_position.z) 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" info = info .. "Grid Items: " .. #instance.grid.nodes .. "\n" info = info .. "Grid Item Size: " .. instance.grid.node_size.x .. " x " .. instance.grid.node_size.y .. "\n" info = info .. "Top Scroll Pos Grid Index: " .. instance.grid:get_index(scroll_position) .. "\n" info = info .. "Bottm Scroll Pos Grid Index: " .. instance.grid:get_index(scroll_bottom_position) .. "\n" return info end }, { name_id = "ui_example_basic_input", information_text_id = "ui_example_basic_input_description", template = "basic_input", root = "basic_input/root", 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 instance.input.on_input_unselect:subscribe(function(_, text) output_log:add_log_text("Input: " .. text) end) instance.input_2.on_input_unselect:subscribe(function(_, text) output_log:add_log_text("Input 2: " .. text) end) end, }, { name_id = "ui_example_input_password", information_text_id = "ui_example_input_password_description", template = "input_password", root = "input_password/root", 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 instance.input.on_input_unselect:subscribe(function(_, text) output_log:add_log_text("Input: " .. text) end) end, }, { name_id = "ui_example_basic_rich_input", information_text_id = "ui_example_basic_rich_input_description", template = "basic_rich_input", root = "basic_rich_input/root", 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 instance.rich_input.input.on_input_unselect:subscribe(function(_, text) output_log:add_log_text("Input: " .. text) end) instance.rich_input_2.input.on_input_unselect:subscribe(function(_, text) output_log:add_log_text("Input 2: " .. text) end) end, }, { name_id = "ui_example_basic_rich_text", information_text_id = "ui_example_basic_rich_text_description", template = "basic_rich_text", root = "basic_rich_text/root", code_url = "example/examples/basic/rich_text/basic_rich_text.lua", component_class = require("example.examples.basic.rich_text.basic_rich_text"), }, { name_id = "ui_example_rich_text_tags", information_text_id = "ui_example_rich_text_tags_description", template = "rich_text_tags", root = "rich_text_tags/root", code_url = "example/examples/basic/rich_text/rich_text_tags.lua", component_class = require("example.examples.basic.rich_text.rich_text_tags"), properties_control = function(instance, properties_panel) local pivot_index = 1 local pivot_list = { gui.PIVOT_CENTER, gui.PIVOT_W, gui.PIVOT_SW, gui.PIVOT_S, gui.PIVOT_SE, gui.PIVOT_E, gui.PIVOT_NE, gui.PIVOT_N, gui.PIVOT_NW, } ---@cast instance rich_text_tags properties_panel:add_button("ui_pivot_next", function() pivot_index = pivot_index + 1 if pivot_index > #pivot_list then pivot_index = 1 end instance:set_pivot(pivot_list[pivot_index]) end) end }, --{ -- name_id = "ui_example_rich_text_tags_custom", -- information_text_id = "ui_example_rich_text_tags_custom_description", -- template = "rich_text_tags_custom", -- root = "rich_text_tags_custom/root", -- code_url = "example/examples/basic/rich_text/rich_text_tags_custom.lua", -- component_class = require("example.examples.basic.rich_text.rich_text_tags_custom"), -- properties_control = function(instance, properties_panel) -- local pivot_index = 1 -- local pivot_list = { -- gui.PIVOT_CENTER, -- gui.PIVOT_W, -- gui.PIVOT_SW, -- gui.PIVOT_S, -- gui.PIVOT_SE, -- gui.PIVOT_E, -- gui.PIVOT_NE, -- gui.PIVOT_N, -- gui.PIVOT_NW, -- } -- ---@cast instance rich_text_tags_custom -- properties_panel:add_button("ui_pivot_next", function() -- pivot_index = pivot_index + 1 -- if pivot_index > #pivot_list then -- pivot_index = 1 -- end -- instance:set_pivot(pivot_list[pivot_index]) -- end) -- end, -- on_create = function(instance, output_log) -- ---@cast instance rich_text_tags_custom -- instance.on_link_click:subscribe(function(text) -- output_log:add_log_text("Custom Link: " .. text) -- end) -- end --}, { name_id = "ui_example_basic_swipe", information_text_id = "ui_example_basic_swipe_description", template = "basic_swipe", root = "basic_swipe/root", 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 instance.swipe.on_swipe:subscribe(function(_, side, dist, delta_time) output_log:add_log_text("Swipe Side: " .. side) end) end, }, { name_id = "ui_example_basic_checkbox", information_text_id = "ui_example_basic_checkbox_description", template = "basic_checkbox", root = "basic_checkbox/root", code_url = "example/examples/basic/checkbox/basic_checkbox.lua", component_class = require("example.examples.basic.checkbox.basic_checkbox"), on_create = function(instance, output_log) ---@cast instance basic_checkbox instance.button.on_click:subscribe(function() output_log:add_log_text("Checkbox Clicked: " .. tostring(instance.is_enabled)) end) end, }, } end return M