ElvUI/Modules/DataTexts/SpecSwitch.lua

161 lines
5.5 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 _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"])