cross character gold tooltip
This commit is contained in:
+186
-28
@@ -1632,6 +1632,7 @@ function BagFrame:UpdateMoney()
|
||||
|
||||
if moneyFrame then
|
||||
MoneyFrame_Update("Guda_BagFrame_MoneyFrame", GetMoney())
|
||||
FormatMoneyFrameWithCommas("Guda_BagFrame_MoneyFrame")
|
||||
moneyFrame:Show()
|
||||
|
||||
-- Ensure tooltip overlay exists
|
||||
@@ -2104,7 +2105,7 @@ function Guda_BagFrame_MoneyFrame_OnLoad(self)
|
||||
Guda_BagFrame_MoneyOnEnter(this:GetParent())
|
||||
end)
|
||||
button:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
Guda_MoneyTooltip_Hide()
|
||||
end)
|
||||
end
|
||||
end
|
||||
@@ -2117,49 +2118,206 @@ function Guda_BagFrame_MoneyFrame_OnLoad(self)
|
||||
Guda_BagFrame_MoneyOnEnter(this)
|
||||
end)
|
||||
self:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
Guda_MoneyTooltip_Hide()
|
||||
end)
|
||||
end
|
||||
|
||||
-- Money tooltip handler
|
||||
function Guda_BagFrame_MoneyOnEnter(self)
|
||||
if not self then return end
|
||||
-- Custom money tooltip with coin icons
|
||||
local moneyTooltip = nil
|
||||
local moneyTooltipRows = {}
|
||||
|
||||
-- Anchor tooltip to TOPRIGHT - aligns tooltip's right edge with money container's right edge
|
||||
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT", 0, 0)
|
||||
GameTooltip:ClearLines()
|
||||
-- Format number with thousand separators (e.g., 1234567 -> "1,234,567")
|
||||
local function FormatWithCommas(n)
|
||||
local s = tostring(n)
|
||||
local len = string.len(s)
|
||||
if len <= 3 then return s end
|
||||
local parts = {}
|
||||
local pos = len
|
||||
while pos > 0 do
|
||||
local start = pos - 2
|
||||
if start < 1 then start = 1 end
|
||||
table.insert(parts, 1, string.sub(s, start, pos))
|
||||
pos = start - 1
|
||||
end
|
||||
return table.concat(parts, ",")
|
||||
end
|
||||
|
||||
-- Apply comma formatting to a MoneyFrame's gold button text (global for BankFrame reuse)
|
||||
function FormatMoneyFrameWithCommas(frameName)
|
||||
local goldBtn = getglobal(frameName .. "GoldButtonText")
|
||||
if goldBtn then
|
||||
local text = goldBtn:GetText()
|
||||
if text then
|
||||
local num = tonumber(text)
|
||||
if num and num >= 1000 then
|
||||
goldBtn:SetText(FormatWithCommas(num))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function DisableMoneyFrameAutoUpdate(frameName)
|
||||
local frame = getglobal(frameName)
|
||||
if frame then
|
||||
frame.moneyType = "STATIC"
|
||||
frame:UnregisterAllEvents()
|
||||
frame:SetScript("OnShow", nil)
|
||||
frame:SetScript("OnEvent", nil)
|
||||
end
|
||||
-- Disable click/hover on denomination buttons
|
||||
local buttons = {"GoldButton", "SilverButton", "CopperButton"}
|
||||
for _, btn in ipairs(buttons) do
|
||||
local b = getglobal(frameName .. btn)
|
||||
if b then
|
||||
b:EnableMouse(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function CreateMoneyTooltip()
|
||||
local f = CreateFrame("Frame", "Guda_MoneyTooltip", UIParent)
|
||||
f:SetFrameStrata("TOOLTIP")
|
||||
f:SetBackdrop({
|
||||
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 16,
|
||||
insets = { left = 4, right = 4, top = 4, bottom = 4 },
|
||||
})
|
||||
f:SetBackdropColor(0, 0, 0, 0.9)
|
||||
f:SetBackdropBorderColor(0.5, 0.5, 0.5, 0.9)
|
||||
f:EnableMouse(false)
|
||||
f:Hide()
|
||||
|
||||
-- Auto-hide when mouse leaves both anchor and tooltip area
|
||||
local elapsed = 0
|
||||
f:SetScript("OnUpdate", function()
|
||||
elapsed = elapsed + arg1
|
||||
if elapsed < 0.2 then return end
|
||||
elapsed = 0
|
||||
if not this.anchor then this:Hide(); return end
|
||||
if MouseIsOver(this) then return end
|
||||
if MouseIsOver(this.anchor) then return end
|
||||
this.anchor = nil
|
||||
this:Hide()
|
||||
end)
|
||||
|
||||
-- Header label
|
||||
f.header = f:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
f.header:SetPoint("TOPLEFT", f, "TOPLEFT", 10, -10)
|
||||
f.header:SetText("Current realm gold")
|
||||
f.header:SetTextColor(1, 0.82, 0)
|
||||
|
||||
-- Header money frame (total) — anchored to right edge, same row as header
|
||||
f.totalMoney = CreateFrame("Frame", "Guda_MoneyTooltip_Total", f, "SmallMoneyFrameTemplate")
|
||||
f.totalMoney:SetPoint("TOPRIGHT", f, "TOPRIGHT", -10, -10)
|
||||
DisableMoneyFrameAutoUpdate("Guda_MoneyTooltip_Total")
|
||||
|
||||
return f
|
||||
end
|
||||
|
||||
local function GetOrCreateMoneyRow(index)
|
||||
if moneyTooltipRows[index] then return moneyTooltipRows[index] end
|
||||
local row = {}
|
||||
local frameName = "Guda_MoneyTooltip_Row" .. index
|
||||
row.label = moneyTooltip:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.money = CreateFrame("Frame", frameName, moneyTooltip, "SmallMoneyFrameTemplate")
|
||||
DisableMoneyFrameAutoUpdate(frameName)
|
||||
moneyTooltipRows[index] = row
|
||||
return row
|
||||
end
|
||||
|
||||
-- Shared money tooltip handler (used by both BagFrame and BankFrame)
|
||||
function Guda_MoneyTooltip_Show(anchor)
|
||||
if not anchor then return end
|
||||
|
||||
if not moneyTooltip then
|
||||
moneyTooltip = CreateMoneyTooltip()
|
||||
end
|
||||
|
||||
-- Hide GameTooltip to avoid overlap
|
||||
GameTooltip:Hide()
|
||||
|
||||
-- Get all characters and total (realm filtered, all factions)
|
||||
local chars = addon.Modules.DB:GetAllCharacters(false, true)
|
||||
local totalMoney = addon.Modules.DB:GetTotalMoney(false, true)
|
||||
|
||||
-- Header with current realm total - use colored money
|
||||
GameTooltip:AddLine(
|
||||
"Current realm gold: " .. addon.Modules.Utils:FormatMoney(totalMoney, false, true),
|
||||
1, 0.82, 0
|
||||
)
|
||||
GameTooltip:AddLine(" ")
|
||||
-- Update header money
|
||||
MoneyFrame_Update("Guda_MoneyTooltip_Total", totalMoney)
|
||||
FormatMoneyFrameWithCommas("Guda_MoneyTooltip_Total")
|
||||
|
||||
-- List each character with class-colored names
|
||||
for _, char in ipairs(chars) do
|
||||
-- Get class color from WoW's built-in table using English class token
|
||||
-- Layout character rows
|
||||
local rowHeight = 18
|
||||
local padding = 10
|
||||
local yOffset = -10 - 20 - 14 -- top padding + header height + gap before character list
|
||||
|
||||
for i, char in ipairs(chars) do
|
||||
local row = GetOrCreateMoneyRow(i)
|
||||
|
||||
-- Class-colored name
|
||||
local classToken = char.classToken
|
||||
local classColor = classToken and (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[classToken]
|
||||
local colorR, colorG, colorB = 0.7, 0.7, 0.7
|
||||
local r, g, b = 0.7, 0.7, 0.7
|
||||
if classColor then r, g, b = classColor.r, classColor.g, classColor.b end
|
||||
|
||||
if classColor then
|
||||
colorR, colorG, colorB = classColor.r, classColor.g, classColor.b
|
||||
end
|
||||
row.label:SetTextColor(r, g, b)
|
||||
row.label:SetText(char.name)
|
||||
row.label:ClearAllPoints()
|
||||
row.label:SetPoint("TOPLEFT", moneyTooltip, "TOPLEFT", padding, yOffset)
|
||||
row.label:Show()
|
||||
|
||||
-- Create colored name
|
||||
local coloredName = addon.Modules.Utils:ColorText(char.name, colorR, colorG, colorB)
|
||||
local frameName = "Guda_MoneyTooltip_Row" .. i
|
||||
MoneyFrame_Update(frameName, char.money or 0)
|
||||
FormatMoneyFrameWithCommas(frameName)
|
||||
row.money:ClearAllPoints()
|
||||
row.money:SetPoint("TOPRIGHT", moneyTooltip, "TOPRIGHT", -padding, yOffset)
|
||||
row.money:Show()
|
||||
|
||||
GameTooltip:AddLine(
|
||||
coloredName .. ": " .. addon.Modules.Utils:FormatMoney(char.money or 0, false, true)
|
||||
)
|
||||
yOffset = yOffset - rowHeight
|
||||
end
|
||||
|
||||
GameTooltip:Show()
|
||||
-- Hide unused rows
|
||||
for i = table.getn(chars) + 1, table.getn(moneyTooltipRows) do
|
||||
if moneyTooltipRows[i] then
|
||||
moneyTooltipRows[i].label:Hide()
|
||||
moneyTooltipRows[i].money:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
-- Calculate frame size
|
||||
local numRows = table.getn(chars)
|
||||
local totalHeight = 10 + 20 + 14 + (numRows * rowHeight) + padding
|
||||
-- Calculate width: widest name + gap + widest money
|
||||
local maxNameWidth = moneyTooltip.header:GetStringWidth()
|
||||
local maxMoneyWidth = moneyTooltip.totalMoney:GetWidth()
|
||||
for i = 1, numRows do
|
||||
local row = moneyTooltipRows[i]
|
||||
if row and row.label:IsShown() then
|
||||
local nw = row.label:GetStringWidth()
|
||||
if nw > maxNameWidth then maxNameWidth = nw end
|
||||
local mw = row.money:GetWidth()
|
||||
if mw > maxMoneyWidth then maxMoneyWidth = mw end
|
||||
end
|
||||
end
|
||||
local gap = 20
|
||||
moneyTooltip:SetWidth(maxNameWidth + gap + maxMoneyWidth + padding * 2 + 10)
|
||||
moneyTooltip:SetHeight(totalHeight)
|
||||
|
||||
-- Anchor above the money frame
|
||||
moneyTooltip:ClearAllPoints()
|
||||
moneyTooltip:SetPoint("BOTTOMRIGHT", anchor, "TOPRIGHT", 0, 2)
|
||||
moneyTooltip.anchor = anchor
|
||||
moneyTooltip:Show()
|
||||
end
|
||||
|
||||
function Guda_MoneyTooltip_Hide()
|
||||
if moneyTooltip then
|
||||
moneyTooltip.anchor = nil
|
||||
moneyTooltip:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
-- Money tooltip handler (BagFrame entry point)
|
||||
function Guda_BagFrame_MoneyOnEnter(self)
|
||||
Guda_MoneyTooltip_Show(self)
|
||||
end
|
||||
|
||||
-- Dropdown management
|
||||
|
||||
+5
-44
@@ -1487,6 +1487,7 @@ function BankFrame:UpdateMoney()
|
||||
|
||||
if moneyFrame then
|
||||
MoneyFrame_Update("Guda_BankFrame_MoneyFrame", GetMoney())
|
||||
if FormatMoneyFrameWithCommas then FormatMoneyFrameWithCommas("Guda_BankFrame_MoneyFrame") end
|
||||
moneyFrame:Show()
|
||||
|
||||
-- Ensure tooltip overlay exists
|
||||
@@ -1521,10 +1522,10 @@ function Guda_BankFrame_MoneyFrame_OnLoad(self)
|
||||
local button = getglobal(fullName)
|
||||
if button then
|
||||
button:SetScript("OnEnter", function()
|
||||
Guda_BankFrame_MoneyOnEnter(this:GetParent())
|
||||
Guda_MoneyTooltip_Show(this:GetParent())
|
||||
end)
|
||||
button:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
Guda_MoneyTooltip_Hide()
|
||||
end)
|
||||
end
|
||||
end
|
||||
@@ -1532,53 +1533,13 @@ function Guda_BankFrame_MoneyFrame_OnLoad(self)
|
||||
-- Also set handlers on parent frame
|
||||
self:EnableMouse(true)
|
||||
self:SetScript("OnEnter", function()
|
||||
Guda_BankFrame_MoneyOnEnter(this)
|
||||
Guda_MoneyTooltip_Show(this)
|
||||
end)
|
||||
self:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
Guda_MoneyTooltip_Hide()
|
||||
end)
|
||||
end
|
||||
|
||||
-- Money tooltip handler
|
||||
function Guda_BankFrame_MoneyOnEnter(self)
|
||||
if not self then return end
|
||||
|
||||
-- Anchor tooltip to TOPRIGHT
|
||||
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT", 0, 0)
|
||||
GameTooltip:ClearLines()
|
||||
|
||||
-- Get all characters and total (realm filtered, all factions)
|
||||
local chars = addon.Modules.DB:GetAllCharacters(false, true)
|
||||
local totalMoney = addon.Modules.DB:GetTotalMoney(false, true)
|
||||
|
||||
-- Header with current realm total - use colored money
|
||||
GameTooltip:AddLine(
|
||||
"Current realm gold: " .. addon.Modules.Utils:FormatMoney(totalMoney, false, true),
|
||||
1, 0.82, 0
|
||||
)
|
||||
GameTooltip:AddLine(" ")
|
||||
|
||||
-- List each character with class-colored names
|
||||
for _, char in ipairs(chars) do
|
||||
local classToken = char.classToken
|
||||
local classColor = classToken and (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[classToken]
|
||||
local colorR, colorG, colorB = 0.7, 0.7, 0.7
|
||||
|
||||
if classColor then
|
||||
colorR, colorG, colorB = classColor.r, classColor.g, classColor.b
|
||||
end
|
||||
|
||||
-- Create colored name
|
||||
local coloredName = addon.Modules.Utils:ColorText(char.name, colorR, colorG, colorB)
|
||||
|
||||
GameTooltip:AddLine(
|
||||
coloredName .. ": " .. addon.Modules.Utils:FormatMoney(char.money or 0, false, true)
|
||||
)
|
||||
end
|
||||
|
||||
GameTooltip:Show()
|
||||
end
|
||||
|
||||
-- Create transparent overlay for money tooltip
|
||||
function BankFrame:EnsureMoneyTooltipOverlay()
|
||||
local overlayName = "Guda_BankFrame_MoneyTooltipOverlay"
|
||||
|
||||
Reference in New Issue
Block a user