You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
10 KiB

local Details = Details
local GameTooltip = GameTooltip
local detailsFramework = DetailsFramework
local unpack = unpack
local CreateFrame = CreateFrame
local GetSpellInfo = GetSpellInfo
local createAuraTabOnBreakdownWindow = function(tab, frame)
local scroll_line_amount = 25
local scroll_width = 410
local scrollHeight = 495
local scroll_line_height = 19
local text_size = 10
local debuffScrollStartX = 445
local headerOffsetsBuffs = {
--buff label, uptime, applications, refreshes, wa
6, 190, 290, 336, 380
}
local headerOffsetsDebuffs = {
--debuff label, uptime, applications, refreshes, wa
426, 630, 729, 775, 820
}
local onEnterLine = function(self)
GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT")
Details:GameTooltipSetSpellByID(self.spellID)
GameTooltip:Show()
self:SetBackdropColor(1, 1, 1, .2)
end
local onLeaveLine = function(self)
GameTooltip:Hide()
self:SetBackdropColor(unpack(self.BackgroundColor))
end
local onClickLine = function(self)
end
local createLineScroll = function(self, index)
local line = CreateFrame("button", "$parentLine" .. index, self,"BackdropTemplate")
line:SetPoint("topleft", self, "topleft", 1, -((index-1)*(scroll_line_height+1)))
line:SetSize(scroll_width -2, scroll_line_height)
line:SetScript("OnEnter", onEnterLine)
line:SetScript("OnLeave", onLeaveLine)
line:SetScript("OnClick", onClickLine)
line:SetBackdrop({bgFile =[[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
line:SetBackdropColor(0, 0, 0, 0.2)
local iconTexture = line:CreateTexture("$parentIcon", "overlay")
iconTexture:SetSize(scroll_line_height -2 , scroll_line_height - 2)
local nameLabel = line:CreateFontString("$parentName", "overlay", "GameFontNormal")
local uptimeLabel = line:CreateFontString("$parentUptime", "overlay", "GameFontNormal")
local uptimePercentLabel = line:CreateFontString("$parentPercent", "overlay", "GameFontNormal")
local applyLabel = line:CreateFontString("$parentApplyed", "overlay", "GameFontNormal")
local refreshLabel = line:CreateFontString("$parentRefreshed", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(nameLabel, text_size)
detailsFramework:SetFontSize(uptimeLabel, text_size)
detailsFramework:SetFontSize(uptimePercentLabel, text_size)
detailsFramework:SetFontSize(applyLabel, text_size)
detailsFramework:SetFontSize(refreshLabel, text_size)
iconTexture:SetPoint("left", line, "left", 2, 0)
nameLabel:SetPoint("left", iconTexture, "right", 2, 0)
uptimeLabel:SetPoint("left", line, "left", 186, 0)
uptimePercentLabel:SetPoint("left", line, "left", 220, 0)
applyLabel:SetPoint("left", line, "left", 276, 0)
refreshLabel:SetPoint("left", line, "left", 322, 0)
line.Icon = iconTexture
line.Name = nameLabel
line.Uptime = uptimeLabel
line.UptimePercent = uptimePercentLabel
line.Apply = applyLabel
line.Refresh = refreshLabel
nameLabel:SetJustifyH("left")
uptimeLabel:SetJustifyH("left")
uptimePercentLabel:SetJustifyH("left")
applyLabel:SetJustifyH("center")
refreshLabel:SetJustifyH("center")
applyLabel:SetWidth(26)
refreshLabel:SetWidth(26)
return line
end
local lineBackgroundColor = {{1, 1, 1, .1}, {1, 1, 1, 0}}
local scrollRefreshBuffs = function(self, data, offset, total_lines)
for i = 1, total_lines do
local index = i + offset
local aura = data[index]
if (aura) then
local line = self:GetLine(i)
line.spellID = aura.spellID
line.Icon:SetTexture(aura[1])
line.Icon:SetTexCoord(.1, .9, .1, .9)
line.Name:SetText(aura[2])
line.Uptime:SetText(detailsFramework:IntegerToTimer(aura[3]))
line.UptimePercent:SetText("|cFFBBAAAA" .. math.floor(aura[6]) .. "%|r")
line.Apply:SetText(aura[4])
line.Refresh:SetText(aura[5])
if (i % 2 == 0) then
line:SetBackdropColor(unpack(lineBackgroundColor[1]))
line.BackgroundColor = lineBackgroundColor[1]
else
line:SetBackdropColor(unpack(lineBackgroundColor[2]))
line.BackgroundColor = lineBackgroundColor[2]
end
end
end
end
local createTitleDesc_Frame = function(anchorWidget, desc)
local newTitleDescFrame = CreateFrame("frame", nil, frame)
newTitleDescFrame:SetSize(40, 20)
newTitleDescFrame:SetPoint("center", anchorWidget, "center")
newTitleDescFrame:SetScript("OnEnter", function()
GameTooltip:SetOwner(newTitleDescFrame, "ANCHOR_TOPRIGHT")
GameTooltip:AddLine(desc)
GameTooltip:Show()
end)
newTitleDescFrame:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
return newTitleDescFrame
end
local buffLabel = detailsFramework:CreateLabel(frame, "Buff Name")
buffLabel:SetPoint(headerOffsetsBuffs[1], -10)
local uptimeLabel = detailsFramework:CreateLabel(frame, "Uptime")
uptimeLabel:SetPoint(headerOffsetsBuffs[2], -10)
local appliedLabel = detailsFramework:CreateLabel(frame, "A")
appliedLabel:SetPoint(headerOffsetsBuffs[3], -10)
createTitleDesc_Frame(appliedLabel.widget, "applications")
local refreshedLabel = detailsFramework:CreateLabel(frame, "R")
refreshedLabel:SetPoint(headerOffsetsBuffs[4], -10)
createTitleDesc_Frame(refreshedLabel.widget, "refreshes")
local buffScroll = detailsFramework:CreateScrollBox(frame, "$parentBuffUptimeScroll", scrollRefreshBuffs, {}, scroll_width, scrollHeight, scroll_line_amount, scroll_line_height)
buffScroll:SetPoint("topleft", frame, "topleft", 5, -30)
for i = 1, scroll_line_amount do
local line = buffScroll:CreateLine(createLineScroll)
line.AuraType = "BUFF"
end
detailsFramework:ReskinSlider(buffScroll)
tab.BuffScroll = buffScroll
local debuffLabel = detailsFramework:CreateLabel(frame, "Debuff Name")
debuffLabel:SetPoint(headerOffsetsDebuffs[1], -10)
local uptimeLabel2 = detailsFramework:CreateLabel(frame, "Uptime")
uptimeLabel2:SetPoint(headerOffsetsDebuffs[2], -10)
local appliedLabel2 = detailsFramework:CreateLabel(frame, "A")
appliedLabel2:SetPoint(headerOffsetsDebuffs[3], -10)
createTitleDesc_Frame(appliedLabel2.widget, "applications")
local refreshedLabel2 = detailsFramework:CreateLabel(frame, "R")
refreshedLabel2:SetPoint(headerOffsetsDebuffs[4], -10)
createTitleDesc_Frame(refreshedLabel2.widget, "refreshes")
local debuffScroll = detailsFramework:CreateScrollBox(frame, "$parentDebuffUptimeScroll", scrollRefreshBuffs, {}, scroll_width, scrollHeight, scroll_line_amount, scroll_line_height)
debuffScroll:SetPoint("topleft", frame, "topleft", debuffScrollStartX, -30)
for i = 1, scroll_line_amount do
local line = debuffScroll:CreateLine(createLineScroll)
line.AuraType = "DEBUFF"
end
detailsFramework:ReskinSlider(debuffScroll)
tab.DebuffScroll = debuffScroll
if (not frame.__background) then
DetailsFramework:ApplyStandardBackdrop(frame)
frame.__background:SetAlpha(0.6)
end
end
local aurasTabFillCallback = function(tab, player, combat)
---@type actor
local miscActor = combat:GetActor(DETAILS_ATTRIBUTE_MISC, player:Name())
---@type number
local combatTime = combat:GetCombatTime()
if (miscActor) then
do --buffs
local newAuraTable = {}
local spellContainer = miscActor:GetSpellContainer("buff")
if (spellContainer) then
for spellId, spellTable in spellContainer:ListSpells() do
local spellName, _, spellIcon = GetSpellInfo(spellId)
local uptime = spellTable.uptime or 0
table.insert(newAuraTable, {spellIcon, spellName, uptime, spellTable.appliedamt, spellTable.refreshamt, uptime / combatTime * 100, spellID = spellId})
end
end
table.sort(newAuraTable, Details.Sort3)
tab.BuffScroll:SetData(newAuraTable)
tab.BuffScroll:Refresh()
end
do --debuffs
local newAuraTable = {}
local spellContainer = miscActor:GetSpellContainer("debuff")
if (spellContainer) then
for spellId, spellTable in spellContainer:ListSpells() do
local spellName, _, spellIcon = GetSpellInfo(spellId)
table.insert(newAuraTable, {spellIcon, spellName, spellTable.uptime, spellTable.appliedamt, spellTable.refreshamt, spellTable.uptime / combatTime * 100, spellID = spellId})
end
end
table.sort(newAuraTable, Details.Sort3)
tab.DebuffScroll:SetData(newAuraTable)
tab.DebuffScroll:Refresh()
end
end
end
local iconTableAuras = {
texture = [[Interface\AddOns\Details\images\icons]],
coords = {257/512, 278/512, 0/512, 19/512},
width = 16,
height = 16,
}
function Details:InitializeAurasTab()
--check if the tab is already created
for i = 1, #Details.player_details_tabs do
local tabButton = Details.player_details_tabs[i]
if (tabButton.tabname == "Auras") then
return
end
end
Details:CreatePlayerDetailsTab("Auras", --[1] tab name
"Auras", --[2] localized name
function(tabOBject, playerObject) --[3] condition
return true
end,
aurasTabFillCallback, --[4] fill function
nil, --[5] onclick
createAuraTabOnBreakdownWindow, --[6] oncreate
iconTableAuras --icon table
)
end