From 35a79b40142cff65c9761401918448808362dfd6 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Wed, 5 Oct 2022 19:19:19 -0300 Subject: [PATCH] portoform barrier and division by zero fix, framework update --- Libs/DF/button.lua | 304 ++++++----- Libs/DF/fw.lua | 1171 ++++++++++++++++++++-------------------- Libs/DF/languages.lua | 380 ++++++++++--- classes/class_heal.lua | 6 +- core/parser.lua | 1 + 5 files changed, 1054 insertions(+), 808 deletions(-) diff --git a/Libs/DF/button.lua b/Libs/DF/button.lua index 80896fbf..9e00552c 100644 --- a/Libs/DF/button.lua +++ b/Libs/DF/button.lua @@ -943,75 +943,77 @@ local ButtonMetaFunctions = _G[DF.GlobalWidgetControlNames ["button"]] ------------------------------------------------------------------------------------------------------------ -function ButtonMetaFunctions:SetTemplate (template) - - if (type (template) == "string") then - template = DF:GetTemplate ("button", template) +function ButtonMetaFunctions:SetTemplate(template) + if (type(template) == "string") then + template = DF:GetTemplate("button", template) end - + if (not template) then - DF:Error ("template not found") + DF:Error("template not found") return end - + if (template.width) then - self:SetWidth (template.width) + self:SetWidth(template.width) end + if (template.height) then - self:SetHeight (template.height) + self:SetHeight(template.height) end - + if (template.backdrop) then - self:SetBackdrop (template.backdrop) + self:SetBackdrop(template.backdrop) end + if (template.backdropcolor) then - local r, g, b, a = DF:ParseColors (template.backdropcolor) - self:SetBackdropColor (r, g, b, a) + local r, g, b, a = DF:ParseColors(template.backdropcolor) + self:SetBackdropColor(r, g, b, a) self.onleave_backdrop = {r, g, b, a} end + if (template.backdropbordercolor) then - local r, g, b, a = DF:ParseColors (template.backdropbordercolor) - self:SetBackdropBorderColor (r, g, b, a) + local r, g, b, a = DF:ParseColors(template.backdropbordercolor) + self:SetBackdropBorderColor(r, g, b, a) self.onleave_backdrop_border_color = {r, g, b, a} end - + if (template.onentercolor) then - local r, g, b, a = DF:ParseColors (template.onentercolor) + local r, g, b, a = DF:ParseColors(template.onentercolor) self.onenter_backdrop = {r, g, b, a} end - + if (template.onleavecolor) then - local r, g, b, a = DF:ParseColors (template.onleavecolor) + local r, g, b, a = DF:ParseColors(template.onleavecolor) self.onleave_backdrop = {r, g, b, a} end - + if (template.onenterbordercolor) then - local r, g, b, a = DF:ParseColors (template.onenterbordercolor) + local r, g, b, a = DF:ParseColors(template.onenterbordercolor) self.onenter_backdrop_border_color = {r, g, b, a} end - + if (template.onleavebordercolor) then - local r, g, b, a = DF:ParseColors (template.onleavebordercolor) + local r, g, b, a = DF:ParseColors(template.onleavebordercolor) self.onleave_backdrop_border_color = {r, g, b, a} end - + if (template.icon) then local i = template.icon - self:SetIcon (i.texture, i.width, i.height, i.layout, i.texcoord, i.color, i.textdistance, i.leftpadding) + self:SetIcon(i.texture, i.width, i.height, i.layout, i.texcoord, i.color, i.textdistance, i.leftpadding) end - + if (template.textsize) then self.textsize = template.textsize end - + if (template.textfont) then self.textfont = template.textfont end - + if (template.textcolor) then self.textcolor = template.textcolor end - + if (template.textalign) then self.textalign = template.textalign end @@ -1020,183 +1022,179 @@ end ------------------------------------------------------------------------------------------------------------ --> object constructor -local build_button = function (self) - self:SetSize (100, 20) - - self.text = self:CreateFontString ("$parent_Text", "ARTWORK", "GameFontNormal") - self.text:SetJustifyH ("CENTER") - DF:SetFontSize (self.text, 10) - self.text:SetPoint ("CENTER", self, "CENTER", 0, 0) - - self.texture_disabled = self:CreateTexture ("$parent_TextureDisabled", "OVERLAY") +local createButtonWidgets = function(self) + self:SetSize(100, 20) + + self.text = self:CreateFontString("$parent_Text", "ARTWORK", "GameFontNormal") + self.text:SetJustifyH("CENTER") + DF:SetFontSize(self.text, 10) + self.text:SetPoint("CENTER", self, "CENTER", 0, 0) + + self.texture_disabled = self:CreateTexture("$parent_TextureDisabled", "OVERLAY") self.texture_disabled:SetAllPoints() self.texture_disabled:Hide() - self.texture_disabled:SetTexture ("Interface\\Tooltips\\UI-Tooltip-Background") - - self:SetScript ("OnDisable", function (self) + self.texture_disabled:SetTexture("Interface\\Tooltips\\UI-Tooltip-Background") + + self:SetScript("OnDisable", function(self) self.texture_disabled:Show() - self.texture_disabled:SetVertexColor (0, 0, 0) - self.texture_disabled:SetAlpha (.5) + self.texture_disabled:SetVertexColor(0, 0, 0) + self.texture_disabled:SetAlpha(.5) end) - - self:SetScript ("OnEnable", function (self) + + self:SetScript("OnEnable", function(self) self.texture_disabled:Hide() end) end -function DF:CreateButton (parent, func, w, h, text, param1, param2, texture, member, name, short_method, button_template, text_template) - return DF:NewButton (parent, parent, name, member, w, h, func, param1, param2, texture, text, short_method, button_template, text_template) +function DF:CreateButton(parent, func, width, height, text, param1, param2, texture, member, name, shortMethod, buttonTemplate, textTemplate) + return DF:NewButton(parent, parent, name, member, width, height, func, param1, param2, texture, text, shortMethod, buttonTemplate, textTemplate) end -function DF:NewButton (parent, container, name, member, w, h, func, param1, param2, texture, text, short_method, button_template, text_template) - +function DF:NewButton(parent, container, name, member, width, height, func, param1, param2, texture, text, shortMethod, buttonTemplate, textTemplate) if (not name) then name = "DetailsFrameworkButtonNumber" .. DF.ButtonCounter DF.ButtonCounter = DF.ButtonCounter + 1 - + elseif (not parent) then - return error ("Details! FrameWork: parent not found.", 2) + return error("Details! FrameWork: parent not found.", 2) end + if (not container) then container = parent end - - if (name:find ("$parent")) then - local parentName = DF.GetParentName (parent) - name = name:gsub ("$parent", parentName) + + if (name:find("$parent")) then + local parentName = DF.GetParentName(parent) + name = name:gsub("$parent", parentName) end - local ButtonObject = {type = "button", dframework = true} - + local buttonObject = {type = "button", dframework = true} + if (member) then - parent [member] = ButtonObject - end - + parent[member] = buttonObject + end + if (parent.dframework) then parent = parent.widget end if (container.dframework) then container = container.widget end - - --> default members: - ButtonObject.is_locked = true - ButtonObject.container = container - ButtonObject.options = {OnGrab = false} - ButtonObject.button = CreateFrame ("button", name, parent,"BackdropTemplate") - DF:Mixin (ButtonObject.button, DF.WidgetFunctions) - - build_button (ButtonObject.button) - - ButtonObject.widget = ButtonObject.button - ButtonObject.button:SetBackdropColor (0, 0, 0, 0.4) - ButtonObject.button:SetBackdropBorderColor (1, 1, 1, 1) - + --default members + buttonObject.is_locked = true + buttonObject.container = container + buttonObject.options = {OnGrab = false} + + buttonObject.button = CreateFrame("button", name, parent, "BackdropTemplate") + DF:Mixin(buttonObject.button, DF.WidgetFunctions) + + createButtonWidgets(buttonObject.button) + + buttonObject.widget = buttonObject.button + buttonObject.button:SetBackdropColor(0, 0, 0, 0.4) + buttonObject.button:SetBackdropBorderColor(1, 1, 1, 1) + if (not APIButtonFunctions) then APIButtonFunctions = true - local idx = getmetatable (ButtonObject.button).__index - for funcName, funcAddress in pairs (idx) do - if (not ButtonMetaFunctions [funcName]) then - ButtonMetaFunctions [funcName] = function (object, ...) - local x = loadstring ( "return _G['"..object.button:GetName().."']:"..funcName.."(...)") - return x (...) + local idx = getmetatable(buttonObject.button).__index + for funcName, funcAddress in pairs(idx) do + if (not ButtonMetaFunctions[funcName]) then + ButtonMetaFunctions[funcName] = function(object, ...) + local x = loadstring("return _G['"..object.button:GetName().."']:"..funcName.."(...)") + return x(...) end end end end - - ButtonObject.button:SetWidth (w or 100) - ButtonObject.button:SetHeight (h or 20) - ButtonObject.button.MyObject = ButtonObject - - ButtonObject.text_overlay = _G [name .. "_Text"] - ButtonObject.disabled_overlay = _G [name .. "_TextureDisabled"] - - texture = texture or "" - ButtonObject.button:SetNormalTexture (texture) - ButtonObject.button:SetPushedTexture (texture) - ButtonObject.button:SetDisabledTexture (texture) - ButtonObject.button:SetHighlightTexture (texture, "ADD") - - ButtonObject.button.text:SetText (text or "") - ButtonObject.button.text:SetPoint ("center", ButtonObject.button, "center") + buttonObject.button:SetWidth(width or 100) + buttonObject.button:SetHeight(height or 20) + buttonObject.button.MyObject = buttonObject - local text_width = ButtonObject.button.text:GetStringWidth() - if (text_width > w-15 and ButtonObject.button.text:GetText() ~= "") then - if (short_method == false) then --> if is false, do not use auto resize + buttonObject.text_overlay = _G[name .. "_Text"] + buttonObject.disabled_overlay = _G[name .. "_TextureDisabled"] + + texture = texture or "" + buttonObject.button:SetNormalTexture(texture) + buttonObject.button:SetPushedTexture(texture) + buttonObject.button:SetDisabledTexture(texture) + buttonObject.button:SetHighlightTexture(texture, "ADD") + + buttonObject.button.text:SetText(text or "") + buttonObject.button.text:SetPoint("center", buttonObject.button, "center") + + local textWidth = buttonObject.button.text:GetStringWidth() + if (textWidth > width - 15 and buttonObject.button.text:GetText() ~= "") then + if (shortMethod == false) then --> if is false, do not use auto resize --do nothing - elseif (not short_method) then --> if the value is omitted, use the default resize - local new_width = text_width+15 - ButtonObject.button:SetWidth (new_width) - - elseif (short_method == 1) then + elseif (not shortMethod) then --> if the value is omitted, use the default resize + local new_width = textWidth + 15 + buttonObject.button:SetWidth(new_width) + + elseif (shortMethod == 1) then local loop = true local textsize = 11 while (loop) do - if (text_width+15 < w or textsize < 8) then + if (textWidth + 15 < width or textsize < 8) then loop = false break else - DF:SetFontSize (ButtonObject.button.text, textsize) - text_width = ButtonObject.button.text:GetStringWidth() + DF:SetFontSize(buttonObject.button.text, textsize) + textWidth = buttonObject.button.text:GetStringWidth() textsize = textsize - 1 end end - - elseif (short_method == 2) then - + elseif (shortMethod == 2) then + end end - - ButtonObject.func = func or cleanfunction - ButtonObject.funcright = cleanfunction - ButtonObject.param1 = param1 - ButtonObject.param2 = param2 - - ButtonObject.short_method = short_method - - if (text_template) then - if (text_template.size) then - DF:SetFontSize (ButtonObject.button.text, text_template.size) + + buttonObject.func = func or cleanfunction + buttonObject.funcright = cleanfunction + buttonObject.param1 = param1 + buttonObject.param2 = param2 + buttonObject.short_method = shortMethod + + if (textTemplate) then + if (textTemplate.size) then + DF:SetFontSize(buttonObject.button.text, textTemplate.size) end - if (text_template.color) then - local r, g, b, a = DF:ParseColors (text_template.color) - ButtonObject.button.text:SetTextColor (r, g, b, a) + if (textTemplate.color) then + local r, g, b, a = DF:ParseColors(textTemplate.color) + buttonObject.button.text:SetTextColor(r, g, b, a) end - if (text_template.font) then - local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") - local font = SharedMedia:Fetch ("font", text_template.font) - DF:SetFontFace (ButtonObject.button.text, font) + if (textTemplate.font) then + local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0") + local font = SharedMedia:Fetch("font", textTemplate.font) + DF:SetFontFace(buttonObject.button.text, font) end end - - --> hooks - ButtonObject.HookList = { - OnEnter = {}, - OnLeave = {}, - OnHide = {}, - OnShow = {}, - OnMouseDown = {}, - OnMouseUp = {}, - } - - ButtonObject.button:SetScript ("OnEnter", OnEnter) - ButtonObject.button:SetScript ("OnLeave", OnLeave) - ButtonObject.button:SetScript ("OnHide", OnHide) - ButtonObject.button:SetScript ("OnShow", OnShow) - ButtonObject.button:SetScript ("OnMouseDown", OnMouseDown) - ButtonObject.button:SetScript ("OnMouseUp", OnMouseUp) - - _setmetatable (ButtonObject, ButtonMetaFunctions) - - if (button_template) then - ButtonObject:SetTemplate (button_template) + + --hooks + buttonObject.HookList = { + OnEnter = {}, + OnLeave = {}, + OnHide = {}, + OnShow = {}, + OnMouseDown = {}, + OnMouseUp = {}, + } + + buttonObject.button:SetScript("OnEnter", OnEnter) + buttonObject.button:SetScript("OnLeave", OnLeave) + buttonObject.button:SetScript("OnHide", OnHide) + buttonObject.button:SetScript("OnShow", OnShow) + buttonObject.button:SetScript("OnMouseDown", OnMouseDown) + buttonObject.button:SetScript("OnMouseUp", OnMouseUp) + + setmetatable(buttonObject, ButtonMetaFunctions) + + if (buttonTemplate) then + buttonObject:SetTemplate(buttonTemplate) end - - return ButtonObject - + + return buttonObject end local pickcolor_callback = function (self, r, g, b, a, button) diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index beb57db0..a71c9213 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 373 +local dversion = 374 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary(major, minor) @@ -1337,137 +1337,139 @@ end ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> menus + --get the text for the widget name and description from the language system + local parseWidgetNameAndDesc = function(languageTable, namePhraseId, descPhraseId, widgetName, widgetDesc) + local returnedName = widgetName + local returnedDesc = widgetDesc + + if (languageTable) then + if (namePhraseId) then + returnedName = languageTable[namePhraseId] or namePhraseId + end + if (descPhraseId) then + returnedDesc = languageTable[descPhraseId] or descPhraseId + end + return returnedName, returnedDesc + else + return returnedName, returnedDesc + end + end local disable_on_combat = {} local getMenuWidgetVolative = function(parent, widgetType, indexTable) - - local widget + local widgetObject if (widgetType == "label") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] - if (not widget) then - widget = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType], "overlay") - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType], "overlay") + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) end - indexTable[widgetType] = indexTable[widgetType] + 1 elseif (widgetType == "dropdown") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] - - if (not widget) then - widget = DF:CreateDropDown (parent, function() return {} end, nil, 140, 18, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) - widget.hasLabel = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateDropDown(parent, function() return {} end, nil, 140, 18, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) + widgetObject.hasLabel = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) else - widget:ClearHooks() - widget.hasLabel.text = "" + widgetObject:ClearHooks() + widgetObject.hasLabel.text = "" end - indexTable[widgetType] = indexTable[widgetType] + 1 elseif (widgetType == "switch") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateSwitch(parent, nil, true, 20, 20, nil, nil, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) + widgetObject.hasLabel = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - if (not widget) then - widget = DF:CreateSwitch (parent, nil, true, 20, 20, nil, nil, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) - widget.hasLabel = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) else - widget:ClearHooks() + widgetObject:ClearHooks() end - indexTable[widgetType] = indexTable[widgetType] + 1 elseif (widgetType == "slider") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] - - if (not widget) then - widget = DF:CreateSlider (parent, 140, 20, 1, 2, 1, 1, false, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) - widget.hasLabel = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateSlider(parent, 140, 20, 1, 2, 1, 1, false, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) + widgetObject.hasLabel = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) else - widget:ClearHooks() + widgetObject:ClearHooks() end - indexTable[widgetType] = indexTable[widgetType] + 1 elseif (widgetType == "color") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] - - if (not widget) then - widget = DF:CreateColorPickButton (parent, "$parentWidget" .. widgetType .. indexTable[widgetType], nil, function()end, 1) - widget.hasLabel = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateColorPickButton(parent, "$parentWidget" .. widgetType .. indexTable[widgetType], nil, function()end, 1) + widgetObject.hasLabel = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) else - widget:ClearHooks() + widgetObject:ClearHooks() end - indexTable[widgetType] = indexTable[widgetType] + 1 elseif (widgetType == "button") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] - - if (not widget) then - widget = DF:CreateButton (parent, function()end, 120, 18, "", nil, nil, nil, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) - widget.hasLabel = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateButton(parent, function()end, 120, 18, "", nil, nil, nil, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) + widgetObject.hasLabel = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) else - widget:ClearHooks() + widgetObject:ClearHooks() end - indexTable[widgetType] = indexTable[widgetType] + 1 elseif (widgetType == "textentry") then - widget = parent.widget_list_by_type[widgetType][indexTable[widgetType]] - - if (not widget) then - widget = DF:CreateTextEntry (parent, function()end, 120, 18, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) - widget.hasLabel = DF:CreateLabel (parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") + widgetObject = parent.widget_list_by_type[widgetType][indexTable[widgetType]] + if (not widgetObject) then + widgetObject = DF:CreateTextEntry(parent, function()end, 120, 18, nil, "$parentWidget" .. widgetType .. indexTable[widgetType]) + widgetObject.hasLabel = DF:CreateLabel(parent, "", 10, "white", "", nil, "$parentWidget" .. widgetType .. indexTable[widgetType] .. "label", "overlay") - tinsert(parent.widget_list, widget) - tinsert(parent.widget_list_by_type[widgetType], widget) + tinsert(parent.widget_list, widgetObject) + tinsert(parent.widget_list_by_type[widgetType], widgetObject) else - widget:ClearHooks() + widgetObject:ClearHooks() end - indexTable[widgetType] = indexTable[widgetType] + 1 end --if the widget is inside the no combat table, remove it for i = 1, #disable_on_combat do - if (disable_on_combat[i] == widget) then + if (disable_on_combat[i] == widgetObject) then tremove(disable_on_combat, i) break end end - return widget + return widgetObject end --volatile menu can be called several times, each time all settings are reset and a new menu is built using the same widgets - function DF:BuildMenuVolatile (parent, menu, x_offset, y_offset, height, use_two_points, text_template, dropdown_template, switch_template, switch_is_box, slider_template, button_template, value_change_hook) - + function DF:BuildMenuVolatile(parent, menuOptions, xOffset, yOffset, height, useColon, textTemplate, dropdownTemplate, switchTemplate, switchIsCheckbox, sliderTemplate, buttonTemplate, valueChangeHook) if (not parent.widget_list) then - DF:SetAsOptionsPanel (parent) + DF:SetAsOptionsPanel(parent) end DF:ClearOptionsPanel(parent) - local cur_x = x_offset - local cur_y = y_offset - local max_x = 0 + local currentXOffset = xOffset + local currentYOffset = yOffset + local maxColumnWidth = 0 local latestInlineWidget @@ -1481,399 +1483,398 @@ end textentry = 1, } - height = abs ((height or parent:GetHeight()) - abs (y_offset) + 20) - height = height*-1 + height = abs((height or parent:GetHeight()) - abs(yOffset) + 20) + height = height * -1 --normalize format types - for index, widgetTable in ipairs(menu) do + for index, widgetTable in ipairs(menuOptions) do if (widgetTable.type == "space") then widgetTable.type = "blank" + elseif (widgetTable.type == "dropdown") then widgetTable.type = "select" + elseif (widgetTable.type == "switch") then widgetTable.type = "toggle" + elseif (widgetTable.type == "slider") then widgetTable.type = "range" + elseif (widgetTable.type == "button") then widgetTable.type = "execute" + end end --catch some options added in the hash part of the menu table - local useBoxFirstOnAllWidgets = menu.always_boxfirst + local useBoxFirstOnAllWidgets = menuOptions.always_boxfirst + local languageAddonId = menuOptions.language_addonId + local languageTable - for index, widget_table in ipairs(menu) do - if (not widget_table.hidden) then + if (languageAddonId) then + languageTable = DetailsFramework.Language.GetLanguageTable(languageAddonId) + end - local widget_created + for index, widgetTable in ipairs(menuOptions) do + if (not widgetTable.hidden) then + + local widgetCreated if (latestInlineWidget) then - if (not widget_table.inline) then + if (not widgetTable.inline) then latestInlineWidget = nil - cur_y = cur_y - 20 + currentYOffset = currentYOffset - 20 end end - if (not widget_table.novolatile) then - + if (not widgetTable.novolatile) then --step a line - if (widget_table.type == "blank" or widget_table.type == "space") then - -- do nothing - - elseif (widget_table.type == "label" or widget_table.type == "text") then + if (widgetTable.type == "blank" or widgetTable.type == "space") then + --do nothing + elseif (widgetTable.type == "label" or widgetTable.type == "text") then local label = getMenuWidgetVolative(parent, "label", widgetIndexes) - widget_created = label + widgetCreated = label - label.text = widget_table.get() or widget_table.text or "" - label.color = widget_table.color + label.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.get and widgetTable.get() or widgetTable.text) or (widgetTable.namePhraseId) or "" + label.color = widgetTable.color - if (widget_table.font) then - label.fontface = widget_table.font + if (widgetTable.font) then + label.fontface = widgetTable.font end - if (widget_table.text_template or text_template) then - label:SetTemplate(widget_table.text_template or text_template) + if (widgetTable.text_template or textTemplate) then + label:SetTemplate(widgetTable.text_template or textTemplate) else - label.fontsize = widget_table.size or 10 + label.fontsize = widgetTable.size or 10 end - label._get = widget_table.get + label._get = widgetTable.get label.widget_type = "label" label:ClearAllPoints() - label:SetPoint (cur_x, cur_y) + label:SetPoint (currentXOffset, currentYOffset) - if (widget_table.id) then - parent.widgetids [widget_table.id] = label + if (widgetTable.id) then + parent.widgetids [widgetTable.id] = label end --dropdowns - elseif (widget_table.type == "select" or widget_table.type == "dropdown") then - + elseif (widgetTable.type == "select" or widgetTable.type == "dropdown") then local dropdown = getMenuWidgetVolative(parent, "dropdown", widgetIndexes) - widget_created = dropdown + widgetCreated = dropdown - dropdown:SetFunction(widget_table.values) + dropdown:SetFunction(widgetTable.values) dropdown:Refresh() - dropdown:Select (widget_table.get()) - dropdown:SetTemplate (dropdown_template) + dropdown:Select(widgetTable.get()) + dropdown:SetTemplate(dropdownTemplate) - dropdown.tooltip = widget_table.desc - dropdown._get = widget_table.get + dropdown.tooltip = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId) + dropdown._get = widgetTable.get dropdown.widget_type = "select" + dropdown.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name .. (useColon and ": " or "")) or (widgetTable.namePhraseId) or "" - dropdown.hasLabel.text = widget_table.name .. (use_two_points and ": " or "") - dropdown.hasLabel:SetTemplate(widget_table.text_template or text_template) + dropdown.hasLabel:SetTemplate(widgetTable.text_template or textTemplate) dropdown:ClearAllPoints() - dropdown:SetPoint ("left", dropdown.hasLabel, "right", 2) + dropdown:SetPoint("left", dropdown.hasLabel, "right", 2) dropdown.hasLabel:ClearAllPoints() - dropdown.hasLabel:SetPoint (cur_x, cur_y) + dropdown.hasLabel:SetPoint(currentXOffset, currentYOffset) - --> global callback - if (value_change_hook) then - dropdown:SetHook ("OnOptionSelected", value_change_hook) + --global callback + if (valueChangeHook) then + dropdown:SetHook("OnOptionSelected", valueChangeHook) end - - --> hook list (hook list is wiped when getting the widget) - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - dropdown:SetHook (hookName, hookFunc) + + --hook list (hook list is wiped when getting the widget) + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + dropdown:SetHook(hookName, hookFunc) end end - if (widget_table.id) then - parent.widgetids [widget_table.id] = dropdown + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = dropdown end - - local size = dropdown.hasLabel.widget:GetStringWidth() + 140 + 4 - if (size > max_x) then - max_x = size + + local widgetTotalSize = dropdown.hasLabel.widget:GetStringWidth() + 140 + 4 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end --switchs - elseif (widget_table.type == "toggle" or widget_table.type == "switch") then - + elseif (widgetTable.type == "toggle" or widgetTable.type == "switch") then local switch = getMenuWidgetVolative(parent, "switch", widgetIndexes) - widget_created = switch + widgetCreated = switch - switch:SetValue(widget_table.get()) - switch:SetTemplate(switch_template) + switch:SetValue(widgetTable.get()) + switch:SetTemplate(switchTemplate) switch:SetAsCheckBox() --it's always a checkbox on volatile menu - switch.tooltip = widget_table.desc - switch._get = widget_table.get + switch.tooltip = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId) + switch._get = widgetTable.get switch.widget_type = "toggle" - switch.OnSwitch = widget_table.set - - if (value_change_hook) then - switch:SetHook ("OnSwitch", value_change_hook) + switch.OnSwitch = widgetTable.set + + if (valueChangeHook) then + switch:SetHook("OnSwitch", valueChangeHook) end - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - switch:SetHook (hookName, hookFunc) + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + switch:SetHook(hookName, hookFunc) end end - if (widget_table.width) then - switch:SetWidth(widget_table.width) + if (widgetTable.width) then + switch:SetWidth(widgetTable.width) end - if (widget_table.height) then - switch:SetHeight(widget_table.height) + if (widgetTable.height) then + switch:SetHeight(widgetTable.height) end - switch.hasLabel.text = widget_table.name .. (use_two_points and ": " or "") - switch.hasLabel:SetTemplate(widget_table.text_template or text_template) + switch.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name .. (useColon and ": " or "")) or (widgetTable.namePhraseId) or "" + switch.hasLabel:SetTemplate(widgetTable.text_template or textTemplate) switch:ClearAllPoints() switch.hasLabel:ClearAllPoints() - if (widget_table.boxfirst or useBoxFirstOnAllWidgets) then - switch:SetPoint (cur_x, cur_y) + if (widgetTable.boxfirst or useBoxFirstOnAllWidgets) then + switch:SetPoint (currentXOffset, currentYOffset) switch.hasLabel:SetPoint ("left", switch, "right", 2) else - switch.hasLabel:SetPoint (cur_x, cur_y) + switch.hasLabel:SetPoint (currentXOffset, currentYOffset) switch:SetPoint ("left", switch.hasLabel, "right", 2) end - if (widget_table.id) then - parent.widgetids [widget_table.id] = switch + if (widgetTable.id) then + parent.widgetids [widgetTable.id] = switch end - - local size = switch.hasLabel:GetStringWidth() + 32 - if (size > max_x) then - max_x = size + + local widgetTotalSize = switch.hasLabel:GetStringWidth() + 32 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end --slider - elseif (widget_table.type == "range" or widget_table.type == "slider") then - + elseif (widgetTable.type == "range" or widgetTable.type == "slider") then local slider = getMenuWidgetVolative(parent, "slider", widgetIndexes) - widget_created = slider + widgetCreated = slider - if (widget_table.usedecimals) then - slider.slider:SetValueStep (0.01) + if (widgetTable.usedecimals) then + slider.slider:SetValueStep(0.01) else - slider.slider:SetValueStep (widget_table.step) + slider.slider:SetValueStep(widgetTable.step) end - slider.useDecimals = widget_table.usedecimals + slider.useDecimals = widgetTable.usedecimals - slider.slider:SetMinMaxValues (widget_table.min, widget_table.max) - slider.slider:SetValue (widget_table.get()) + slider.slider:SetMinMaxValues(widgetTable.min, widgetTable.max) + slider.slider:SetValue(widgetTable.get()) slider.ivalue = slider.slider:GetValue() - slider:SetTemplate(slider_template) + slider:SetTemplate(sliderTemplate) - slider.tooltip = widget_table.desc - slider._get = widget_table.get + slider.tooltip = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId) + slider._get = widgetTable.get slider.widget_type = "range" - slider:SetHook ("OnValueChange", widget_table.set) + slider:SetHook("OnValueChange", widgetTable.set) - if (value_change_hook) then - slider:SetHook ("OnValueChange", value_change_hook) + if (valueChangeHook) then + slider:SetHook("OnValueChange", valueChangeHook) end - - if (widget_table.thumbscale) then - slider:SetThumbSize (slider.thumb.originalWidth * widget_table.thumbscale, nil) + + if (widgetTable.thumbscale) then + slider:SetThumbSize (slider.thumb.originalWidth * widgetTable.thumbscale, nil) else slider:SetThumbSize (slider.thumb.originalWidth * 1.3, nil) end - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - slider:SetHook (hookName, hookFunc) + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + slider:SetHook(hookName, hookFunc) end end - slider.hasLabel.text = widget_table.name .. (use_two_points and ": " or "") - slider.hasLabel:SetTemplate(widget_table.text_template or text_template) - - slider:SetPoint ("left", slider.hasLabel, "right", 2) - slider.hasLabel:SetPoint (cur_x, cur_y) - - if (widget_table.id) then - parent.widgetids [widget_table.id] = slider + slider.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name .. (useColon and ": " or "")) or (widgetTable.namePhraseId) or "" + slider.hasLabel:SetTemplate(widgetTable.text_template or textTemplate) + + slider:SetPoint("left", slider.hasLabel, "right", 2) + slider.hasLabel:SetPoint(currentXOffset, currentYOffset) + + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = slider end - local size = slider.hasLabel:GetStringWidth() + 146 - if (size > max_x) then - max_x = size + local widgetTotalSize = slider.hasLabel:GetStringWidth() + 146 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end --color - elseif (widget_table.type == "color" or widget_table.type == "color") then - + elseif (widgetTable.type == "color" or widgetTable.type == "color") then local colorpick = getMenuWidgetVolative(parent, "color", widgetIndexes) - widget_created = colorpick + widgetCreated = colorpick - colorpick.color_callback = widget_table.set --callback - colorpick:SetTemplate(button_template) + colorpick.color_callback = widgetTable.set --callback + colorpick:SetTemplate(buttonTemplate) colorpick:SetSize(18, 18) - colorpick.tooltip = widget_table.desc - colorpick._get = widget_table.get + colorpick.tooltip = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId) + colorpick._get = widgetTable.get colorpick.widget_type = "color" - local default_value, g, b, a = widget_table.get() - if (type (default_value) == "table") then - colorpick:SetColor (unpack (default_value)) + local default_value, g, b, a = widgetTable.get() + if (type(default_value) == "table") then + colorpick:SetColor(unpack(default_value)) else - colorpick:SetColor (default_value, g, b, a) + colorpick:SetColor(default_value, g, b, a) end - - if (value_change_hook) then - colorpick:SetHook ("OnColorChanged", value_change_hook) + + if (valueChangeHook) then + colorpick:SetHook("OnColorChanged", valueChangeHook) end - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - colorpick:SetHook (hookName, hookFunc) + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + colorpick:SetHook(hookName, hookFunc) end end local label = colorpick.hasLabel - label.text = widget_table.name .. (use_two_points and ": " or "") - label:SetTemplate(widget_table.text_template or text_template) + label.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name .. (useColon and ": " or "")) or (widgetTable.namePhraseId) or "" + label:SetTemplate(widgetTable.text_template or textTemplate) - if (widget_table.boxfirst or useBoxFirstOnAllWidgets) then + if (widgetTable.boxfirst or useBoxFirstOnAllWidgets) then label:SetPoint("left", colorpick, "right", 2) - colorpick:SetPoint(cur_x, cur_y) + colorpick:SetPoint(currentXOffset, currentYOffset) extraPaddingY = 1 else colorpick:SetPoint("left", label, "right", 2) - label:SetPoint(cur_x, cur_y) + label:SetPoint(currentXOffset, currentYOffset) end - if (widget_table.id) then - parent.widgetids [widget_table.id] = colorpick + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = colorpick end - local size = label:GetStringWidth() + 32 - if (size > max_x) then - max_x = size + local widgetTotalSize = label:GetStringWidth() + 32 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end --button - elseif (widget_table.type == "execute" or widget_table.type == "button") then - + elseif (widgetTable.type == "execute" or widgetTable.type == "button") then local button = getMenuWidgetVolative(parent, "button", widgetIndexes) - widget_created = button + widgetCreated = button - button:SetTemplate(button_template) - button:SetSize(widget_table.width or 120, widget_table.height or 18) - button:SetClickFunction(widget_table.func, widget_table.param1, widget_table.param2) + button:SetTemplate(buttonTemplate) + button:SetSize(widgetTable.width or 120, widgetTable.height or 18) + button:SetClickFunction(widgetTable.func, widgetTable.param1, widgetTable.param2) - local textTemplate = widget_table.text_template or text_template or DF.font_templates ["ORANGE_FONT_TEMPLATE"] + local textTemplate = widgetTable.text_template or textTemplate or DF.font_templates["ORANGE_FONT_TEMPLATE"] button.textcolor = textTemplate.color button.textfont = textTemplate.font button.textsize = textTemplate.size - button.text = widget_table.name + button.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name) or (widgetTable.namePhraseId) or "" - if (widget_table.inline) then + if (widgetTable.inline) then if (latestInlineWidget) then - button:SetPoint ("left", latestInlineWidget, "right", 2, 0) + button:SetPoint("left", latestInlineWidget, "right", 2, 0) latestInlineWidget = button else - button:SetPoint (cur_x, cur_y) + button:SetPoint(currentXOffset, currentYOffset) latestInlineWidget = button end else - button:SetPoint (cur_x, cur_y) + button:SetPoint(currentXOffset, currentYOffset) end - button.tooltip = widget_table.desc + button.tooltip = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId) button.widget_type = "execute" - - --> execute doesn't trigger global callback - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - button:SetHook (hookName, hookFunc) + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + button:SetHook(hookName, hookFunc) end end - if (widget_table.width) then - button:SetWidth(widget_table.width) + if (widgetTable.width) then + button:SetWidth(widgetTable.width) end - if (widget_table.height) then - button:SetHeight(widget_table.height) + if (widgetTable.height) then + button:SetHeight(widgetTable.height) end - if (widget_table.id) then - parent.widgetids [widget_table.id] = button + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = button end - - local size = button:GetWidth() + 4 - if (size > max_x) then - max_x = size + + local widgetTotalSize = button:GetWidth() + 4 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end --textentry - elseif (widget_table.type == "textentry") then - + elseif (widgetTable.type == "textentry") then local textentry = getMenuWidgetVolative(parent, "textentry", widgetIndexes) - widget_created = textentry + widgetCreated = textentry - textentry:SetCommitFunction(widget_table.func or widget_table.set) - textentry:SetTemplate(widget_table.template or widget_table.button_template or button_template) - textentry:SetSize(widget_table.width or 120, widget_table.height or 18) + textentry:SetCommitFunction(widgetTable.func or widgetTable.set) + textentry:SetTemplate(widgetTable.template or widgetTable.button_template or buttonTemplate) + textentry:SetSize(widgetTable.width or 120, widgetTable.height or 18) - textentry.tooltip = widget_table.desc - textentry.text = widget_table.get() - textentry._get = widget_table.get + textentry.tooltip = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId) + textentry.text = widgetTable.get() + textentry._get = widgetTable.get textentry.widget_type = "textentry" - textentry:SetHook ("OnEnterPressed", widget_table.func or widget_table.set) - textentry:SetHook ("OnEditFocusLost", widget_table.func or widget_table.set) + textentry:SetHook("OnEnterPressed", widgetTable.func or widgetTable.set) + textentry:SetHook("OnEditFocusLost", widgetTable.func or widgetTable.set) - textentry.hasLabel.text = widget_table.name .. (use_two_points and ": " or "") - textentry.hasLabel:SetTemplate(widget_table.text_template or text_template) - textentry:SetPoint ("left", textentry.hasLabel, "right", 2) - textentry.hasLabel:SetPoint (cur_x, cur_y) + textentry.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name .. (useColon and ": " or "")) or (widgetTable.namePhraseId) or "" + textentry.hasLabel:SetTemplate(widgetTable.text_template or textTemplate) + textentry:SetPoint("left", textentry.hasLabel, "right", 2) + textentry.hasLabel:SetPoint(currentXOffset, currentYOffset) - --> text entry doesn't trigger global callback - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - textentry:SetHook (hookName, hookFunc) + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + textentry:SetHook(hookName, hookFunc) end end - if (widget_table.id) then - parent.widgetids [widget_table.id] = textentry + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = textentry end - - local size = textentry.hasLabel:GetStringWidth() + 64 - if (size > max_x) then - max_x = size + + local widgetTotalSize = textentry.hasLabel:GetStringWidth() + 64 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end end --end loop - if (widget_table.nocombat) then - tinsert (disable_on_combat, widget_created) - end - - if (not widget_table.inline) then - if (widget_table.spacement) then - cur_y = cur_y - 30 - else - cur_y = cur_y - 20 - end - end - - if (widget_table.type == "breakline" or cur_y < height) then - cur_y = y_offset - cur_x = cur_x + max_x + 20 - max_x = 0 + if (widgetTable.nocombat) then + tinsert(disable_on_combat, widgetCreated) end - if widget_created then - widget_created:Show() + if (not widgetTable.inline) then + if (widgetTable.spacement) then + currentYOffset = currentYOffset - 30 + else + currentYOffset = currentYOffset - 20 + end + end + + if (widgetTable.type == "breakline" or currentYOffset < height) then + currentYOffset = yOffset + currentXOffset = currentXOffset + maxColumnWidth + 20 + maxColumnWidth = 0 + end + + if widgetCreated then + widgetCreated:Show() end end end @@ -1882,399 +1883,415 @@ end DF.RefreshUnsafeOptionsWidgets() end - function DF:BuildMenu (parent, menu, x_offset, y_offset, height, use_two_points, text_template, dropdown_template, switch_template, switch_is_box, slider_template, button_template, value_change_hook) - + function DF:BuildMenu(parent, menuOptions, xOffset, yOffset, height, useColon, textTemplate, dropdownTemplate, switchTemplate, switchIsCheckbox, sliderTemplate, buttonTemplate, valueChangeHook) if (not parent.widget_list) then - DF:SetAsOptionsPanel (parent) + DF:SetAsOptionsPanel(parent) end - - local cur_x = x_offset - local cur_y = y_offset - local max_x = 0 - local line_widgets_created = 0 --how many widgets has been created on this line loop pass - + + local currentXOffset = xOffset + local currentYOffset = yOffset + local maxColumnWidth = 0 + + --how many widgets has been created on this line loop pass + local amountLineWidgetCreated = 0 local latestInlineWidget - height = abs ((height or parent:GetHeight()) - abs (y_offset) + 20) - height = height*-1 + height = abs((height or parent:GetHeight()) - abs(yOffset) + 20) + height = height * -1 --normalize format types - for index, widgetTable in ipairs(menu) do + for index, widgetTable in ipairs(menuOptions) do if (widgetTable.type == "space") then widgetTable.type = "blank" + elseif (widgetTable.type == "dropdown") then widgetTable.type = "select" + elseif (widgetTable.type == "switch") then widgetTable.type = "toggle" + elseif (widgetTable.type == "slider") then widgetTable.type = "range" + elseif (widgetTable.type == "button") then widgetTable.type = "execute" end end --catch some options added in the hash part of the menu table - local useBoxFirstOnAllWidgets = menu.always_boxfirst + local useBoxFirstOnAllWidgets = menuOptions.always_boxfirst + local languageAddonId = menuOptions.language_addonId + local languageTable - for index, widget_table in ipairs (menu) do - if (not widget_table.hidden) then + if (languageAddonId) then + languageTable = DetailsFramework.Language.GetLanguageTable(languageAddonId) + end - local widget_created + for index, widgetTable in ipairs(menuOptions) do + if (not widgetTable.hidden) then + + local widgetCreated if (latestInlineWidget) then - if (not widget_table.inline) then + if (not widgetTable.inline) then latestInlineWidget = nil - cur_y = cur_y - 28 + currentYOffset = currentYOffset - 28 end end local extraPaddingY = 0 - if (widget_table.type == "blank") then - -- do nothing + if (widgetTable.type == "blank") then + --do nothing - elseif (widget_table.type == "label" or widget_table.type == "text") then - local label = DF:CreateLabel (parent, widget_table.get() or widget_table.text, widget_table.text_template or text_template or widget_table.size, widget_table.color, widget_table.font, nil, "$parentWidget" .. index, "overlay") - label._get = widget_table.get + elseif (widgetTable.type == "label" or widgetTable.type == "text") then + local label = DF:CreateLabel(parent, "", widgetTable.text_template or textTemplate or widgetTable.size, widgetTable.color, widgetTable.font, nil, "$parentWidget" .. index, "overlay") + label._get = widgetTable.get label.widget_type = "label" - label:SetPoint (cur_x, cur_y) + label:SetPoint(currentXOffset, currentYOffset) + + if (widgetTable.namePhraseId) then + DetailsFramework.Language.RegisterFontString(languageAddonId, label.widget, widgetTable.namePhraseId) + else + local textToSet = widgetTable.get() or widgetTable.text or "" + label:SetText(textToSet) + end --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, label) - tinsert (parent.widget_list_by_type.label, label) + tinsert(parent.widget_list, label) + tinsert(parent.widget_list_by_type.label, label) - line_widgets_created = line_widgets_created + 1 + amountLineWidgetCreated = amountLineWidgetCreated + 1 - if (widget_table.id) then - parent.widgetids [widget_table.id] = label + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = label end - - elseif (widget_table.type == "select") then - local dropdown = DF:NewDropDown (parent, nil, "$parentWidget" .. index, nil, 140, 18, widget_table.values, widget_table.get(), dropdown_template) - dropdown.tooltip = widget_table.desc - dropdown._get = widget_table.get + + elseif (widgetTable.type == "select") then + local dropdown = DF:NewDropDown(parent, nil, "$parentWidget" .. index, nil, 140, 18, widgetTable.values, widgetTable.get(), dropdownTemplate) + dropdown.tooltip = widgetTable.desc + dropdown._get = widgetTable.get dropdown.widget_type = "select" - local label = DF:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name .. (use_two_points and ": " or ""), "GameFontNormal", widget_table.text_template or text_template or 12) - dropdown:SetPoint ("left", label, "right", 2) - label:SetPoint (cur_x, cur_y) + local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, widgetTable.name .. (useColon and ": " or ""), "GameFontNormal", widgetTable.text_template or textTemplate or 12) + dropdown:SetPoint("left", label, "right", 2) + label:SetPoint(currentXOffset, currentYOffset) dropdown.hasLabel = label - - --> global callback - if (value_change_hook) then - dropdown:SetHook ("OnOptionSelected", value_change_hook) + + --global callback + if (valueChangeHook) then + dropdown:SetHook("OnOptionSelected", valueChangeHook) end - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - dropdown:SetHook (hookName, hookFunc) + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + dropdown:SetHook(hookName, hookFunc) end end - if (widget_table.id) then - parent.widgetids [widget_table.id] = dropdown + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = dropdown end - - local size = label.widget:GetStringWidth() + 144 - if (size > max_x) then - max_x = size - end - - --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, dropdown) - tinsert (parent.widget_list_by_type.dropdown, dropdown) - widget_created = dropdown - line_widgets_created = line_widgets_created + 1 - - elseif (widget_table.type == "toggle") then - local switch = DF:NewSwitch (parent, nil, "$parentWidget" .. index, nil, 60, 20, nil, nil, widget_table.get(), nil, nil, nil, nil, switch_template) - switch.tooltip = widget_table.desc - switch._get = widget_table.get + local widgetTotalSize = label.widget:GetStringWidth() + 144 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize + end + + --store the widget created into the overall table and the widget by type + tinsert(parent.widget_list, dropdown) + tinsert(parent.widget_list_by_type.dropdown, dropdown) + + widgetCreated = dropdown + amountLineWidgetCreated = amountLineWidgetCreated + 1 + + elseif (widgetTable.type == "toggle") then + local switch = DF:NewSwitch(parent, nil, "$parentWidget" .. index, nil, 60, 20, nil, nil, widgetTable.get(), nil, nil, nil, nil, switchTemplate) + + DetailsFramework.Language.RegisterTableKeyWithDefaultt(languageAddonId, switch, "tooltip", widgetTable.descPhraseId, widgetTable.desc) + + switch._get = widgetTable.get switch.widget_type = "toggle" - switch.OnSwitch = widget_table.set - - if (switch_is_box) then + switch.OnSwitch = widgetTable.set + + if (switchIsCheckbox) then switch:SetAsCheckBox() end - - if (value_change_hook) then - switch:SetHook ("OnSwitch", value_change_hook) + + if (valueChangeHook) then + switch:SetHook("OnSwitch", valueChangeHook) end - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - switch:SetHook (hookName, hookFunc) + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + switch:SetHook(hookName, hookFunc) end end - if (widget_table.width) then - switch:SetWidth(widget_table.width) + if (widgetTable.width) then + switch:SetWidth(widgetTable.width) end - if (widget_table.height) then - switch:SetHeight(widget_table.height) + if (widgetTable.height) then + switch:SetHeight(widgetTable.height) end - local label = DF:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name .. (use_two_points and ": " or ""), "GameFontNormal", widget_table.text_template or text_template or 12) - if (widget_table.boxfirst or useBoxFirstOnAllWidgets) then - switch:SetPoint (cur_x, cur_y) - label:SetPoint ("left", switch, "right", 2) + local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, "", "GameFontNormal", widgetTable.text_template or textTemplate or 12) + if (widgetTable.boxfirst or useBoxFirstOnAllWidgets) then + switch:SetPoint(currentXOffset, currentYOffset) + label:SetPoint("left", switch, "right", 2) - local nextWidgetTable = menu[index+1] + local nextWidgetTable = menuOptions[index+1] if (nextWidgetTable) then if (nextWidgetTable.type ~= "blank" and nextWidgetTable.type ~= "breakline" and nextWidgetTable.type ~= "toggle" and nextWidgetTable.type ~= "color") then extraPaddingY = 3 end end else - label:SetPoint (cur_x, cur_y) - switch:SetPoint ("left", label, "right", 2) + label:SetPoint(currentXOffset, currentYOffset) + switch:SetPoint("left", label, "right", 2) end switch.hasLabel = label - if (widget_table.id) then - parent.widgetids [widget_table.id] = switch + if (widgetTable.namePhraseId) then + --local name = parseWidgetNameAndDesc(languageTable, widgetTable.namePhraseId, widgetTable.descPhraseId, textToSet, "") + DetailsFramework.Language.RegisterFontString(languageAddonId, label.widget, widgetTable.namePhraseId) + else + local textToSet = widgetTable.name .. (useColon and ": " or "") + label:SetText(textToSet) end - - local size = label.widget:GetStringWidth() + 32 - if (size > max_x) then - max_x = size - end - - --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, switch) - tinsert (parent.widget_list_by_type.switch, switch) - widget_created = switch - line_widgets_created = line_widgets_created + 1 - - elseif (widget_table.type == "range") then - local is_decimanls = widget_table.usedecimals - local slider = DF:NewSlider (parent, nil, "$parentWidget" .. index, nil, 140, 20, widget_table.min, widget_table.max, widget_table.step, widget_table.get(), is_decimanls, nil, nil, slider_template) - slider.tooltip = widget_table.desc - slider._get = widget_table.get + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = switch + end + + local widgetTotalSize = label.widget:GetStringWidth() + 32 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize + end + + --store the widget created into the overall table and the widget by type + tinsert(parent.widget_list, switch) + tinsert(parent.widget_list_by_type.switch, switch) + + widgetCreated = switch + amountLineWidgetCreated = amountLineWidgetCreated + 1 + + elseif (widgetTable.type == "range") then + local isDecimanls = widgetTable.usedecimals + local slider = DF:NewSlider(parent, nil, "$parentWidget" .. index, nil, 140, 20, widgetTable.min, widgetTable.max, widgetTable.step, widgetTable.get(), isDecimanls, nil, nil, sliderTemplate) + slider.tooltip = widgetTable.desc + slider._get = widgetTable.get slider.widget_type = "range" - slider:SetHook ("OnValueChange", widget_table.set) - - if (widget_table.thumbscale) then - slider:SetThumbSize (slider.thumb:GetWidth()*widget_table.thumbscale, nil) + slider:SetHook("OnValueChange", widgetTable.set) + + if (widgetTable.thumbscale) then + slider:SetThumbSize(slider.thumb:GetWidth() * widgetTable.thumbscale, nil) else - slider:SetThumbSize (slider.thumb:GetWidth()*1.3, nil) - end - - if (value_change_hook) then - slider:SetHook ("OnValueChange", value_change_hook) - end - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - slider:SetHook (hookName, hookFunc) - end - end - - local label = DF:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name .. (use_two_points and ": " or ""), "GameFontNormal", widget_table.text_template or text_template or 12) - slider:SetPoint ("left", label, "right", 2) - label:SetPoint (cur_x, cur_y) - slider.hasLabel = label - - if (widget_table.id) then - parent.widgetids [widget_table.id] = slider + slider:SetThumbSize(slider.thumb:GetWidth() * 1.3, nil) end - local size = label.widget:GetStringWidth() + 146 - if (size > max_x) then - max_x = size - end - - --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, slider) - tinsert (parent.widget_list_by_type.slider, slider) - - widget_created = slider - line_widgets_created = line_widgets_created + 1 - - elseif (widget_table.type == "color") then - local colorpick = DF:NewColorPickButton (parent, "$parentWidget" .. index, nil, widget_table.set, nil, button_template) - colorpick.tooltip = widget_table.desc - colorpick._get = widget_table.get - colorpick.widget_type = "color" - colorpick:SetSize(18, 18) - - local default_value, g, b, a = widget_table.get() - if (type (default_value) == "table") then - colorpick:SetColor (unpack (default_value)) - else - colorpick:SetColor (default_value, g, b, a) - end - - if (value_change_hook) then - colorpick:SetHook ("OnColorChanged", value_change_hook) - end - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - colorpick:SetHook (hookName, hookFunc) - end - end - - local label = DF:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name .. (use_two_points and ": " or ""), "GameFontNormal", widget_table.text_template or text_template or 12) - if (widget_table.boxfirst or useBoxFirstOnAllWidgets) then - label:SetPoint("left", colorpick, "right", 2) - colorpick:SetPoint(cur_x, cur_y) - extraPaddingY = 1 - else - colorpick:SetPoint("left", label, "right", 2) - label:SetPoint(cur_x, cur_y) - end - - colorpick.hasLabel = label - - if (widget_table.id) then - parent.widgetids [widget_table.id] = colorpick - end - - local size = label.widget:GetStringWidth() + 32 - if (size > max_x) then - max_x = size - end - - --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, colorpick) - tinsert (parent.widget_list_by_type.color, colorpick) - - widget_created = colorpick - line_widgets_created = line_widgets_created + 1 - - elseif (widget_table.type == "execute") then - - local button = DF:NewButton (parent, nil, "$parentWidget" .. index, nil, 120, 18, widget_table.func, widget_table.param1, widget_table.param2, nil, widget_table.name, nil, button_template, text_template) - if (not button_template) then - button:InstallCustomTexture() - end - - if (widget_table.inline) then - if (latestInlineWidget) then - button:SetPoint ("left", latestInlineWidget, "right", 2, 0) - latestInlineWidget = button - else - button:SetPoint (cur_x, cur_y) - latestInlineWidget = button - end - else - button:SetPoint (cur_x, cur_y) - end - - button.tooltip = widget_table.desc - button.widget_type = "execute" - - --notice: execute doesn't trigger global callback - - --button icon - if (widget_table.icontexture) then - button:SetIcon(widget_table.icontexture, nil, nil, nil, widget_table.icontexcoords, nil, nil, 2) + if (valueChangeHook) then + slider:SetHook("OnValueChange", valueChangeHook) end --hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - button:SetHook (hookName, hookFunc) + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + slider:SetHook(hookName, hookFunc) end end - if (widget_table.id) then - parent.widgetids [widget_table.id] = button + local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, widgetTable.name .. (useColon and ": " or ""), "GameFontNormal", widgetTable.text_template or textTemplate or 12) + slider:SetPoint("left", label, "right", 2) + label:SetPoint(currentXOffset, currentYOffset) + slider.hasLabel = label + + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = slider end - if (widget_table.width) then - button:SetWidth(widget_table.width) + local widgetTotalSize = label.widget:GetStringWidth() + 146 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end - if (widget_table.height) then - button:SetHeight(widget_table.height) - end - - local size = button:GetWidth() + 4 - if (size > max_x) then - max_x = size - end - + --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, button) - tinsert (parent.widget_list_by_type.button, button) + tinsert(parent.widget_list, slider) + tinsert(parent.widget_list_by_type.slider, slider) - widget_created = button - line_widgets_created = line_widgets_created + 1 - - elseif (widget_table.type == "textentry") then - local textentry = DF:CreateTextEntry (parent, widget_table.func or widget_table.set, 120, 18, nil, "$parentWidget" .. index, nil, button_template) - textentry.tooltip = widget_table.desc - textentry.text = widget_table.get() - textentry._get = widget_table.get + widgetCreated = slider + amountLineWidgetCreated = amountLineWidgetCreated + 1 + + elseif (widgetTable.type == "color") then + local colorpick = DF:NewColorPickButton(parent, "$parentWidget" .. index, nil, widgetTable.set, nil, buttonTemplate) + colorpick.tooltip = widgetTable.desc + colorpick._get = widgetTable.get + colorpick.widget_type = "color" + colorpick:SetSize(18, 18) + + local r, g, b, a = DF:ParseColors(widgetTable.get()) + colorpick:SetColor(r, g, b, a) + + if (valueChangeHook) then + colorpick:SetHook("OnColorChanged", valueChangeHook) + end + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + colorpick:SetHook(hookName, hookFunc) + end + end + + local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, widgetTable.name .. (useColon and ": " or ""), "GameFontNormal", widgetTable.text_template or textTemplate or 12) + if (widgetTable.boxfirst or useBoxFirstOnAllWidgets) then + label:SetPoint("left", colorpick, "right", 2) + colorpick:SetPoint(currentXOffset, currentYOffset) + extraPaddingY = 1 + else + colorpick:SetPoint("left", label, "right", 2) + label:SetPoint(currentXOffset, currentYOffset) + end + + colorpick.hasLabel = label + + if (widgetTable.id) then + parent.widgetids[widgetTable.id] = colorpick + end + + local widgetTotalSize = label.widget:GetStringWidth() + 32 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize + end + + --store the widget created into the overall table and the widget by type + tinsert(parent.widget_list, colorpick) + tinsert(parent.widget_list_by_type.color, colorpick) + + widgetCreated = colorpick + amountLineWidgetCreated = amountLineWidgetCreated + 1 + + elseif (widgetTable.type == "execute") then + local button = DF:NewButton(parent, nil, "$parentWidget" .. index, nil, 120, 18, widgetTable.func, widgetTable.param1, widgetTable.param2, nil, widgetTable.name, nil, buttonTemplate, textTemplate) + if (not buttonTemplate) then + button:InstallCustomTexture() + end + + if (widgetTable.inline) then + if (latestInlineWidget) then + button:SetPoint("left", latestInlineWidget, "right", 2, 0) + latestInlineWidget = button + else + button:SetPoint(currentXOffset, currentYOffset) + latestInlineWidget = button + end + else + button:SetPoint(currentXOffset, currentYOffset) + end + + button.tooltip = widgetTable.desc + button.widget_type = "execute" + + --button icon + if (widgetTable.icontexture) then + button:SetIcon(widgetTable.icontexture, nil, nil, nil, widgetTable.icontexcoords, nil, nil, 2) + end + + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + button:SetHook(hookName, hookFunc) + end + end + + if (widgetTable.id) then + parent.widgetids [widgetTable.id] = button + end + + if (widgetTable.width) then + button:SetWidth(widgetTable.width) + end + if (widgetTable.height) then + button:SetHeight(widgetTable.height) + end + + local widgetTotalSize = button:GetWidth() + 4 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize + end + + --store the widget created into the overall table and the widget by type + tinsert(parent.widget_list, button) + tinsert(parent.widget_list_by_type.button, button) + + widgetCreated = button + amountLineWidgetCreated = amountLineWidgetCreated + 1 + + elseif (widgetTable.type == "textentry") then + local textentry = DF:CreateTextEntry(parent, widgetTable.func or widgetTable.set, 120, 18, nil, "$parentWidget" .. index, nil, buttonTemplate) + textentry.tooltip = widgetTable.desc + textentry.text = widgetTable.get() + textentry._get = widgetTable.get textentry.widget_type = "textentry" - textentry:SetHook ("OnEnterPressed", widget_table.func or widget_table.set) - textentry:SetHook ("OnEditFocusLost", widget_table.func or widget_table.set) + textentry:SetHook("OnEnterPressed", widgetTable.func or widgetTable.set) + textentry:SetHook("OnEditFocusLost", widgetTable.func or widgetTable.set) - local label = DF:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name .. (use_two_points and ": " or ""), "GameFontNormal", widget_table.text_template or text_template or 12) - textentry:SetPoint ("left", label, "right", 2) - label:SetPoint (cur_x, cur_y) + local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, widgetTable.name .. (useColon and ": " or ""), "GameFontNormal", widgetTable.text_template or textTemplate or 12) + textentry:SetPoint("left", label, "right", 2) + label:SetPoint(currentXOffset, currentYOffset) textentry.hasLabel = label - --> text entry doesn't trigger global callback - - --> hook list - if (widget_table.hooks) then - for hookName, hookFunc in pairs (widget_table.hooks) do - textentry:SetHook (hookName, hookFunc) + --hook list + if (widgetTable.hooks) then + for hookName, hookFunc in pairs(widgetTable.hooks) do + textentry:SetHook(hookName, hookFunc) end end - if (widget_table.id) then - parent.widgetids [widget_table.id] = textentry + if (widgetTable.id) then + parent.widgetids [widgetTable.id] = textentry end - - local size = label.widget:GetStringWidth() + 64 - if (size > max_x) then - max_x = size + + local widgetTotalSize = label.widget:GetStringWidth() + 64 + if (widgetTotalSize > maxColumnWidth) then + maxColumnWidth = widgetTotalSize end - + --store the widget created into the overall table and the widget by type - tinsert (parent.widget_list, textentry) - tinsert (parent.widget_list_by_type.textentry, textentry) + tinsert(parent.widget_list, textentry) + tinsert(parent.widget_list_by_type.textentry, textentry) - widget_created = textentry - line_widgets_created = line_widgets_created + 1 - + widgetCreated = textentry + amountLineWidgetCreated = amountLineWidgetCreated + 1 end - if (widget_table.nocombat) then - tinsert (disable_on_combat, widget_created) + if (widgetTable.nocombat) then + tinsert(disable_on_combat, widgetCreated) end - if (not widget_table.inline) then - if (widget_table.spacement) then - cur_y = cur_y - 30 + if (not widgetTable.inline) then + if (widgetTable.spacement) then + currentYOffset = currentYOffset - 30 else - cur_y = cur_y - 20 + currentYOffset = currentYOffset - 20 end end if (extraPaddingY > 0) then - cur_y = cur_y - extraPaddingY + currentYOffset = currentYOffset - extraPaddingY end - if (widget_table.type == "breakline" or cur_y < height) then - cur_y = y_offset - cur_x = cur_x + max_x + 20 - line_widgets_created = 0 - max_x = 0 + if (widgetTable.type == "breakline" or currentYOffset < height) then + currentYOffset = yOffset + currentXOffset = currentXOffset + maxColumnWidth + 20 + amountLineWidgetCreated = 0 + maxColumnWidth = 0 end end end DF.RefreshUnsafeOptionsWidgets() - end local lock_notsafe_widgets = function() diff --git a/Libs/DF/languages.lua b/Libs/DF/languages.lua index 1f1a96af..fabeaa2f 100644 --- a/Libs/DF/languages.lua +++ b/Libs/DF/languages.lua @@ -1,9 +1,7 @@ - ---todo: GetText(addonId, phraseId) ---todo: SetText(addonId, phraseId, FontString, ...) +--todo: need to send a callback when setting a new language, this will be used by the volatile menu to refresh the menu --[=[ - DetailsFramework.Language.Register(addonId, languageId, gameLanguageOnly) + DetailsFramework.Language.Register(addonId, languageId[, gameLanguageOnly]) create a language table within an addon namespace @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater @languageId: game languages: "deDE", "enUS", "esES", "esMX", "frFR", "itIT", "koKR", "ptBR", "ruRU", "zhCN", "zhTW", or any other value if 'gameLanguageOnly' is false (default) @@ -19,7 +17,7 @@ local newLanguageTable = DetailsFramework.Language.Register(_G.Details, "valyrianValyria", false) newLanguageTable["STRING_MY_PHRASE"] = "ñuha udrir" - DetailsFramework.Language.GetLanguageTable(addonId, languageId) + DetailsFramework.Language.GetLanguageTable(addonId[, languageId]) get the languageTable for the requested languageId within the addon namespace if languageId is not passed, uses the current language set for the addonId the default languageId for the addon is the first language registered with DetailsFramework.Language.Register() @@ -36,18 +34,24 @@ local languageTable = DetailsFramework.Language.GetLanguageTable("Details", "valyrianValyria") fontString:SetText(languageTable["STRING_MY_PHRASE"]) + DetailsFramework.Language.GetText(addonId, phraseId[, silent]) + get a text from a registered addonId and phraseId + @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater + @phraseId: any string to identify the a translated text, example: phraseId: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame." + @silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId + DetailsFramework.Language.SetCurrentLanguage(addonId, languageId) set the language used by default when retriving a languageTable with DF.Language.GetLanguageTable() and not passing the second argument (languageId) within the call use this in combination with a savedVariable to use a language of the user choice @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater @languageId: game languages: "deDE", "enUS", "esES", "esMX", "frFR", "itIT", "koKR", "ptBR", "ruRU", "zhCN", "zhTW", or any other value if 'gameLanguageOnly' is false (default) - DetailsFramework.Language.RegisterFontString(addonId, fontString, phraseId, silent, ...) + DetailsFramework.Language.RegisterFontString(addonId, fontString, phraseId[, silent[, ...]]) when setting a languageId with DetailsFramework.Language.SetCurrentLanguage(), automatically change the text of all registered FontStrings @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater @fontString: a UIObject FontString @phraseId: any string to identify the a translated text, example: "My Phrase", "STRING_TEXT_LENGTH", text: "This is my phrase" - @silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId + @silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId and fontString @vararg: arguments to pass for format(text, ...) DetailsFramework.Language.UpdateFontStringArguments(addonId, fontString, ...) @@ -57,6 +61,24 @@ @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater @fontString: a UIObject FontString @vararg: arguments to pass for format(text, ...) + + DetailsFramework.Language.RegisterTableKey(addonId, table, key, phraseId[, silent[, ...]]) + when setting a languageId with DetailsFramework.Language.SetCurrentLanguage(), automatically change the text of all registered tables, table[key] = 'new translated text' + @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater + @table: a lua table + @key: any value except nil or boolean + @phraseId: any string to identify the a translated text, example: token: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame." + @silent: if true won't error on invalid phrase text or table already registered, it will still error on invalid addonId, table, key and phraseId + @vararg: arguments to pass for format(text, ...) + + DetailsFramework.Language.UpdateTableKeyArguments(addonId, table, key, ...) + --same as UpdateFontStringArguments() but for table keys + @addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater + @table: a lua table + @key: any value except nil or boolean + @vararg: arguments to pass for format(text, ...) + + --]=] local DF = _G["DetailsFramework"] @@ -81,12 +103,14 @@ local supportedGameLanguages = { } local functionSignature = { - ["RegisterLanguage"] = "RegisterLanguage(addonID, languageID [, gameLanguageOnly])", + ["RegisterLanguage"] = "RegisterLanguage(addonID, languageID[, gameLanguageOnly])", ["SetCurrentLanguage"] = "SetCurrentLanguage(addonID, languageID)", - ["GetLanguageTable"] = "GetLanguageTable(addonID [, languageID])", - ["RegisterFontString"] = "RegisterFontString(addonID, fontString, phraseID [, silent] [, ...]])", + ["GetLanguageTable"] = "GetLanguageTable(addonID[, languageID])", + ["RegisterFontString"] = "RegisterFontString(addonID, fontString, phraseID[, silent[, ...]])", ["UpdateFontStringArguments"] = "UpdateFontStringArguments(addonID, fontString, ...)", - ["GetText"] = "GetText(addonID, phraseID [, silent])", + ["RegisterTableKey"] = "RegisterTableKey(addonId, table, key, phraseId[[, silent[, ...]])", + ["GetText"] = "GetText(addonID, phraseID[, silent])", + ["UpdateTableKeyArguments"] = "UpdateTableKeyArguments(addonId, table, key, ...)", } local functionCallPath = { @@ -96,6 +120,8 @@ local functionCallPath = { ["RegisterFontString"] = "DetailsFramework.Language.RegisterFontString", ["UpdateFontStringArguments"] = "DetailsFramework.Language.UpdateFontStringArguments", ["GetText"] = "DetailsFramework.Language.GetText", + ["RegisterTableKey"] = "DetailsFramework.Language.RegisterTableKey", + ["UpdateTableKeyArguments"] = "DetailsFramework.Language.UpdateTableKeyArguments", } local errorText = { @@ -107,16 +133,20 @@ local errorText = { ["PhraseIDNotRegistered"] = "phraseID not registered", ["FontString"] = "require a FontString on #%d argument", ["FontStringNotRegistered"] = "FontString not registered yet", + ["TableKeyNotRegistered"] = "table not registered yet", + ["KeyNotRegistered"] = "key not registered yet", + ["InvalidTable"] = "require a table on #%d argument", + ["InvalidTableKey"] = "require a table key on #%d argument", + ["TableKeyAlreadyRegistered"] = "table already registered", --not in use } ---create languages namespace -DF.Language = { - RegisteredNamespaces = {}, -} +--create language namespace +DF.Language = DF.Language or {version = 1} +DF.Language.RegisteredNamespaces = DF.Language.RegisteredNamespaces or {} + --internal functions - local isValid_AddonID = function(addonId) if (type(addonId) ~= "string" and type(addonId) ~= "table") then return false @@ -146,10 +176,15 @@ local getOrCreateAddonNamespace = function(addonId, languageId) if (not addonNamespaceTable) then addonNamespaceTable = { addonId = addonId, + --by default, the current language is the first registered language currentLanguageId = languageId, languages = {}, fontStrings = {}, + tableKeys = setmetatable({}, {__mode = "k"}), + + --set when the first language table is registered + defaultLanguageTable = nil, } DF.Language.RegisteredNamespaces[addonId] = addonNamespaceTable end @@ -181,6 +216,8 @@ local getCurrentLanguageId = function(addonNamespaceTable) return addonNamespaceTable.currentLanguageId end +--if invalid, the __index from the metatable get the value from the first registered table +--will return nil if the languageTable is from the first registered language local getTextFromLangugeTable = function(languageTable, phraseId) return languageTable[phraseId] end @@ -190,8 +227,8 @@ local getRegisteredFontStrings = function(addonNamespaceTable) end local getText = function(addonNamespaceTable, phraseId) - local currentLanguageId = getCurrentLanguageId(addonNamespaceTable) --never nil - local languageTable = getLanguageTable(addonNamespaceTable, currentLanguageId) --can be nil if the languageId isn't registered yet + local currentLanguageId = getCurrentLanguageId(addonNamespaceTable) + local languageTable = getLanguageTable(addonNamespaceTable, currentLanguageId) --if the languageTable is invalid, let the function caller handle it --note: languageTable is always valid when the callstack started at from DF.Language.SetCurrentLanguage @@ -199,7 +236,9 @@ local getText = function(addonNamespaceTable, phraseId) return false end - local text = getTextFromLangugeTable(languageTable, phraseId) + --by using getTextFromLangugeTable the metatable will get the default of the first registered language + --local text = getTextFromLangugeTable(languageTable, phraseId) + local text = rawget(languageTable, phraseId) if (isValid_Text(text)) then return text end @@ -208,18 +247,24 @@ local getText = function(addonNamespaceTable, phraseId) local clientLanguage = GetLocale() if (currentLanguageId ~= clientLanguage) then languageTable = getLanguageTable(addonNamespaceTable, clientLanguage) - text = getTextFromLangugeTable(languageTable, phraseId) - if (isValid_Text(text)) then - return text + if (languageTable) then + --text = getTextFromLangugeTable(languageTable, phraseId) + text = rawget(languageTable, phraseId) + if (isValid_Text(text)) then + return text + end end end --attempt to get from english if (currentLanguageId ~= CONST_LANGAGEID_ENUS and clientLanguage ~= CONST_LANGAGEID_ENUS) then languageTable = getLanguageTable(addonNamespaceTable, CONST_LANGAGEID_ENUS) - text = getTextFromLangugeTable(languageTable, phraseId) - if (isValid_Text(text)) then - return text + if (languageTable) then + --text = getTextFromLangugeTable(languageTable, phraseId) + text = rawget(languageTable, phraseId) + if (isValid_Text(text)) then + return text + end end end @@ -227,6 +272,14 @@ local getText = function(addonNamespaceTable, phraseId) end local setLanguageTable = function(addonNamespaceTable, languageId, languageTable) + local isFirstLanguage = not next(addonNamespaceTable.languages) + if (isFirstLanguage) then + addonNamespaceTable.defaultLanguageTable = languageTable + else + local defaultLanguageMetatable = {__index = function(table, key) return addonNamespaceTable.defaultLanguageTable[key] or key end} + setmetatable(languageTable, defaultLanguageMetatable) + end + addonNamespaceTable.languages[languageId] = languageTable return languageTable end @@ -235,11 +288,7 @@ local setCurrentLanguageId = function(addonNamespaceTable, languageId) addonNamespaceTable.currentLanguageId = languageId end -local getFontStringTable = function(addonNamespaceTable, fontString) - return addonNamespaceTable.fontStrings[fontString] -end - -local parseFontStringArguments = function(...) +local parseArguments = function(...) local argumentAmount = select("#", ...) if (argumentAmount > 0) then return {...} @@ -248,12 +297,30 @@ local parseFontStringArguments = function(...) end end -local updateFontStringTable_Arguments = function(fontStringTable, ...) - fontStringTable.arguments = parseFontStringArguments(...) +--hold information about a localization, used by registered fontStrings and keyTables, has .phraesId, .arguments and .key (on keyTables) +local createPhraseInfoTable = function(phraseId, key, ...) + return {phraseId = phraseId, key = key, arguments = parseArguments(...)} end -local updateFontStringTable_PhraseId = function(fontStringTable, phraseId) - fontStringTable.phraseId = phraseId +local updatePhraseInfoArguments = function(phraseInfoTable, ...) + phraseInfoTable.arguments = parseArguments(...) +end + +--get a phraseInfo and text returning a formatted text using arguments if they exists +local getFormattedText = function(phraseInfoTable, text) + if (phraseInfoTable.arguments) then + return format(text, unpack(phraseInfoTable.arguments)) + else + return text + end +end + +local updateFontStringTable_PhraseId = function(phraseInfoTable, phraseId) + phraseInfoTable.phraseId = phraseId +end + +local getFontStringPhraseInfoTable = function(addonNamespaceTable, fontString) + return addonNamespaceTable.fontStrings[fontString] end local setFontString_InternalMembers = function(fontString, addonId, phraseId, arguments) @@ -262,12 +329,9 @@ local setFontString_InternalMembers = function(fontString, addonId, phraseId, ar fontString.__languageArguments = arguments or fontString.__languageArguments end -local setFontString_Text = function(fontString, fontStringTable, text) - if (fontStringTable.arguments) then - fontString:SetText(format(text, unpack(fontStringTable.arguments))) - else - fontString:SetText(text) - end +local setFontString_Text = function(fontString, phraseInfoTable, text) + local formattedText = getFormattedText(phraseInfoTable, text) + fontString:SetText(formattedText) end --this method only exists on registered FontStrings @@ -275,39 +339,109 @@ local fontStringMethod_SetTextByPhraseID = function(fontString, phraseId, ...) local addonId = fontString.__languageAddonId local addonNamespaceTable = getAddonNamespace(addonId) - local fontStringTable = getFontStringTable(addonNamespaceTable, fontString) - updateFontStringTable_PhraseId(fontStringTable, phraseId) - updateFontStringTable_Arguments(fontStringTable, ...) - setFontString_InternalMembers(fontString, addonId, phraseId, fontStringTable.arguments) + local phraseInfoTable = getFontStringPhraseInfoTable(addonNamespaceTable, fontString) + updateFontStringTable_PhraseId(phraseInfoTable, phraseId) + updatePhraseInfoArguments(phraseInfoTable, ...) + setFontString_InternalMembers(fontString, addonId, phraseId, phraseInfoTable.arguments) local text = getText(addonNamespaceTable, phraseId) - setFontString_Text(fontString, fontStringTable, text) + setFontString_Text(fontString, phraseInfoTable, text) return true end local registerFontString = function(addonNamespaceTable, fontString, phraseId, ...) - local fontStringTable = {phraseId = phraseId} - fontStringTable.arguments = parseFontStringArguments(...) - - addonNamespaceTable.fontStrings[fontString] = fontStringTable + local phraseInfoTable = createPhraseInfoTable(phraseId, nil, ...) + addonNamespaceTable.fontStrings[fontString] = phraseInfoTable --save internal information about the language directly in the FontString - setFontString_InternalMembers(fontString, addonNamespaceTable.addonId, phraseId, fontStringTable.arguments) + setFontString_InternalMembers(fontString, addonNamespaceTable.addonId, phraseId, phraseInfoTable.arguments) fontString.SetTextByPhraseID = fontStringMethod_SetTextByPhraseID - return fontStringTable + return phraseInfoTable end --iterate among all registered fontStrings of an addon namespace and set the new text on them -local updateAllRegisteredFontStringText = function(addonNamespaceTable, languageTable) +local updateAllRegisteredFontStringText = function(addonNamespaceTable) local fontStrings = getRegisteredFontStrings(addonNamespaceTable) - for fontString, fontStringTable in pairs(fontStrings) do - local phraseId = fontStringTable.phraseId + for fontString, phraseInfoTable in pairs(fontStrings) do + local phraseId = phraseInfoTable.phraseId --note: text is always valid when the callstack started at from DF.Language.SetCurrentLanguage local text = getText(addonNamespaceTable, phraseId) - setFontString_Text(fontString, fontStringTable, text) + setFontString_Text(fontString, phraseInfoTable, text) + end +end + +--internal tableKey looks like: +--addonNamespaceTable.tableKeys = {} -> this table is a weaktable 'k' +--addonNamespaceTable.tableKeys[table] = {} -> table is a table from code elsewhere, it is used as a key for the internal code here, table created is what stores the keys +--addonNamespaceTable.tableKeys[table][key] -> key is the key from the table elsewhere which points to a string +--addonNamespaceTable.tableKeys[table][key] = {phraseId = phraseId, arguments = {...}, key = key} + +--when registring a tableKey in practice, look like: +--Details.StoredStrings = {}; Details.StoredStrings["Height"] = "height": table is 'Details.StoredStrings' key is "Height" +--registerTableKey(_, Details.StoredStrings, "Height", _, _) + +local setTableKey_Text = function(table, key, phraseInfoTable, text) + local formattedText = getFormattedText(phraseInfoTable, text) + table[key] = formattedText +end + +local getTableKeyTable = function(addonNamespaceTable, table) + return addonNamespaceTable.tableKeys[table] +end + +--get the phraseInfo from the addon namespace +local getTableKeyPhraseInfoTable = function(addonNamespaceTable, table, key) + return addonNamespaceTable.tableKeys[table][key] +end + +--get the phraseInfo from the tableKey +local getPhraseInfoFromTableKey = function(tableKeyTable, key) + return tableKeyTable[key] +end + +local isTableKeyRegistered = function(addonNamespaceTable, table) + return getTableKeyTable(addonNamespaceTable, table) and true +end + +--return true if the phraseInfo is present in the tableKey +local isKeyRegisteredInTableKey = function(tableKeyTable, key) + return getPhraseInfoFromTableKey(tableKeyTable, key) and true +end + +local getRegisteredTableKeys = function(addonNamespaceTable) + return addonNamespaceTable.tableKeys +end + +local registerTableKeyTable = function(addonNamespaceTable, table, tableKeyTable) + addonNamespaceTable.tableKeys[table] = tableKeyTable +end + +local registerTableKey = function(addonNamespaceTable, table, key, phraseId, ...) + local tableKeyTable = getTableKeyTable(addonNamespaceTable, table) + if (not tableKeyTable) then + tableKeyTable = {} + registerTableKeyTable(addonNamespaceTable, table, tableKeyTable) + end + + --create a table for this table key as a table can hold several keys with localization strings + local phraseInfoTable = createPhraseInfoTable(phraseId, key, ...) + tableKeyTable[key] = phraseInfoTable + return tableKeyTable +end + +--iterate among all registered tableKey of an addon namespace and set the new text on them +local updateAllRegisteredTableKeyText = function(addonNamespaceTable) + local tableKeys = getRegisteredTableKeys(addonNamespaceTable) + for table, tableKeyTable in pairs(tableKeys) do + for key, phraseInfoTable in pairs(tableKeyTable) do + local phraseId = phraseInfoTable.phraseId + --note: text is always valid when the callstack started at from DF.Language.SetCurrentLanguage + local text = getText(addonNamespaceTable, phraseId) + setTableKey_Text(table, key, phraseInfoTable, text) + end end end @@ -386,16 +520,46 @@ function DF.Language.SetCurrentLanguage(addonId, languageId) setCurrentLanguageId(languageId) - --go into the registered FontStrings and change their text - updateAllRegisteredFontStringText(addonNamespaceTable, languageTable) + --go into the registered FontStrings and KeyTables and change their text + updateAllRegisteredFontStringText(addonNamespaceTable) + updateAllRegisteredTableKeyText(addonNamespaceTable) return true end +--@addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater +--@phraseId: any string to identify the a translated text, example: phraseId: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame." +--@silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId +function DF.Language.GetText(addonId, phraseId, silent) + if (not isValid_AddonID(addonId)) then + error(functionCallPath["GetText"] .. ": " .. format(errorText["AddonID"], 1) .. ", use: " .. functionSignature["GetText"] .. ".") + + elseif (not isValid_PhraseID(phraseId)) then + error(functionCallPath["GetText"] .. ": " .. format(errorText["PhraseID"], 2) .. ", use: " .. functionSignature["GetText"] .. ".") + end + + local addonNamespaceTable = getAddonNamespace(addonId) + if (not addonNamespaceTable) then + error(functionCallPath["GetText"] .. ": " .. errorText["NoLanguages"] .. ", use: " .. functionSignature["RegisterLanguage"] .. ".") + end + + local text = getText(addonNamespaceTable, phraseId) + if (isValid_Text(text)) then + return text + end + + if (not silent) then + error(functionCallPath["GetText"] .. ": " .. errorText["PhraseIDNotRegistered"] .. ", use: " .. functionSignature["GetLanguageTable"] .. "['PhraseID'] = 'translated text'.") + end + + return phraseId +end + + --@addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater --@fontString: a UIObject FontString --@phraseId: any string to identify the a translated text, example: token: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame." ---@silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId +--@silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId and fontString --@vararg: arguments to pass for format(text, ...) function DF.Language.RegisterFontString(addonId, fontString, phraseId, silent, ...) if (not isValid_AddonID(addonId)) then @@ -448,42 +612,108 @@ function DF.Language.UpdateFontStringArguments(addonId, fontString, ...) error(functionCallPath["UpdateFontStringArguments"] .. ": " .. format(errorText["FontString"], 2) .. ", use: " .. functionSignature["UpdateFontStringArguments"] .. ".") end - local fontStringTable = getFontStringTable(addonNamespaceTable, fontString) - if (not fontStringTable) then + local phraseInfoTable = getFontStringPhraseInfoTable(addonNamespaceTable, fontString) + if (not phraseInfoTable) then error(functionCallPath["UpdateFontStringArguments"] .. ": " .. errorText["FontStringNotRegistered"] .. ", use: " .. functionSignature["RegisterFontString"] .. ".") end - updateFontStringTable_Arguments(fontStringTable, ...) + updatePhraseInfoArguments(phraseInfoTable, ...) - local text = getText(addonNamespaceTable, fontStringTable.phraseId) - setFontString_Text(fontString, fontStringTable, text) + local text = getText(addonNamespaceTable, phraseInfoTable.phraseId) + setFontString_Text(fontString, phraseInfoTable, text) return true end --@addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater ---@phraseId: any string to identify the a translated text, example: phraseId: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame." ---@silent: if true won't error on invalid phrase text and instead use the phraseId as the text, it will still error on invalid addonId -function DF.Language.GetText(addonId, phraseId, silent) +--@table: a lua table +--@key: any value except nil or boolean +--@phraseId: any string to identify the a translated text, example: token: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame." +--@silent: if true won't error on invalid phrase text or table already registered, it will still error on invalid addonId, table, key and phraseId +--@vararg: arguments to pass for format(text, ...) +function DF.Language.RegisterTableKey(addonId, table, key, phraseId, silent, ...) if (not isValid_AddonID(addonId)) then - error(functionCallPath["GetText"] .. ": " .. format(errorText["AddonID"], 1) .. ", use: " .. functionSignature["GetText"] .. ".") + error(functionCallPath["RegisterTableKey"] .. ": " .. format(errorText["AddonID"], 1) .. ", use: " .. functionSignature["RegisterTableKey"] .. ".") + end - elseif (not isValid_PhraseID(phraseId)) then - error(functionCallPath["GetText"] .. ": " .. format(errorText["PhraseID"], 2) .. ", use: " .. functionSignature["GetText"] .. ".") + if (type(table) ~= "table") then + error(functionCallPath["RegisterTableKey"] .. ": " .. format(errorText["InvalidTable"], 2) .. ", use: " .. functionSignature["RegisterTableKey"] .. ".") + end + + if (key == nil or type(key) == "boolean") then + error(functionCallPath["RegisterTableKey"] .. ": " .. format(errorText["InvalidTableKey"], 3) .. ", use: " .. functionSignature["RegisterTableKey"] .. ".") + end + + if (not isValid_PhraseID(phraseId)) then + error(functionCallPath["RegisterTableKey"] .. ": " .. format(errorText["PhraseID"], 4) .. ", use: " .. functionSignature["RegisterTableKey"] .. ".") end local addonNamespaceTable = getAddonNamespace(addonId) if (not addonNamespaceTable) then - error(functionCallPath["GetText"] .. ": " .. errorText["NoLanguages"] .. ", use: " .. functionSignature["RegisterLanguage"] .. ".") + error(functionCallPath["RegisterTableKey"] .. ": " .. errorText["NoLanguages"] .. ", use: " .. functionSignature["RegisterLanguage"] .. ".") end + local tableKeyTable = registerTableKey(addonNamespaceTable, table, key, phraseId, ...) + local text = getText(addonNamespaceTable, phraseId) - if (isValid_Text(text)) then - return text + if (not isValid_Text(text)) then + if (not silent) then + error(functionCallPath["RegisterTableKey"] .. ": " .. errorText["PhraseIDNotRegistered"] .. ", use: " .. functionSignature["GetLanguageTable"] .. "['PhraseID'] = 'translated text'.") + else + text = phraseId + end end - if (not silent) then - error(functionCallPath["GetText"] .. ": " .. errorText["PhraseIDNotRegistered"] .. ", use: " .. functionSignature["GetLanguageTable"] .. "['PhraseID'] = 'translated text'.") + setTableKey_Text(table, key, tableKeyTable, text) + return true +end + +--@addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater +--@table: a lua table +--@key: any value except nil or boolean +--@vararg: arguments to pass for format(text, ...) +function DF.Language.UpdateTableKeyArguments(addonId, table, key, ...) + if (not isValid_AddonID(addonId)) then + error(functionCallPath["UpdateTableKeyArguments"] .. ": " .. format(errorText["AddonID"], 1) .. ", use: " .. functionSignature["UpdateTableKeyArguments"] .. ".") end - return phraseId + local addonNamespaceTable = getAddonNamespace(addonId) + if (not addonNamespaceTable) then + error(functionCallPath["UpdateTableKeyArguments"] .. ": " .. errorText["NoLanguages"] .. ", use: " .. functionSignature["RegisterLanguage"] .. ".") + end + + if (type(table) ~= "table") then + error(functionCallPath["UpdateTableKeyArguments"] .. ": " .. format(errorText["InvalidTable"], 2) .. ", use: " .. functionSignature["UpdateTableKeyArguments"] .. ".") + end + + if (key == nil or type(key) == "boolean") then + error(functionCallPath["UpdateTableKeyArguments"] .. ": " .. format(errorText["InvalidTableKey"], 3) .. ", use: " .. functionSignature["UpdateTableKeyArguments"] .. ".") + end + + if (not isTableKeyRegistered(addonNamespaceTable, table)) then + error(functionCallPath["UpdateTableKeyArguments"] .. ": " .. errorText["TableKeyNotRegistered"] .. ", use: " .. functionSignature["RegisterTableKey"] .. ".") + end + + local tableKeyTable = getTableKeyTable(addonNamespaceTable, table) --can't nil as the line above checked if it exists + + if (not isKeyRegisteredInTableKey(tableKeyTable, key)) then + error(functionCallPath["UpdateTableKeyArguments"] .. ": " .. errorText["KeyNotRegistered"] .. ", use: " .. functionSignature["RegisterTableKey"] .. ".") + end + + local phraseInfo = getPhraseInfoFromTableKey(tableKeyTable, key) --can't nil as the line above checked if it exists + updatePhraseInfoArguments(phraseInfo, key, ...) + + local text = getText(addonNamespaceTable, phraseInfo.phraseId) + setTableKey_Text(table, key, tableKeyTable, text) + return true +end + + +function DF.Language.RegisterTableKeyWithDefaultt(addonId, table, key, phraseId, defaultText) + if (addonId and phraseId) then + print("registered...") + DetailsFramework.Language.RegisterTableKey(addonId, table, key, phraseId) + else + print("used default") + table[key] = defaultText + end end \ No newline at end of file diff --git a/classes/class_heal.lua b/classes/class_heal.lua index 5db51df5..ea9f0b4d 100644 --- a/classes/class_heal.lua +++ b/classes/class_heal.lua @@ -2328,8 +2328,8 @@ function atributo_heal:MontaDetalhesHealingDone (spellid, barra) t1[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.n_min) t1[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.n_max) t1[6] = Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media_normal) - t1[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (normal_curado/T) - t1[8] = normal_hits .. " / ".. _cstr ("%.1f", normal_hits/total_hits*100) .. "%" + t1[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (normal_curado / max(T, 0.001)) + t1[8] = normal_hits .. " / ".. _cstr ("%.1f", normal_hits / max(total_hits, 0.001) * 100) .. "%" end @@ -2354,7 +2354,7 @@ function atributo_heal:MontaDetalhesHealingDone (spellid, barra) t2[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.c_max) t2[6] = Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media_critico) t2[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (crit_hps) - t2[8] = esta_magia.c_amt .. " [|cFFC0C0C0".. _cstr ("%.1f", esta_magia.c_amt/total_hits*100) .. "%|r]" + t2[8] = esta_magia.c_amt .. " [|cFFC0C0C0".. _cstr ("%.1f", esta_magia.c_amt / max(total_hits, 0.001) * 100) .. "%|r]" end end diff --git a/core/parser.lua b/core/parser.lua index 46cf30b3..e06a3c66 100755 --- a/core/parser.lua +++ b/core/parser.lua @@ -420,6 +420,7 @@ --the damage that the warlock apply to its pet through soullink is ignored --it is not useful for damage done or friendly fire [SPELLID_WARLOCK_SOULLINK] = true, + [371597] = true, --Protoform Barrier gotten from an SPELL_ABSORBED cleu event } --> expose the ignore spells table to external scripts