From 98660fd44bf1e9910640f56f3b08e038d6974064 Mon Sep 17 00:00:00 2001 From: urnati Date: Mon, 22 Jul 2024 15:58:39 -0400 Subject: [PATCH] Gold, Repair, XP : Gold : Fix gold display when user selects . (period) as thousands separator. - Added TitanUtils_NumToString for use in all 3. - Added TitanUtils_CashToString for use in Gold and Repair for common look of gold/silver/copper. --- Titan/TitanGlobal.lua | 3 + Titan/TitanHistory.lua | 9 ++ Titan/TitanUtils.lua | 199 +++++++++++++++++++++++++++++++++++++++++++ TitanGold/TitanGold.lua | 59 ++++++------- TitanRegen/TitanRegen.lua | 79 +++++++---------- TitanRepair/TitanRepair.lua | 35 +++++--- TitanXP/TitanXP.lua | 23 ++--- 7 files changed, 304 insertions(+), 103 deletions(-) diff --git a/Titan/TitanGlobal.lua b/Titan/TitanGlobal.lua index c91023d..2588389 100644 --- a/Titan/TitanGlobal.lua +++ b/Titan/TitanGlobal.lua @@ -166,6 +166,9 @@ Titan_Global.literals = { Titan_Global.colors = { alliance = "00adf0", -- PLAYER_FACTION_COLOR_ALLIANCE blue = "0000ff", -- PURE_BLUE_COLOR + coin_gold = "ffd100", + coin_silver = "e6e6e6", + coin_copper = "c8602c", gold = "f2e699", -- GOLD_FONT_COLOR gray = "808080", -- GRAY_FONT_COLOR green = "19ff19", -- GREEN_FONT_COLOR diff --git a/Titan/TitanHistory.lua b/Titan/TitanHistory.lua index e1ad67c..54b8ac3 100644 --- a/Titan/TitanHistory.lua +++ b/Titan/TitanHistory.lua @@ -15,6 +15,15 @@ Green - 'header' - Titan or plugin Highlight - notes. tips. and details --]] Titan_Global.recent_changes = "" +.. TitanUtils_GetGoldText("8.0.16 : 2024/07/22\n") +.. TitanUtils_GetGreenText("Gold, Repair, XP : \n") +.. TitanUtils_GetHighlightText("" +.. "- Gold : Fix gold display when user selects . (period) as thousands separator.\n" +.. "- Added TitanUtils_NumToString for use in all 3.\n" +.. "- Added TitanUtils_CashToString for use in Gold and Repair for common look of gold/silver/copper.\n" +) +.. "\n\n" +Titan_Global.recent_changes = "" .. TitanUtils_GetGoldText("8.0.15 : 2024/07/14\n") .. TitanUtils_GetGreenText("Location : \n") .. TitanUtils_GetHighlightText("" diff --git a/Titan/TitanUtils.lua b/Titan/TitanUtils.lua index b245ea1..409fe64 100644 --- a/Titan/TitanUtils.lua +++ b/Titan/TitanUtils.lua @@ -847,6 +847,205 @@ function TitanUtils_ToString(text) return TitanUtils_Ternary(text, text, ""); end +---API Add separators into the value given. This does not break coin into its parts. +--- This routines handles negative and fractional numbers. +--- Assumes amount decimal separator is a period per tostring(). +---@param amount number +---@param thousands_separator string +---@param decimal_separator string +---@return string formatted +function TitanUtils_NumToString(amount, thousands_separator, decimal_separator) + -- Jul 2024 Moved to Utils for use by plugins + --[=[ Jul 2024 + Handle the general cases of converting any number to a string with separators for plugins. + Titan usage is , / . or . / , although this will handle other schemes. + NOTE: Currently only positive, whole numbers are passed in from Titan (no fractional or negative). + NOTE: If ampount is 100 trillion or more then return the string as is to avoid very messy strings. + This is the behavior of Lua tostring. + NOTE: Do not use separator directly in gsub - it could be a pattern special char, resulting in unexpected behavior! + --]=] + + local formatted = "" + + if type(amount) == "number" then + -- Break number into segments - minus, integer, and fractional + local i, j, minus, int, fraction = 0, 0, "", "", "" + if amount > 99999999999999 then -- 1 trillion - 1 + int = tostring(amount) + -- leave as is and, if gold, congratulate the player!!! + -- Result will be have an exponent (1.23+e16) + else + i, j, minus, int, fraction = tostring(amount):find('([-]?)(%d+)([.]?%d*)') + + -- Reverse the int-string and append a separator to all blocks of 3 digits + int = int:reverse():gsub("(%d%d%d)", "%1|") + + -- Reverse the int-string back and remove an extraneous separator + int = int:reverse():gsub("^|", "") + + -- Now use the given decimal separator. + -- tostring outputs a period as the separator so it needs to be escaped. + int = int:gsub("%.", decimal_separator) + + -- Now use the given thousands separator + int = int:gsub("|", thousands_separator) + + -- Add optional minus part back + formatted = minus .. int .. fraction + end + else + formatted = "0" -- 'silent' error + end + return formatted +end + +---API Take the total cash and make it into a nice, colorful string of g s c (gold silver copper) +---@param value number +---@param thousands_separator string +---@param decimal_separator string +---@param only_gold boolean +---@param show_labels boolean +---@param show_icons boolean +---@param add_color boolean +---@return string outstr Formatted cash for output +---@return integer gold part of value +---@return integer silver part of value +---@return integer copper part of value +function TitanUtils_CashToString(value, thousands_separator, decimal_separator, + only_gold, show_labels, show_icons, + add_color) + local show_zero = true + local show_neg = true + + local neg1 = "" + local neg2 = "" + local agold = 10000; + local asilver = 100; + local outstr = ""; + local gold = 0; + local gold_str = "" + local gc = "" + local silver = 0; + local silver_str = "" + local sc = "" + local copper = 0; + local copper_str = "" + local cc = "" + local amount = (value or 0) + local font_size = TitanPanelGetVar("FontSize") + local icon_pre = "|TInterface\\MoneyFrame\\" + local icon_post = ":" .. font_size .. ":" .. font_size .. ":2:0|t" + local g_icon = icon_pre .. "UI-GoldIcon" .. icon_post + local s_icon = icon_pre .. "UI-SilverIcon" .. icon_post + local c_icon = icon_pre .. "UI-CopperIcon" .. icon_post + -- build the coin label strings based on the user selections + local c_lab = (show_labels and L["TITAN_GOLD_COPPER"]) or (show_icons and c_icon) or "" + local s_lab = (show_labels and L["TITAN_GOLD_SILVER"]) or (show_icons and s_icon) or "" + local g_lab = (show_labels and L["TITAN_GOLD_GOLD"]) or (show_icons and g_icon) or "" + + -- show the money in highlight or coin color based on user selection + if add_color then + gc = Titan_Global.colors.coin_gold + sc = Titan_Global.colors.coin_silver + cc = Titan_Global.colors.coin_copper + else + gc = Titan_Global.colors.white + sc = Titan_Global.colors.white + cc = Titan_Global.colors.white + end + + if show_neg then + if amount < 0 then + neg1 = TitanUtils_GetHexText("(", Titan_Global.colors.orange) -- "|cFFFF6600" .. "(" .. FONT_COLOR_CODE_CLOSE + neg2 = TitanUtils_GetHexText(")", Titan_Global.colors.orange) --"|cFFFF6600" .. ")" .. FONT_COLOR_CODE_CLOSE + else + -- no padding + end + end + if amount < 0 then + amount = amount * -1 + end + + -- amount INCLUDES silver and copper (last 4 digits) + if amount == 0 then + if show_zero then + copper_str = TitanUtils_GetHexText("0".. c_lab, cc) --cc .. (amount or "?") .. c_lab .. "" .. FONT_COLOR_CODE_CLOSE + end + elseif amount > 999999999999999999 then -- 999,999,999,999,999,999 (1 quadrillion - 1) + -- we are really in trouble :) + -- gold should be accurate but in exponent format + gold = (math.floor(amount / agold) or 0) + gold_str = TitanUtils_GetHexText(tostring(gold)..g_lab .. " ", gc) + -- silver and copper will be off + silver_str = "" + copper_str = "" + elseif amount > 99999999999999999 then -- 99,999,999,999,999,999 (100 trillion - 1) + -- we are in some trouble :) + -- gold should be accurate so format + gold = (math.floor(amount / agold) or 0) + local gnum = TitanUtils_NumToString(gold, thousands_separator, decimal_separator) + gold_str = TitanUtils_GetHexText(gnum..g_lab .. " ", gc) + -- silver and copper will be off + silver_str = "" + copper_str = "" + + elseif amount > 0 then + -- figure out the gold - silver - copper components for return and string + gold = (math.floor(amount / agold) or 0) + amount = amount - (gold * agold) -- now only silver + copper + silver = (math.floor(amount / asilver) or 0) + copper = amount - (silver * asilver) + + -- now make the coin strings + if gold > 0 then + local gnum = TitanUtils_NumToString(gold, thousands_separator, decimal_separator) + gold_str = TitanUtils_GetHexText(gnum..g_lab .. " ", gc) --gc .. (gnum) .. g_lab .. " " .. FONT_COLOR_CODE_CLOSE + else + gold_str = "" + end + if (silver > 0) then + local snum = (string.format("%02d", silver) or "?") + silver_str = TitanUtils_GetHexText(snum..s_lab .. " ", sc) --sc .. (silver or "?") .. s_lab .. " " .. FONT_COLOR_CODE_CLOSE + else + silver_str = "" + end + if (copper > 0) then + local cnum = (string.format("%02d", copper) or "?") + copper_str = TitanUtils_GetHexText(cnum..c_lab, cc) --cc .. (copper or "?") .. c_lab .. "" .. FONT_COLOR_CODE_CLOSE + else + copper_str = "" + end + end + + if only_gold then + silver_str = "" + copper_str = "" + -- special case for those who want only gold when amount is less than 1 gold + if gold == 0 then + if show_zero then + gold_str = TitanUtils_GetHexText("0"..g_lab, gc) --gc .. "0" .. g_lab .. " " .. FONT_COLOR_CODE_CLOSE + end + end + end + + -- build the return string + outstr = outstr + .. neg1 + .. gold_str + .. silver_str + .. copper_str + .. neg2 + --[[ +print("_CashToString:" +..(gold or "?").."g " +..(silver or "?").."s " +..(copper or "?").."c " +..(outstr or "?") +); +--]] + return outstr, gold, silver, copper +end + --====== Right click menu routines - Retail dropdown menu ---local Add menu button at the given level. diff --git a/TitanGold/TitanGold.lua b/TitanGold/TitanGold.lua index 053dac6..8132cc5 100644 --- a/TitanGold/TitanGold.lua +++ b/TitanGold/TitanGold.lua @@ -59,37 +59,17 @@ end ---@param amount number ---@return string local function comma_value(amount) ---[===[ - local formatted = tostring(amount) - local k - local sep = (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma") and "UseComma" or "UsePeriod") - while true do - if sep == "UseComma" then formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') end - if sep == "UsePeriod" then formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1.%2') end - if (k == 0) then - break - end - end - return formatted ---]===] - -- Jul 2024 Use same code as XP - local formatted = "" - - if type(amount) == "number" then - local sep = (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma") and "," or ".") - local i, j, minus, int, fraction = tostring(amount):find('([-]?)(%d+)([.]?%d*)') - - -- reverse the int-string and append a comma to all blocks of 3 digits - int = int:reverse():gsub("(%d%d%d)", "%1"..sep) - - -- reverse the int-string back remove an optional comma and put the - -- optional minus and fractional part back - formatted = minus .. int:reverse():gsub("^"..sep, "") .. fraction + local sep = "" + local dec = "" + if (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma")) then + sep = "," + dec = "." else - formatted = "0" -- 'silent' error + sep = "." + dec = "," end - return formatted + return TitanUtils_NumToString(amount, sep, dec) end ---local Take the total cash and make it into a nice, colorful string of g s c (gold silver copper) @@ -97,11 +77,11 @@ end ---@param show_zero boolean ---@param show_neg boolean ---@return string outstr Formatted cash for output ----@return number cash Value as passed in ---@return integer gold part of value ---@return integer silver part of value ---@return integer copper part of value local function NiceCash(value, show_zero, show_neg) + --[[ local neg1 = "" local neg2 = "" local agold = 10000; @@ -195,15 +175,30 @@ local function NiceCash(value, show_zero, show_neg) .. silver_str .. copper_str .. neg2 - --[[ -SC.Print("Acc cash:" +print("Acc cash:" ..(gold or "?").."g " ..(silver or "?").."s " ..(copper or "?").."c " ..(outstr or "?") ); --]] - return outstr, cash, gold, silver, copper + local sep = "" + local dec = "" + if (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma")) then + sep = "," + dec = "." + else + 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 ---local Create Show menu - list of characters in same faction diff --git a/TitanRegen/TitanRegen.lua b/TitanRegen/TitanRegen.lua index 848cd9c..f5dcb85 100644 --- a/TitanRegen/TitanRegen.lua +++ b/TitanRegen/TitanRegen.lua @@ -29,30 +29,28 @@ local TITAN_RegenMPCombatTrack = 0; local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true) -- ******************************** Functions ******************************* ---[[ --- ************************************************************************** --- NAME : TitanRegenTemp_GetColoredTextRGB(text, r, g, b) --- DESC : Define colors for colored text and display --- VARS : text = text to display, r = red value, g = green value, b = blue value --- ************************************************************************** ---]] -local function TitanRegenTemp_GetColoredTextRGB(text, r, g, b) +---Color a text tring based on the RBG passed +---@param text string To color +---@param r number Red (0.0 - 1.0) +---@param g any Green (0.0 - 1.0) +---@param b any Blue (0.0 - 1.0) +---@return string Color_string +local function SetTextColorRBG(text, r, g, b) + local str = "" if (text and r and g and b) then local redColorCode = format("%02x", r * 255); local greenColorCode = format("%02x", g * 255); local blueColorCode = format("%02x", b * 255); - local colorCode = "|cff"..redColorCode..greenColorCode..blueColorCode; - return colorCode..text..FONT_COLOR_CODE_CLOSE; + local colorCode = "|cff"..redColorCode..greenColorCode..blueColorCode.."|r" + str = colorCode..text..FONT_COLOR_CODE_CLOSE end + + return str end ---[[ --- ************************************************************************** --- NAME : TitanPanelRegenButton_OnLoad() --- DESC : Registers the plugin upon it loading --- ************************************************************************** ---]] -function TitanPanelRegenButton_OnLoad(self) +---local Build the plugin .registry and register events +---@param self Button plugin frame +function OnLoad(self) local notes = "" .."Adds a regen monitor to Titan Panel to show HP/MANA regen - Classic versions only.\n" self.registry = { @@ -60,7 +58,7 @@ function TitanPanelRegenButton_OnLoad(self) category = "Built-ins", version = TITAN_VERSION, menuText = L["TITAN_REGEN_MENU_TEXT"], - buttonTextFunction = "TitanPanelRegenButton_GetButtonText", + buttonTextFunction = "GetButtonText", tooltipTitle = L["TITAN_REGEN_MENU_TOOLTIP_TITLE"], tooltipTextFunction = "TitanPanelRegenButton_GetTooltipText", icon = "Interface\\AddOns\\TitanRegen\\TitanRegen", @@ -84,12 +82,10 @@ function TitanPanelRegenButton_OnLoad(self) } end ---[[ --- ************************************************************************** --- NAME : TitanPanelXPButton_OnEvent --- DESC : Parse events registered to addon and act on them --- ************************************************************************** ---]] +---local Handle events the clock plugin is interested in. +---@param self Button plugin frame +---@param event string Event +---@param ... any Event parameters function TitanPanelRegenButton_OnEvent(self, event, a1, a2, ...) if ( event == "PLAYER_ENTERING_WORLD") then end @@ -153,19 +149,17 @@ function TitanPanelRegenButton_OnEvent(self, event, a1, a2, ...) end end ---[[ --- ************************************************************************** --- NAME : TitanPanelRegenButton_GetButtonText(id) --- DESC : Calculate regeneration logic for button text --- VARS : id = button ID --- ************************************************************************** ---]] -function TitanPanelRegenButton_GetButtonText(id) +---Generate button text +---@param id string +---@return string label_hit_points +---@return string text_hit_points +---@return string label_mana +---@return string text_mana +function GetButtonText(id) local labelTextHP = ""; local valueTextHP = ""; local labelTextMP = ""; local valueTextMP = ""; - local OutputStr = ""; if UnitHealth("player") == UnitHealthMax("player") then TITAN_RegenHP = 0; @@ -202,7 +196,7 @@ function TitanPanelRegenButton_GetButtonText(id) valueTextMP = format(TITAN_REGEN_MP_FORMAT, TITAN_RegenMP); end if (TitanGetVar(TITAN_REGEN_ID, "ShowColoredText")) then - valueTextMP = TitanRegenTemp_GetColoredTextRGB(valueTextMP, 0.0, 0.0, 1.0); + valueTextMP = SetTextColorRBG(valueTextMP, 0.0, 0.0, 1.0); else valueTextMP = TitanUtils_GetHighlightText(valueTextMP); end @@ -222,12 +216,8 @@ print("Regen text" return labelTextHP, valueTextHP, labelTextMP, valueTextMP; end ---[[ --- ************************************************************************** --- NAME : TitanPanelRegenButton_GetTooltipText() --- DESC : Display tooltip text --- ************************************************************************** ---]] +---Generate tooltip text +---@return string Tool_tip Formatted text function TitanPanelRegenButton_GetTooltipText() local minHP = TITAN_RegenMinHPRate; local minMP = TITAN_RegenMinMPRate; @@ -264,12 +254,7 @@ function TitanPanelRegenButton_GetTooltipText() return txt end ---[[ --- ************************************************************************** --- NAME : TitanPanelRightClickMenu_PrepareTitanRegenMenu() --- DESC : Display rightclick menu options --- ************************************************************************** ---]] +---Generate right click menu options function TitanPanelRightClickMenu_PrepareRegenMenu() local id = TITAN_REGEN_ID; local info; @@ -325,7 +310,7 @@ local function Create_Frames() local window = CreateFrame("Button", TITAN_BUTTON, f, "TitanPanelComboTemplate") window:SetFrameStrata("FULLSCREEN") -- Using SetScript("OnLoad", does not work - TitanPanelRegenButton_OnLoad(window); + OnLoad(window); -- TitanPanelButton_OnLoad(window); -- Titan XML template calls this... window:SetScript("OnShow", function(self) diff --git a/TitanRepair/TitanRepair.lua b/TitanRepair/TitanRepair.lua index 3a25137..bb69d62 100644 --- a/TitanRepair/TitanRepair.lua +++ b/TitanRepair/TitanRepair.lua @@ -564,20 +564,11 @@ local function GetGSC(money) return g, s, c, neg; end ---[[ local --- ************************************************************************** --- NAME : GetGSC(money) --- DESC : Scan all bags and equipment and set the 'scan in progress' --- VARS : --- money : int : money in copper --- OUT : --- gsc : string : formatted and colored of given money --- ************************************************************************** ---]] ---local Get a formated string from the given money (in copper) ---@param money number Money in copper ---@return string readable_money local function GetTextGSC(money) +--[===[ local GSC_GOLD = "ffd100"; local GSC_SILVER = "e6e6e6"; local GSC_COPPER = "c8602c"; @@ -611,6 +602,30 @@ local function GetTextGSC(money) end if (neg) then gsc = "(" .. gsc .. ")"; end return gsc; +--]===] + + local sep = "" + local dec = "" +-- if (TitanGetVar(TITAN_REPAIR_ID, "UseSeperatorComma")) then + sep = "," + dec = "." +-- else +-- sep = "." +-- dec = "," +-- end + + -- Not all parameters are Repair options so default. + local outstr, gold, silver, copper = + TitanUtils_CashToString(money, + ",", -- thousand seprator + ".", -- decimal seprator + TitanGetVar(TITAN_REPAIR_ID, "ShowCostGoldOnly"), + false, -- coin labels + false, -- coin icons + true -- color G / S / C + ) + return outstr + end ---local Repair items per user settings to use Guild or own gold. diff --git a/TitanXP/TitanXP.lua b/TitanXP/TitanXP.lua index 4212893..ad94257 100644 --- a/TitanXP/TitanXP.lua +++ b/TitanXP/TitanXP.lua @@ -83,22 +83,17 @@ end ---@param amount number ---@return string local function comma_value(amount) - local formatted = "" - - if type(amount) == "number" then - local sep = (TitanGetVar(TITAN_XP_ID, "UseSeperatorComma") and "," or ".") - local i, j, minus, int, fraction = tostring(amount):find('([-]?)(%d+)([.]?%d*)') - - -- reverse the int-string and append a comma to all blocks of 3 digits - int = int:reverse():gsub("(%d%d%d)", "%1"..sep) - - -- reverse the int-string back remove an optional comma and put the - -- optional minus and fractional part back - formatted = minus .. int:reverse():gsub("^"..sep, "") .. fraction + local sep = "" + local dec = "" + if (TitanGetVar(TITAN_XP_ID, "UseSeperatorComma")) then + sep = "," + dec = "." else - formatted = "0" -- 'silent' error + sep = "." + dec = "," end - return formatted + + return TitanUtils_NumToString(amount, sep, dec) end ---local Reset session and accumulated variables -- 1.7.9.5