Files
coa-altoholic/Altoholic-Addon/Altoholic/Frames/Currencies.lua
T

224 lines
5.6 KiB
Lua

local addonName = ...
local addon = _G[addonName]
local WHITE = "|cFFFFFFFF"
local GREEN = "|cFF00FF00"
local currentTokenType
local usedTokens
local tokenTextures = {}
addon.Currencies = {}
local ns = addon.Currencies -- ns = namespace
local function HashToSortedArray(hash)
local array = {} -- order them
for k, _ in pairs(hash) do
table.insert(array, k)
end
table.sort(array)
return array
end
local function GetUsedHeaders()
local realm, account = addon:GetCurrentRealm()
local DS = DataStore
local usedHeaders = {}
for _, character in pairs(DS:GetCharacters(realm, account)) do -- all alts on this realm
local num = DS:GetNumCurrencies(character) or 0
for i = 1, num do
local isHeader, name = DS:GetCurrencyInfo(character, i) -- save ech header found in the table
if isHeader then
usedHeaders[name] = true
end
end
end
return HashToSortedArray(usedHeaders)
end
local function GetUsedTokens(header)
-- get the list of tokens found under a specific header, across all alts
local realm, account = addon:GetCurrentRealm()
local DS = DataStore
-- local tokens = {}
local useData -- use data for a specific header or not
local tokensIDname = {}
for _, character in pairs(DS:GetCharacters(realm, account)) do -- all alts on this realm
local num = DS:GetNumCurrencies(character) or 0
for i = 1, num do
local isHeader, name, _, itemID = DS:GetCurrencyInfo(character, i)
if isHeader then
if name == header then -- the header we're searching for, set the flag
useData = true
else
useData = nil
end
else
if useData then -- mark it as used
-- tokens[name] = true
tokenTextures[name] = GetItemIcon(itemID)
-- print("-- CURRENCIES:", name, itemID)
tokensIDname[itemID] = name
end
end
end
end
local tokensID = {} -- sort by ID
for k,_ in pairs(tokensIDname) do
table.insert(tokensID, k)
end
table.sort(tokensID)
local returnTable = {} -- insert sorted names
for _,v in pairs(tokensID) do
table.insert(returnTable, tokensIDname[v])
end
return returnTable
-- return HashToSortedArray(tokens)
end
local function DDM_Add(text, func, arg1, arg2)
-- tiny wrapper
local info = UIDropDownMenu_CreateInfo();
info.text = text
info.func = func
info.arg1 = arg1
info.arg2 = arg2
info.checked = nil
UIDropDownMenu_AddButton(info, 1);
end
local function DDM_AddCloseMenu()
local info = UIDropDownMenu_CreateInfo();
-- Close menu item
info.text = CLOSE
info.func = function() CloseDropDownMenus() end
info.checked = nil
info.notCheckable = 1
info.icon = nil
UIDropDownMenu_AddButton(info, 1)
end
local function DDM_OnClick(self, header)
currentTokenType = header
UIDropDownMenu_SetText(AltoholicFrameCurrencies_SelectCurrencies, currentTokenType)
usedTokens = GetUsedTokens(currentTokenType)
ns:Update()
end
local function Currencies_UpdateEx(self, offset, entry, desc)
local line
local size = desc:GetSize()
local DS = DataStore
local realm, account = addon:GetCurrentRealm()
local character
for i=1, desc.NumLines do
line = i + offset
if line <= size then
local token = usedTokens[line]
_G[entry..i.."Name"]:SetText(WHITE .. token)
_G[entry..i.."Name"]:SetJustifyH("LEFT")
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 15, 0)
for j = 1, 10 do -- loop through the 10 alts
local itemName = entry.. i .. "Item" .. j;
local itemButton = _G[itemName]
local classButton = _G["AltoholicFrameClassesItem" .. j]
local itemTexture = _G[itemName .. "_Background"]
itemTexture:SetTexture(tokenTextures[token])
if classButton.CharName then -- if there's an alt in this column..
character = DS:GetCharacter(classButton.CharName, realm, account)
local count = DS:GetCurrencyInfoByName(character, token)
itemButton.count = count
if count then
itemTexture:SetVertexColor(0.5, 0.5, 0.5); -- greyed out
itemButton.CharName = classButton.CharName
if count >= 100000 then
count = format("%2.1fM", count/1000000)
elseif count >= 10000 then
count = format("%2.0fk", count/1000)
elseif count >= 1000 then
count = format("%2.1fk", count/1000)
end
_G[itemName .. "Name"]:SetText(GREEN..count)
itemButton:Show()
else
itemButton.CharName = nil
itemButton:Hide()
end
else
itemButton:Hide()
end
end
_G[ entry..i ]:SetID(line)
_G[ entry..i ]:Show()
end
end
end
local CurrenciesScrollFrame_Desc = {
NumLines = 8,
LineHeight = 41,
Frame = "AltoholicFrameCurrencies",
GetSize = function() return #usedTokens end,
Update = Currencies_UpdateEx,
}
local function DropDown_Initialize()
for _, header in ipairs(GetUsedHeaders()) do -- and add them to the DDM
DDM_Add(header, DDM_OnClick, header)
end
DDM_AddCloseMenu()
end
function ns:Init()
local headers = GetUsedHeaders()
currentTokenType = headers[1]
local f = AltoholicFrameCurrencies_SelectCurrencies
UIDropDownMenu_SetText(f, currentTokenType)
UIDropDownMenu_Initialize(f, DropDown_Initialize)
usedTokens = GetUsedTokens(currentTokenType)
end
function ns:Update()
addon:ScrollFrameUpdate(CurrenciesScrollFrame_Desc)
end
function ns:OnEnter(frame)
local charName = frame.CharName
if not charName then return end
local DS = DataStore
local realm, account = addon:GetCurrentRealm()
local character = DS:GetCharacter(charName, realm, account)
AltoTooltip:SetOwner(frame, "ANCHOR_LEFT");
AltoTooltip:ClearLines();
AltoTooltip:AddLine(DS:GetColoredCharacterName(character));
AltoTooltip:AddLine(usedTokens[frame:GetParent():GetID()], 1, 1, 1);
AltoTooltip:AddLine(GREEN..frame.count);
AltoTooltip:Show();
end