-- # 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 -- Formspecs are loaded and shown by individual functions. The function name -- correlates with the formspec to show. All of the names are self-explanatory -- and within the functions no logic is used. -- -- The Main menu is a bit more complex and is generated seperately. -- -- @see mtimer.show_formspec -- @see mtimer.get_times -- @see ./system/on_receive_fields.lua -- @see ./system/chat_command.lua -- @see ./system/formspec/main_menu.lua -- @see https://dev.minetest.net/formspec mtimer.dialog.set_visibility = function (player_name) local player = minetest.get_player_by_name(player_name) local visible = player:get_meta():get_string(m.meta.visible.key) local status = visible == 'true' and S('visible') or S('invisible') mtimer.show_formspec('mtimer:set_visibility', { title = S('Visibility'), show_to = player_name, formspec = { mtimer.get_icon_button('set_visible', { width = 4, label = S('Make visible') }), mtimer.get_icon_button('set_invisible', { width = 4, label = S('Make invisible'), container = { left = 4.25 } }), 'label[0,1.25;'..S('The timer is currently @1.', status)..']' } }) end mtimer.dialog.set_position = function (player_name) local player = minetest.get_player_by_name(player_name) local howto = S('Click the position you want to place the timer at.') -- Get current position name local p_value = player:get_meta():get_string(m.meta.position.key) local p_names = { ['t'] = S('top'), ['m'] = S('middle'), ['b'] = S('bottom'), ['l'] = S('left'), ['c'] = S('center'), ['r'] = S('right') } local p_name = p_names[p_value:sub(1,1)]..' '..p_names[p_value:sub(2,2)] local p_info = S('Current position: @1', p_name) -- Set up image local image = 'mtimer_positions_orientation.png' local i_width = 10 local i_height = 6 -- Return the parsed button local b_define = function(t, l, p) return ('image_button[+l,+t;+w,+h;+i;pos_+p;d;;false]'):gsub('%+%w', { ['+l'] = (l - 1) * (i_width / 3), ['+t'] = (t - 1) * (i_height / 3), ['+w'] = i_width / 3, ['+h'] = i_height / 3, ['+i'] = 'mtimer_transparent.png', ['+p'] = p, }) end mtimer.show_formspec('mtimer:set_position', { title = S('Position'), height = 7.2, width = 10, show_to = player_name, formspec = { 'image[0,0;'..i_width..','..i_height..';'..image..']', b_define(1, 1, 'tl'), b_define(1, 2, 'tc'), b_define(1, 3, 'tr'), b_define(2, 1, 'ml'), b_define(2, 2, 'mc'), b_define(2, 3, 'mr'), b_define(3, 1, 'bl'), b_define(3, 2, 'bc'), b_define(3, 3, 'br'), 'label[0,6.5;'..howto..'\n'..p_info..']' } }) end mtimer.dialog.set_color = function (player_name) local player = minetest.get_player_by_name(player_name) local color = player:get_meta():get_string(m.meta.color.key) local hexcolor = table.concat({ '#', minetest.colorize('#ce5c00', 'rr'), minetest.colorize('#4e9a06', 'gg'), minetest.colorize('#729fcf', 'bb') }) mtimer.show_formspec('mtimer:set_color', { title = S('Color'), show_to = player_name, formspec = { 'field_close_on_enter[color;false]', 'field[0,0;3,0.5;color;;'..color..']', 'box[3.25,0;0.5,0.5;'..color..'ff]', 'label[0.025,0.75;'..S('Use `@1` format only!', hexcolor)..']' } }) end mtimer.dialog.timezone_offset = function (player_name) local time_data = mtimer.get_times(player_name).real_time local format = { conversion = S('30 minutes @= 0.5, 60 minutes @= 1'), arbitrarity = S('“Arbitrary” values are possible.') } local time_information = { s = S('Server Time: @1', time_data.times.server_time), l = S('Local Time: @1', time_data.times.local_time) } mtimer.show_formspec('mtimer:timezone_offset', { title = S('Timezone Offset'), show_to = player_name, formspec = { 'field_close_on_enter[offset;false]', 'field[0,0;3,0.5;offset;;'..time_data.times.offset..']', 'container[3.25,0.1]', 'label[0,0;'..format.conversion..']', 'label[0,0.3;'..format.arbitrarity..']', 'container_end[]', 'container[0,0.9]', 'label[0,0;'..time_information.s..']', 'label[0,0.3;'..time_information.l..']', 'container_end[]' } }) end mtimer.dialog.ingame_time_format = function (player_name) local time_data = mtimer.get_times(player_name).ingame_time mtimer.show_formspec('mtimer:ingame_time_format', { title = S('Ingame Time Format'), height = 3.8, show_to = player_name, formspec = { 'field_close_on_enter[format;false]', 'field[0,0;+contentWidth,0.5;format;;'..esc(time_data.format)..']', 'container[0,0.9]', 'label[2.8,0;'..S('Variable')..']', 'label[4.25,0;'..S('Current Value')..']', 'box[0,0.25;+contentWidth,0.02;#ffffff]', 'label[0,0.5;'..S('Hours (24h)')..'] label[2.8,0.5;{24h}] label[4.25,0.5;'..time_data.hours_24..']', 'label[0,0.9;'..S('Hours (12h)')..'] label[2.8,0.9;{12h}] label[4.25,0.9;'..time_data.hours_12..']', 'label[0,1.3;'..S('Minutes')..'] label[2.8,1.3;{min}] label[4.25,1.3;'..time_data.minutes..']', 'label[0,1.7;'..S('Ingame Timestamp')..'] label[2.8,1.7;{its}] label[4.25,1.7;'..time_data.ingame_timestamp..']', 'box[0,2;+contentWidth,0.02;#ffffff]', 'label[0,2.25;'..S('Current Result')..']', 'label[2.8,2.25;'..esc(time_data.formatted)..']', 'container_end[]' } }) end mtimer.dialog.real_world_time_format = function (player_name) mtimer.dialog.real_time_universal(player_name, { time_type = 'real_time', formspec_name = 'mtimer:real_world_time_format', title = S('Real-World Time Format') }) end mtimer.dialog.host_time_format = function (player_name) mtimer.dialog.real_time_universal(player_name, { time_type = 'host_time', formspec_name = 'mtimer:host_time_format', title = S('Host Time Format') }) end mtimer.dialog.session_start_time_format = function (player_name) mtimer.dialog.real_time_universal(player_name, { time_type = 'session_start_time', formspec_name = 'mtimer:session_start_time_format', title = S('Session Start Time Format') }) end mtimer.dialog.session_duration_format = function (player_name) local time_data = mtimer.get_times(player_name).session_duration mtimer.show_formspec('mtimer:session_duration_format', { title = S('Session Duration Format'), show_to = player_name, height = 3.8, formspec = { 'field_close_on_enter[format;false]', 'field[0,0;+contentWidth,0.5;format;;'..esc(time_data.format)..']', 'container[0,0.9]', 'label[2.5,0;'..S('Variable')..']', 'label[4,0;'..S('Current Value')..']', 'box[0,0.25;+contentWidth,0.02;#ffffff]', 'label[0,0.5;'..S('Days')..'] label[2.5,0.5;{days}] label[4,0.5;'..time_data.days..']', 'label[0,0.9;'..S('Hours')..'] label[2.5,0.9;{hours}] label[4,0.9;'..time_data.hours..']', 'label[0,1.3;'..S('Minutes')..'] label[2.5,1.3;{minutes}] label[4,1.3;'..time_data.minutes..']', 'label[0,1.7;'..S('Seconds')..'] label[2.5,1.7;{seconds}] label[4,1.7;'..time_data.seconds..']', 'box[0,2;+contentWidth,0.02;#ffffff]', 'label[0,2.25;'..S('Current Result')..']', 'label[2.5,2.25;'..esc(time_data.formatted)..']', 'container_end[]' } }) end mtimer.dialog.hud_element_size = function (player_name) local player = minetest.get_player_by_name(player_name) local size = player:get_meta():get_string(m.meta.hud_element_size.key) local information = table.concat({ S('If set to 1 the HUD element is unscaled.'), S('All values larger than 1 scale the element up.'), S('Clicking the +/- button changes the size by 1.') }, '\n') mtimer.show_formspec('mtimer:hud_element_size', { title = S('HUD Element Size'), show_to = player_name, formspec = { 'field_close_on_enter[hud_element_size;false]', 'button[0,0;0.5,0.5;substract;'..S('-')..']', 'field[0.75,0;0.75,0.5;hud_element_size;;'..size..']', 'button[1.75,0;0.5,0.5;add;'..S('+')..']', 'label[0.025,1;'..information..']', } }) end mtimer.dialog.hud_element_offset = function (player_name) local player = minetest.get_player_by_name(player_name) local timer_data = esc(mtimer.get_timer_data(player_name).format) local information = table.concat({ S('HUD element offset is used like a border/padding.'), S('Timer format can’t be set here. Go to the timer format dialog for that.') }, '\n') -- Get current offset values or 0 for use in formspec local key = m.meta.hud_element_offset.key local offset = minetest.deserialize(player:get_meta():get_string(key)) offset.x = offset.x and offset.x or 0 offset.y = offset.y and offset.y or 0 mtimer.show_formspec('mtimer:hud_element_offset', { title = S('HUD Element Offset'), show_to = player_name, height = 4.75, formspec = { 'field_close_on_enter[x_offset;false]', 'field_close_on_enter[y_offset;false]', 'box[0,0;5,2.25;#ffffff33]', 'textarea[0,0;5,2.25;;;'..timer_data..']', 'container[0,2.5]', ' button[0,0;0.5,0.5;x_substract_1;'..S('-')..']', ' field[0.75,0;0.75,0.5;x_offset;;'..offset.x..']', ' button[1.75,0;0.5,0.5;x_add_1;'..S('+')..']', 'container_end[]', 'container[5.25,0]', ' button[0,0;0.5,0.5;y_add_1;'..S('+')..']', ' field[0,0.75;0.75,0.5;y_offset;;'..offset.y..']', ' button[0,1.5;0.5,0.5;y_substract_1;'..S('-')..']', 'container_end[]', 'label[0.025,3.5;'..information..']', } }) end mtimer.dialog.timer_format = function (player_name) local timer_data = mtimer.get_timer_data(player_name) mtimer.show_formspec('mtimer:timer_format', { title = S('Timer Format'), show_to = player_name, height = 6, width = 8.5, formspec = { 'textarea[0,0;6,2.5;format;;'..esc(timer_data.format)..']', 'container[0,2.9]', 'label[2.5,0;'..S('Variable')..']', 'label[4,0;'..S('Current Value')..']', 'box[0,0.25;+contentWidth,0.02;#ffffff]', 'label[0,0.5;'..S('Real-World Date')..'] label[2.5,0.5;{rd}] label[4,0.5;'..esc(timer_data.real_world_date)..']', 'label[0,0.9;'..S('In-Game Time')..'] label[2.5,0.9;{it}] label[4,0.9;'..esc(timer_data.ingame_time)..']', 'label[0,1.3;'..S('Session Start Time')..'] label[2.5,1.3;{st}] label[4,1.3;'..esc(timer_data.session_start_time)..']', 'label[0,1.7;'..S('Session Duration')..'] label[2.5,1.7;{sd}] label[4,1.7;'..esc(timer_data.session_duration)..']', 'label[0,2.1;'..S('Host Time')..'] label[2.5,2.1;{ht}] label[4,2.1;'..esc(timer_data.host_time)..']', 'label[0,2.5;'..S('Custom Timer')..'] label[2.5,2.5;{ct}] label[4,2.5;'..esc(S('As configured'))..']', 'container_end[]', 'container[6.25,0]', mtimer.get_icon_button('apply', { label = S('Apply') }), 'container_end[]' } }) end