mirror of
https://gitlab.com/4w/mtimer.git
synced 2024-12-01 03:33:56 +01:00
115 lines
4.9 KiB
Lua
115 lines
4.9 KiB
Lua
local m = mtimer
|
||
local S = m.translator
|
||
|
||
|
||
-- Build the formspec frame
|
||
--
|
||
-- This function builds and displays a formspec based on the input.
|
||
--
|
||
-- The `name` is the usual formspec name (for example `mymod:my_formspec`) and
|
||
-- has to be provided as a simple string all other parameters are provided via
|
||
-- the `def` table. The following table is an example.
|
||
--
|
||
-- {
|
||
-- title = 'Nice Title' -- Automatically prefixed for orientation
|
||
-- prefix = '[Blarb] ' -- Optional title prefix
|
||
-- width = 8, -- Optional width of the content container
|
||
-- height = 3, -- Optional height of the content container
|
||
-- show_to = 'Playername' -- Name of the player to show the formspec to
|
||
-- add_buttons = false -- Optionally hide buttons
|
||
-- content_offset = 0 -- Optionally Offset content height position
|
||
-- formspec = {} -- Table with formspec definition
|
||
-- }
|
||
--
|
||
-- When set the title is prefixed with the prefix value. If omitted “[mTimer] ”
|
||
-- is used. The example creates “[Blarb] Nice Title” as title. Translated
|
||
-- strings can be used here. The Title and prefix are “formspec-safe” so
|
||
-- strings that are formspec elements can be used to show them literal.
|
||
--
|
||
-- The default buttons can be hidden by adding `add_buttons = false` to the
|
||
-- definition table. If omitted the buttons are shown. When not shown the
|
||
-- formspec size will be reduced by the amout of units the buttons would
|
||
-- have taken place.
|
||
--
|
||
-- Some formspec elements do nbot properly start at 0,0 even if set so. The
|
||
-- `content_offset` attribute offsets the content vertically by the given
|
||
-- amount of units. Formspec height and button positions are fixed according
|
||
-- to the given value.
|
||
--
|
||
-- The table entries for `formspec` are the usual formspec elements that
|
||
-- define what a formspec looks like. You can write all definition in one entry
|
||
-- or split the definition into multiple entries.
|
||
--
|
||
-- The definition defines the CONTENT of the formspec not the whole formspec so
|
||
-- you can easily start at 0,0 for your definition. The function automatically
|
||
-- places everything in relation to the formspec frame and default buttons.
|
||
--
|
||
-- The minimum formspec width and height are 8 units in width and 3 units in
|
||
-- height. So `width` and `height` can be omitted when all of your content fits
|
||
-- into the default size. The resulting formspec is a minimum of 8 units wide
|
||
-- and 4.6 units high (1.6 units are added for the title and the buttons).
|
||
--
|
||
-- All formspec table entries can contain the following variables. Variables
|
||
-- start with a plus sign (+) and are read until any character that is not
|
||
-- a letter. Some variables are useless, some can be used quite well.
|
||
--
|
||
-- Variable Name Value Type
|
||
-- --------------------------------------------------------------------------
|
||
-- +width width of the formspec
|
||
-- +height height of the formspec
|
||
-- +linewidth optimal width for a box that is used as horizontal line
|
||
-- +title formspec’s title
|
||
-- +content content container vertical position (+offset)
|
||
-- +buttons default buttons vertical position
|
||
-- +defbutton “Default” button’s horizontal position
|
||
-- +mainbutton “Main Menu” button’s horizontal position
|
||
-- +exitbutton “Exit” button’s horizontal position
|
||
--
|
||
-- @param name The name of the formspec
|
||
-- @param def The definition table as described
|
||
-- @return string the constructed “frame”
|
||
mtimer.show_formspec = function (name, def)
|
||
local add_buttons = def.add_buttons == true or def.add_buttons == nil
|
||
local content_offset = def.content_offset or 0
|
||
local width = (def.width or 0) <= 8 and 8 or def.width
|
||
local height = (def.height or 0) <= 3 and 4.6 or def.height + 1.6
|
||
local prefix = def.prefix or '[mTimer] '
|
||
if not add_buttons then height = height - 1.6 end
|
||
|
||
height = height + content_offset
|
||
|
||
local buttons = not add_buttons and '' or table.concat({
|
||
'container[0,+buttons]',
|
||
'box[0,0;+linewidth,0.04;#ffffff]',
|
||
'button[+defbutton,0.2;2,1;default;'..S('Default')..']',
|
||
'button[+mainbutton,0.2;2,1;main_menu;'..S('Main Menu')..']',
|
||
'button_exit[+exitbutton,0.2;2,1;exit;'..S('Exit')..']',
|
||
'container_end[]'
|
||
}, ' ')
|
||
|
||
local formspec = table.concat({
|
||
'size[+width,+height]',
|
||
'label[0,-0.1;+title]',
|
||
'box[0,0.5;+linewidth,0.04;#ffffff]',
|
||
'container[0,+content]',
|
||
table.concat(def.formspec, ' '),
|
||
'container_end[]',
|
||
buttons
|
||
}, ' ')
|
||
|
||
formspec = formspec:gsub('%+%a+', {
|
||
['+width'] = width,
|
||
['+height'] = height,
|
||
['+linewidth'] = width-0.215,
|
||
['+title'] = minetest.formspec_escape(prefix..def.title),
|
||
['+content'] = 0.7 + content_offset,
|
||
['+buttons'] = height-0.8,
|
||
['+defbutton'] = 0,
|
||
['+mainbutton'] = width-4,
|
||
['+exitbutton'] = width-2,
|
||
|
||
})
|
||
|
||
minetest.show_formspec(def.show_to, name, formspec)
|
||
end
|