From 6eafc394ae8efd55fff42edc131945c7cc909595 Mon Sep 17 00:00:00 2001 From: NoM0Re Date: Sat, 25 Jan 2025 17:12:25 +0100 Subject: [PATCH] from retail --- WeakAuras/BuffTrigger2.lua | 55 +++--- WeakAuras/Compatibility.lua | 6 + WeakAuras/GenericTrigger.lua | 14 +- WeakAuras/Media/Textures/Options.blp | Bin 0 -> 1049748 bytes WeakAuras/Media/Textures/sidebar.tga | Bin 0 -> 16428 bytes WeakAuras/WeakAuras.lua | 20 +-- .../AceGUIWidget-WeakAurasInput.lua | 31 ++++ ...AceGUIWidget-WeakAurasMultiLineEditBox.lua | 12 +- .../AceGUIWidget-WeakAurasSnippetButton.lua | 26 ++- WeakAurasOptions/ActionOptions.lua | 122 +++++++++++-- WeakAurasOptions/CommonOptions.lua | 19 +- WeakAurasOptions/ConditionOptions.lua | 74 ++++++-- .../OptionsFrames/OptionsFrame.lua | 99 ++++++++++- WeakAurasOptions/RegionOptions/Text.lua | 19 +- WeakAurasOptions/SubRegionOptions/SubText.lua | 34 +++- WeakAurasOptions/WeakAurasOptions.lua | 165 ++++++++++++++++++ WeakAurasOptions/WeakAurasOptions.toc | 1 + 17 files changed, 605 insertions(+), 92 deletions(-) create mode 100644 WeakAuras/Media/Textures/Options.blp create mode 100644 WeakAuras/Media/Textures/sidebar.tga create mode 100644 WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasInput.lua diff --git a/WeakAuras/BuffTrigger2.lua b/WeakAuras/BuffTrigger2.lua index 2675297..1f4448e 100644 --- a/WeakAuras/BuffTrigger2.lua +++ b/WeakAuras/BuffTrigger2.lua @@ -2622,52 +2622,53 @@ end -- @return string of additional properties function BuffTrigger.GetAdditionalProperties(data, triggernum) local trigger = data.triggers[triggernum].trigger + local props = {} + props["spellId"] = L["Spell ID"] + props["debuffClass"] = L["Debuff Class"] + props["debuffClassIcon"] = L["Debuff Class Icon"] + props["unitCaster"] = L["Caster Unit"] + props["casterName"] = L["Caster Name"] - local ret = {"|cFFFFCC00%".. triggernum .. ".spellId|r - " .. L["Spell ID"] .. "\n"} - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".debuffClass|r - " .. L["Debuff Class"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".debuffClassIcon|r - " .. L["Debuff Class Icon"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".unitCaster|r - " .. L["Caster Unit"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".casterName|r - " .. L["Caster Name"] .. "\n") if trigger.unit ~= "multi" then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".unit|r - " .. L["Unit"] .. "\n") + props["unit"] = L["Unit"] end - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".unitName|r - " .. L["Unit Name"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".matchCount|r - " .. L["Match Count"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".matchCountPerUnit|r - " .. L["Match Count per Unit"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".unitCount|r - " .. L["Units Affected"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".totalStacks|r - " .. L["Total stacks over all matches"] .. "\n") + props["unitName"] = L["Unit Name"] + props["matchCount"] = L["Match Count"] + props["matchCountPerUnit"] = L["Match Count per Unit"] + props["unitCount"] = L["Units Affected"] + props["totalStacks"] = L["Total stacks over all matches"] if trigger.unit ~= "multi" then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".maxUnitCount|r - " .. L["Total Units"] .. "\n") + props["maxUnitCount"] = L["Total Units"] end if not IsSingleMissing(trigger) and trigger.unit ~= "multi" and trigger.fetchTooltip then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".tooltip|r - " .. L["Tooltip"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".tooltip1|r - " .. L["First Value of Tooltip Text"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".tooltip2|r - " .. L["Second Value of Tooltip Text"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".tooltip3|r - " .. L["Third Value of Tooltip Text"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".tooltip4|r - " .. L["Fourth Value of Tooltip Text"] .. "\n") + props["tooltip"] = L["Tooltip"] + props["tooltip1"] = L["First Value of Tooltip Text"] + props["tooltip2"] = L["Second Value of Tooltip Text"] + props["tooltip3"] = L["Third Value of Tooltip Text"] + props["tooltip4"] = L["Fourth Value of Tooltip Text"] end if trigger.unit ~= "multi" then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".stackGainTime|r - " .. L["Since Stack Gain"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".stackLostTime|r - " .. L["Since Stack Lost"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".initialTime|r - " .. L["Since Apply"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".refreshTime|r - " .. L["Since Apply/Refresh"] .. "\n") + props["stackGainTime"] = L["Since Stack Gain"] + props["stackLostTime"] = L["Since Stack Lost"] + props["initialTime"] = L["Since Apply"] + props["refreshTime"] = L["Since Apply/Refresh"] end if trigger.unit ~= "multi" and trigger.fetchRaidMark then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".raidMark|r - " .. L["Raid Mark"] .. "\n") + props["raidMark"] = L["Raid Mark"] end if (trigger.unit == "group" or trigger.unit == "raid" or trigger.unit == "party") and trigger.useAffected then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".affected|r - " .. L["Names of affected Players"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".unaffected|r - " .. L["Names of unaffected Players"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".affectedUnits|r - " .. L["Units of affected Players in a table format"] .. "\n") - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".unaffectedUnits|r - " .. L["Units of unaffected Players in a table format"] .. "\n") + props["affected"] = L["Names of affected Players"] + props["unaffected"] = L["Names of unaffected Players"] + props["affectedUnits"] = L["Units of affected Players in a table format"] + props["unaffectedUnits"] = L["Units of unaffected Players in a table format"] end - return table.concat(ret) + return props end function BuffTrigger.GetProgressSources(data, triggernum, values) diff --git a/WeakAuras/Compatibility.lua b/WeakAuras/Compatibility.lua index f6f24d7..00cdea8 100644 --- a/WeakAuras/Compatibility.lua +++ b/WeakAuras/Compatibility.lua @@ -53,6 +53,12 @@ function TableHasAnyEntries(tbl) return false end +function tAppendAll(table, addedArray) + for i, element in ipairs(addedArray) do + tinsert(table, element); + end +end + function IsInGroup() return GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0 end diff --git a/WeakAuras/GenericTrigger.lua b/WeakAuras/GenericTrigger.lua index c34d7e3..9a153bc 100644 --- a/WeakAuras/GenericTrigger.lua +++ b/WeakAuras/GenericTrigger.lua @@ -3826,7 +3826,7 @@ end function GenericTrigger.GetAdditionalProperties(data, triggernum) local trigger = data.triggers[triggernum].trigger - local ret = {""}; + local props = {} local prototype = GenericTrigger.GetPrototype(trigger) if prototype then for _, v in pairs(prototype.args) do @@ -3838,28 +3838,26 @@ function GenericTrigger.GetAdditionalProperties(data, triggernum) end if (enable and v.store and v.name and v.display and v.conditionType ~= "bool") then - table.insert(ret, "|cFFFFCC00%".. triggernum .. "." .. v.name .. "|r - " .. v.display .. "\n") + props[v.name] = v.display end end if prototype.countEvents then - table.insert(ret, "|cFFFFCC00%".. triggernum .. ".count|r - " .. L["Count"] .. "\n") + props.count = L["Count"] end else if (trigger.custom_type == "stateupdate") then local variables = GenericTrigger.GetTsuConditionVariables(data.id, triggernum) if (type(variables) == "table") then for var, varData in pairs(variables) do - if (type(varData) == "table") then - if varData.display then - table.insert(ret, "|cFFFFCC00%".. triggernum .. "." .. var .. "|r - " .. varData.display .. "\n") - end + if (type(varData) == "table") and varData.display then + props[var] = varData.display end end end end end - return table.concat(ret); + return props; end function GenericTrigger.GetProgressSources(data, triggernum, values) diff --git a/WeakAuras/Media/Textures/Options.blp b/WeakAuras/Media/Textures/Options.blp new file mode 100644 index 0000000000000000000000000000000000000000..5cb5011aea787525920d8a479cb0a7eed5db3f3f GIT binary patch literal 1049748 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
mSModjH>LgVy_;59Nl3*8k2U%2#@R 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 Version then return end + +local OnEditFocusGained = function(frame) + local self = frame.obj + local option = self.userdata.option + if option and option.callbacks and option.callbacks.OnEditFocusGained then + option.callbacks.OnEditFocusGained(self) + end +end + +local OnShow = function(frame) + local self = frame.obj + local option = self.userdata.option + if option and option.callbacks and option.callbacks.OnShow then + option.callbacks.OnShow(self) + end +end + +local function Constructor() + local widget = AceGUI:Create("EditBox") + widget.type = Type + widget.editbox:HookScript("OnEditFocusGained", OnEditFocusGained) + widget.editbox:HookScript("OnShow", OnShow) + return widget +end + +AceGUI:RegisterWidgetType(Type, Constructor, Version) diff --git a/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasMultiLineEditBox.lua b/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasMultiLineEditBox.lua index 73b68df..d8a4b94 100644 --- a/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasMultiLineEditBox.lua +++ b/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasMultiLineEditBox.lua @@ -1,6 +1,6 @@ if not WeakAuras.IsLibsOK() then return end -local Type, Version = "WeakAurasMultiLineEditBox", 36 +local Type, Version = "WeakAurasMultiLineEditBox", 38 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -169,6 +169,10 @@ local function OnFrameShow(frame) end end + if option and option.callbacks and option.callbacks.OnShow then + option.callbacks.OnShow(self) + end + for i = numExtraButtons + 1, #self.extraButtons do self.extraButtons[i]:Hide(); end @@ -178,6 +182,11 @@ local function OnEditFocusGained(frame) AceGUI:SetFocus(frame.obj) frame.obj:Fire("OnEditFocusGained") frame.obj.scrollFrame:EnableMouseWheel(true); + + local option = frame.obj.userdata.option + if option and option.callbacks and option.callbacks.OnEditFocusGained then + option.callbacks.OnEditFocusGained(frame.obj) + end end --[[----------------------------------------------------------------------------- @@ -369,6 +378,7 @@ local function Constructor() button = button, extraButtons = extraButtons, editBox = editBox, + editbox = editBox, frame = frame, label = label, labelHeight = 10, diff --git a/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasSnippetButton.lua b/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasSnippetButton.lua index c4ddda5..45ee972 100644 --- a/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasSnippetButton.lua +++ b/WeakAurasOptions/AceGUI-Widgets/AceGUIWidget-WeakAurasSnippetButton.lua @@ -4,7 +4,7 @@ Graphical Button. -------------------------------------------------------------------------------]] if not WeakAuras.IsLibsOK() then return end -local Type, Version = "WeakAurasSnippetButton", 2 +local Type, Version = "WeakAurasSnippetButton", 3 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return @@ -71,6 +71,12 @@ local methods = { self:SetDisabled(false) self:SetTitle() self:SetEditable(false) + + self.ntex:SetTexture("Interface\\BUTTONS\\UI-Listbox-Highlight2.blp") + self.ntex:SetVertexColor(0.8, 0.8, 0.8, 0.25) + self.htex:SetTexture("Interface\\BUTTONS\\UI-Listbox-Highlight2.blp") + self.htex:SetVertexColor(0.3, 0.5, 1, 0.5) + self.ptex:SetTexture(1, 1, 1, 0.2) end, -- ["OnRelease"] = nil, @@ -115,6 +121,14 @@ local methods = { self.renameEditBox:HighlightText() self.renameEditBox:SetFocus() end + end, + ["SetDynamicTextStyle"] = function(self) + self.ntex:SetTexture(nil) + self.htex:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\Options") + self.htex:SetTexCoord(0.774414, 0.957031, 0.000976562, 0.0214844) + self.htex:SetVertexColor(1, 1, 1, 1) + self.ptex:SetTexture("Interface\\AddOns\\WeakAuras\\Media\\Textures\\Options") + self.ptex:SetTexCoord(0.589844, 0.772461, 0.000976562, 0.0214844) end } @@ -154,25 +168,20 @@ local function Constructor() button.title = title local ntex = button:CreateTexture() - ntex:SetTexture("Interface\\BUTTONS\\UI-Listbox-Highlight2.blp") - ntex:SetVertexColor(0.8, 0.8, 0.8, 0.25) ntex:SetPoint("TOPLEFT", 0, -1) ntex:SetPoint("BOTTOMRIGHT", 0, 1) button:SetNormalTexture(ntex) local htex = button:CreateTexture() - htex:SetTexture("Interface\\BUTTONS\\UI-Listbox-Highlight2.blp") - htex:SetVertexColor(0.3, 0.5, 1, 0.5) htex:SetBlendMode("ADD") htex:SetAllPoints(ntex) button:SetHighlightTexture(htex) button.htex = htex local ptex = button:CreateTexture() - ptex:SetTexture(1, 1, 1, 0.2) - htex:SetAllPoints(ntex) + ptex:SetAllPoints(ntex) button:SetPushedTexture(ptex) - button.ptext = ptex + button.ptex = ptex local delHighlight = deleteButton:CreateTexture() delHighlight:SetTexture([[Interface\Buttons\CancelButton-Highlight]]) @@ -214,6 +223,7 @@ local function Constructor() title = title, frame = button, type = Type, + ntex = ntex, htex = htex, ptex = ptex, deleteButton = deleteButton, diff --git a/WeakAurasOptions/ActionOptions.lua b/WeakAurasOptions/ActionOptions.lua index 5b7c137..7d99e92 100644 --- a/WeakAurasOptions/ActionOptions.lua +++ b/WeakAurasOptions/ActionOptions.lua @@ -11,6 +11,7 @@ local disabledAll = OptionsPrivate.commonOptions.CreateDisabledAll("action") local hiddenAll = OptionsPrivate.commonOptions.CreateHiddenAll("action") local getAll = OptionsPrivate.commonOptions.CreateGetAll("action") local setAll = OptionsPrivate.commonOptions.CreateSetAll("action", getAll) +local dynamicTextInputs = {} local RestrictedChannelCheck = function(data) return data.message_type == "SAY" or data.message_type == "YELL" or data.message_type == "SMARTRAID" @@ -146,14 +147,38 @@ function OptionsPrivate.GetActionOptions(data) }, start_message_dest = { type = "input", - width = WeakAuras.normalWidth, + width = WeakAuras.normalWidth - 0.15, name = L["Send To"], order = 3.1, disabled = function() return not data.actions.start.do_message end, hidden = function() return data.actions.start.message_type ~= "WHISPER" end, - desc = function() - return L["Dynamic text tooltip"] .. OptionsPrivate.Private.GetAdditionalProperties(data) + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["start_message_dest"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["start_message_dest"] = self + end, + } + }, + start_message_dest_text_replacements_button = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = 3.11, + disabled = function() return not data.actions.start.do_message end, + hidden = function() return data.actions.start.message_type ~= "WHISPER" end, + func = function() + local widget = dynamicTextInputs["start_message_dest"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", }, start_message_dest_isunit = { type = "toggle", @@ -166,13 +191,36 @@ function OptionsPrivate.GetActionOptions(data) }, start_message = { type = "input", - width = WeakAuras.doubleWidth, + width = WeakAuras.doubleWidth - 0.15, name = L["Message"], order = 4, disabled = function() return not data.actions.start.do_message end, - desc = function() - return L["Dynamic text tooltip"] .. OptionsPrivate.Private.GetAdditionalProperties(data) + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["start_message"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["start_message"] = self + end, + } + }, + start_message_text_replacements_button = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = 4.1, + disabled = function() return not data.actions.start.do_message end, + func = function() + local widget = dynamicTextInputs["start_message"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", }, -- texteditor added later start_do_sound = { @@ -537,7 +585,7 @@ function OptionsPrivate.GetActionOptions(data) }, finish_message_color = { type = "color", - width = WeakAuras.normalWidth, + width = WeakAuras.normalWidth - 0.15, name = L["Color"], order = 23, hasAlpha = false, @@ -556,11 +604,38 @@ function OptionsPrivate.GetActionOptions(data) }, finish_message_dest = { type = "input", - width = WeakAuras.normalWidth, + width = WeakAuras.normalWidth - 0.15, name = L["Send To"], order = 23.1, disabled = function() return not data.actions.finish.do_message end, - hidden = function() return data.actions.finish.message_type ~= "WHISPER" end + hidden = function() return data.actions.finish.message_type ~= "WHISPER" end, + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["finish_message_dest"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["finish_message_dest"] = self + end, + } + }, + finish_message_dest_text_replacements_button = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = 23.11, + disabled = function() return not data.actions.finish.do_message end, + hidden = function() return data.actions.finish.message_type ~= "WHISPER" end, + func = function() + local widget = dynamicTextInputs["finish_message_dest"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) + end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", }, finish_message_dest_isunit = { type = "toggle", @@ -573,13 +648,36 @@ function OptionsPrivate.GetActionOptions(data) }, finish_message = { type = "input", - width = WeakAuras.doubleWidth, + width = WeakAuras.doubleWidth - 0.15, name = L["Message"], order = 24, disabled = function() return not data.actions.finish.do_message end, - desc = function() - return L["Dynamic text tooltip"] .. OptionsPrivate.Private.GetAdditionalProperties(data) + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["finish_message"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["finish_message"] = self + end, + } + }, + finish_message_text_replacements_button = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = 24.1, + disabled = function() return not data.actions.finish.do_message end, + func = function() + local widget = dynamicTextInputs["finish_message"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", }, -- texteditor added below finish_do_sound = { diff --git a/WeakAurasOptions/CommonOptions.lua b/WeakAurasOptions/CommonOptions.lua index 6997445..012a29e 100644 --- a/WeakAurasOptions/CommonOptions.lua +++ b/WeakAurasOptions/CommonOptions.lua @@ -98,6 +98,7 @@ local function addCollapsibleHeader(options, key, input, order, isGroupTab) local hasDown = input.__down local hasDuplicate = input.__duplicate local hasApplyTemplate = input.__applyTemplate + local hasDynamicTextCodes = input.__dynamicTextCodes local defaultCollapsed = input.__collapsed local hiddenFunc = input.__hidden local notcollapsable = input.__notcollapsable @@ -122,7 +123,7 @@ local function addCollapsibleHeader(options, key, input, order, isGroupTab) end local titleWidth = WeakAuras.doubleWidth - (hasAdd and 0.15 or 0) - (hasDelete and 0.15 or 0) - (hasUp and 0.15 or 0) - - (hasDown and 0.15 or 0) - (hasDuplicate and 0.15 or 0) - (hasApplyTemplate and 0.15 or 0) + - (hasDown and 0.15 or 0) - (hasDuplicate and 0.15 or 0) - (hasApplyTemplate and 0.15 or 0) - (hasDynamicTextCodes and 0.15 or 0) options[key .. "collapseSpacer"] = { type = marginTop and "header" or "description", @@ -241,6 +242,22 @@ local function addCollapsibleHeader(options, key, input, order, isGroupTab) } setFuncs(options[key .. "applyTemplate"], input.__applyTemplate) end + + if hasDynamicTextCodes then + options[key .. "dynamicTextCodesButton"] = { + type = "execute", + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = order + 0.8, + width = 0.15, + hidden = hiddenFunc, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", + } + setFuncs(options[key .. "dynamicTextCodesButton"], input.__dynamicTextCodes) + end end if hiddenFunc then diff --git a/WeakAurasOptions/ConditionOptions.lua b/WeakAurasOptions/ConditionOptions.lua index 0b10f7d..f0506e2 100644 --- a/WeakAurasOptions/ConditionOptions.lua +++ b/WeakAurasOptions/ConditionOptions.lua @@ -241,6 +241,8 @@ local function wrapWithPlaySound(func, kit) end end +local dynamicTextInputs = {} + local function addControlsForChange(args, order, data, conditionVariable, totalAuraCount, conditions, i, j, allProperties, usedProperties) local thenText = (j == 1) and L["Then "] or L["And "]; local display = isSubset(data, conditions[i].changes[j], totalAuraCount) and allProperties.displayWithCopy or allProperties.display; @@ -917,16 +919,10 @@ local function addControlsForChange(args, order, data, conditionVariable, totalA } order = order + 1; - local descMessage = descIfNoValue2(data, conditions[i].changes[j], "value", "message", propertyType); - if (not descMessage and data ~= OptionsPrivate.tempGroup) then - descMessage = L["Dynamic text tooltip"] .. OptionsPrivate.Private.GetAdditionalProperties(data) - end - args["condition" .. i .. "value" .. j .. "message dest"] = { type = "input", - width = WeakAuras.normalWidth, + width = WeakAuras.normalWidth - 0.15, name = blueIfNoValue2(data, conditions[i].changes[j], "value", "message_dest", L["Send To"], L["Send To"]), - desc = descMessage, order = order, get = function() return type(conditions[i].changes[j].value) == "table" and conditions[i].changes[j].value.message_dest; @@ -934,7 +930,37 @@ local function addControlsForChange(args, order, data, conditionVariable, totalA set = setValueComplex("message_dest"), hidden = function() return not anyMessageType("WHISPER"); - end + end, + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["condition" .. i .. "value" .. j .. "message dest"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["condition" .. i .. "value" .. j .. "message dest"] = self + end, + } + } + order = order + 1; + + args["condition" .. i .. "value" .. j .. "message dest_text_replacements_button"] = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = order, + hidden = function() + return not anyMessageType("WHISPER"); + end, + func = function() + local widget = dynamicTextInputs["condition" .. i .. "value" .. j .. "message dest"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) + end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", } order = order + 1; @@ -960,12 +986,38 @@ local function addControlsForChange(args, order, data, conditionVariable, totalA args["condition" .. i .. "value" .. j .. "message"] = { type = "input", - width = WeakAuras.doubleWidth, + width = WeakAuras.doubleWidth - 0.15, name = blueIfNoValue2(data, conditions[i].changes[j], "value", "message", L["Message"], L["Message"]), - desc = descMessage, order = order, get = message_getter, - set = setValueComplex("message") + set = setValueComplex("message"), + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["condition" .. i .. "value" .. j .. "message"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["condition" .. i .. "value" .. j .. "message"] = self + end, + } + } + order = order + 1; + + args["condition" .. i .. "value" .. j .. "message_text_replacements_button"] = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = order, + func = function() + local widget = dynamicTextInputs["condition" .. i .. "value" .. j .. "message"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) + end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", } order = order + 1; diff --git a/WeakAurasOptions/OptionsFrames/OptionsFrame.lua b/WeakAurasOptions/OptionsFrames/OptionsFrame.lua index fe2fd51..1bfae9f 100644 --- a/WeakAurasOptions/OptionsFrames/OptionsFrame.lua +++ b/WeakAurasOptions/OptionsFrames/OptionsFrame.lua @@ -136,7 +136,6 @@ function OptionsPrivate.CreateFrame() OptionsPrivate.Private.ClearFakeStates() - for id, data in pairs(OptionsPrivate.Private.regions) do if data.region then data.region:Collapse() @@ -160,6 +159,10 @@ function OptionsPrivate.CreateFrame() if OptionsPrivate.Private.personalRessourceDisplayFrame then OptionsPrivate.Private.personalRessourceDisplayFrame:OptionsClosed() end + + if frame.dynamicTextCodesFrame then + frame.dynamicTextCodesFrame:Hide() + end end) local width, height @@ -225,6 +228,7 @@ function OptionsPrivate.CreateFrame() self.tipFrame:Hide() self:HideTip() self.bottomRightResizer:Hide() + self.dynamicTextCodesFrame:Hide() else WeakAurasOptionsTitleText:Show() self.bottomRightResizer:Show() @@ -236,6 +240,7 @@ function OptionsPrivate.CreateFrame() else self.buttonsContainer.frame:Hide() self.container.frame:Hide() + self.dynamicTextCodesFrame:Hide() self:HideTip() end @@ -887,6 +892,93 @@ function OptionsPrivate.CreateFrame() unloadedButton.childButtons = {} frame.unloadedButton = unloadedButton + -- Sidebar used for Dynamic Text Replacements + local sidegroup = AceGUI:Create("WeakAurasInlineGroup") + sidegroup.frame:SetParent(frame) + sidegroup.frame:SetPoint("TOPLEFT", frame, "TOPLEFT", 17, -63); + sidegroup.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -17, 46); + sidegroup.frame:Show() + sidegroup:SetLayout("flow") + + local dynamicTextCodesFrame = CreateFrame("Frame", "WeakAurasTextReplacements", sidegroup.frame, "WA_PortraitFrameTemplate") + dynamicTextCodesFrame:HidePortrait() + dynamicTextCodesFrame:SetPoint("TOPLEFT", sidegroup.frame, "TOPRIGHT", 20, 0) + dynamicTextCodesFrame:SetPoint("BOTTOMLEFT", sidegroup.frame, "BOTTOMRIGHT", 20, 0) + dynamicTextCodesFrame:SetWidth(250) + dynamicTextCodesFrame:SetScript("OnHide", function() + OptionsPrivate.currentDynamicTextInput = nil + end) + frame.dynamicTextCodesFrame = dynamicTextCodesFrame + + local dynamicTextCodesFrameTitle + if dynamicTextCodesFrame.TitleContainer and dynamicTextCodesFrame.TitleContainer.TitleText then + dynamicTextCodesFrameTitle = dynamicTextCodesFrame.TitleContainer.TitleText + elseif dynamicTextCodesFrame.TitleText then + dynamicTextCodesFrameTitle = dynamicTextCodesFrame.TitleText + end + if dynamicTextCodesFrameTitle then + dynamicTextCodesFrameTitle:SetText("Dynamic Text Replacements") + dynamicTextCodesFrameTitle:SetJustifyH("CENTER") + dynamicTextCodesFrameTitle:SetPoint("LEFT", dynamicTextCodesFrame, "TOPLEFT") + dynamicTextCodesFrameTitle:SetPoint("RIGHT", dynamicTextCodesFrame, "TOPRIGHT", -10, 0) + end + + local dynamicTextCodesLabel = AceGUI:Create("Label") + dynamicTextCodesLabel:SetText(L["Insert text replacement codes to make text dynamic."]) + dynamicTextCodesLabel:SetFontObject(GameFontNormal) + dynamicTextCodesLabel:SetPoint("TOP", dynamicTextCodesFrame, "TOP", 0, -35) + dynamicTextCodesLabel:SetFontObject(GameFontNormalSmall) + dynamicTextCodesLabel.frame:SetParent(dynamicTextCodesFrame) + dynamicTextCodesLabel.frame:Show() + + local dynamicTextCodesScrollContainer = AceGUI:Create("SimpleGroup") + dynamicTextCodesScrollContainer.frame:SetParent(dynamicTextCodesFrame) + dynamicTextCodesScrollContainer.frame:SetPoint("TOP", dynamicTextCodesLabel.frame, "BOTTOM", 0, -15) + dynamicTextCodesScrollContainer.frame:SetPoint("LEFT", dynamicTextCodesFrame, "LEFT", 15, 0) + dynamicTextCodesScrollContainer.frame:SetPoint("BOTTOMRIGHT", dynamicTextCodesFrame, "BOTTOMRIGHT", -15, 5) + dynamicTextCodesScrollContainer:SetFullWidth(true) + dynamicTextCodesScrollContainer:SetFullHeight(true) + dynamicTextCodesScrollContainer:SetLayout("Fill") + + + local dynamicTextCodesScrollList = AceGUI:Create("ScrollFrame") + dynamicTextCodesScrollList:SetLayout("List") + dynamicTextCodesScrollList:SetPoint("TOPLEFT", dynamicTextCodesScrollContainer.frame, "TOPLEFT") + dynamicTextCodesScrollList:SetPoint("BOTTOMRIGHT", dynamicTextCodesScrollContainer.frame, "BOTTOMRIGHT") + dynamicTextCodesScrollList.frame:SetParent(dynamicTextCodesFrame) + dynamicTextCodesScrollList:FixScroll() + dynamicTextCodesScrollList.scrollframe:SetScript( + "OnScrollRangeChanged", + function(frame) + frame.obj:DoLayout() + end + ) + + dynamicTextCodesScrollList.scrollframe:SetScript( + "OnSizeChanged", + function(frame) + if frame.obj.scrollBarShown then + frame.obj.content.width = frame.obj.content.original_width - 10 + frame.obj.scrollframe:SetPoint("BOTTOMRIGHT", -10, 0) + end + end + ) + + dynamicTextCodesFrame.scrollList = dynamicTextCodesScrollList + dynamicTextCodesFrame.label = dynamicTextCodesLabel + dynamicTextCodesFrame:Hide() + + function OptionsPrivate.ToggleTextReplacements(data, show, widget) + if show or not dynamicTextCodesFrame:IsShown() then + dynamicTextCodesFrame:Show() + if OptionsPrivate.currentDynamicTextInput ~= widget then + OptionsPrivate.UpdateTextReplacements(dynamicTextCodesFrame, data) + end + OptionsPrivate.currentDynamicTextInput = widget + else + dynamicTextCodesFrame:Hide() + end + end frame.ClearOptions = function(self, id) aceOptions[id] = nil @@ -1037,6 +1129,10 @@ function OptionsPrivate.CreateFrame() if data.controlledChildren and #data.controlledChildren == 0 then WeakAurasOptions:NewAura() end + + if frame.dynamicTextCodesFrame then + frame.dynamicTextCodesFrame:Hide() + end end frame.ClearPick = function(self, id) @@ -1136,6 +1232,7 @@ function OptionsPrivate.CreateFrame() targetIsDynamicGroup = parentData and parentData.regionType == "dynamicgroup" end end + self.dynamicTextCodesFrame:Hide() self.moversizer:Hide() self.pickedOption = "New" diff --git a/WeakAurasOptions/RegionOptions/Text.lua b/WeakAurasOptions/RegionOptions/Text.lua index 9f17306..3851e68 100644 --- a/WeakAurasOptions/RegionOptions/Text.lua +++ b/WeakAurasOptions/RegionOptions/Text.lua @@ -11,6 +11,8 @@ local hiddenFontExtra = function() return OptionsPrivate.IsCollapsed("text", "text", "fontflags", true) end +local dynamicTextInputs = {} + local function createOptions(id, data) local function hideCustomTextOption() if OptionsPrivate.Private.ContainsCustomPlaceHolder(data.displayText) then @@ -39,12 +41,13 @@ local function createOptions(id, data) local options = { __title = L["Text Settings"], __order = 1, + __dynamicTextCodes = function() + local widget = dynamicTextInputs["displayText"] + OptionsPrivate.ToggleTextReplacements(data, nil, widget) + end, displayText = { type = "input", width = WeakAuras.doubleWidth, - desc = function() - return L["Dynamic text tooltip"] .. OptionsPrivate.Private.GetAdditionalProperties(data) - end, multiline = true, name = L["Display Text"], order = 10, @@ -58,6 +61,16 @@ local function createOptions(id, data) WeakAuras.UpdateThumbnail(data); OptionsPrivate.ResetMoverSizer(); end, + control = "WeakAurasMultiLineEditBox", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs["displayText"] + OptionsPrivate.ToggleTextReplacements(data, true, widget) + end, + OnShow = function(self) + dynamicTextInputs["displayText"] = self + end, + } }, customTextUpdate = { type = "select", diff --git a/WeakAurasOptions/SubRegionOptions/SubText.lua b/WeakAurasOptions/SubRegionOptions/SubText.lua index 613ff2e..42cf1ae 100644 --- a/WeakAurasOptions/SubRegionOptions/SubText.lua +++ b/WeakAurasOptions/SubRegionOptions/SubText.lua @@ -18,6 +18,8 @@ local self_point_types = { AUTO = L["Automatic"] } +local dynamicTextInputs = {} + local function createOptions(parentData, data, index, subIndex) -- The toggles for font flags is intentionally not keyed on the id -- So that all auras share the state of that toggle @@ -45,17 +47,39 @@ local function createOptions(parentData, data, index, subIndex) }, text_text = { type = "input", - width = WeakAuras.normalWidth, - desc = function() - return L["Dynamic text tooltip"] .. OptionsPrivate.Private.GetAdditionalProperties(parentData) - end, + width = WeakAuras.normalWidth - 0.15, name = L["Display Text"], order = 11, set = function(info, v) data.text_text = OptionsPrivate.Private.ReplaceLocalizedRaidMarkers(v) WeakAuras.Add(parentData) WeakAuras.ClearAndUpdateOptions(parentData.id) - end + end, + control = "WeakAurasInput", + callbacks = { + OnEditFocusGained = function(self) + local widget = dynamicTextInputs[subIndex] + OptionsPrivate.ToggleTextReplacements(parentData, true, widget) + end, + OnShow = function(self) + dynamicTextInputs[subIndex] = self + end, + } + }, + text_replacements_button = { + type = "execute", + width = 0.15, + name = L["Dynamic Text Replacements"], + desc = L["There are several special codes available to make this text dynamic. Click to view a list with all dynamic text codes."], + order = 11.1, + func = function() + local widget = dynamicTextInputs[subIndex] + OptionsPrivate.ToggleTextReplacements(parentData, nil, widget) + end, + imageWidth = 24, + imageHeight = 24, + control = "WeakAurasIcon", + image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\sidebar", }, text_font = { type = "select", diff --git a/WeakAurasOptions/WeakAurasOptions.lua b/WeakAurasOptions/WeakAurasOptions.lua index 8f16cce..a8bccd7 100644 --- a/WeakAurasOptions/WeakAurasOptions.lua +++ b/WeakAurasOptions/WeakAurasOptions.lua @@ -1715,6 +1715,171 @@ function OptionsPrivate.OpenTriggerTemplate(data, targetId) end end +OptionsPrivate.currentDynamicTextInput = false; + +local BaseDynamicTextCodes = { + trigger = { + {type = "mini", name = "p", desc = L["Progress - The remaining time of a timer, or a non-timer value"]}, + {type = "mini", name = "t", desc = L["Total - The maximum duration of a timer, or a maximum non-timer value"]}, + {type = "mini", name = "n", desc = L["Name - The name of the display (usually an aura name), or the display's ID if there is no dynamic name"]}, + {type = "mini", name = "i", desc = L["Icon - The icon associated with the display"]}, + {type = "mini", name = "s", desc = L["Stacks - The number of stacks of an aura (usually)"]}, + }, + global = { + {type = "mini", name = "c", desc = L["Custom - Allows you to define a custom Lua function that returns a list of string values. %c1 will be replaced by the first value returned, %c2 by the second, etc."]}, + {type = "mini", name = "%", desc = L["% - To show a percent sign"]}, + } +} + +function OptionsPrivate.UpdateTextReplacements(frame, data) + frame.scrollList:ReleaseChildren() + + local props = OptionsPrivate.Private.GetAdditionalProperties(data) + local sortedProps = {} + + -- Add global header and markers + table.insert(sortedProps, {type = "header", triggerNum = 0, name = "Global Properties"}) + for index, icon in ipairs(ICON_LIST) do + table.insert(sortedProps, {type = "marker", triggerNum = 0, name = "{rt"..index.."}", desc = icon..":0|t", widthFraction = #ICON_LIST}) + end + + -- Add base dynamic text codes + local globalProps = {} + tAppendAll(globalProps, CopyTable(BaseDynamicTextCodes.trigger)) + tAppendAll(globalProps, CopyTable(BaseDynamicTextCodes.global)) + for _, prop in ipairs(globalProps) do + prop.widthFraction = #globalProps + prop.triggerNum = 0 + table.insert(sortedProps, prop) + end + + -- Process each trigger's properties + for triggerNum, triggerProps in pairs(props) do + if next(triggerProps) then + -- Create a temporary table for this trigger's properties + local tempProps = {} + + -- Add the properties to the temporary table + for name, desc in pairs(triggerProps) do + table.insert(tempProps, {triggerNum = triggerNum, name = name, desc = desc}) + end + + -- Sort the temporary table by name + table.sort(tempProps, function(a, b) + return a.name < b.name + end) + + -- Add a header for the trigger + table.insert(sortedProps, {type = "header", triggerNum = triggerNum, name = OptionsPrivate.GetTriggerTitle(data, triggerNum)}) + + -- Add the base properties for the trigger + for _, v in ipairs(BaseDynamicTextCodes.trigger) do + local prop = CopyTable(v) + prop.widthFraction = #BaseDynamicTextCodes.trigger + prop.triggerNum = triggerNum + table.insert(sortedProps, prop) + end + + -- Add the sorted properties to the sortedProps table + for _, prop in ipairs(tempProps) do + table.insert(sortedProps, prop) + end + end + end + + -- Create a modified WeakAurasSnippetButton for each property and add it to ScrollList + local lastType, miniGroup + for i, prop in ipairs(sortedProps) do + if prop.type == "header" then + local heading = AceGUI:Create("Heading") + heading:SetText(prop.name) + heading:SetRelativeWidth(1) + heading.label:SetFontObject(GameFontNormalSmall) + frame.scrollList:AddChild(heading) + else + if ((prop.type == "mini" or prop.type == "marker") and prop.type ~= lastType) + then + miniGroup = AceGUI:Create("SimpleGroup") + miniGroup:SetLayout("Flow") + miniGroup:SetAutoAdjustHeight(true) + miniGroup:SetRelativeWidth(1) + frame.scrollList:AddChild(miniGroup) + end + local button = AceGUI:Create("WeakAurasSnippetButton") + local propIndex = prop.triggerNum > 0 and ("%s"):format(prop.triggerNum) or "" + local propPrefix = prop.triggerNum > 0 and ("%%%s."):format(propIndex) or "%" + if prop.type == "marker" then + button:SetTitle(prop.desc) + else + button:SetTitle(string.format("|cFFFFCC00%s|r%s", propPrefix, prop.name)) + end + if prop.type == "mini" or prop.type == "marker" then + button:SetRelativeWidth((1/prop.widthFraction) - 1e-10) + else + button:SetRelativeWidth(1) + end + button.title:SetFontObject(GameFontNormal) + button.frame:SetHeight(28) + button:SetDynamicTextStyle() + + -- Set Tooltip + if prop.type ~= "marker" then + button.frame:SetScript("OnEnter", function(frame) + local tooltip = GameTooltip + tooltip:SetWidth(300) + tooltip:SetOwner(frame, "ANCHOR_RIGHT") + tooltip:ClearLines() + tooltip:AddLine(("%s%s"):format(propPrefix, prop.name)) + tooltip:AddLine(prop.desc, 1, 1, 1, true) + if prop.name ~= "c" and prop.name ~= "%" then + tooltip:AddLine("\n") + tooltip:AddLine( + prop.triggerNum > 0 + and L["The trigger number is optional. When no trigger number is specified, the trigger selected via dynamic information will be used."] + or L["By default this shows the information from the trigger selected via dynamic information. The information from a specific trigger can be shown via e.g. %2.p."], + 0.8, 0.8, 0.8, + true) + end + tooltip:Show() + frame.obj:Fire("OnEnter") + end) + else + button.frame:SetScript("OnEnter", nil) + end + + -- Insert dynamic text property on click + button:SetCallback("OnClick", function() + local insertProp + if prop.type == "marker" then + insertProp = prop.name + else + if IsShiftKeyDown() then + insertProp = prop.name == "%" and "%%" or ("%%{%s}"):format(prop.name) + if prop.triggerNum > 0 then + insertProp = string.format("%%{%d.%s}", propIndex, prop.name) + end + else + insertProp = prop.name == "%" and "%%" or ("%%%s"):format(prop.name) + if prop.triggerNum > 0 then + insertProp = string.format("%%%d.%s", propIndex, prop.name) + end + end + end + + OptionsPrivate.currentDynamicTextInput.editbox:Insert(insertProp) + OptionsPrivate.currentDynamicTextInput.editbox:SetFocus() + end) + + if prop.type == "mini" or prop.type == "marker" then + miniGroup:AddChild(button) + else + frame.scrollList:AddChild(button) + end + end + lastType = prop.type + end +end + function OptionsPrivate.ResetMoverSizer() if(frame and frame.mover and frame.moversizer and frame.mover.moving.region and frame.mover.moving.data) then frame.moversizer:SetToRegion(frame.mover.moving.region, frame.mover.moving.data); diff --git a/WeakAurasOptions/WeakAurasOptions.toc b/WeakAurasOptions/WeakAurasOptions.toc index 98e917e..5a42662 100644 --- a/WeakAurasOptions/WeakAurasOptions.toc +++ b/WeakAurasOptions/WeakAurasOptions.toc @@ -95,6 +95,7 @@ AceGUI-Widgets\AceGUIWidget-WeakAurasExpandAnchor.lua AceGUI-Widgets\AceGUIWidget-WeakAurasSpacer.lua AceGUI-Widgets\AceGuiWidget-WeakAurasProgressBar.lua AceGUI-Widgets\AceGUIWidget-WeakAurasSpinBox.lua +AceGUI-Widgets\AceGUIWidget-WeakAurasInput.lua AceGUI-Widgets\AceGUIWidget-WeakAurasInputFocus.lua AceGUI-Widgets\AceGUIWidget-WeakAurasMediaSound.lua AceGUI-Widgets\WeakAurasStatusbarAtlasWidget.lua