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())