From a0c0c39a8cde66a402726f35129eedb79976de50 Mon Sep 17 00:00:00 2001 From: uramer Date: Sat, 9 Apr 2022 19:58:32 +0200 Subject: [PATCH] Separate setting keys and names, support localization --- .../scripts/omw/settings/common.lua | 58 ++++++------- .../scripts/omw/settings/player.lua | 1 + .../scripts/omw/settings/register.lua | 19 ++--- .../scripts/omw/settings/render.lua | 85 +++++++++++++------ 4 files changed, 97 insertions(+), 66 deletions(-) diff --git a/files/builtin_scripts/scripts/omw/settings/common.lua b/files/builtin_scripts/scripts/omw/settings/common.lua index f6645b3a11..ec7afcae22 100644 --- a/files/builtin_scripts/scripts/omw/settings/common.lua +++ b/files/builtin_scripts/scripts/omw/settings/common.lua @@ -52,28 +52,28 @@ local function isGlobalScope(scope) return scope == SCOPE.Global or scope == SCOPE.SaveGlobal end -local function getSetting(groupName, settingName) - local group = groups:get(groupName) +local function getSetting(groupKey, settingKey) + local group = groups:get(groupKey) if not group then error('Unknown group') end - local setting = group[settingName] + local setting = group[settingKey] if not setting then error('Unknown setting') end return setting end -local function getSettingValue(groupName, settingName) - local setting = getSetting(groupName, settingName) +local function getSettingValue(groupKey, settingKey) + local setting = getSetting(groupKey, settingKey) local scopeSection = scopes[setting.scope] if not scopeSection then - error(('Setting %s is not available in this context'):format(setting.name)) + error(('Setting %s is not available in this context'):format(setting.key)) end - if not scopeSection:get(groupName) then - scopeSection:set(groupName, {}) + if not scopeSection:get(groupKey) then + scopeSection:set(groupKey, {}) end - return scopeSection:get(groupName)[setting.name] or setting.default + return scopeSection:get(groupKey)[setting.key] or setting.default end local function notifySettingChange(scope, event) @@ -89,11 +89,11 @@ local function notifySettingChange(scope, event) end end -local function setSettingValue(groupName, settingName, value) - local setting = getSetting(groupName, settingName) +local function setSettingValue(groupKey, settingKey, value) + local setting = getSetting(groupKey, settingKey) local event = { - groupName = groupName, - settingName = setting.name, + groupName = groupKey, + settingName = setting.key, value = value, } if isPlayerScript and isGlobalScope(setting.scope) then @@ -102,43 +102,43 @@ local function setSettingValue(groupName, settingName, value) end local scopeSection = scopes[setting.scope] - if not scopeSection:get(groupName) then - scopeSection:set(groupName, {}) + if not scopeSection:get(groupKey) then + scopeSection:set(groupKey, {}) end - local copy = scopeSection:getCopy(groupName) - copy[setting.name] = value - scopeSection:set(groupName, copy) + local copy = scopeSection:getCopy(groupKey) + copy[setting.key] = value + scopeSection:set(groupKey, copy) notifySettingChange(setting.scope, event) end local groupMeta = { __index = { - get = function(self, settingName) - return getSettingValue(self.name, settingName) + get = function(self, settingKey) + return getSettingValue(self.key, settingKey) end, - set = function(self, settingName, value) - setSettingValue(self.name, settingName, value) + set = function(self, settingKey, value) + setSettingValue(self.key, settingKey, value) end, onChange = function(self, callback) table.insert(self.__callbacks, callback) end, - __changed = function(self, settingName, value) + __changed = function(self, settingKey, value) for _, callback in ipairs(self.__callbacks) do - callback(settingName, value) + callback(settingKey, value) end end, }, } local cachedGroups = {} -local function getGroup(groupName) - if not cachedGroups[groupName] then - cachedGroups[groupName] = setmetatable({ - name = groupName, +local function getGroup(groupKey) + if not cachedGroups[groupKey] then + cachedGroups[groupKey] = setmetatable({ + key = groupKey, __callbacks = {}, }, groupMeta) end - return cachedGroups[groupName] + return cachedGroups[groupKey] end return { diff --git a/files/builtin_scripts/scripts/omw/settings/player.lua b/files/builtin_scripts/scripts/omw/settings/player.lua index 42e333a4be..fb9a434e05 100644 --- a/files/builtin_scripts/scripts/omw/settings/player.lua +++ b/files/builtin_scripts/scripts/omw/settings/player.lua @@ -8,6 +8,7 @@ return { SCOPE = common.SCOPE, getGroup = common.getGroup, registerRenderer = render.registerRenderer, + localizeGroup = render.localizeGroup, }, engineHandlers = { onLoad = function(saved) diff --git a/files/builtin_scripts/scripts/omw/settings/register.lua b/files/builtin_scripts/scripts/omw/settings/register.lua index 93dcfc18bb..bc8812acf6 100644 --- a/files/builtin_scripts/scripts/omw/settings/register.lua +++ b/files/builtin_scripts/scripts/omw/settings/register.lua @@ -17,14 +17,8 @@ local function validScope(scope) end local function validateSettingOptions(options) - if type(options.name) ~= 'string' then - error('Setting must have a name') - end - if options.default == nil then - error('Setting must have a default value') - end - if type(options.description) ~= 'string' then - error('Setting must have a description') + if type(options.key) ~= 'string' then + error('Setting must have a key') end if not validScope(options.scope) then error(('Invalid setting scope %s'):format(options.scope)) @@ -36,14 +30,13 @@ end local function addSetting(group, options) validateSettingOptions(options) - if group[options.name] then - error(('Duplicate setting name %s'):format(options.name)) + if group[options.key] then + error(('Duplicate setting key %s'):format(options.key)) end - group[options.name] = { - name = options.name, + group[options.key] = { + key = options.key, scope = options.scope or SCOPE.Global, default = options.default, - description = options.description, renderer = options.renderer, } end diff --git a/files/builtin_scripts/scripts/omw/settings/render.lua b/files/builtin_scripts/scripts/omw/settings/render.lua index 0f9249a390..17217aab6f 100644 --- a/files/builtin_scripts/scripts/omw/settings/render.lua +++ b/files/builtin_scripts/scripts/omw/settings/render.lua @@ -9,51 +9,88 @@ local function registerRenderer(name, renderFunction) end local groupOptions = {} +local localization = {} -local function renderSetting(groupName, setting, value, index) +local function renderSetting(groupKey, setting, value, index) local renderFunction = renderers[setting.renderer] if not renderFunction then - error(('Setting %s of %s has unknown renderer %s'):format(setting.name, groupName, setting.renderer)) + error(('Setting %s of %s has unknown renderer %s'):format(setting.key, groupKey, setting.renderer)) end - local layout = renderFunction(setting, value or setting.default, function(value) - local group = common.getGroup(groupName) - group:set(setting.name, value) - local element = groupOptions[groupName].element - local settingLayout = renderSetting(groupName, setting, value, index) - settingLayout.name = setting.name - element.layout.content[setting.name] = settingLayout + local loc = localization[groupKey] and localization[groupKey].settings[setting.key] or { + name = setting.key, + description = '', + } + local layout = renderFunction(loc, value or setting.default, function(value) + local group = common.getGroup(groupKey) + group:set(setting.key, value) + local element = groupOptions[groupKey].element + local settingLayout = renderSetting(groupKey, setting, value, index) + settingLayout.name = setting.key + element.layout.content.settings.content[setting.key] = settingLayout element:update() end) - layout.name = setting.name + layout.name = setting.key return layout end -local function onGroupRegistered(groupName) - local group = common.groups:get(groupName) - local layout = { +local function updateLocalization(groupKey) + local loc = localization[groupKey] + local options = groupOptions[groupKey] + if not options or not loc then return end + local searchHints = { loc.name, loc.description } + options.name = loc.name + options.searchHints = table.concat(searchHints, ' ') + local layout = options.element.layout + layout.content.header.props.text = loc.description +end + +local function onGroupRegistered(groupKey) + local group = common.groups:get(groupKey) + local settingsLayout = { + name = 'settings', type = ui.TYPE.Flex, content = ui.content{}, } - local searchHints = { groupName } local count = 0 for _, setting in pairs(group) do count = count + 1 - local settingLayout = renderSetting(groupName, setting, setting.default, count) - settingLayout.name = setting.name - layout.content:add(settingLayout) - table.insert(searchHints, setting.name) + local settingLayout = renderSetting(groupKey, setting, setting.default, count) + settingLayout.key = setting.key + settingsLayout.content:add(settingLayout) end - local options = { - name = groupName, - element = ui.create(layout), - searchHints = table.concat(searchHints, ' '), + local layout = { + type = ui.TYPE.Flex, + content = ui.content { + { + name = 'header', + type = ui.TYPE.Text, + props = { + text = '', + textSize = 30, + textColor = util.color.rgb(1, 1, 1), + }, + }, + settingsLayout, + }, } - groupOptions[groupName] = options - print(('registering group %s'):format(groupName)) + local options = { + name = groupKey, + element = ui.create(layout), + searchHints = '', + } + groupOptions[groupKey] = options + updateLocalization(groupKey) + print(('registering group %s'):format(groupKey)) ui.registerSettingsPage(options) end +local function localizeGroup(groupKey, loc) + localization[groupKey] = loc + updateLocalization(groupKey) +end + return { onGroupRegistered = onGroupRegistered, registerRenderer = registerRenderer, + localizeGroup = localizeGroup, } \ No newline at end of file