mirror of
https://gitlab.com/4w/mtimer.git
synced 2024-12-01 03:33:56 +01:00
062c01e535
This also adds a palette to the color dialog so players can pick a color without typing in the hexadecimal number of it. Addresses https://gitlab.com/4w/mtimer/-/issues/16
372 lines
14 KiB
Lua
372 lines
14 KiB
Lua
-- # 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 palette = {}
|
||
local col = 0
|
||
local row = 1
|
||
|
||
local hexformat = table.concat({
|
||
'#',
|
||
minetest.colorize('#ce5c00', 'rr'),
|
||
minetest.colorize('#4e9a06', 'gg'),
|
||
minetest.colorize('#729fcf', 'bb')
|
||
})
|
||
|
||
-- Tango palette
|
||
--
|
||
-- @see http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines
|
||
local palette_entries = {
|
||
'fce94f', 'edd400', 'c4a000', 'fcaf3e', 'f57900', 'ce5c00', 'e9b96e',
|
||
'c17d11', '8f5902', '8ae234', '73d216', '4e9a06', '729fcf', '3465a4',
|
||
'204a87', 'ad7fa8', '75507b', '5c3566', 'ef2929', 'cc0000', 'a40000',
|
||
'eeeeec', 'd3d7cf', 'babdb6', '888a85', '555753', '2e3436', '000000',
|
||
'ff0000', '00ff00', '0000ff', 'ffff00', '00ffff', 'ff00ff', 'c0c0c0',
|
||
'808080', '800000', '808000', '008000', '800080', '008080', '000080',
|
||
}
|
||
|
||
for _,color in pairs(palette_entries) do
|
||
local cb_height = 0.6
|
||
local cb_width = 1.39
|
||
local cb_style = 'style[+name;bgcolor=#+color;textcolor=#+color]'
|
||
local cb_button = 'button[+left,+top;+width,+height;+name;+label]'
|
||
local cb_complete = cb_style..' '..cb_button
|
||
|
||
col = col + 1
|
||
if col > 7 then
|
||
col = 1
|
||
row = row + 1
|
||
end
|
||
|
||
table.insert(palette, ((cb_complete):gsub('%+%w+', {
|
||
['+top'] = (row - 1) * (cb_height + 0.05),
|
||
['+left'] = (col - 1) * (cb_width + 0.05),
|
||
['+width'] = cb_width,
|
||
['+height'] = cb_height,
|
||
['+name'] = 'set_color',
|
||
['+color'] = color,
|
||
['+label'] = color
|
||
})))
|
||
end
|
||
|
||
mtimer.show_formspec('mtimer:set_color', {
|
||
title = S('Color'),
|
||
show_to = player_name,
|
||
width = 10,
|
||
height = 6.2,
|
||
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]',
|
||
'tooltip[3.25,0;0.5,0.5;'..S('Current color: @1', color)..']',
|
||
'label[0,1;'..S('Use `@1` format only!', hexformat)..']',
|
||
'container[0,1.85]',
|
||
' box[0,-0.4;+contentWidth,0.04;#ffffff]',
|
||
' label[0,0;'..esc(S('Set a predefined color'))..']',
|
||
' container[0,0.4]'..table.concat(palette, ' ')..'container_end[]',
|
||
'container_end[]'
|
||
}
|
||
})
|
||
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
|