local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB local DT = E:GetModule('DataTexts') local _G = _G local ipairs, wipe = ipairs, wipe local format, next, strjoin = format, next, strjoin local GetLootSpecialization = GetLootSpecialization local GetNumSpecializations = GetNumSpecializations local GetPvpTalentInfoByID = GetPvpTalentInfoByID local GetSpecialization = GetSpecialization local GetSpecializationInfo = GetSpecializationInfo local GetTalentInfo = GetTalentInfo local HideUIPanel = HideUIPanel local IsShiftKeyDown = IsShiftKeyDown local SetLootSpecialization = SetLootSpecialization local SetSpecialization = SetSpecialization local ShowUIPanel = ShowUIPanel local LOOT = LOOT local TALENTS = TALENTS local PVP_TALENTS = PVP_TALENTS local SELECT_LOOT_SPECIALIZATION = SELECT_LOOT_SPECIALIZATION local LOOT_SPECIALIZATION_DEFAULT = LOOT_SPECIALIZATION_DEFAULT local C_SpecializationInfo_GetAllSelectedPvpTalentIDs = C_SpecializationInfo.GetAllSelectedPvpTalentIDs local displayString, lastPanel, active = '' local activeString = strjoin('', '|cff00FF00' , _G.ACTIVE_PETS, '|r') local inactiveString = strjoin('', '|cffFF0000', _G.FACTION_INACTIVE, '|r') local menuList = { { text = SELECT_LOOT_SPECIALIZATION, isTitle = true, notCheckable = true }, { checked = function() return GetLootSpecialization() == 0 end, func = function() SetLootSpecialization(0) end }, } local specList = { { text = _G.SPECIALIZATION, isTitle = true, notCheckable = true }, } local mainIcon = '|T%s:16:16:0:0:64:64:4:60:4:60|t' local function OnEvent(self) lastPanel = self if #menuList == 2 then for index = 1, GetNumSpecializations() do local id, name, _, icon = GetSpecializationInfo(index) if id then menuList[index + 2] = { text = name, checked = function() return GetLootSpecialization() == id end, func = function() SetLootSpecialization(id) end } specList[index + 1] = { text = format('|T%s:14:14:0:0:64:64:4:60:4:60|t %s', icon, name), checked = function() return GetSpecialization() == index end, func = function() SetSpecialization(index) end } end end end local specIndex = GetSpecialization() local specialization = GetLootSpecialization() local info = DT.SPECIALIZATION_CACHE[specIndex] if not info then self.text:SetText('N/A') return end active = specIndex local spec = format(mainIcon, info.icon) if specialization == 0 or info.id == specialization then self.text:SetFormattedText('%s %s', spec, info.name) else info = DT.SPECIALIZATION_CACHE[specialization] self.text:SetFormattedText('%s: %s %s: %s', L["Spec"], spec, LOOT, format(mainIcon, info.icon)) end end local listIcon = '|T%s:16:16:0:0:50:50:4:46:4:46|t' local function AddTexture(texture) return texture and format(listIcon, texture) or '' end local function OnEnter() DT.tooltip:ClearLines() for i, info in ipairs(DT.SPECIALIZATION_CACHE) do DT.tooltip:AddLine(strjoin(' ', format(displayString, info.name), AddTexture(info.icon), (i == active and activeString or inactiveString)), 1, 1, 1) end DT.tooltip:AddLine(' ') local specialization = GetLootSpecialization() local sameSpec = specialization == 0 and GetSpecialization() local specIndex = DT.SPECIALIZATION_CACHE[sameSpec or specialization] if specIndex and specIndex.name then DT.tooltip:AddLine(format('|cffFFFFFF%s:|r %s', SELECT_LOOT_SPECIALIZATION, sameSpec and format(LOOT_SPECIALIZATION_DEFAULT, specIndex.name) or specIndex.name)) end DT.tooltip:AddLine(' ') DT.tooltip:AddLine(TALENTS, 0.69, 0.31, 0.31) for i = 1, _G.MAX_TALENT_TIERS do for j = 1, 3 do local _, name, icon, selected = GetTalentInfo(i, j, 1) if selected then DT.tooltip:AddLine(AddTexture(icon)..' '..name) end end end local pvpTalents = C_SpecializationInfo_GetAllSelectedPvpTalentIDs() if next(pvpTalents) then DT.tooltip:AddLine(' ') DT.tooltip:AddLine(PVP_TALENTS, 0.69, 0.31, 0.31) for i, talentID in next, pvpTalents do if i > 4 then break end local _, name, icon, _, _, _, unlocked = GetPvpTalentInfoByID(talentID) if name and unlocked then DT.tooltip:AddLine(AddTexture(icon)..' '..name) end end end DT.tooltip:AddLine(' ') DT.tooltip:AddLine(L["|cffFFFFFFLeft Click:|r Change Talent Specialization"]) DT.tooltip:AddLine(L["|cffFFFFFFShift + Left Click:|r Show Talent Specialization UI"]) DT.tooltip:AddLine(L["|cffFFFFFFRight Click:|r Change Loot Specialization"]) DT.tooltip:Show() end local function OnClick(self, button) local specIndex = GetSpecialization() if not specIndex then return end if button == 'LeftButton' then if not _G.PlayerTalentFrame then _G.LoadAddOn('Blizzard_TalentUI') end if IsShiftKeyDown() then if not _G.PlayerTalentFrame:IsShown() then ShowUIPanel(_G.PlayerTalentFrame) else HideUIPanel(_G.PlayerTalentFrame) end else DT:SetEasyMenuAnchor(DT.EasyMenu, self) _G.EasyMenu(specList, DT.EasyMenu, nil, nil, nil, 'MENU') end else local _, specName = GetSpecializationInfo(specIndex) menuList[2].text = format(LOOT_SPECIALIZATION_DEFAULT, specName) DT:SetEasyMenuAnchor(DT.EasyMenu, self) _G.EasyMenu(menuList, DT.EasyMenu, nil, nil, nil, 'MENU') end end local function ValueColorUpdate() displayString = strjoin('', '|cffFFFFFF%s:|r ') if lastPanel then OnEvent(lastPanel) end end E.valueColorUpdateFuncs[ValueColorUpdate] = true DT:RegisterDatatext('Talent/Loot Specialization', nil, {'CHARACTER_POINTS_CHANGED', 'PLAYER_TALENT_UPDATE', 'ACTIVE_TALENT_GROUP_CHANGED', 'PLAYER_LOOT_SPEC_UPDATED'}, OnEvent, nil, OnClick, OnEnter, nil, L["Talent/Loot Specialization"])