mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.8 KiB
Lua
142 lines
4.8 KiB
Lua
local storage = require('openmw.storage')
|
|
|
|
local groupSectionKey = 'OmwSettingGroups'
|
|
local conventionPrefix = 'Settings'
|
|
local argumentSectionPostfix = 'Arguments'
|
|
|
|
local contextSection = storage.playerSection or storage.globalSection
|
|
local groupSection = contextSection(groupSectionKey)
|
|
|
|
local function validateSettingOptions(options)
|
|
if type(options) ~= 'table' then
|
|
error('Setting options must be a table')
|
|
end
|
|
if type(options.key) ~= 'string' then
|
|
error('Setting must have a key')
|
|
end
|
|
if type(options.renderer) ~= 'string' then
|
|
error('Setting must have a renderer')
|
|
end
|
|
if type(options.name) ~= 'string' then
|
|
error('Setting must have a name localization key')
|
|
end
|
|
if options.description ~= nil and type(options.description) ~= 'string' then
|
|
error('Setting description key must be a string')
|
|
end
|
|
end
|
|
|
|
local function validateGroupOptions(options)
|
|
if type(options) ~= 'table' then
|
|
error('Group options must be a table')
|
|
end
|
|
if type(options.key) ~= 'string' then
|
|
error('Group must have a key')
|
|
end
|
|
if options.key:sub(1, conventionPrefix:len()) ~= conventionPrefix then
|
|
print(("Group key %s doesn't start with %s"):format(options.key, conventionPrefix))
|
|
end
|
|
if type(options.page) ~= 'string' then
|
|
error('Group must belong to a page')
|
|
end
|
|
if type(options.order) ~= 'number' and type(options.order) ~= 'nil' then
|
|
error('Group order must be a number')
|
|
end
|
|
if type(options.l10n) ~= 'string' then
|
|
error('Group must have a localization context')
|
|
end
|
|
if type(options.name) ~= 'string' then
|
|
error('Group must have a name localization key')
|
|
end
|
|
if options.description ~= nil and type(options.description) ~= 'string' then
|
|
error('Group description key must be a string')
|
|
end
|
|
if type(options.permanentStorage) ~= 'boolean' then
|
|
error('Group must have a permanentStorage flag')
|
|
end
|
|
if type(options.settings) ~= 'table' then
|
|
error('Group must have a table of settings')
|
|
end
|
|
for _, opt in ipairs(options.settings) do
|
|
validateSettingOptions(opt)
|
|
end
|
|
end
|
|
|
|
local function registerSetting(options)
|
|
return {
|
|
key = options.key,
|
|
default = options.default,
|
|
renderer = options.renderer,
|
|
argument = options.argument,
|
|
|
|
name = options.name,
|
|
description = options.description,
|
|
}
|
|
end
|
|
|
|
local function registerGroup(options)
|
|
validateGroupOptions(options)
|
|
if groupSection:get(options.key) then
|
|
error(('Group with key %s was already registered'):format(options.key))
|
|
end
|
|
local group = {
|
|
key = options.key,
|
|
page = options.page,
|
|
order = options.order or 0,
|
|
l10n = options.l10n,
|
|
name = options.name,
|
|
description = options.description,
|
|
permanentStorage = options.permanentStorage,
|
|
settings = {},
|
|
}
|
|
local valueSection = contextSection(options.key)
|
|
local argumentSection = contextSection(options.key .. argumentSectionPostfix)
|
|
for i, opt in ipairs(options.settings) do
|
|
local setting = registerSetting(opt)
|
|
setting.order = i
|
|
if group.settings[setting.key] then
|
|
error(('Duplicate setting key %s'):format(options.key))
|
|
end
|
|
group.settings[setting.key] = setting
|
|
if valueSection:get(setting.key) == nil then
|
|
valueSection:set(setting.key, setting.default)
|
|
end
|
|
argumentSection:set(setting.key, setting.argument)
|
|
end
|
|
groupSection:set(group.key, group)
|
|
end
|
|
|
|
return {
|
|
getSection = function(global, key)
|
|
return (global and storage.globalSection or storage.playerSection)(key)
|
|
end,
|
|
getArgumentSection = function(global, key)
|
|
return (global and storage.globalSection or storage.playerSection)(key .. argumentSectionPostfix)
|
|
end,
|
|
updateRendererArgument = function(groupKey, settingKey, argument)
|
|
local argumentSection = contextSection(groupKey .. argumentSectionPostfix)
|
|
argumentSection:set(settingKey, argument)
|
|
end,
|
|
setGlobalEvent = 'OMWSettingsGlobalSet',
|
|
registerPageEvent = 'OmWSettingsRegisterPage',
|
|
groupSectionKey = groupSectionKey,
|
|
onLoad = function(saved)
|
|
if not saved then return end
|
|
for groupKey, settings in pairs(saved) do
|
|
local section = contextSection(groupKey)
|
|
for key, value in pairs(settings) do
|
|
section:set(key, value)
|
|
end
|
|
end
|
|
end,
|
|
onSave = function()
|
|
local saved = {}
|
|
for groupKey, group in pairs(groupSection:asTable()) do
|
|
if not group.permanentStorage then
|
|
saved[groupKey] = contextSection(groupKey):asTable()
|
|
end
|
|
end
|
|
return saved
|
|
end,
|
|
registerGroup = registerGroup,
|
|
}
|