Reworked settings (#111)
* Store globally settings (type and default value) * Add settings groups * Generate settings pages with global storage Add saving, generate selection idxs from settings list, order settings via index value in each group of settings * Rewrite setting store No code change, only format Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Remove tabs from settings groups Use spaces instead Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> * Use table.copy() minetest api function * Better formatting for setting tooltip Using inline instead of multiples lines to add tooltip attached to setting into formspec Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com> --------- Co-authored-by: SX <50966843+S-S-X@users.noreply.github.com>
This commit is contained in:
parent
fe533eeb4d
commit
e5996469fb
68
init.lua
68
init.lua
@ -1,3 +1,6 @@
|
|||||||
|
-- translation
|
||||||
|
local S = minetest.get_translator("mail")
|
||||||
|
|
||||||
mail = {
|
mail = {
|
||||||
-- version
|
-- version
|
||||||
version = 3,
|
version = 3,
|
||||||
@ -28,14 +31,7 @@ mail = {
|
|||||||
filter = {},
|
filter = {},
|
||||||
multipleselection = {},
|
multipleselection = {},
|
||||||
optionstab = {},
|
optionstab = {},
|
||||||
chat_notifications = {},
|
settings_group = {},
|
||||||
onjoin_notifications = {},
|
|
||||||
hud_notifications = {},
|
|
||||||
sound_notifications = {},
|
|
||||||
unreadcolorenable = {},
|
|
||||||
cccolorenable = {},
|
|
||||||
trash_move_enable = {},
|
|
||||||
auto_marking_read = {},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
colors = {
|
colors = {
|
||||||
@ -51,9 +47,65 @@ mail = {
|
|||||||
new = "#00F529"
|
new = "#00F529"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
chat_notifications = {
|
||||||
|
type = "bool", default = true, group = "notifications", index = 1,
|
||||||
|
label = S("Chat notifications"), tooltip = S("Receive a message in the chat when there is a new message")
|
||||||
|
},
|
||||||
|
onjoin_notifications = {
|
||||||
|
type = "bool", default = true, group = "notifications", index = 2,
|
||||||
|
label = S("On join notifications"), tooltip = S("Receive a message at login when inbox isn't empty") },
|
||||||
|
hud_notifications = {
|
||||||
|
type = "bool", default = true, group = "notifications", index = 3,
|
||||||
|
label = S("HUD notifications"), tooltip = S("Show an HUD notification when inbox isn't empty")
|
||||||
|
},
|
||||||
|
sound_notifications = {
|
||||||
|
type = "bool", default = true, group = "notifications", index = 4,
|
||||||
|
label = S("Sound notifications"), tooltip = S("Play a sound when there is a new message")
|
||||||
|
},
|
||||||
|
unreadcolorenable = {
|
||||||
|
type = "bool", default = true, group = "message_list", index = 1,
|
||||||
|
label = S("Show unread in different color")
|
||||||
|
},
|
||||||
|
cccolorenable = {
|
||||||
|
type = "bool", default = true, group = "message_list", index = 2,
|
||||||
|
label = S("Show CC/BCC in different color")
|
||||||
|
},
|
||||||
|
defaultsortfield = {
|
||||||
|
type = "index", default = 3, group = "message_list", index = 3,
|
||||||
|
label = S("Default sorting field"), dataset = { S("From/To"), S("Subject"), S("Date") }
|
||||||
|
},
|
||||||
|
defaultsortdirection = {
|
||||||
|
type = "index", default = 1, group = "message_list", index = 4,
|
||||||
|
label = S("Default sorting direction"), dataset = { S("Ascending"), S("Descending") }
|
||||||
|
},
|
||||||
|
trash_move_enable = {
|
||||||
|
type = "bool", default = true, group = "other", index = 1,
|
||||||
|
label = S("Move deleted messages to trash")
|
||||||
|
},
|
||||||
|
auto_marking_read = {
|
||||||
|
type = "bool", default = true, group = "other", index = 2,
|
||||||
|
label = S("Automatic marking read"), tooltip = S("Mark a message as read when opened")
|
||||||
|
},
|
||||||
|
date_format = {
|
||||||
|
type = "string", default = "%Y-%m-%d %X", group = "other", index = 3, label = S("Date format"),
|
||||||
|
dataset = {"%Y-%m-%d %X", "%d/%m/%y %X", "%A %d %B %Y %X"}, format = os.date
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
settings_groups = {
|
||||||
|
{ name = "notifications", label = S("Notifications")},
|
||||||
|
{ name = "message_list", label = S("Message list")},
|
||||||
|
{ name = "other", label = S("Other")}
|
||||||
|
},
|
||||||
|
|
||||||
message_drafts = {}
|
message_drafts = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for s, _ in pairs(mail.settings) do
|
||||||
|
mail.selected_idxs[s] = {}
|
||||||
|
end
|
||||||
|
|
||||||
if minetest.get_modpath("default") then
|
if minetest.get_modpath("default") then
|
||||||
mail.theme = default.gui_bg .. default.gui_bg_img
|
mail.theme = default.gui_bg .. default.gui_bg_img
|
||||||
end
|
end
|
||||||
|
15
storage.lua
15
storage.lua
@ -394,20 +394,7 @@ function mail.extractMaillists(receivers_string, maillists_owner)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function mail.get_setting_default_value(setting_name)
|
function mail.get_setting_default_value(setting_name)
|
||||||
local default_values = {
|
return mail.settings[setting_name].default
|
||||||
chat_notifications = true,
|
|
||||||
onjoin_notifications = true,
|
|
||||||
hud_notifications = true,
|
|
||||||
sound_notifications = true,
|
|
||||||
unreadcolorenable = true,
|
|
||||||
cccolorenable = true,
|
|
||||||
defaultsortfield = 3,
|
|
||||||
defaultsortdirection = 1,
|
|
||||||
trash_move_enable = true,
|
|
||||||
auto_marking_read = true,
|
|
||||||
date_format = "%Y-%m-%d %X",
|
|
||||||
}
|
|
||||||
return default_values[setting_name]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function mail.get_setting(playername, setting_name)
|
function mail.get_setting(playername, setting_name)
|
||||||
|
208
ui/settings.lua
208
ui/settings.lua
@ -3,70 +3,110 @@ local S = minetest.get_translator("mail")
|
|||||||
|
|
||||||
local FORMNAME = "mail:settings"
|
local FORMNAME = "mail:settings"
|
||||||
|
|
||||||
local date_formats = {"%Y-%m-%d %X", "%d/%m/%y %X", "%A %d %B %Y %X"}
|
|
||||||
|
|
||||||
function mail.show_settings(name)
|
function mail.show_settings(name)
|
||||||
-- date formats prepare
|
local groups_labels = {}
|
||||||
local dates_now = {}
|
local group_index = 1
|
||||||
local previous_date_format = mail.get_setting(name, "date_format")
|
mail.selected_idxs.settings_group[name] = mail.selected_idxs.settings_group[name] or mail.settings_groups[1].name
|
||||||
local date_dropdown_index = 1
|
for i, g in ipairs(mail.settings_groups) do
|
||||||
for i, f in pairs(date_formats) do
|
table.insert(groups_labels, g.label)
|
||||||
table.insert(dates_now, os.date(f, os.time()))
|
if g.name == mail.selected_idxs.settings_group[name] then
|
||||||
if f == previous_date_format then date_dropdown_index = i end
|
group_index = i
|
||||||
end
|
end
|
||||||
local date_dropdown_str = table.concat(dates_now, ",")
|
end
|
||||||
|
local groups_str = table.concat(groups_labels, ",")
|
||||||
|
|
||||||
local formspec = [[
|
local formspec = [[
|
||||||
size[10,6;]
|
size[10,6;]
|
||||||
tabheader[0.3,0.875;optionstab;]] .. S("Settings") .. "," .. S("About") .. [[;1;false;false]
|
tabheader[0.3,0.875;optionstab;]] .. S("Settings") .. "," .. S("About") .. [[;1;false;false]
|
||||||
button[9.35,0;0.75,0.5;back;X]
|
button[9.35,0;0.75,0.5;back;X]
|
||||||
|
|
||||||
box[0,0.8;3,0.45;]] .. mail.colors.highlighted .. [[]
|
tablecolumns[text]
|
||||||
label[0.2,0.8;]] .. S("Notifications") .. [[]
|
table[0,0.775;3,4.5;groups;]] .. groups_str .. [[;]] .. group_index .. [[]
|
||||||
checkbox[0,1.2;chat_notifications;]] .. S("Chat notifications") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "chat_notifications")) .. [[]
|
|
||||||
checkbox[0,1.6;onjoin_notifications;]] .. S("On join notifications") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "onjoin_notifications")) .. [[]
|
|
||||||
checkbox[0,2.0;hud_notifications;]] .. S("HUD notifications") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "hud_notifications")) .. [[]
|
|
||||||
checkbox[0,2.4;sound_notifications;]] .. S("Sound notifications") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "sound_notifications")) .. [[]
|
|
||||||
|
|
||||||
box[5,0.8;3,0.45;]] .. mail.colors.highlighted .. [[]
|
box[3.5,0.8;3,0.45;]] .. mail.colors.highlighted .. [[]
|
||||||
label[5.2,0.8;]] .. S("Message list") .. [[]
|
label[3.7,0.8;]] .. mail.settings_groups[group_index].label .. [[]
|
||||||
checkbox[5,1.2;unreadcolorenable;]] .. S("Show unread in different color") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "unreadcolorenable")) .. [[]
|
|
||||||
checkbox[5,1.6;cccolorenable;]] .. S("Show CC/BCC in different color") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "cccolorenable")) .. [[]
|
|
||||||
|
|
||||||
label[5,2.6;]] .. S("Default sorting fields") .. [[]
|
|
||||||
dropdown[5.5,3.0;2,0.5;defaultsortfield;]] ..
|
|
||||||
S("From/To") .. "," .. S("Subject") .. "," .. S("Date") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "defaultsortfield")) .. [[;true]
|
|
||||||
dropdown[7.5,3.0;2,0.5;defaultsortdirection;]] ..
|
|
||||||
S("Ascending") .. "," .. S("Descending") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "defaultsortdirection")) .. [[;true]
|
|
||||||
|
|
||||||
box[0,3.2;3,0.45;]] .. mail.colors.highlighted .. [[]
|
|
||||||
label[0.2,3.2;]] .. S("Other") .. [[]
|
|
||||||
checkbox[0,3.6;trash_move_enable;]] .. S("Move deleted messages to trash") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "trash_move_enable")) .. [[]
|
|
||||||
checkbox[0,4.0;auto_marking_read;]] .. S("Automatic marking read") .. [[;]] ..
|
|
||||||
tostring(mail.get_setting(name, "auto_marking_read")) .. [[]
|
|
||||||
label[0.31,4.7;]] .. S("Date format:") .. [[]
|
|
||||||
dropdown[2.7,4.6;4,0.5;date_format;]] .. date_dropdown_str .. [[;]] ..
|
|
||||||
tostring(date_dropdown_index) .. [[;true]
|
|
||||||
|
|
||||||
tooltip[chat_notifications;]] .. S("Receive a message in the chat when there is a new message") .. [[]
|
|
||||||
tooltip[onjoin_notifications;]] .. S("Receive a message at login when inbox isn't empty") .. [[]
|
|
||||||
tooltip[hud_notifications;]] .. S("Show an HUD notification when inbox isn't empty") .. [[]
|
|
||||||
tooltip[sound_notifications;]] .. S("Play a sound when there is a new message") .. [[]
|
|
||||||
tooltip[auto_marking_read;]] .. S("Mark a message as read when opened") .. [[]
|
|
||||||
|
|
||||||
button[0,5.65;2.5,0.5;reset;]] .. S("Reset") .. [[]
|
button[0,5.65;2.5,0.5;reset;]] .. S("Reset") .. [[]
|
||||||
button[7.5,5.65;2.5,0.5;save;]] .. S("Save") .. [[]
|
button[7.5,5.65;2.5,0.5;save;]] .. S("Save") .. [[]
|
||||||
]] .. mail.theme
|
]]
|
||||||
|
|
||||||
|
local x = 3.5
|
||||||
|
local y = 1
|
||||||
|
-- put settings in order
|
||||||
|
local ordered_settings = {}
|
||||||
|
for setting, data in pairs(mail.settings) do
|
||||||
|
if data.group == mail.selected_idxs.settings_group[name] then
|
||||||
|
table.insert(ordered_settings, setting)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.sort(ordered_settings, function(a, b) return mail.settings[a].index < mail.settings[b].index end)
|
||||||
|
for _, setting in pairs(ordered_settings) do
|
||||||
|
local data = mail.settings[setting]
|
||||||
|
y = y + 0.4
|
||||||
|
local field_default = mail.selected_idxs[setting][name]
|
||||||
|
if field_default == nil then field_default = mail.get_setting(name, setting) end
|
||||||
|
if data.type == "bool" then
|
||||||
|
formspec = formspec .. [[
|
||||||
|
checkbox[]] .. x .. "," .. y .. ";" .. setting .. ";" ..
|
||||||
|
data.label .. ";" .. tostring(field_default) .. [[]
|
||||||
|
]]
|
||||||
|
if data.tooltip then
|
||||||
|
formspec = formspec .. [[
|
||||||
|
tooltip[]] .. setting .. ";" .. data.tooltip .. [[]
|
||||||
|
]]
|
||||||
|
end
|
||||||
|
elseif data.type == "string" then
|
||||||
|
y = y + 1
|
||||||
|
formspec = formspec .. [[
|
||||||
|
field[]] .. x+0.275 .. "," .. y .. ";3,0.5;" .. setting .. ";" .. data.label .. [[;]] ..
|
||||||
|
field_default .. [[]
|
||||||
|
]]
|
||||||
|
if data.tooltip then
|
||||||
|
formspec = formspec .. "tooltip[" .. setting .. ";" .. data.tooltip .. "]"
|
||||||
|
end
|
||||||
|
if data.dataset then
|
||||||
|
local formatted_dataset = table.copy(data.dataset)
|
||||||
|
if data.format then
|
||||||
|
for i, d in ipairs(formatted_dataset) do
|
||||||
|
formatted_dataset[i] = data.format(d)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local dataset_str = table.concat(formatted_dataset, ",")
|
||||||
|
local dataset_selected_id = 1
|
||||||
|
for i, d in ipairs(data.dataset) do
|
||||||
|
if d == field_default then
|
||||||
|
dataset_selected_id = i
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
formspec = formspec .. [[
|
||||||
|
dropdown[]] .. x+3 .. "," .. y-0.45 .. ";3,0.5;" .. "dataset_" .. setting .. ";" ..
|
||||||
|
dataset_str .. [[;]] .. dataset_selected_id .. [[;true]
|
||||||
|
]]
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif data.type == "index" then
|
||||||
|
y = y + 0.55
|
||||||
|
local formatted_dataset = table.copy(data.dataset)
|
||||||
|
if data.format then
|
||||||
|
for i, d in ipairs(formatted_dataset) do
|
||||||
|
formatted_dataset[i] = data.format(d)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local dataset_str = table.concat(formatted_dataset, ",")
|
||||||
|
local dataset_selected_id = field_default
|
||||||
|
formspec = formspec .. [[
|
||||||
|
dropdown[]] .. x .. "," .. y .. ";3,0.5;" .. setting .. ";" ..
|
||||||
|
dataset_str .. [[;]] .. dataset_selected_id .. [[;true]
|
||||||
|
]]
|
||||||
|
if data.tooltip then
|
||||||
|
formspec = formspec .. [[
|
||||||
|
tooltip[]] .. setting .. ";" .. data.tooltip .. [[]
|
||||||
|
]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
formspec = formspec .. mail.theme
|
||||||
minetest.show_formspec(name, FORMNAME, formspec)
|
minetest.show_formspec(name, FORMNAME, formspec)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -77,10 +117,30 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
|
|
||||||
local playername = player:get_player_name()
|
local playername = player:get_player_name()
|
||||||
|
|
||||||
|
for setting, data in pairs(mail.settings) do
|
||||||
|
if fields[setting] then
|
||||||
|
if data.type == "bool" then
|
||||||
|
mail.selected_idxs[setting][playername] = fields[setting] == "true"
|
||||||
|
break
|
||||||
|
elseif data.type == "string" then
|
||||||
|
if data.dataset and fields["dataset_" .. setting] then
|
||||||
|
mail.selected_idxs[setting][playername] = data.dataset[tonumber(fields["dataset_" .. setting])]
|
||||||
|
end
|
||||||
|
mail.show_settings(playername)
|
||||||
|
elseif data.type == "index" then
|
||||||
|
mail.selected_idxs[setting][playername] = tonumber(fields[setting])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if fields.back then
|
if fields.back then
|
||||||
mail.show_mail_menu(playername)
|
mail.show_mail_menu(playername)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
elseif fields.groups then
|
||||||
|
local evt = minetest.explode_table_event(fields.groups)
|
||||||
|
mail.selected_idxs.settings_group[playername] = mail.settings_groups[tonumber(evt.row)].name
|
||||||
|
mail.show_settings(playername)
|
||||||
elseif fields.optionstab == "1" then
|
elseif fields.optionstab == "1" then
|
||||||
mail.selected_idxs.optionstab[playername] = 1
|
mail.selected_idxs.optionstab[playername] = 1
|
||||||
|
|
||||||
@ -89,47 +149,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
mail.show_about(playername)
|
mail.show_about(playername)
|
||||||
return
|
return
|
||||||
|
|
||||||
elseif fields.chat_notifications then
|
|
||||||
mail.selected_idxs.chat_notifications[playername] = fields.chat_notifications == "true"
|
|
||||||
|
|
||||||
elseif fields.onjoin_notifications then
|
|
||||||
mail.selected_idxs.onjoin_notifications[playername] = fields.onjoin_notifications == "true"
|
|
||||||
|
|
||||||
elseif fields.hud_notifications then
|
|
||||||
mail.selected_idxs.hud_notifications[playername] = fields.hud_notifications == "true"
|
|
||||||
|
|
||||||
elseif fields.sound_notifications then
|
|
||||||
mail.selected_idxs.sound_notifications[playername] = fields.sound_notifications == "true"
|
|
||||||
|
|
||||||
elseif fields.unreadcolorenable then
|
|
||||||
mail.selected_idxs.unreadcolorenable[playername] = fields.unreadcolorenable == "true"
|
|
||||||
|
|
||||||
elseif fields.cccolorenable then
|
|
||||||
mail.selected_idxs.cccolorenable[playername] = fields.cccolorenable == "true"
|
|
||||||
|
|
||||||
elseif fields.trash_move_enable then
|
|
||||||
mail.selected_idxs.trash_move_enable[playername] = fields.trash_move_enable == "true"
|
|
||||||
|
|
||||||
elseif fields.auto_marking_read then
|
|
||||||
mail.selected_idxs.auto_marking_read[playername] = fields.auto_marking_read == "true"
|
|
||||||
|
|
||||||
elseif fields.save then
|
elseif fields.save then
|
||||||
-- checkboxes
|
-- save settings
|
||||||
mail.set_setting(playername, "chat_notifications", mail.selected_idxs.chat_notifications[playername])
|
for setting, _ in pairs(mail.settings) do
|
||||||
mail.set_setting(playername, "onjoin_notifications", mail.selected_idxs.onjoin_notifications[playername])
|
local new_value = mail.selected_idxs[setting][playername]
|
||||||
mail.set_setting(playername, "hud_notifications", mail.selected_idxs.hud_notifications[playername])
|
if new_value == nil then new_value = mail.get_setting(playername, setting) end
|
||||||
mail.set_setting(playername, "sound_notifications", mail.selected_idxs.sound_notifications[playername])
|
mail.set_setting(playername, setting, new_value)
|
||||||
mail.set_setting(playername, "unreadcolorenable", mail.selected_idxs.unreadcolorenable[playername])
|
end
|
||||||
mail.set_setting(playername, "cccolorenable", mail.selected_idxs.cccolorenable[playername])
|
|
||||||
mail.set_setting(playername, "trash_move_enable", mail.selected_idxs.trash_move_enable[playername])
|
|
||||||
mail.set_setting(playername, "auto_marking_read", mail.selected_idxs.auto_marking_read[playername])
|
|
||||||
-- dropdowns
|
|
||||||
local defaultsortfield = fields.defaultsortfield or mail.get_setting(playername, "defaultsortfield")
|
|
||||||
local defaultsortdirection = fields.defaultsortdirection or mail.get_setting(playername, "defaultsortdirection")
|
|
||||||
local date_format = date_formats[tonumber(fields.date_format)] or mail.get_setting(playername, "date_format")
|
|
||||||
mail.set_setting(playername, "defaultsortfield", tonumber(defaultsortfield))
|
|
||||||
mail.set_setting(playername, "defaultsortdirection", tonumber(defaultsortdirection))
|
|
||||||
mail.set_setting(playername, "date_format", date_format)
|
|
||||||
-- update visuals
|
-- update visuals
|
||||||
mail.hud_update(playername, mail.get_storage_entry(playername).inbox)
|
mail.hud_update(playername, mail.get_storage_entry(playername).inbox)
|
||||||
mail.show_settings(playername)
|
mail.show_settings(playername)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user