ElvUI/Modules/DataTexts/DataTexts.lua

849 lines
25 KiB
Lua
Raw Normal View History

2020-11-13 14:27:50 -05:00
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local DT = E:GetModule('DataTexts')
local TT = E:GetModule('Tooltip')
local LDB = E.Libs.LDB
local LSM = E.Libs.LSM
local _G = _G
local tostring, format, type, pcall = tostring, format, type, pcall
local tinsert, ipairs, pairs, wipe, sort = tinsert, ipairs, pairs, wipe, sort
local next, strfind, strlen, strsplit = next, strfind, strlen, strsplit
local CloseDropDownMenus = CloseDropDownMenus
local CreateFrame = CreateFrame
local EasyMenu = EasyMenu
local InCombatLockdown = InCombatLockdown
local IsInInstance = IsInInstance
local MouseIsOver = MouseIsOver
local RegisterStateDriver = RegisterStateDriver
local UIDropDownMenu_SetAnchor = UIDropDownMenu_SetAnchor
local UnregisterStateDriver = UnregisterStateDriver
local C_CurrencyInfo_GetCurrencyInfo = C_CurrencyInfo.GetCurrencyInfo
local C_CurrencyInfo_GetCurrencyListSize = C_CurrencyInfo.GetCurrencyListSize
local C_CurrencyInfo_GetCurrencyListInfo = C_CurrencyInfo.GetCurrencyListInfo
local C_CurrencyInfo_GetCurrencyListLink = C_CurrencyInfo.GetCurrencyListLink
local C_CurrencyInfo_GetCurrencyIDFromLink = C_CurrencyInfo.GetCurrencyIDFromLink
local C_CurrencyInfo_ExpandCurrencyList = C_CurrencyInfo.ExpandCurrencyList
local GetNumSpecializations = GetNumSpecializations
local GetSpecializationInfo = GetSpecializationInfo
local MISCELLANEOUS = MISCELLANEOUS
local LFG_TYPE_DUNGEON = LFG_TYPE_DUNGEON
local expansion = _G['EXPANSION_NAME'..GetExpansionLevel()]
local ActivateHyperMode
local HyperList = {}
DT.tooltip = CreateFrame('GameTooltip', 'DataTextTooltip', E.UIParent, 'GameTooltipTemplate')
DT.EasyMenu = CreateFrame('Frame', 'DataTextEasyMenu', E.UIParent, 'UIDropDownMenuTemplate')
DT.SelectedDatatext = nil
DT.HyperList = HyperList
DT.RegisteredPanels = {}
DT.RegisteredDataTexts = {}
DT.LoadedInfo = {}
DT.PanelPool = {
InUse = {},
Free = {},
Count = 0
}
DT.FontStrings = {}
DT.AssignedDatatexts = {}
DT.UnitEvents = {
UNIT_AURA = true,
UNIT_RESISTANCES = true,
UNIT_STATS = true,
UNIT_ATTACK_POWER = true,
UNIT_RANGED_ATTACK_POWER = true,
UNIT_TARGET = true,
UNIT_SPELL_HASTE = true
}
DT.SPECIALIZATION_CACHE = {}
function DT:SetEasyMenuAnchor(menu, dt)
local point = E:GetScreenQuadrant(dt)
local bottom = point and strfind(point, 'BOTTOM')
local left = point and strfind(point, 'LEFT')
local anchor1 = (bottom and left and 'BOTTOMLEFT') or (bottom and 'BOTTOMRIGHT') or (left and 'TOPLEFT') or 'TOPRIGHT'
local anchor2 = (bottom and left and 'TOPLEFT') or (bottom and 'TOPRIGHT') or (left and 'BOTTOMLEFT') or 'BOTTOMRIGHT'
UIDropDownMenu_SetAnchor(menu, 0, 0, anchor1, dt, anchor2)
end
--> [HyperDT Credits] <--
--> Original Work: NihilisticPandemonium
--> Modified by Azilroka! :)
function DT:SingleHyperMode(_, key, active)
if DT.SelectedDatatext and (key == 'LALT' or key == 'RALT') then
if active == 1 and MouseIsOver(DT.SelectedDatatext) then
DT:OnLeave()
DT:SetEasyMenuAnchor(DT.EasyMenu, DT.SelectedDatatext)
EasyMenu(HyperList, DT.EasyMenu, nil, nil, nil, 'MENU')
elseif _G.DropDownList1:IsShown() and not _G.DropDownList1:IsMouseOver() then
CloseDropDownMenus()
end
end
end
function DT:HyperClick()
DT.SelectedDatatext = self
DT:SetEasyMenuAnchor(DT.EasyMenu, DT.SelectedDatatext)
EasyMenu(HyperList, DT.EasyMenu, nil, nil, nil, 'MENU')
end
function DT:EnableHyperMode(Panel)
DT:OnLeave()
if Panel then
for _, dt in pairs(Panel.dataPanels) do
dt.overlay:Show()
dt:SetScript('OnEnter', nil)
dt:SetScript('OnLeave', nil)
dt:SetScript('OnClick', DT.HyperClick)
end
else
for _, panel in pairs(DT.RegisteredPanels) do
for _, dt in pairs(panel.dataPanels) do
dt.overlay:Show()
dt:SetScript('OnEnter', nil)
dt:SetScript('OnLeave', nil)
dt:SetScript('OnClick', DT.HyperClick)
end
end
end
end
function DT:OnEnter()
if E.db.datatexts.noCombatHover and InCombatLockdown() then return end
if self.parent then
DT.SelectedDatatext = self
DT:SetupTooltip(self)
end
if self.MouseEnters then
for _, func in ipairs(self.MouseEnters) do
func(self)
end
end
DT.MouseEnter(self)
end
function DT:OnLeave()
if self.MouseLeaves then
for _, func in ipairs(self.MouseLeaves) do
func(self)
end
end
DT.MouseLeave(self)
DT.tooltip:Hide()
end
function DT:MouseEnter()
local frame = self.parent or self
if frame.db and frame.db.mouseover then
E:UIFrameFadeIn(frame, 0.2, frame:GetAlpha(), 1)
end
end
function DT:MouseLeave()
local frame = self.parent or self
if frame.db and frame.db.mouseover then
E:UIFrameFadeOut(frame, 0.2, frame:GetAlpha(), 0)
end
end
function DT:FetchFrame(givenName)
local panelExists = DT.PanelPool.InUse[givenName]
if panelExists then return panelExists end
local count = DT.PanelPool.Count
local name = 'ElvUI_DTPanel' .. count
local frame
local poolName, poolFrame = next(DT.PanelPool.Free)
if poolName then
frame = poolFrame
DT.PanelPool.Free[poolName] = nil
else
frame = CreateFrame('Frame', name, E.UIParent, 'BackdropTemplate')
DT.PanelPool.Count = DT.PanelPool.Count + 1
end
DT.PanelPool.InUse[givenName] = frame
return frame
end
function DT:EmptyPanel(panel)
panel:Hide()
for _, dt in ipairs(panel.dataPanels) do
dt:UnregisterAllEvents()
dt:SetScript('OnUpdate', nil)
dt:SetScript('OnEvent', nil)
dt:SetScript('OnEnter', nil)
dt:SetScript('OnLeave', nil)
dt:SetScript('OnClick', nil)
end
UnregisterStateDriver(panel, 'visibility')
E:DisableMover(panel.moverName)
end
function DT:ReleasePanel(givenName)
local panel = DT.PanelPool.InUse[givenName]
if panel then
DT:EmptyPanel(panel)
DT.PanelPool.Free[givenName] = panel
DT.PanelPool.InUse[givenName] = nil
DT.RegisteredPanels[givenName] = nil
E.db.movers[panel.moverName] = nil
end
end
function DT:BuildPanelFrame(name, db, fromInit)
db = db or E.global.datatexts.customPanels[name] or DT:Panel_DefaultGlobalSettings(name)
local Panel = DT:FetchFrame(name)
Panel:ClearAllPoints()
Panel:SetPoint('CENTER')
Panel:SetSize(db.width, db.height)
local MoverName = 'DTPanel'..name..'Mover'
Panel.moverName = MoverName
Panel.givenName = name
local holder = E:GetMoverHolder(MoverName)
if holder then
E:SetMoverPoints(MoverName, Panel)
else
E:CreateMover(Panel, MoverName, name, nil, nil, nil, nil, nil, 'datatexts,panels')
end
DT:RegisterPanel(Panel, db.numPoints, db.tooltipAnchor, db.tooltipXOffset, db.tooltipYOffset, db.growth == 'VERTICAL')
if not fromInit then
DT:UpdatePanelAttributes(name, db)
end
end
local LDBhex, LDBna = '|cffFFFFFF', {['N/A'] = true, ['n/a'] = true, ['N/a'] = true}
function DT:BuildPanelFunctions(name, obj)
local panel
local function OnEnter(dt)
DT.tooltip:ClearLines()
if obj.OnTooltipShow then obj.OnTooltipShow(DT.tooltip) end
if obj.OnEnter then obj.OnEnter(dt) end
DT.tooltip:Show()
end
local function OnLeave(dt)
if obj.OnLeave then obj.OnLeave(dt) end
end
local function OnClick(dt, button)
if obj.OnClick then
obj.OnClick(dt, button)
end
end
local function UpdateText(_, Name, _, Value)
if not Value or (strlen(Value) >= 3) or (Value == Name or LDBna[Value]) then
panel.text:SetText((not LDBna[Value] and Value) or Name)
else
panel.text:SetFormattedText('%s: %s%s|r', Name, LDBhex, Value)
end
end
local function OnCallback(Hex)
if name and obj then
LDBhex = Hex
LDB.callbacks:Fire('LibDataBroker_AttributeChanged_'..name..'_text', name, nil, obj.text, obj)
end
end
local function OnEvent(dt)
panel = dt
LDB:RegisterCallback('LibDataBroker_AttributeChanged_'..name..'_text', UpdateText)
LDB:RegisterCallback('LibDataBroker_AttributeChanged_'..name..'_value', UpdateText)
OnCallback(LDBhex)
end
return OnEnter, OnLeave, OnClick, OnCallback, OnEvent, UpdateText
end
function DT:SetupObjectLDB(name, obj)
local onEnter, onLeave, onClick, onCallback, onEvent = DT:BuildPanelFunctions(name, obj)
local data = DT:RegisterDatatext(name, 'Data Broker', nil, onEvent, nil, onClick, onEnter, onLeave)
E.valueColorUpdateFuncs[onCallback] = true
data.isLibDataBroker = true
-- Update config if it has been loaded
if DT.PanelLayoutOptions then
DT:PanelLayoutOptions()
end
end
function DT:RegisterLDB()
for name, obj in LDB:DataObjectIterator() do
DT:SetupObjectLDB(name, obj)
end
end
function DT:GetDataPanelPoint(panel, i, numPoints, vertical)
if numPoints == 1 then
return 'CENTER', panel, 'CENTER'
else
local point, relativePoint, xOffset, yOffset = 'LEFT', i == 1 and 'LEFT' or 'RIGHT', 4, 0
if vertical then
point, relativePoint, xOffset, yOffset = 'TOP', i == 1 and 'TOP' or 'BOTTOM', 0, -4
end
local lastPanel = (i == 1 and panel) or panel.dataPanels[i - 1]
return point, lastPanel, relativePoint, xOffset, yOffset
end
end
function DT:SetupTooltip(panel)
local parent = panel:GetParent()
DT.tooltip:SetOwner(panel, parent.anchor, parent.xOff, parent.yOff)
if not _G.GameTooltip:IsForbidden() then
_G.GameTooltip:Hide() -- WHY??? BECAUSE FUCK GAMETOOLTIP, THATS WHY!!
end
end
function DT:RegisterPanel(panel, numPoints, anchor, xOff, yOff, vertical)
local realName = panel:GetName()
local name = panel.givenName or realName
if not name then
E:Print('DataTexts: Requires a panel name.')
return
end
DT.RegisteredPanels[name] = panel
panel:SetScript('OnEnter', DT.OnEnter)
panel:SetScript('OnLeave', DT.OnLeave)
panel:SetScript('OnSizeChanged', DT.PanelSizeChanged)
panel.dataPanels = panel.dataPanels or {}
panel.numPoints = numPoints
panel.xOff = xOff
panel.yOff = yOff
panel.anchor = anchor
panel.vertical = vertical
end
function DT:Panel_DefaultGlobalSettings(name)
local db = E:CopyTable({}, G.datatexts.newPanelInfo)
E.global.datatexts.customPanels[name] = db
return db
end
function DT:AssignPanelToDataText(dt, data, event, ...)
dt.name = data.name or '' -- This is needed for Custom Currencies
if data.events then
for _, ev in pairs(data.events) do
if data.eventFunc then
if data.objectEvent then
if not dt.objectEventFunc then
dt.objectEvent = data.objectEvent
dt.objectEventFunc = function(_, ...)
if data.eventFunc then
data.eventFunc(dt, ...)
end
end
end
if not E:HasFunctionForObject(ev, data.objectEvent, dt.objectEventFunc) then
E:RegisterEventForObject(ev, data.objectEvent, dt.objectEventFunc)
end
elseif DT.UnitEvents[ev] then
pcall(dt.RegisterUnitEvent, dt, ev, 'player')
else
pcall(dt.RegisterEvent, dt, ev)
end
end
end
end
local ev = event or 'ELVUI_FORCE_UPDATE'
if data.eventFunc then
if not data.objectEvent then
dt:SetScript('OnEvent', data.eventFunc)
end
data.eventFunc(dt, ev, ...)
end
if data.onUpdate then
dt:SetScript('OnUpdate', data.onUpdate)
data.onUpdate(dt, 20000)
end
if data.onClick then
dt:SetScript('OnClick', function(p, button)
if E.db.datatexts.noCombatClick and InCombatLockdown() then return end
data.onClick(p, button)
DT.tooltip:Hide()
end)
end
if data.onEnter then
tinsert(dt.MouseEnters, data.onEnter)
end
if data.onLeave then
tinsert(dt.MouseLeaves, data.onLeave)
end
end
function DT:ForceUpdate_DataText(name)
for dtSlot, dtName in pairs(DT.AssignedDatatexts) do
if dtName.name == name then
if dtName.colorUpdate then
dtName.colorUpdate(E.media.hexvaluecolor)
end
if dtName.eventFunc then
dtName.eventFunc(dtSlot, 'ELVUI_FORCE_UPDATE')
end
end
end
end
function DT:GetTextAttributes(panel, db)
local panelWidth, panelHeight = panel:GetSize()
local numPoints = db and db.numPoints or panel.numPoints or 1
local vertical = db and db.vertical or panel.vertical
local width, height = (panelWidth / numPoints) - 4, panelHeight - 4
if vertical then width, height = panelWidth - 4, (panelHeight / numPoints) - 4 end
return width, height, vertical, numPoints
end
function DT:UpdatePanelInfo(panelName, panel, ...)
if not panel then panel = DT.RegisteredPanels[panelName] end
local db = panel.db or P.datatexts.panels[panelName] and DT.db.panels[panelName]
if not db then return end
local info = DT.LoadedInfo
local font, fontSize, fontOutline = info.font, info.fontSize, info.fontOutline
if db and db.fonts and db.fonts.enable then
font, fontSize, fontOutline = LSM:Fetch('font', db.fonts.font), db.fonts.fontSize, db.fonts.fontOutline
end
local chatPanel = panelName == 'LeftChatDataPanel' or panelName == 'RightChatDataPanel'
local battlePanel = info.isInBattle and chatPanel and (not DT.ForceHideBGStats and E.db.datatexts.battleground)
if battlePanel then
DT:RegisterEvent('UPDATE_BATTLEFIELD_SCORE')
DT.ShowingBattleStats = info.instanceType
elseif chatPanel and DT.ShowingBattleStats then
DT:UnregisterEvent('UPDATE_BATTLEFIELD_SCORE')
DT.ShowingBattleStats = nil
end
local width, height, vertical, numPoints = DT:GetTextAttributes(panel, db)
for i = 1, numPoints do
local dt = panel.dataPanels[i]
if not dt then
dt = CreateFrame('Button', panelName..'_DataText'..i, panel)
dt.MouseEnters = {}
dt.MouseLeaves = {}
dt:RegisterForClicks('AnyUp')
local text = dt:CreateFontString(nil, 'ARTWORK')
text:SetAllPoints()
text:SetJustifyV('MIDDLE')
dt.text = text
DT.FontStrings[text] = true
local overlay = dt:CreateTexture(nil, 'OVERLAY')
overlay:SetTexture(E.media.blankTex)
overlay:SetVertexColor(0.3, 0.9, 0.3, .3)
overlay:SetAllPoints()
dt.overlay = overlay
panel.dataPanels[i] = dt
end
end
--Note: some plugins dont have db.border, we need the nil checks
panel.forcedBorderColors = (db.border == false and {0,0,0,0}) or nil
panel:SetTemplate(db.backdrop and (db.panelTransparency and 'Transparent' or 'Default') or 'NoBackdrop', true)
--Show Border option
if db.border ~= nil then
if panel.iborder then panel.iborder:SetShown(db.border) end
if panel.oborder then panel.oborder:SetShown(db.border) end
end
--Restore Panels
for i, dt in ipairs(panel.dataPanels) do
dt:SetShown(i <= numPoints)
dt:SetSize(width, height)
dt:ClearAllPoints()
dt:SetPoint(DT:GetDataPanelPoint(panel, i, numPoints, vertical))
dt:UnregisterAllEvents()
dt:EnableMouseWheel(false)
dt:SetScript('OnUpdate', nil)
dt:SetScript('OnEvent', nil)
dt:SetScript('OnClick', nil)
dt:SetScript('OnEnter', DT.OnEnter)
dt:SetScript('OnLeave', DT.OnLeave)
wipe(dt.MouseEnters)
wipe(dt.MouseLeaves)
dt.overlay:Hide()
dt.pointIndex = i
dt.parent = panel
dt.parentName = panelName
dt.battleStats = battlePanel
dt.db = db
E:StopFlash(dt)
if dt.objectEvent and dt.objectEventFunc then
E:UnregisterAllEventsForObject(dt.objectEvent, dt.objectEventFunc)
dt.objectEvent, dt.objectEventFunc = nil, nil
end
dt.text:FontTemplate(font, fontSize, fontOutline)
dt.text:SetJustifyH(db.textJustify or 'CENTER')
dt.text:SetWordWrap(DT.db.wordWrap)
dt.text:SetText()
if battlePanel then
dt:SetScript('OnClick', DT.ToggleBattleStats)
tinsert(dt.MouseEnters, DT.HoverBattleStats)
else
local assigned = DT.RegisteredDataTexts[ DT.db.panels[panelName][i] ]
DT.AssignedDatatexts[dt] = assigned
if assigned then DT:AssignPanelToDataText(dt, assigned, ...) end
end
end
end
function DT:LoadDataTexts(...)
local data = DT.LoadedInfo
data.font, data.fontSize, data.fontOutline = LSM:Fetch('font', DT.db.font), DT.db.fontSize, DT.db.fontOutline
data.inInstance, data.instanceType = IsInInstance()
data.isInBattle = data.inInstance and data.instanceType == 'pvp'
for panel, db in pairs(E.global.datatexts.customPanels) do
DT:UpdatePanelAttributes(panel, db, true)
end
for panelName, panel in pairs(DT.RegisteredPanels) do
local db = DT.db.panels[panelName]
if db and db.enable then
DT:UpdatePanelInfo(panelName, panel, ...)
end
end
if DT.ShowingBattleStats then
DT:UPDATE_BATTLEFIELD_SCORE()
end
end
function DT:PanelSizeChanged()
if not self.dataPanels then return end
local db = self.db or P.datatexts.panels[self.name] and DT.db.panels[self.name]
local width, height, vertical, numPoints = DT:GetTextAttributes(self, db)
for i, dt in ipairs(self.dataPanels) do
dt:SetSize(width, height)
dt:ClearAllPoints()
dt:SetPoint(DT:GetDataPanelPoint(self, i, numPoints, vertical))
end
end
function DT:UpdatePanelAttributes(name, db, fromLoad)
local Panel = DT.PanelPool.InUse[name]
DT.OnLeave(Panel)
Panel.db = db
Panel.name = name
Panel.numPoints = db.numPoints
Panel.xOff = db.tooltipXOffset
Panel.yOff = db.tooltipYOffset
Panel.anchor = db.tooltipAnchor
Panel.vertical = db.growth == 'VERTICAL'
Panel:SetSize(db.width, db.height)
Panel:SetFrameStrata(db.frameStrata)
Panel:SetFrameLevel(db.frameLevel)
E:UIFrameFadeIn(Panel, 0.2, Panel:GetAlpha(), db.mouseover and 0 or 1)
if not DT.db.panels[name] or type(DT.db.panels[name]) ~= 'table' then
DT.db.panels[name] = { enable = false }
end
for i = 1, (E.global.datatexts.customPanels[name].numPoints or 1) do
if not DT.db.panels[name][i] then
DT.db.panels[name][i] = ''
end
end
if DT.db.panels[name].enable then
E:EnableMover(Panel.moverName)
RegisterStateDriver(Panel, 'visibility', db.visibility)
if not fromLoad then
DT:UpdatePanelInfo(name, Panel)
end
else
DT:EmptyPanel(Panel)
end
end
function DT:GetMenuListCategory(category)
for i, info in ipairs(HyperList) do
if info.text == category then
return i
end
end
end
do
local function menuSort(a, b)
if a.order and b.order then
return a.order < b.order
end
return a.text < b.text
end
function DT:SortMenuList(list)
for _, menu in pairs(list) do
if menu.menuList then
DT:SortMenuList(menu.menuList)
end
end
sort(list, menuSort)
end
end
function DT:HyperDT()
if ActivateHyperMode then
ActivateHyperMode = nil
DT:LoadDataTexts()
else
ActivateHyperMode = true
DT:EnableHyperMode()
end
end
function DT:RegisterHyperDT()
for name, info in pairs(DT.RegisteredDataTexts) do
local category = DT:GetMenuListCategory(info.category or MISCELLANEOUS)
if not category then
category = #HyperList + 1
tinsert(HyperList, { order = 0, text = info.category or MISCELLANEOUS, notCheckable = true, hasArrow = true, menuList = {} } )
end
tinsert(HyperList[category].menuList, {
text = info.localizedName or name,
checked = function() return DT.EasyMenu.MenuGetItem(DT.SelectedDatatext, name) end,
func = function() DT.EasyMenu.MenuSetItem(DT.SelectedDatatext, name) end
})
end
tinsert(HyperList, {
order = 100, text = L["NONE"],
checked = function() return DT.EasyMenu.MenuGetItem(DT.SelectedDatatext, '') end,
func = function() DT.EasyMenu.MenuSetItem(DT.SelectedDatatext, '') end
})
DT:SortMenuList(HyperList)
DT:RegisterEvent('MODIFIER_STATE_CHANGED', 'SingleHyperMode')
end
function DT:PopulateData()
local Collapsed = {}
local listSize, i = C_CurrencyInfo_GetCurrencyListSize(), 1
local headerIndex
while listSize >= i do
local info = C_CurrencyInfo_GetCurrencyListInfo(i)
if info.isHeader and not info.isHeaderExpanded then
C_CurrencyInfo_ExpandCurrencyList(i, true)
listSize = C_CurrencyInfo_GetCurrencyListSize()
Collapsed[info.name] = true
end
if info.isHeader then
G.datatexts.settings.Currencies.tooltipData[i] = { info.name, nil, nil, (info.name == expansion or info.name == MISCELLANEOUS) or strfind(info.name, LFG_TYPE_DUNGEON) }
E.global.datatexts.settings.Currencies.tooltipData[i] = E.global.datatexts.settings.Currencies.tooltipData[i] or { info.name, nil, nil, G.datatexts.settings.Currencies.tooltipData[i][4] }
E.global.datatexts.settings.Currencies.tooltipData[i][1] = info.name
headerIndex = i
end
if not info.isHeader then
local currencyLink = C_CurrencyInfo_GetCurrencyListLink(i)
local currencyID = currencyLink and C_CurrencyInfo_GetCurrencyIDFromLink(currencyLink)
if currencyID then
DT.CurrencyList[tostring(currencyID)] = info.name
G.datatexts.settings.Currencies.tooltipData[i] = { info.name, currencyID, headerIndex, G.datatexts.settings.Currencies.tooltipData[headerIndex][4] }
E.global.datatexts.settings.Currencies.tooltipData[i] = E.global.datatexts.settings.Currencies.tooltipData[i] or { info.name, currencyID, headerIndex, G.datatexts.settings.Currencies.tooltipData[headerIndex][4] }
E.global.datatexts.settings.Currencies.tooltipData[i][1] = info.name
end
end
i = i + 1
end
for k = 1, listSize do
local info = C_CurrencyInfo_GetCurrencyListInfo(k)
if not info then
break
elseif info.isHeader and info.isHeaderExpanded and Collapsed[info.name] then
C_CurrencyInfo_ExpandCurrencyList(k, false)
end
end
wipe(Collapsed)
for index = 1, GetNumSpecializations() do
local id, name, _, icon, _, statID = GetSpecializationInfo(index)
if id then
DT.SPECIALIZATION_CACHE[index] = { id = id, name = name, icon = icon, statID = statID }
DT.SPECIALIZATION_CACHE[id] = { name = name, icon = icon }
end
end
end
function DT:CURRENCY_DISPLAY_UPDATE(_, currencyType)
if currencyType and not DT.CurrencyList[tostring(currencyType)] then
local info = C_CurrencyInfo_GetCurrencyInfo(currencyType)
if info and info.name then
DT.CurrencyList[tostring(currencyType)] = info.name
end
end
end
function DT:PLAYER_ENTERING_WORLD()
DT:LoadDataTexts()
end
function DT:Initialize()
DT.Initialized = true
DT.db = E.db.datatexts
DT.EasyMenu:SetClampedToScreen(true)
DT.EasyMenu:EnableMouse(true)
DT.EasyMenu.MenuSetItem = function(dt, value)
DT.db.panels[dt.parentName][dt.pointIndex] = value
DT:UpdatePanelInfo(dt.parentName, dt.parent)
if ActivateHyperMode then
DT:EnableHyperMode(dt.parent)
end
DT.SelectedDatatext = nil
CloseDropDownMenus()
end
DT.EasyMenu.MenuGetItem = function(dt, value)
return dt and (DT.db.panels[dt.parentName] and DT.db.panels[dt.parentName][dt.pointIndex] == value)
end
if E.private.skins.blizzard.enable and E.private.skins.blizzard.tooltip then
TT:SetStyle(DT.tooltip)
end
-- Ignore header font size on DatatextTooltip
local font = LSM:Fetch('font', E.db.tooltip.font)
local fontOutline = E.db.tooltip.fontOutline
local textSize = E.db.tooltip.textFontSize
_G.DataTextTooltipTextLeft1:FontTemplate(font, textSize, fontOutline)
_G.DataTextTooltipTextRight1:FontTemplate(font, textSize, fontOutline)
LDB.RegisterCallback(E, 'LibDataBroker_DataObjectCreated', DT.SetupObjectLDB)
DT:RegisterLDB() -- LibDataBroker
DT:RegisterCustomCurrencyDT() -- Register all the user created currency datatexts from the 'CustomCurrency' DT.
for name, db in pairs(E.global.datatexts.customPanels) do
DT:BuildPanelFrame(name, db, true)
end
do -- we need to register the panels to access them for the text
DT.BattleStats.LEFT.panel = _G.LeftChatDataPanel.dataPanels
DT.BattleStats.RIGHT.panel = _G.RightChatDataPanel.dataPanels
end
DT:PopulateData()
DT:RegisterHyperDT()
DT:RegisterEvent('PLAYER_ENTERING_WORLD')
DT:RegisterEvent('CURRENCY_DISPLAY_UPDATE')
end
--[[
DT:RegisterDatatext(name, events, eventFunc, updateFunc, clickFunc, onEnterFunc, onLeaveFunc, localizedName)
name - name of the datatext (required)
category - name of the category the datatext belongs to.
events - must be a table with string values of event names to register
eventFunc - function that gets fired when an event gets triggered
updateFunc - onUpdate script target function
click - function to fire when clicking the datatext
onEnterFunc - function to fire OnEnter
onLeaveFunc - function to fire OnLeave, if not provided one will be set for you that hides the tooltip.
localizedName - localized name of the datetext
objectEvent - register events on an object, using E.RegisterEventForObject instead of panel.RegisterEvent
colorUpdate - function that fires when called from the config when you change the dt options.
]]
function DT:RegisterDatatext(name, category, events, eventFunc, updateFunc, clickFunc, onEnterFunc, onLeaveFunc, localizedName, objectEvent, colorUpdate)
if not name then return end
if type(category) ~= 'string' and category ~= nil then return E:Print(format('%s is an invalid DataText.', name)) end
local data = { name = name, category = category }
if type(events) == 'function' then
return E:Print(format('%s is an invalid DataText. Events must be registered as a table or a string.', name))
else
data.events = type(events) == 'string' and { strsplit('[, ]', events) } or events
data.eventFunc = eventFunc
data.objectEvent = objectEvent
end
if updateFunc and type(updateFunc) == 'function' then
data.onUpdate = updateFunc
end
if clickFunc and type(clickFunc) == 'function' then
data.onClick = clickFunc
end
if onEnterFunc and type(onEnterFunc) == 'function' then
data.onEnter = onEnterFunc
end
if onLeaveFunc and type(onLeaveFunc) == 'function' then
data.onLeave = onLeaveFunc
end
if localizedName and type(localizedName) == 'string' then
data.localizedName = localizedName
end
if colorUpdate and type(colorUpdate) == 'function' then
data.colorUpdate = colorUpdate
end
DT.RegisteredDataTexts[name] = data
return data
end
E:RegisterModule(DT:GetName())