diff --git a/system/formspec_helpers.lua b/system/formspec_helpers.lua index 5c3fde3..7c1f7ba 100644 --- a/system/formspec_helpers.lua +++ b/system/formspec_helpers.lua @@ -1,10 +1,3 @@ --- # vim: nowrap --- --- Set Vim to no-wrapping mode because of some lines not fitting within the 80 --- characters width limit due to overall readability of the code. - - --- Localise needed functions local m = mtimer local S = m.translator local esc = minetest.formspec_escape @@ -24,7 +17,7 @@ local esc = minetest.formspec_escape -- definition = { -- label = 'My Cool Button label' or '', -- width = 5, or 3, --- image_size = 1, or 0,5, +-- image_size = 1, or 0.5, -- container = { left = 1, top = 1} or pos_container -- exit_button = true or false -- } @@ -34,7 +27,7 @@ local esc = minetest.formspec_escape -- top left corner of the formspec if not contained in another container. -- -- pos_container = { --- left = 0 +-- left = 0, -- top = 0 -- } -- @@ -68,7 +61,7 @@ mtimer.get_icon_button = function (id, definition) }, ' '):gsub('%+%w+', { ['+containerLeft'] = c_left, ['+containerTop'] = c_top, - ['+buttonType'] = def.exit_button == true and 'button_exit' or 'button', + ['+buttonType'] = def.exit_button==true and 'button_exit' or 'button', ['+buttonWidth'] = b_width, ['+buttonHeight'] = b_height, ['+buttonPadding'] = b_padding, @@ -91,14 +84,16 @@ end -- 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 +-- 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 +-- hide_buttons = true, -- Optionally hide buttons +-- hide_title = true, -- Optionally hide title +-- icon_size = 0.5, -- Optionally set title icon size +-- 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] ” @@ -106,15 +101,15 @@ end -- 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 +-- The default buttons can be hidden by adding `hide_buttons = true` 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. +-- have taken place. Same for the title with `hide_title = true`. -- -- Some formspec elements do not 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. +-- amount of units. Formspec height and button positions are adapted 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 @@ -124,10 +119,9 @@ end -- 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 9 units in width and 4 units in +-- The minimum formspec width and height are 10 units in width and 5 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 9 units wide --- and 5.85 units high (1.85 units are added for the title and the buttons). +-- into the default size. -- -- All formspec table entries can contain the following variables. Variables -- start with a plus sign (+) and are read until any character that is not @@ -135,59 +129,96 @@ end -- -- Variable Name Value Type -- -------------------------------------------------------------------------- --- +title formspec’s title --- +width width of the formspec --- +height height of the formspec --- +contentWidth optimal width for the content --- +contentPosition content container vertical position (+offset) --- +buttons default buttons vertical position +-- +width Width of the formspec +-- +height Height of the formspec +-- +iconSize Size of the title icon +-- +labelPositionLeft Position of the title label from left side +-- +labelPositionTop Position of the title label from top +-- +linePosition Position of the title separator line +-- +titleText The text of the title label (the dialog title) +-- +titleIcon The icon that is used in the dialog title +-- +contentPosition Position of the actual content of the dialog +-- +buttonsPosition The position where the buttons are -- -- @param id The ID of the formspec -- @param def The definition table as described -- @return string the constructed “frame” mtimer.show_formspec = function (id, def) - local add_buttons = def.add_buttons == true or def.add_buttons == nil + local title_text = def.title or '' + local title_prefix = def.prefix or '[mTimer] ' local content_offset = def.content_offset or 0 local width = (def.width or 0) <= 10 and 10 or def.width - local height = (def.height or 0) <= 4 and 5.85 or def.height + 1.85 - local prefix = def.prefix or '[mTimer] ' + local height = ((def.height or 0) <= 4 and 5 or def.height)+content_offset + local icon_size = def.icon_size or 0.5 + local line_position = 0 + local buttons = '' + local title = '' - -- Calculate height - if not add_buttons then height = height - 1.85 end - height = height + content_offset + -- Set up title + if def.hide_title ~= true then + line_position = icon_size + 0.25 + content_offset = content_offset + line_position + (icon_size / 2) + 0.1 + height = height + content_offset + (icon_size / 2) + title = table.concat({ + 'container[0.25,0.25]', + ' image[0,0;+iconSize,+iconSize;+titleIcon]', + ' label[+labelPositionLeft,+labelPositionTop;+titleText]', + ' box[0,+linePosition;+contentWidth,0.04;#ffffff]', + 'container_end[]' + }, ' ') + end -- Set up buttons - local buttons = not add_buttons and '' or table.concat({ - 'container[0.25,+buttons]', - ' box[0,0;+contentWidth,0.04;#ffffff]', - mtimer.get_icon_button('main_menu', { label = S('Main Menu'), width = 2.5, container = { top = 0.25 } }), - ' container[+contentWidth,0.25]', - mtimer.get_icon_button('exit', { label = S('Exit'), exit_button = true, width = 2.5, container = { left = -2.5 } }), - mtimer.get_icon_button('default', { label = S('Default'), width = 2.5, container = { left = -5.25 } }), - ' container_end[]', - 'container_end[]' - }, ' ') + if def.hide_buttons ~= true then + height = height + 1 + buttons = table.concat({ + 'container[0.25,+buttonsPosition]', + 'box[0,0;+contentWidth,0.04;#ffffff]', + mtimer.get_icon_button('main_menu', { + label = S('Main Menu'), + width = 2.5, container = { top = 0.25 } + }), + 'container[+contentWidth,0.25]', + mtimer.get_icon_button('exit', { + label = S('Exit'), + exit_button = true, + width = 2.5, + container = { left = -2.5 } + }), + mtimer.get_icon_button('default', { + label = S('Default'), + width = 2.5, + container = { left = -5.25 } + }), + 'container_end[]', -- right side buttons + 'container_end[]' -- buttons + }, ' ') + end -- Build formspec local formspec = table.concat({ 'formspec_version[2]', 'size[+width,+height]', - 'image[0.25,0.2;0.3,0.3;+icon]', - 'label[0.65,0.35;+title]', - 'box[0.25,0.6;+contentWidth,0.04;#ffffff]', + title, 'container[0.25,+contentPosition]', table.concat(def.formspec, ' '), 'container_end[]', buttons }, ' '):gsub('%+%a+', { - ['+width'] = width+0.25, - ['+height'] = height, - ['+contentWidth'] = width-0.25, - ['+title'] = minetest.formspec_escape(prefix..def.title), - ['+icon'] = 'mtimer_'..id:gsub('mtimer:', '')..'.png', - ['+contentPosition'] = 0.9 + content_offset, - ['+buttons'] = height-1.25, - + -- Formspec frame + ['+width'] = width + 0.5, + ['+height'] = height + 0.5, + ['+contentWidth'] = width, + ['+contentPosition'] = content_offset + 0.25, + ['+iconSize'] = icon_size, + -- Title-related settings + ['+labelPositionLeft'] = icon_size + (icon_size / 4), + ['+labelPositionTop'] = (icon_size / 2), + ['+linePosition'] = line_position, + ['+titleText'] = minetest.formspec_escape(title_prefix..title_text), + ['+titleIcon'] = 'mtimer_'..id:gsub('mtimer:', '')..'.png', + -- Buttons-related settings + ['+buttonsPosition'] = height - 0.75, }) -- Show formspec to the plauyer diff --git a/system/formspecs/main_menu.lua b/system/formspecs/main_menu.lua index f648ee7..2c6b222 100644 --- a/system/formspecs/main_menu.lua +++ b/system/formspecs/main_menu.lua @@ -21,7 +21,7 @@ local esc = minetest.formspec_escape -- @param id The button’s ID -- @param label The button’s label -- @return string The parsed main menu button -local button = function (column, row, id, label) +local menu_button = function (column, row, id, label) local b_width = 5 local i_size = 0.5 @@ -53,29 +53,29 @@ end -- @see https://dev.minetest.net/formspec mtimer.dialog.main_menu = function (player_name) mtimer.show_formspec('mtimer:main_menu', { - title = S('mTimer'), - width = 16, - height = 6.9, - prefix = '', - add_buttons = false, + width = 15.75, + height = 5.75, + hide_buttons = true, + hide_title = true, show_to = player_name, formspec = { -- Visuals - button(1, 1, 'set_visibility', S('Visibility')), - button(1, 2, 'set_position', S('Position')), - button(1, 3, 'set_color', S('Color')), - button(1, 4, 'hud_element_size', S('HUD Element Size')), - button(1, 5, 'hud_element_offset', S('HUD Element Offset')), + menu_button(1, 1, 'set_visibility', S('Visibility')), + menu_button(1, 2, 'set_position', S('Position')), + menu_button(1, 3, 'set_color', S('Color')), + menu_button(1, 4, 'hud_element_size', S('HUD Element Size')), + menu_button(1, 5, 'hud_element_offset', S('HUD Element Offset')), -- Time Representation - button(2, 1, 'ingame_time_format', S('Ingame Time Format')), - button(2, 2, 'real_world_time_format', S('Real-World Time Format')), - button(2, 3, 'session_start_time_format', S('Session Start Time Format')), - button(2, 4, 'session_duration_format', S('Session Duration Format')), - button(2, 5, 'host_time_format', S('Host Time Format')), + menu_button(2, 1, 'ingame_time_format', S('Ingame Time Format')), + menu_button(2, 2, 'real_world_time_format', S('Real-World Time Format')), + menu_button(2, 3, 'session_start_time_format', S('Session Start Time Format')), + menu_button(2, 4, 'session_duration_format', S('Session Duration Format')), + menu_button(2, 5, 'host_time_format', S('Host Time Format')), -- Timer configuration - button(3, 1, 'timer_format', S('Timer Format')), - button(3, 2, 'timezone_offset', S('Timezone Offset')), - button(3, 3, 'custom_timer', S('Custom Timer')), + menu_button(3, 1, 'timer_format', S('Timer Format')), + menu_button(3, 2, 'timezone_offset', S('Timezone Offset')), + menu_button(3, 3, 'custom_timer', S('Custom Timer')), + -- Custom buttons 'container[0,4.75]', ' box[0,0;+contentWidth,0.04;#ffffff]', ' container[+contentWidth,0]',