From 7c006e291f20a6b6a4fa260b45ea7bba90aaef6f Mon Sep 17 00:00:00 2001 From: urnati Date: Wed, 10 Jun 2026 19:44:19 -0400 Subject: [PATCH] TOC : Update MoP to 5.5.4 Gold : Fix for missing toons on servers with a space in the name Titan : Tooltips : Fix for tooltip covering TitanUI menu --- Titan/TitanHistory.lua | 24 ++ Titan/TitanTemplate.lua | 69 +---- Titan/TitanUtils.lua | 16 +- TitanAlts/TitanAlts.lua | 10 +- TitanClock/TitanClock.lua | 20 +- TitanGold/TitanGold.lua | 592 +++++++++++++++++-------------------------- TitanVolume/TitanVolume.lua | 10 +- 7 files changed, 298 insertions(+), 443 deletions(-) diff --git a/Titan/TitanHistory.lua b/Titan/TitanHistory.lua index 95fa397..2f352ca 100644 --- a/Titan/TitanHistory.lua +++ b/Titan/TitanHistory.lua @@ -10,6 +10,30 @@ These are in a seperate file to --- Release notes. Keep structure; most recent on 'top' local recent_changes = { { + version = "9.2.5", + when = "2026/06/10", + topics = { + { + topic = "TOC", + lines = { + "Update MoP to 5.5.4.", + }, + }, + { + topic = "Gold", + lines = { + "Fix for missing toons on servers with a space in the name.", + }, + }, + { + topic = "Titan", + lines = { + "Tooltips : Fix for tooltip covering TitanUI menu.", + }, + }, + }, + }, + { version = "9.2.4", when = "2026/05/07", topics = { diff --git a/Titan/TitanTemplate.lua b/Titan/TitanTemplate.lua index dded51c..7b2f550 100644 --- a/Titan/TitanTemplate.lua +++ b/Titan/TitanTemplate.lua @@ -1315,80 +1315,25 @@ end -- Set tool tip scripts -- OnUpdate starts as soon as OnShow is done... local tt_frame = TitanPanelTooltip -local tt_init_timeout = .5 - ---[===[ GameTooltip does not stay if cursor moves off plugin... -tt_frame:SetScript("OnShow", function(self) - local time_out = TitanPanelGetVar("TooltipTimeout") - local dbg_msg = "OnShow" - .. " timeout: " .. tostring(time_out) .. "" - .. " USING: " .. tostring(tt_init_timeout) .. "" - .. " isCounting: " .. tostring(self.isCounting) .. "" - .. " timer: " .. tostring(self.frameTimer) .. "" - .. " plugin: " .. tostring(self.registry_id) .. "" - .. " plugin_frame: " .. tostring(self.plugin_frame_str) .. "" - Titan_Debug.Out('titan', 'tool_tips', dbg_msg) - - -- OnShow will start the OnUpdate. - -- If user enters plugin, the tooltip will show - -- BUT if the user never enters the tooltip, it will keep showing because - -- the OnLeave did not kick the timer. - TitanUtils_StartFrameCounting(self, tt_init_timeout) -end) -tt_frame:SetScript("OnEnter", function(self) - local time_out = TitanPanelGetVar("TooltipTimeout") - - local dbg_msg = "OnEnter" - .. " timeout: " .. tostring(time_out) .. "" - .. " isCounting: " .. tostring(self.isCounting) .. "" - .. " timer: " .. tostring(self.frameTimer) .. "" - Titan_Debug.Out('titan', 'tool_tips', dbg_msg) - - TitanUtils_StopFrameCounting(self) -end) -tt_frame:SetScript("OnLeave", function(self) - local time_out = TitanPanelGetVar("TooltipTimeout") - - local dbg_msg = "OnLeave" - .. " timeout: " .. tostring(time_out) .. "" - .. " isCounting: " .. tostring(self.isCounting) .. "" - .. " timer: " .. tostring(self.frameTimer) .. "" - Titan_Debug.Out('titan', 'tool_tips', dbg_msg) - - if time_out < 0.1 then - tt_frame:Hide() -- hide right away - else - TitanUtils_StartFrameCounting(self, time_out) - end -end) ---]===] local debug_over = false local debug_over_new = false tt_frame:SetScript("OnUpdate", function(self, elapsed) local time_out = TitanPanelGetVar("TooltipTimeout") - --[[ -- Be VERY careful enabling this debug :) - local dbg_msg = "TT OnUpdate" - .. " timeout: " .. tostring(time_out) .. "" - .. " isCounting: " .. tostring(self.isCounting) .. "" - .. " timer: " .. tostring(self.frameTimer) .. "" - --Titan_Debug.Out('titan', 'tool_tips', dbg_msg) - if self.isCounting == nil then - Titan_Debug.Out('titan', 'tool_tips', dbg_msg) - elseif self.frameTimer <= 0.01 then - Titan_Debug.Out('titan', 'tool_tips', dbg_msg) - else - end - --]] - -- Keep tooltip open as long as the curser stays over plugin local is_over = self.plugin_frame:IsMouseOver() if is_over then TitanUtils_StopFrameCounting(self) debug_over_new = true else - TitanUtils_CheckFrameCounting(self, elapsed); + local status = TitanUtils_CheckFrameCounting(self, elapsed) + if status == "Active" then + -- counting down + else + -- should catch all the edge cases + self:Hide() + end debug_over = false end diff --git a/Titan/TitanUtils.lua b/Titan/TitanUtils.lua index 7f8acd3..5e7405c 100644 --- a/Titan/TitanUtils.lua +++ b/Titan/TitanUtils.lua @@ -1158,23 +1158,31 @@ end -- Control Frame check & manipulation routines -- ----Titan: Check the frame - expected to be a control / menu frame. Close if timer has expired. Used in plugin OnUpdate +---Titan: Check the timer on the frame return the status. Used in plugin OnUpdate ---@param frame table control / menu frame ---@param elapsed number portion of second since last OnUpdate +---@return string status Inactive / Active / Expired / NotVisible function TitanUtils_CheckFrameCounting(frame, elapsed) + local res = "" + -- 2026 June : Removed Hide; return the status instead. This allows the caller to control hide + -- especially if it is a tooltip, not the frame itself if (frame:IsVisible()) then if (not frame.frameTimer or not frame.isCounting) then --- frame:Hide() -- just in case; 9.2.4 removed - it hides control frames... + res = "Inactive" elseif (frame.frameTimer < 0) then - -- hide and clear - frame:Hide() frame.frameTimer = nil frame.isCounting = nil + res = "Expired" else -- count down frame.frameTimer = frame.frameTimer - elapsed + res = "Active" end + else + res = "NotVisible" end + + return res end ---Titan Set the max time the control frame could be open once cursor has left frame. Used in plugin OnLeave diff --git a/TitanAlts/TitanAlts.lua b/TitanAlts/TitanAlts.lua index 5925b99..702423e 100755 --- a/TitanAlts/TitanAlts.lua +++ b/TitanAlts/TitanAlts.lua @@ -1135,7 +1135,15 @@ local function Create_Frames() if is_over then TitanUtils_StopFrameCounting(self) else - TitanUtils_CheckFrameCounting(self, elapsed); + local status = TitanUtils_CheckFrameCounting(self, elapsed) + if status == "Active" then + -- counting down + elseif status == "Inactive" then + -- user needs time to enter + else + -- should catch all the edge cases + self:Hide() + end end end) diff --git a/TitanClock/TitanClock.lua b/TitanClock/TitanClock.lua index 8795be3..5799006 100644 --- a/TitanClock/TitanClock.lua +++ b/TitanClock/TitanClock.lua @@ -383,7 +383,8 @@ local function Slider_GetTooltip(self) local slider_tooltip = TitanOptionSlider_TooltipText(L["TITAN_CLOCK_CONTROL_TOOLTIP"], GetOffsetText(TitanGetVar(TITAN_CLOCK_ID, "OffsetHour"))); GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT"); - GameTooltip:SetText(slider_tooltip, nil, nil, nil, nil, 1); +---@diagnostic disable-next-line: param-type-mismatch + GameTooltip:SetText(slider_tooltip, nil, nil, nil, nil, true); end ---local Display slider tooltip on mouse over. @@ -465,13 +466,6 @@ and set the values in the code (Lua) TitanPanelRightClickMenu_SetCustomBackdrop(self) end ----If dropdown is visible, see if its timer has expired. If expired, hide frame. ----@param self Frame Plugin option menu frame ----@param elapsed number portion of second since last OnUpdate -local function Control_OnUpdate(self, elapsed) - TitanUtils_CheckFrameCounting(self, elapsed); -end - -- ====== Create needed frames local function Create_Frames() if _G[TITAN_BUTTON] then @@ -523,7 +517,15 @@ local function Create_Frames() TitanUtils_StartFrameCounting(self, 0.5) end) config:SetScript("OnUpdate", function(self, elapsed) - Control_OnUpdate(self, elapsed) + local status = TitanUtils_CheckFrameCounting(self, elapsed) + if status == "Active" then + -- counting down + elseif status == "Inactive" then + -- user needs time to enter + else + -- should catch all the edge cases + self:Hide() + end end) -- Config Title diff --git a/TitanGold/TitanGold.lua b/TitanGold/TitanGold.lua index 75d824b..3e1827e 100644 --- a/TitanGold/TitanGold.lua +++ b/TitanGold/TitanGold.lua @@ -8,34 +8,26 @@ --]] -- WoW method to get addon name -local addonName = ... - +local addonName = ...; TitanGold = {} -- for API routines -- ******************************** Constants ******************************* -local TITAN_GOLD_ID = "Gold"; -local TITAN_BUTTON = "TitanPanel" .. TITAN_GOLD_ID .. "Button" +local TITAN_GOLD_ID = "Gold" +local TITAN_BUTTON = "TitanPanel"..TITAN_GOLD_ID.."Button" local TITAN_GOLD_VERSION = TITAN_VERSION; -local TITAN_GOLD_SPACERBAR = "-----------------------"; -local updateTable = { TITAN_GOLD_ID, TITAN_PANEL_UPDATE_TOOLTIP }; +--local TITAN_GOLD_SPACERBAR = "-----------------------" +local updateTable = {TITAN_GOLD_ID, TITAN_PANEL_UPDATE_TOOLTIP} -- ******************************** Variables ******************************* local GOLD_INITIALIZED = false; -local GOLD_STARTINGGOLD; -local GOLD_SESSIONSTART; +local GOLD_STARTINGGOLD, GOLD_SESSIONSTART; local AceTimer = LibStub("AceTimer-3.0") local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true) -local GoldTimer = {}; -local GoldTimerRunning = false -local _G = getfenv(0); -local realmName = "" -- fill on PEW -local realmNames = {} -- fill on PEW -local merged_realms = {} -- fill on PEW - +local GoldTimer, GoldTimerRunning = {}, false; +local _G = getfenv(0) +local realmName, realmNames, merged_realms = "", {}, {} -- fill on PEW -- English faction for indexing and sorting and coloring -local TITAN_ALLIANCE = "Alliance" -local TITAN_HORDE = "Horde" - +local TITAN_ALLIANCE, TITAN_HORDE = "Alliance", "Horde" local player_faction, player_faction_locale = UnitFactionGroup("Player") local player_name = GetUnitName("Player") @@ -45,12 +37,7 @@ local FACTION_HORDE = "Horde_debug" --]] -- Topic debug tool / scheme -Titan_Debug.gold = {} -Titan_Debug.gold.events = false -Titan_Debug.gold.flow = false -Titan_Debug.gold.tool_tip = false -Titan_Debug.gold.total_gold = false -Titan_Debug.gold.eval = false +Titan_Debug.gold = {events = false, flow = false, tool_tip = false, total_gold = false, eval = false} ---@class GoldData ---@field gold number @@ -82,44 +69,21 @@ local GoldInfo = nil ---@class CharInfo ---@return integer silver part of value ---@return integer copper part of value local function NiceCash(value, show_zero, show_neg) - local sep = "" - local dec = "" - if (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma")) then - sep = "," - dec = "." - elseif (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorPeriod")) then - sep = "." - dec = "," - elseif (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorSpace")) then - sep = " " - dec = "." - end - - local outstr, gold, silver, copper = - TitanUtils_CashToString(value, sep, dec, - TitanGetVar(TITAN_GOLD_ID, "ShowGoldOnly"), - TitanGetVar(TITAN_GOLD_ID, "ShowCoinLabels"), - TitanGetVar(TITAN_GOLD_ID, "ShowCoinIcons"), - TitanGetVar(TITAN_GOLD_ID, "ShowColoredText")) - return outstr, gold, silver, copper + local sep, dec = "", "" + if(TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma"))then sep = "," dec = "." + elseif(TitanGetVar(TITAN_GOLD_ID, "UseSeperatorPeriod"))then sep = "." dec = "," + elseif(TitanGetVar(TITAN_GOLD_ID, "UseSeperatorSpace"))then sep = " " dec = "." end + local outstr, gold, silver, copper = TitanUtils_CashToString(value, sep, dec, TitanGetVar(TITAN_GOLD_ID, "ShowGoldOnly"), TitanGetVar(TITAN_GOLD_ID, "ShowCoinLabels"), TitanGetVar(TITAN_GOLD_ID, "ShowCoinIcons"), + TitanGetVar(TITAN_GOLD_ID, "ShowColoredText")) + return outstr, gold, silver, copper; end -- A bit overkill but make a class for the Warbank bank functions - -local Warband = { - bank_sum = 0, - active = false, - label = "", -} +local Warband = {bank_sum = 0, active = false, label = ""} ---local Warband Bank debug function Gold_debug(reason) - local str = "" - .. "$" .. tostring(NiceCash(GetMoney(), false, false)) - .. " WB " .. reason - .. " " .. tostring(Warband.active) - .. " " .. tostring(Warband.label) - .. " " .. tostring(NiceCash(Warband.bank_sum, false, false)) - return str + local str = "$"..tostring(NiceCash(GetMoney(), false, false)).." WB "..reason.." "..tostring(Warband.active).." "..tostring(Warband.label).." "..tostring(NiceCash(Warband.bank_sum, false, false)) + return str; end ---local Check if Warband Bank is in this version and user requested @@ -127,37 +91,31 @@ end function Warband.Use() local res = false if Warband.active then - if TitanGetVar(TITAN_GOLD_ID, "ShowWarband") then - res = true + if TitanGetVar(TITAN_GOLD_ID, "ShowWarband")then res = true; else -- Not requested by user end else -- Likely Classic version end - return res + return res; end ---local Update Warband Bank info - sum function Warband.SetSum() - if Warband.Use() then + if Warband.Use()then -- Really just prevents errors if not implemented in the WoW version - -- There *may* have been instances of failure reported as Titan errors - local sum = 0 - local call_ok = false - local ret_val = nil - - call_ok, ret_val = pcall(C_Bank.FetchDepositedMoney, Enum.BankType.Account) - + local sum = 0; + local call_ok, ret_val = pcall(C_Bank.FetchDepositedMoney, Enum.BankType.Account) if call_ok then -- Assume a valid Warband cash amount (WOWMONEY) - sum = ret_val + sum = ret_val; else -- Set to zero as a default and not an error. - sum = 0 + sum = 0; end - Warband.bank_sum = sum + Warband.bank_sum = sum; else -- Likely Classic version end @@ -166,9 +124,8 @@ end ---local Set Warband Bank info function Warband.Init() -- check for func in case either Classic implements (Added 11.0.0) - Warband.active = (C_Bank and C_Bank.CanUseBank) and true or false - if Warband.active then - Warband.label = L["TITAN_WARBAND_BANK"] + Warband.active = (C_Bank and C_Bank.CanUseBank)and true or false; + if Warband.active then Warband.label = L["TITAN_WARBAND_BANK"] else -- Likely Classic version end @@ -176,18 +133,13 @@ end ---local Return Warband Bank info ---@return number -function Warband.GetSum() - return Warband.bank_sum -end +function Warband.GetSum()return Warband.bank_sum;end ---local Return Warband Bank info ---@return string -function Warband.GetName() - return Warband.label -end +function Warband.GetName()return Warband.label;end --=== - ---Helper to safely encapsulate WoW API (returns number in form ggsscc) ---@return number local function Get_Money() @@ -197,28 +149,24 @@ local function Get_Money() -- assume it is good else -- Not accurate but safe - money = 0 + money = 0; end Warband.SetSum() -- update warbank as well - return money + return money; end local function GetConnectedRealms() local realms = GetAutoCompleteRealms() - if #realms == 0 then - realms[1] = GetRealmName() - end - return realms + if #realms == 0 then realms[1] = GetRealmName()end + return realms; end ---local Take Gold index and return parts plus various flags ---@param index string ---@return IndexInfo local function EvalIndexInfo(index) - local str = "" - str = str .. tostring(index) - - local res = { valid = false } + local str = tostring(index) + local res = {valid = false} -- The return table will be built as needed. local character, charserver, is_custom = TitanUtils_ParseName(index) local result = "" @@ -226,107 +174,59 @@ local function EvalIndexInfo(index) result, toon_info = TitanUtils_GetProfileInfo(index, "Info", false) if result == "is_custom" then -- do not fill in - res.valid = false - - str = str .. " ignored : is_custom" + res.valid = false; + str = str.." ignored: is_custom" Titan_Debug.Out('gold', 'eval', str) elseif result == "not_found" then -- do not fill in - res.valid = false - - str = str .. " ignored : no data yet" + res.valid = false; + str = str.." ignored: no data yet" elseif result == "found" then if toon_info == nil then else local toon_gold ---@class GoldData result, toon_gold = TitanUtils_GetProfileInfo(index, "Gold", false) if toon_gold == nil then - res.valid = false - - str = str .. " ignored : info but no gold data yet" + res.valid = false; + str = str.." ignored: info but no gold data yet" else - res.valid = true - - res.char_name = character -- set in Info 9.1 - res.server = charserver -- set in Info 9.1 - res.faction = toon_info.faction - + res.valid = true; + res.char_name = character; -- set in Info 9.1 + res.server = charserver; -- set in Info 9.1 + res.faction = toon_info.faction; res.ignore_faction = TitanGetVar(TITAN_GOLD_ID, "IgnoreFaction") - - if (res.faction == GoldInfo.faction) then - res.same_faction = true - else - res.same_faction = false - end - - if (res.server == GoldInfo.server) then - res.same_realm = true - else - res.same_realm = false - end - + if(res.faction == GoldInfo.faction)then res.same_faction = true;else res.same_faction = false;end + if(res.server == GoldInfo.server)then res.same_realm = true;else res.same_realm = false;end local saved_server = string.gsub(res.server, "%s", "") -- GetAutoCompleteRealms removes spaces, idk why... - if merged_realms[saved_server] then - res.merge_realm = true - else - res.merge_realm = false - end - + if merged_realms[saved_server]then res.merge_realm = true;else res.merge_realm = false;end -- Assume server option is satisfied; check other options - if (res.ignore_faction or res.same_faction) - and toon_gold.show - then - res.show_toon = true - else - res.show_toon = false - end - - res.gold = toon_gold.gold - res.show = toon_gold.show -- user option - - str = str - .. " n:" .. tostring(res.char_name) .. "" - .. " s:" .. tostring(res.server) .. "" - .. " ss:" .. tostring(res.same_realm) .. "" - .. " ms:" .. tostring(res.merge_realm) .. "" - .. " f:" .. tostring(res.faction) .. "" - .. " if:" .. tostring(res.ignore_faction) .. "" - .. " sf:" .. tostring(res.same_faction) .. "" - .. " show:" .. tostring(res.show_toon) .. "" - .. " gold:" .. tostring(res.gold) .. "" + if(res.ignore_faction or res.same_faction)and toon_gold.show then res.show_toon = true;else res.show_toon = false;end + res.gold = toon_gold.gold; + res.show = toon_gold.show; -- user option + str = str.." n:"..tostring(res.char_name).." s:"..tostring(res.server).." ss:"..tostring(res.same_realm).." ms:"..tostring(res.merge_realm).." f:"..tostring(res.faction).." if:"..tostring(res.ignore_faction) + .." sf:"..tostring(res.same_faction).." show:"..tostring(res.show_toon).." gold:"..tostring(res.gold).."" end end - else - str = str .. " ignored : no data yet" - end - + else str = str.." ignored: no data yet" end Titan_Debug.Out('gold', 'eval', str) - - return res + return res; end ---local Helper for TotalGold --- If toon is to be shown add amount to total; otherwise pass back running total local function ToonAdd(show, amount, total) - local new_total = 0 - - if show then - new_total = total + amount - else - new_total = total - end - - return new_total + local new_total = 0; + if show then new_total = total + amount; + else new_total = total;end + return new_total; end ---local Calculates total gold for display per user selections ---@return integer local function TotalGold() - -- EvalIndexInfo checks the toon info against the user options - -- then returns a table of 'flags'. + -- EvalIndexInfo checks the toon info against the user options then returns a table of 'flags'. -- The if within each loop checks the appropriate flags per user server display option. - local ttlgold = 0 - + local ttlgold = 0; if TitanGetVar(TITAN_GOLD_ID, "SeparateServers") then Titan_Debug.Out('gold', 'total_gold', "=== SeparateServers") -- Parse the database and display all characters on this server @@ -336,8 +236,8 @@ local function TotalGold() if char.same_realm and char.show_toon then ttlgold = ToonAdd(true, char.gold, ttlgold) Titan_Debug.Out('gold', 'total_gold', - index .. " > " .. NiceCash(char.gold, false, false) - .. " " .. NiceCash(ttlgold, false, false) + index.." > "..NiceCash(char.gold, false, false) + .." "..NiceCash(ttlgold, false, false) ) end else @@ -353,8 +253,8 @@ local function TotalGold() if char.merge_realm and char.show_toon then ttlgold = ToonAdd(true, char.gold, ttlgold) Titan_Debug.Out('gold', 'total_gold', - index .. " " .. NiceCash(char.gold, false, false) - .. " > " .. NiceCash(ttlgold, false, false) + index.." "..NiceCash(char.gold, false, false) + .." > "..NiceCash(ttlgold, false, false) ) end else @@ -370,8 +270,8 @@ local function TotalGold() if char.show_toon then ttlgold = ToonAdd(true, char.gold, ttlgold) Titan_Debug.Out('gold', 'total_gold', - index .. " " .. NiceCash(char.gold, false, false) - .. " > " .. NiceCash(ttlgold, false, false) + index.." "..NiceCash(char.gold, false, false) + .." > "..NiceCash(ttlgold, false, false) ) end else @@ -386,7 +286,7 @@ local function TotalGold() ttlgold = ttlgold + Warband.GetSum() end - Titan_Debug.Out('gold', 'total_gold', "Total = " .. NiceCash(ttlgold, false, false)) + Titan_Debug.Out('gold', 'total_gold', "Total = "..NiceCash(ttlgold, false, false)) return ttlgold end @@ -396,86 +296,81 @@ end local function printArray(t)for k, v in pairs(t)do print(k..": ", v)end end local function printTable(t)for k, v in pairs(t)do if type(v) == "table" then print(k..": ")printArray(v)else print(k..": ", v)end end end -local function MySort(copy, i, sort_by) - if sort_by == "NameAsc" then table.sort(copy[i], function(key1, key2)return key1.char_name < key2.char_name;end) - elseif sort_by == "GoldAsc" then table.sort(copy[i], function(key1, key2)return key1.gold < key2.gold;end) - elseif sort_by == "GoldDec" then table.sort(copy[i], function(key1, key2)return key1.gold > key2.gold;end) - else end +--- function to hard copy an array +local function deepcopy(orig) + local orig_type = type(orig) + local copy; + if orig_type == 'table' then copy = {} + for orig_key, orig_value in next, orig, nil do copy[deepcopy(orig_key)] = deepcopy(orig_value)end + setmetatable(copy, deepcopy(getmetatable(orig))) + else copy = orig;end + return copy; +end + +local function MySort(copy, sort_by) --- changing some Variables for more global using + if sort_by == "NameAsc" then table.sort(copy, function(key1, key2)return key1.char_name < key2.char_name;end) + elseif sort_by == "GoldAsc" then table.sort(copy, function(key1, key2)return key1.gold < key2.gold;end) + elseif sort_by == "GoldDec" then table.sort(copy, function(key1, key2)return key1.gold > key2.gold;end) + else end end -- ====== Tool tip routines ---Take a table of toons to sort per user settings: @param gold_table table; @return table sorted May not be need but it is explicit local function SortByIndex(gold_table) - - -- special thanks to Liefwing (Andre) for the code to show all server properly! - - --- function to hard copy an array - local function deepcopy(orig) - local orig_type = type(orig) - local copy; - if orig_type == 'table' then copy = {} - for orig_key, orig_value in next, orig, nil do copy[deepcopy(orig_key)] = deepcopy(orig_value)end - setmetatable(copy, deepcopy(getmetatable(orig))) - else copy = orig;end - return copy; - end + -- special thanks to Leifweng (Andr\E9) for the code to show all server properly! -- save array for safety local origin = deepcopy(gold_table) -- original sourcecode - local sort_by = TitanGetVar(TITAN_GOLD_ID, "SortByName") + local sort_by, by_realm = TitanGetVar(TITAN_GOLD_ID, "SortByName"), TitanGetVar(TITAN_GOLD_ID, "GroupByRealm") --- Yeah, after a feeling from 1000 of hours the function is ready for use (I hope so, because I don't have many Chars in retail). - if TitanGetVar(TITAN_GOLD_ID, "AllServers")then - local copy, sorting, test, a, p = {}, {}, {}, 0, "" --(arrays and container for internal use) - for _, subTable in pairs(gold_table)do - local value = subTable["server"] - if value ~= nil then - if not sorting[value]then - sorting[value] = true; - a = a + 1; + if by_realm then + if TitanGetVar(TITAN_GOLD_ID, "AllServers")then + local copy, sorting, test = {}, {}, {} --(arrays and container for internal use) + for _, subTable in pairs(gold_table)do + local value = subTable["server"] + if value ~= nil then + if not sorting[value]then + sorting[value] = true; + end end end - end - for value, _ in pairs(sorting)do table.insert(test, value)end - table.sort(test, function(key1, key2)return key1 < key2;end) - for i = 1, a do copy[i] = deepcopy(gold_table) - if sort_by == "NameAsc" then table.sort(copy[i], function(key1, key2)return key1.char_name < key2.char_name;end) - elseif sort_by == "GoldAsc" then table.sort(copy[i], function(key1, key2)return key1.gold < key2.gold;end) - elseif sort_by == "GoldDec" then table.sort(copy[i], function(key1, key2)return key1.gold > key2.gold;end) - else end - for k = #copy[i], 1, -1 do - if string.match(copy[i][k].server, " ")then p = string.gsub(copy[i][k].server, " ", "")else p = copy[i][k].server;end - if p ~= test[i]then table.remove(copy[i], k)end + for value, _ in pairs(sorting)do table.insert(test, value)end + table.sort(test, function(key1, key2)return key1 < key2;end) + for i = 1, #test do copy[i] = deepcopy(gold_table) + MySort(copy[i], sort_by) + for k = #copy[i], 1, -1 do + if copy[i][k].server ~= test[i]then table.remove(copy[i], k)end + end end - end - gold_table = {} - for i = 1, a do - for _, value in pairs(copy[i])do table.insert(gold_table, value)end - end - elseif TitanGetVar(TITAN_GOLD_ID, "MergeServers")then local copy, p = {}, "" - for i = 1, #realmNames do copy[i] = deepcopy(gold_table) - if sort_by == "NameAsc" then table.sort(copy[i], function(key1, key2)return key1.char_name < key2.char_name;end) - elseif sort_by == "GoldAsc" then table.sort(copy[i], function(key1, key2)return key1.gold < key2.gold;end) - elseif sort_by == "GoldDec" then table.sort(copy[i], function(key1, key2)return key1.gold > key2.gold;end) - else end - for k = #copy[i], 1, -1 do - if string.match(copy[i][k].server, " ")then p = string.gsub(copy[i][k].server, " ", "")else p = copy[i][k].server;end - if p ~= realmNames[i]then table.remove(copy[i], k)end + gold_table = {} + for i = 1, #test do + for _, value in pairs(copy[i])do table.insert(gold_table, value)end + end + elseif TitanGetVar(TITAN_GOLD_ID, "MergeServers")then + local copy, p = {}, "" + for i = 1, #realmNames do copy[i] = deepcopy(gold_table) + MySort(copy[i], sort_by) + for k = #copy[i], 1, -1 do + p = copy[i][k].server + if p ~= realmNames[i]then table.remove(copy[i], k)end + end + end + gold_table = {} + for i = 1, #realmNames do + for _, value in ipairs(copy[i])do table.insert(gold_table, value)end end end - gold_table = {} - for i = 1, #realmNames do - for _, value in ipairs(copy[i])do table.insert(gold_table, value)end - end - elseif TitanGetVar(TITAN_GOLD_ID, "SeparateServers")then - -- This section will sort the array based on user preference: * by name or by gold amount descending, * grouping by realm if selected - if sort_by == "NameAsc" then table.sort(gold_table, function(key1, key2)return key1.char_name < key2.char_name;end) - -- by gold ascending - elseif sort_by == "GoldAsc" then table.sort(gold_table, function(key1, key2)return key1.gold < key2.gold;end) - -- by gold descending - elseif sort_by == "GoldDec" then table.sort(gold_table, function(key1, key2)return key1.gold > key2.gold;end) - -- should not get here + else + if TitanGetVar(TITAN_GOLD_ID, "AllServers")or TitanGetVar(TITAN_GOLD_ID, "MergeServers")then + local copy = {} + copy = deepcopy(gold_table) + MySort(copy, sort_by) + gold_table = {} + for _, value in ipairs(copy)do table.insert(gold_table, value)end + elseif TitanGetVar(TITAN_GOLD_ID, "SeparateServers")then + MySort(gold_table, sort_by) else end - else end + end return gold_table; end @@ -523,7 +418,7 @@ local function GetTooltipText() end end local by_realm = TitanGetVar(TITAN_GOLD_ID, "GroupByRealm") - GoldSorted = SortByIndex(GoldSorted) + if #GoldSorted > 1 then GoldSorted = SortByIndex(GoldSorted)end -- sorting only neccessary, when more than one toon exists for the choosed option. -- Array holds all characters to display, nicely sorted. currentMoneyRichText = "" local coin_str = "" @@ -542,8 +437,7 @@ local function GetTooltipText() show_dash = false; show_realm = true; if(TitanGetVar(TITAN_GOLD_ID, "SeparateServers"))then show_realm = false; - elseif(TitanGetVar(TITAN_GOLD_ID, "MergeServers"))then show_dash = true; - elseif(TitanGetVar(TITAN_GOLD_ID, "AllServers"))then show_dash = true;end + elseif(TitanGetVar(TITAN_GOLD_ID, "MergeServers"))or(TitanGetVar(TITAN_GOLD_ID, "AllServers"))then show_dash = true;end if by_realm then -- Set a realm header if charserver ~= curr_realm then @@ -559,6 +453,8 @@ local function GetTooltipText() end currentMoneyRichText = currentMoneyRichText.."\n"..character..(show_dash and "-" or "")..(show_realm and charserver or "")..faction_text.."\t"..coin_str; end + --- I think, it's neccessary to warning the player for choosing an option, who doesn't existing or the choice is not logical + if #GetAutoCompleteRealms() == 0 and TitanGetVar(TITAN_GOLD_ID, "MergeServers")then currentMoneyRichText = currentMoneyRichText.."\nSorry, but you don't playing on a merged realm.\nPlease choose another option." end -- === Add Warband Bank if Warband.Use()then local cash = NiceCash(Warband.GetSum(), false, false) @@ -743,8 +639,8 @@ local function GetTooltipText() if by_realm then -- Set a realm header if charserver ~= curr_realm then - currentMoneyRichText = currentMoneyRichText .. "\n" - .. "-- " .. charserver + currentMoneyRichText = currentMoneyRichText.."\n" + .."-- "..charserver curr_realm = charserver end show_dash = false @@ -754,22 +650,22 @@ local function GetTooltipText() if ignore_faction then local font_size = TitanPanelGetVar("FontSize") local icon_pre = "|TInterface/AddOns/TitanGold/Artwork/" - local icon_post = ":" .. font_size .. ":" .. font_size .. ":2:0|t" - local a_icon = icon_pre .. "UI_AllianceIcon-round" .. icon_post - local h_icon = icon_pre .. "UI_HordeIcon-round" .. icon_post + local icon_post = ":"..font_size..":"..font_size..":2:0|t" + local a_icon = icon_pre.."UI_AllianceIcon-round"..icon_post + local h_icon = icon_pre.."UI_HordeIcon-round"..icon_post if char_faction == TITAN_ALLIANCE then - faction_text = " " .. a_icon + faction_text = " "..a_icon elseif char_faction == TITAN_HORDE then - faction_text = " " .. h_icon + faction_text = " "..h_icon end end - currentMoneyRichText = currentMoneyRichText .. "\n" - .. character - .. (show_dash and "-" or "") - .. (show_realm and charserver or "") - .. faction_text - .. "\t" .. coin_str + currentMoneyRichText = currentMoneyRichText.."\n" + ..character + ..(show_dash and "-" or "") + ..(show_realm and charserver or "") + ..faction_text + .."\t"..coin_str end -- @@ -777,12 +673,12 @@ local function GetTooltipText() -- if Warband.Use() then local cash = NiceCash(Warband.GetSum(), false, false) - local war_name = "" .. Warband.GetName() -- localized - currentMoneyRichText = currentMoneyRichText .. "\n" - .. "------ \t +" .. "\n" - .. war_name - .. "\t" .. cash - local msg = "" .. war_name .. " " .. cash + local war_name = ""..Warband.GetName() -- localized + currentMoneyRichText = currentMoneyRichText.."\n" + .."------ \t +".."\n" + ..war_name + .."\t"..cash + local msg = ""..war_name.." "..cash Titan_Debug.Out('gold', 'tool_tip', msg) end @@ -807,9 +703,9 @@ print("TG" coin_str = "" -- Display total gold coin_str = NiceCash(TotalGold(), false, false) - currentMoneyRichText = currentMoneyRichText .. "\n" - .. TITAN_GOLD_SPACERBAR .. "\n" - .. L["TITAN_GOLD_TTL_GOLD"] .. "\t" .. coin_str + currentMoneyRichText = currentMoneyRichText.."\n" + ..TITAN_GOLD_SPACERBAR.."\n" + ..L["TITAN_GOLD_TTL_GOLD"].."\t"..coin_str -- find session earnings and earning per hour local sesstotal = Get_Money() - GOLD_STARTINGGOLD; @@ -828,8 +724,8 @@ print("TG" local per_hour_status; local sessionMoneyRichText = "" if TitanGetVar(TITAN_GOLD_ID, "ShowSessionInfo") then - sessionMoneyRichText = "\n\n" .. TitanUtils_GetHighlightText(L["TITAN_GOLD_STATS_TITLE"]) - .. "\n" .. L["TITAN_GOLD_START_GOLD"] .. "\t" .. coin_str .. "\n" + sessionMoneyRichText = "\n\n"..TitanUtils_GetHighlightText(L["TITAN_GOLD_STATS_TITLE"]) + .."\n"..L["TITAN_GOLD_START_GOLD"].."\t"..coin_str.."\n" if (negative) then session_status = TitanUtils_GetRedText(L["TITAN_GOLD_SESS_LOST"]) @@ -841,14 +737,14 @@ print("TG" coin_str = NiceCash(sesstotal, true, true) sessionMoneyRichText = sessionMoneyRichText - .. session_status - .. "\t" .. coin_str .. "\n"; + ..session_status + .."\t"..coin_str.."\n"; if TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour") then coin_str = NiceCash(perhour, true, true) sessionMoneyRichText = sessionMoneyRichText - .. per_hour_status - .. "\t" .. coin_str .. "\n"; + ..per_hour_status + .."\t"..coin_str.."\n"; end else -- Do not display session info @@ -857,7 +753,7 @@ print("TG" -- -- === Add Gold notes and info -- - local final_tooltip = TitanUtils_GetGoldText(L["TITAN_GOLD_TOOLTIPTEXT"] .. " : ") + local final_tooltip = TitanUtils_GetGoldText(L["TITAN_GOLD_TOOLTIPTEXT"].." : ") local final_server = "" if realmNames == nil or TitanGetVar(TITAN_GOLD_ID, "SeparateServers") then @@ -867,7 +763,7 @@ print("TG" elseif TitanGetVar(TITAN_GOLD_ID, "AllServers") then final_server = ALL end - final_server = TitanUtils_GetGoldText(final_server .. " : ") + final_server = TitanUtils_GetGoldText(final_server.." : ") local final_faction = "" if ignore_faction then @@ -879,10 +775,10 @@ print("TG" end return "" - .. currentMoneyRichText .. "\n" - .. TITAN_GOLD_SPACERBAR .. "\n" - .. final_tooltip .. final_server .. final_faction .. "\n" - .. sessionMoneyRichText + ..currentMoneyRichText.."\n" + ..TITAN_GOLD_SPACERBAR.."\n" + ..final_tooltip..final_server..final_faction.."\n" + ..sessionMoneyRichText end -- ====== --]===] @@ -952,9 +848,9 @@ local function Initialize_Array(action) GOLD_INITIALIZED = true; info = "" - .. " " .. tostring(GOLD_SESSIONSTART) .. "" - .. " " .. tostring(GOLD_STARTINGGOLD) .. "" - .. " " .. tostring(Warband.GetSum()) .. "" + .." "..tostring(GOLD_SESSIONSTART).."" + .." "..tostring(GOLD_STARTINGGOLD).."" + .." "..tostring(Warband.GetSum()).."" end -- 2026 Mar : Repurposed to add sort gold decsending @@ -969,8 +865,8 @@ local function Initialize_Array(action) end local msg = ">Init done : " - .. " " .. tostring(GOLD_INITIALIZED) .. "" - .. " " .. info .. "" + .." "..tostring(GOLD_INITIALIZED).."" + .." "..info.."" Titan_Debug.Out('gold', 'flow', msg) end ---local Clear the gold array and rebuild @@ -988,8 +884,8 @@ end ---local Pops an 'are you sure' when user clicks to reset the gold array local function TitanGold_ClearDB() StaticPopupDialogs["TITANGOLD_CLEAR_DATABASE"] = { - text = TitanUtils_GetNormalText(L["TITAN_PANEL_MENU_TITLE"] .. " " - .. L["TITAN_GOLD_MENU_TEXT"]) .. "\n\n" .. L["TITAN_GOLD_CLEAR_DATA_WARNING"], + text = TitanUtils_GetNormalText(L["TITAN_PANEL_MENU_TITLE"].." " + ..L["TITAN_GOLD_MENU_TEXT"]).."\n\n"..L["TITAN_GOLD_CLEAR_DATA_WARNING"], button1 = ACCEPT, button2 = CANCEL, OnAccept = function(self) @@ -1053,7 +949,7 @@ local function ShowMenuButtons(faction, level) end TitanPanelButton_UpdateButton(TITAN_GOLD_ID); end, - { c_name = toon } + {c_name = toon} ) end end @@ -1065,10 +961,10 @@ local function GeneratorFunction(owner, rootDescription) local opts_sort = Titan_Menu.AddButton(root, L["TITAN_GOLD_SORT_BY"]) do -- next level options -- NameAsc | GoldAsc | GoldDec [Ascend, Descend] - local disp = { -- selectors using the same option - label, value - { "Sort by Name", "NameAsc" }, - { "Sort by Gold Ascending", "GoldAsc" }, - { "Sort by Gold Descending", "GoldDec" }, + local disp = {-- selectors using the same option - label, value + {"Sort by Name", "NameAsc"}, + {"Sort by Gold Ascending", "GoldAsc"}, + {"Sort by Gold Descending", "GoldDec"}, } Titan_Menu.AddSelectorList(opts_sort, id, nil, "SortByName", disp) @@ -1079,25 +975,25 @@ local function GeneratorFunction(owner, rootDescription) local opts_gold = Titan_Menu.AddButton(root, L["TITAN_GOLD_TOOLTIP_DISPLAY_OPTIONS"]) do -- next level options - local list = { -- a mututally exclusive triple - { L["TITAN_GOLD_SEPARATE"], "SeparateServers" }, - { L["TITAN_GOLD_MERGE"], "MergeServers" }, - { L["TITAN_GOLD_ALL"], "AllServers" }, + local list = {-- a mututally exclusive triple + {L["TITAN_GOLD_SEPARATE"], "SeparateServers"}, + {L["TITAN_GOLD_MERGE"], "MergeServers"}, + {L["TITAN_GOLD_ALL"], "AllServers"}, } Titan_Menu.AddSelectorExclusiveList(opts_gold, id, L["TITAN_GOLD_SORT_BY"], list) Titan_Menu.AddSelector(opts_gold, id, L["TITAN_GOLD_IGNORE_FACTION"], "IgnoreFaction") - local coins = { -- a mututally exclusive triple - { L["TITAN_GOLD_COIN_NONE"], "ShowCoinNone" }, - { L["TITAN_GOLD_COIN_LABELS"], "ShowCoinLabels" }, - { L["TITAN_GOLD_COIN_ICONS"], "ShowCoinIcons" }, + local coins = {-- a mututally exclusive triple + {L["TITAN_GOLD_COIN_NONE"], "ShowCoinNone"}, + {L["TITAN_GOLD_COIN_LABELS"], "ShowCoinLabels"}, + {L["TITAN_GOLD_COIN_ICONS"], "ShowCoinIcons"}, } Titan_Menu.AddSelectorExclusiveList(opts_gold, id, "Coin Labels", coins) - local seps = { -- a mututally exclusive triple - { L["TITAN_PANEL_USE_COMMA"], "UseSeperatorComma" }, - { L["TITAN_PANEL_USE_PERIOD"], "UseSeperatorPeriod" }, - { "Use Space", "UseSeperatorSpace" }, + local seps = {-- a mututally exclusive triple + {L["TITAN_PANEL_USE_COMMA"], "UseSeperatorComma"}, + {L["TITAN_PANEL_USE_PERIOD"], "UseSeperatorPeriod"}, + {"Use Space", "UseSeperatorSpace"}, } Titan_Menu.AddSelectorExclusiveList(opts_gold, id, "Seperator", seps) @@ -1112,9 +1008,9 @@ local function GeneratorFunction(owner, rootDescription) Titan_Menu.AddSelector(root, id, L["TITAN_GOLD_ONLY"], "ShowGoldOnly") - local disp = { -- selectors using the same option - { L["TITAN_GOLD_TOGGLE_ALL_TEXT"], true }, - { L["TITAN_GOLD_TOGGLE_PLAYER_TEXT"], false }, + local disp = {-- selectors using the same option + {L["TITAN_GOLD_TOGGLE_ALL_TEXT"], true}, + {L["TITAN_GOLD_TOGGLE_PLAYER_TEXT"], false}, } Titan_Menu.AddSelectorList(root, id, nil, "ViewAll", disp) @@ -1158,17 +1054,17 @@ local function FindGold() ret_str = NiceCash(ttlgold, true, false) - return L["TITAN_GOLD_MENU_TEXT"] .. ": " .. FONT_COLOR_CODE_CLOSE, ret_str + return L["TITAN_GOLD_MENU_TEXT"]..": "..FONT_COLOR_CODE_CLOSE, ret_str end ---local Build the plugin .registry and init and register for events ---@param self Button local function OnLoad(self) local notes = "" - .. "Keeps track of all gold held by a player's toons.\n" - .. "- Can show by server / merged servers / all servers.\n" - .. "- Can show by faction.\n" - .. "Shift + Left click will print list of connected servers to chat.\n" + .."Keeps track of all gold held by a player's toons.\n" + .."- Can show by server / merged servers / all servers.\n" + .."- Can show by faction.\n" + .."Shift + Left click will print list of connected servers to chat.\n" self.registry = { id = TITAN_GOLD_ID, category = "Built-ins", @@ -1210,7 +1106,7 @@ local function OnLoad(self) AllServers = false, IgnoreFaction = false, GroupByRealm = false, - gold = { total = "112233", neg = false }, + gold = {total = "112233", neg = false}, ShowSessionInfo = true, ShowWarband = true, } @@ -1238,7 +1134,7 @@ local function OnShow(self) end local msg = "" - .. " " .. Gold_debug("OnShow") + .." "..Gold_debug("OnShow") Titan_Debug.Out('gold', 'flow', msg) end @@ -1253,7 +1149,7 @@ end ---local Handle registered events for this plugin ---@param self Button ---@param event string ----@param ... any +---@param ...any local function OnEvent(self, event, a1, ...) if (event == "PLAYER_MONEY") then if (GOLD_INITIALIZED) then @@ -1268,14 +1164,12 @@ local function OnEvent(self, event, a1, ...) for index, realm in pairs(realmNames) do merged_realms[realm] = true end - self:UnregisterEvent("ADDON_LOADED"); else -- Not this addon - return -- no debug, if enabled + return; -- no debug, if enabled end end - Titan_Debug.Out('gold', 'events', event) end @@ -1283,18 +1177,13 @@ end ---@param self Button ---@param button string local function OnClick(self, button) - if button == "LeftButton" and IsShiftKeyDown() then + if button == "LeftButton" and IsShiftKeyDown()then local realms = GetConnectedRealms() - local this_realm = " * " local mark = "" - TitanPrint("Connected Realms:", "plain") + TitanPrint(L["TITAN_LOCATION_CONNECTED_REALMS"], "plain") for idx = 1, #realms do - if realms[idx] == realmName then - mark = this_realm - else - mark = "" - end - TitanPrint("- " .. tostring(realms[idx]) .. mark, "plain") + if realms[idx] == string.gsub(realmName, "%s", "")then mark = " * " else mark = "" end + TitanPrint("- "..tostring(realms[idx])..mark, "plain") end end end @@ -1304,68 +1193,39 @@ end ---@param add_label boolean ---@return string function TitanGold.GetInfo(player, add_label) - local res = "" - local label = "" - if add_label then - label = L["TITAN_GOLD_MENU_TEXT"] .. " : " - else - label = "" - end - + local res, label = "", "" + if add_label then label = L["TITAN_GOLD_MENU_TEXT"]..": " else label = "" end local result = "" local toon_gold ---@class GoldData result, toon_gold = TitanUtils_GetProfileInfo(player, "Gold", false) local character, charserver, is_custom = TitanUtils_ParseName(player) - if result == "is_custom" then - res = L["TITAN_PANEL_NA"] .. " - Custom profile." - elseif _G[TITAN_BUTTON]:IsShown() then + if result == "is_custom" then res = L["TITAN_PANEL_NA"].." - Custom profile." + elseif _G[TITAN_BUTTON]:IsShown()then if result == "found" then - if toon_gold == nil then - res = L["TITAN_PANEL_NA"] .. " - Data empty!?." - else - res = NiceCash(toon_gold.gold, true, false) - end - else - res = L["TITAN_PANEL_NA"] .. " - Not logged in yet with Gold enabled." - end - else - res = L["TITAN_PANEL_MENU_DISABLED"] - end - - return label .. res + if toon_gold == nil then res = L["TITAN_PANEL_NA"].." - Data empty!?." + else res = NiceCash(toon_gold.gold, true, false)end + else res = L["TITAN_PANEL_NA"].." - Not logged in yet with Gold enabled." end + else res = L["TITAN_PANEL_MENU_DISABLED"]end + return label..res; end ---local Create required Gold frames local function Create_Frames() - if _G[TITAN_BUTTON] then - return -- if already created + if _G[TITAN_BUTTON]then return; -- if already created end - -- general container frame local f = CreateFrame("Frame", nil, UIParent) -- f:Hide() - -- Titan plugin button local window = CreateFrame("Button", TITAN_BUTTON, f, "TitanPanelComboTemplate") window:SetFrameStrata("FULLSCREEN") -- Using SetScript("OnLoad", does not work - OnLoad(window); + OnLoad(window) -- TitanPanelButton_OnLoad(window); -- Titan XML template calls this... - - window:SetScript("OnShow", function(self) - OnShow(self); - TitanPanelButton_OnShow(self); - end) - window:SetScript("OnHide", function(self) - OnHide(self); - end) - window:SetScript("OnEvent", function(self, event, ...) - OnEvent(self, event, ...) - end) - window:SetScript("OnClick", function(self, button) - OnClick(self, button); - TitanPanelButton_OnClick(self, button); - end) + window:SetScript("OnShow", function(self)OnShow(self)TitanPanelButton_OnShow(self)end) + window:SetScript("OnHide", function(self)OnHide(self)end) + window:SetScript("OnEvent", function(self, event, ...)OnEvent(self, event, ...)end) + window:SetScript("OnClick", function(self, button)OnClick(self, button)TitanPanelButton_OnClick(self, button)end) end -Create_Frames() -- do the work +Create_Frames() -- do the work \ No newline at end of file diff --git a/TitanVolume/TitanVolume.lua b/TitanVolume/TitanVolume.lua index 4f9d0ca..6e14d83 100644 --- a/TitanVolume/TitanVolume.lua +++ b/TitanVolume/TitanVolume.lua @@ -408,7 +408,15 @@ local function Create_Frames() TitanUtils_StartFrameCounting(self, 0.5) end) config:SetScript("OnUpdate", function(self, elapsed) - TitanUtils_CheckFrameCounting(self, elapsed) + local status = TitanUtils_CheckFrameCounting(self, elapsed) + if status == "Active" then + -- counting down + elseif status == "Inactive" then + -- user needs time to enter + else + -- should catch all the edge cases + self:Hide() + end end) local mute_button = CreateFrame("CheckButton", mname, config, "UICheckButtonTemplate") -- 1.7.9.5