diff --git a/README.md b/README.md index 5d9ecfa..2739dc6 100644 --- a/README.md +++ b/README.md @@ -542,7 +542,31 @@ end) You can set `bgcolor = "#123"`, `fbgcolor = "#123"`, and `bg_fullscreen = true` on the root element to set a background colour. The -values for these correspond to the [`bgcolor` formspec element](https://minetest.gitlab.io/minetest/formspec/#bgcolorbgcolorfullscreenfbgcolor). +values for these correspond to the [`bgcolor` formspec element](https://api.luanti.org/formspec/#bgcolorbgcolorfullscreenfbgcolor). + +
+position[] etc + +These values allow the position of the displayed form to be moved around. +See [the formspec documentation](https://api.luanti.org/formspec/#positionxy) +for more information. They are especially useful when creating HUDs using flow. + +Example: + +```lua +local my_gui = flow.make_gui(function(player, ctx) + return gui.VBox{ + -- 0 is the start/top, 1 is the bottom/end + window_position = {x = 0, y = 0}, + window_anchor = {x = 1, y = 1}, + + -- Equivalent to padding[0.1,0.2] + window_padding = {x = 0.1, y = 0.2}, + + gui.Label{label = "Hello world"}, + } +end) +```
Rendering to a formspec diff --git a/init.lua b/init.lua index 92ce5b4..e6c07a5 100644 --- a/init.lua +++ b/init.lua @@ -46,38 +46,64 @@ local function render_ast(node, embedded) {type = "size", w = w, h = h}, } - -- TODO: Consider a nicer place to put these parameters - if node.no_prepend and not embedded then - res[#res + 1] = {type = "no_prepend"} - end - if node.fbgcolor or node.bgcolor or node.bg_fullscreen ~= nil then - -- Hack to prevent breaking mods that rely on the old (broken) - -- behaviour of fbgcolor - if node.fbgcolor == "#08080880" and node.bgcolor == nil and - node.bg_fullscreen == nil then - node.bg_fullscreen = true - node.fbgcolor = nil + if not embedded then + if node.window_position then + res[#res + 1] = { + type = "position", + x = node.window_position.x, + y = node.window_position.y, + } + node.window_position = nil + end + if node.window_anchor then + res[#res + 1] = { + type = "anchor", + x = node.window_anchor.x, + y = node.window_anchor.y, + } + node.window_anchor = nil + end + if node.window_padding then + res[#res + 1] = { + type = "padding", + x = node.window_padding.x, + y = node.window_padding.y, + } + node.window_padding = nil + end + if node.no_prepend then + res[#res + 1] = {type = "no_prepend"} end - res[#res + 1] = { - type = "bgcolor", - bgcolor = node.bgcolor, - fbgcolor = node.fbgcolor, - fullscreen = node.bg_fullscreen - } - node.bgcolor = nil - node.fbgcolor = nil - node.bg_fullscreen = nil - end + if node.fbgcolor or node.bgcolor or node.bg_fullscreen ~= nil then + -- Hack to prevent breaking mods that rely on the old (broken) + -- behaviour of fbgcolor + if node.fbgcolor == "#08080880" and node.bgcolor == nil and + node.bg_fullscreen == nil then + node.bg_fullscreen = true + node.fbgcolor = nil + end - -- Add the root element's background image as a fullscreen one - if node.bgimg and not embedded then - res[#res + 1] = { - type = node.bgimg_middle and "background9" or "background", - texture_name = node.bgimg, middle_x = node.bgimg_middle, - x = 0, y = 0, w = 0, h = 0, auto_clip = true, - } - node.bgimg = nil + res[#res + 1] = { + type = "bgcolor", + bgcolor = node.bgcolor, + fbgcolor = node.fbgcolor, + fullscreen = node.bg_fullscreen + } + node.bgcolor = nil + node.fbgcolor = nil + node.bg_fullscreen = nil + end + + -- Add the root element's background image as a fullscreen one + if node.bgimg then + res[#res + 1] = { + type = node.bgimg_middle and "background9" or "background", + texture_name = node.bgimg, middle_x = node.bgimg_middle, + x = 0, y = 0, w = 0, h = 0, auto_clip = true, + } + node.bgimg = nil + end end res[#res + 1] = node @@ -329,6 +355,11 @@ function Form:show(player, ctx) end function Form:show_hud(player, ctx) + if not core.global_exists("hud_fs") then + error("[flow] Form:show_hud() requires the hud_fs mod to be " .. + "installed!", 2) + end + local info = core.get_player_information(player:get_player_name()) local tree = self:_render(player, ctx or {}, nil, nil, nil, info and info.lang_code)