mtimer/system/formspecs/formspec_creation.lua
Dirk Sohler 062c01e535
adapt color dialog to new style
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
2021-04-05 09:29:44 +02:00

372 lines
14 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- # 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 cant 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