local addonId, edTable = ... local Details = _G._detalhes local AceLocale = LibStub("AceLocale-3.0") local Loc = AceLocale:GetLocale("Details_EncounterDetails") local Graphics = LibStub:GetLibrary("LibGraph-2.0") local ipairs = ipairs local _GetSpellInfo = Details.getspellinfo local unpack = unpack local detailsFramework = DetailsFramework local CreateFrame = CreateFrame local GameCooltip = GameCooltip local wipe = table.wipe local _ local encounterDetails = _G.EncounterDetailsGlobal local edFrame = encounterDetails.Frame local phaseFrame = CreateFrame("frame", "EncounterDetailsPhaseFrame", edFrame, "BackdropTemplate") phaseFrame:SetAllPoints() phaseFrame:SetFrameLevel(edFrame:GetFrameLevel()+1) phaseFrame.DamageTable = {} phaseFrame.HealingTable = {} phaseFrame.LastPhaseSelected = 1 phaseFrame.CurrentSegment = {} phaseFrame.PhaseButtons = {} EncounterDetailsPhaseFrame:Hide() local phaseButtonTemplateHighlight = { backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}, backdropcolor = {.7, .7, .7, .5}, onentercolor = {1, 1, 1, .5}, backdropbordercolor = {.70, .70, .70, 1}, } local phaseButtonTemplate = { backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}, backdropcolor = {.7, .7, .7, .5}, onentercolor = {1, 1, 1, .5}, backdropbordercolor = {0, 0, 0, 1}, } local scrollWidth, scrollHeight, scrollLineAmount, scrollLineHeight = 250, 420, 20, 20 local phasesY = -88 local anchorY = -120 phaseFrame:SetScript("OnShow", function() phaseFrame.OnSelectPhase(1) end) function phaseFrame:ClearAll() --disable all buttons for i = 1, #phaseFrame.PhaseButtons do phaseFrame.PhaseButtons[i]:SetTemplate(phaseButtonTemplate) phaseFrame.PhaseButtons[i]:Disable() end --update damage and healing scrolls wipe(phaseFrame.DamageTable) wipe(phaseFrame.HealingTable) --refresh the scroll phaseFrame.Damage_Scroll:Refresh() phaseFrame.Heal_Scroll:Refresh() --clear phase bars phaseFrame:ClearPhaseBars() end local selectSegment = function(_, _, phaseSelected) phaseFrame["OnSelectPhase"](phaseSelected) end function phaseFrame.OnSelectPhase(phaseSelected) phaseFrame:ClearAll() --get the selected segment phaseFrame.CurrentSegment = encounterDetails:GetCombat(encounterDetails._segment) if (not phaseFrame.CurrentSegment) then return end --get the heal and damage for phase selected local phaseData = phaseFrame.CurrentSegment.PhaseData if (not phaseData) then return end phaseSelected = phaseSelected or phaseFrame.LastPhaseSelected phaseFrame.LastPhaseSelected = phaseSelected local phases = phaseFrame:GetPhaseTimers(phaseFrame.CurrentSegment, true) for buttonIndex, phase in ipairs(phases) do local button = phaseFrame.PhaseButtons[buttonIndex] if (phase == phaseSelected) then button:SetTemplate(phaseButtonTemplateHighlight) else button:SetTemplate(phaseButtonTemplate) if (phaseFrame.CurrentSegment.PhaseData.damage[phase]) then button:Enable() else button:Disable() end end button:SetText(phase) button:SetClickFunction(selectSegment, phase) end if (not phaseData.damage[phaseSelected]) then phaseFrame:ClearAll() return end --update damage and healing scrolls wipe(phaseFrame.DamageTable) for charName, amount in pairs(phaseData.damage[phaseSelected]) do table.insert(phaseFrame.DamageTable, {charName, amount}) end table.sort(phaseFrame.DamageTable, function(a, b) return a[2] > b[2] end) wipe(phaseFrame.HealingTable) for charName, amount in pairs(phaseData.heal[phaseSelected]) do table.insert(phaseFrame.HealingTable, {charName, amount}) end table.sort(phaseFrame.HealingTable, function(a, b) return a[2] > b[2] end) --refresh the scroll phaseFrame.Damage_Scroll:Refresh() phaseFrame.Heal_Scroll:Refresh() phaseFrame:UpdatePhaseBars() end local PhaseSelectLabel = detailsFramework:CreateLabel(phaseFrame, "Select Phase:", 12, "orange") local DamageLabel = detailsFramework:CreateLabel(phaseFrame, "Damage Done") local HealLabel = detailsFramework:CreateLabel(phaseFrame, "Healing Done") local PhaseTimersLabel = detailsFramework:CreateLabel(phaseFrame, "Time Spent on Each Phase") local report_damage = function(IsCurrent, IsReverse, AmtLines) local result = {} local reportFunc = function(IsCurrent, IsReverse, AmtLines) AmtLines = AmtLines + 1 if (#result > AmtLines) then for i = #result, AmtLines+1, -1 do table.remove(result, i) end end encounterDetails:SendReportLines(result) end table.insert(result, "Details!: Damage for Phase " .. phaseFrame.LastPhaseSelected .. " of " ..(phaseFrame.CurrentSegment and phaseFrame.CurrentSegment.is_boss and phaseFrame.CurrentSegment.is_boss.name or "Unknown") .. ":") for i = 1, #phaseFrame.DamageTable do table.insert(result, encounterDetails:GetOnlyName(phaseFrame.DamageTable[i][1]) .. ": " .. Details:ToK(math.floor(phaseFrame.DamageTable[i][2]))) end encounterDetails:SendReportWindow(reportFunc, nil, nil, true) end local Report_DamageButton = detailsFramework:CreateButton(phaseFrame, report_damage, 16, 16, "report") Report_DamageButton:SetPoint("left", DamageLabel, "left", scrollWidth-44, 0) Report_DamageButton.textcolor = "gray" Report_DamageButton.textsize = 9 local report_healing = function() local result = {} local reportFunc = function(IsCurrent, IsReverse, AmtLines) AmtLines = AmtLines + 1 if (#result > AmtLines) then for i = #result, AmtLines+1, -1 do table.remove(result, i) end end encounterDetails:SendReportLines(result) end table.insert(result, "Details!: Healing for Phase " .. phaseFrame.LastPhaseSelected .. " of " ..(phaseFrame.CurrentSegment and phaseFrame.CurrentSegment.is_boss and phaseFrame.CurrentSegment.is_boss.name or "Unknown") .. ":") for i = 1, #phaseFrame.HealingTable do table.insert(result, encounterDetails:GetOnlyName(phaseFrame.HealingTable[i][1]) .. ": " .. Details:ToK(math.floor(phaseFrame.HealingTable[i][2]))) end encounterDetails:SendReportWindow(reportFunc, nil, nil, true) end local Report_HealingButton = detailsFramework:CreateButton(phaseFrame, report_healing, 16, 16, "report") Report_HealingButton:SetPoint("left", HealLabel, "left", scrollWidth-44, 0) Report_HealingButton.textcolor = "gray" Report_HealingButton.textsize = 9 PhaseSelectLabel:SetPoint("topleft", phaseFrame, "topleft", 10, phasesY) DamageLabel:SetPoint("topleft", phaseFrame, "topleft", 10, anchorY) HealLabel:SetPoint("topleft", phaseFrame, "topleft", scrollWidth + 40, anchorY) PhaseTimersLabel:SetPoint("topleft", phaseFrame, "topleft",(scrollWidth * 2) +(40*2), anchorY) for i = 1, 10 do local button = detailsFramework:CreateButton(phaseFrame, phaseFrame.OnSelectPhase, 60, 20, "", i) button:SetPoint("left", PhaseSelectLabel, "right", 8 +((i-1) * 61), 0) table.insert(phaseFrame.PhaseButtons, button) end local ScrollRefresh = function(self, data, offset, total_lines) local formatToK = Details:GetCurrentToKFunction() local removeRealm = Details.GetOnlyName local topValue = data[1] and data[1][2] for i = 1, scrollLineAmount do local index = i + offset local player = data[index] if (player) then local line = self:GetLine(i) local texture, L, R, T, B = Details:GetPlayerIcon(player[1], phaseFrame.CurrentSegment) line.icon:SetTexture(texture) line.icon:SetTexCoord(L, R, T, B) line.name:SetText(index .. ". " .. removeRealm(_, player[1])) line.done:SetText(formatToK(_, player[2]) .. " (" .. string.format("%.1f", player[2] / topValue * 100) .. "%)") line.statusbar:SetValue(player[2] / topValue * 100) local actorClass = Details:GetClass(player[1]) if (actorClass) then line.statusbar:SetColor(actorClass) else line.statusbar:SetColor("silver") end end end end local onEnterLine = function(self) self:SetBackdropColor(unpack(edTable.defaultBackgroundColor_OnEnter)) end local onLeaveLine = function(self) self:SetBackdropColor(unpack(edTable.defaultBackgroundColor)) end local scrollCreateLine = function(self, index) local line = CreateFrame("button", "$parentLine" .. index, self,"BackdropTemplate") line:SetPoint("topleft", self, "topleft", 0, -((index-1)*(scrollLineHeight+1))) line:SetSize(scrollWidth, scrollLineHeight) line:SetScript("OnEnter", onEnterLine) line:SetScript("OnLeave", onLeaveLine) line:SetScript("OnClick", line_onclick) line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor(unpack(edTable.defaultBackgroundColor)) local statusBar = detailsFramework:CreateBar(line, encounterDetails.Frame.DefaultBarTexture, 1, 1, 100) statusBar:SetAllPoints(line) statusBar.backgroundtexture = encounterDetails.Frame.DefaultBarTexture statusBar.backgroundcolor = {.3, .3, .3, .3} local icon = statusBar:CreateTexture("$parentIcon", "overlay") icon:SetSize(scrollLineHeight, scrollLineHeight) local name = statusBar:CreateFontString("$parentName", "overlay", "GameFontNormal") detailsFramework:SetFontSize(name, 10) icon:SetPoint("left", line, "left", 2, 0) name:SetPoint("left", icon, "right", 2, 0) detailsFramework:SetFontColor(name, "white") local done = statusBar:CreateFontString("$parentDone", "overlay", "GameFontNormal") detailsFramework:SetFontSize(done, 10) detailsFramework:SetFontColor(done, "white") done:SetPoint("right", line, "right", -2, 0) line.icon = icon line.name = name line.done = done line.statusbar = statusBar name:SetHeight(10) name:SetJustifyH("left") return line end local damageScroll = detailsFramework:CreateScrollBox(phaseFrame, "$parentDamageScroll", ScrollRefresh, phaseFrame.DamageTable, scrollWidth, scrollHeight, scrollLineAmount, scrollLineHeight) local healScroll = detailsFramework:CreateScrollBox(phaseFrame, "$parentHealScroll", ScrollRefresh, phaseFrame.HealingTable, scrollWidth, scrollHeight, scrollLineAmount, scrollLineHeight) damageScroll:SetPoint("topleft", DamageLabel.widget, "bottomleft", 0, -4) healScroll:SetPoint("topleft", HealLabel.widget, "bottomleft", 0, -4) detailsFramework:ReskinSlider(damageScroll, 4) detailsFramework:ReskinSlider(healScroll, 4) for i = 1, scrollLineAmount do damageScroll:CreateLine(scrollCreateLine) end phaseFrame.Damage_Scroll = damageScroll damageScroll:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}) damageScroll:SetBackdropColor(0, 0, 0, .4) for i = 1, scrollLineAmount do healScroll:CreateLine(scrollCreateLine) end phaseFrame.Heal_Scroll = healScroll healScroll:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}) healScroll:SetBackdropColor(0, 0, 0, .4) phaseFrame.PhasesBars = {} phaseFrame.PhasesSegmentCompare = {} local PhaseBarOnEnter = function(self) phaseFrame:UpdateSegmentCompareBars(self.phase) self:SetBackdropColor(unpack(edTable.defaultBackgroundColor_OnEnter)) end local PhaseBarOnLeave = function(self) phaseFrame:ClearSegmentCompareBars() self:SetBackdropColor(unpack(edTable.defaultBackgroundColor)) end local PhaseBarOnClick = function(self) --report end --cria as linhas mostrando o tempo decorride de cada phase for i = 1, 10 do local line = CreateFrame("button", "$parentPhaseBar" .. i, phaseFrame,"BackdropTemplate") line:SetPoint("topleft", PhaseTimersLabel.widget, "bottomleft", 0, -((i-1)*(31)) - 4) line:SetSize(175, 30) line:SetScript("OnEnter", PhaseBarOnEnter) line:SetScript("OnLeave", PhaseBarOnLeave) line:SetScript("OnClick", PhaseBarOnClick) line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor(unpack(edTable.defaultBackgroundColor)) local icon = line:CreateTexture("$parentIcon", "overlay") icon:SetSize(16, 16) icon:SetTexture([[Interface\AddOns\Details\images\clock]]) local name = line:CreateFontString("$parentName", "overlay", "GameFontNormal") detailsFramework:SetFontSize(name, 10) local done = line:CreateFontString("$parentDone", "overlay", "GameFontNormal") detailsFramework:SetFontSize(done, 10) icon:SetPoint("left", line, "left", 2, 0) name:SetPoint("left", icon, "right", 2, 0) done:SetPoint("right", line, "right", -3, 0) line.icon = icon line.name = name line.done = done name:SetHeight(10) name:SetJustifyH("left") table.insert(phaseFrame.PhasesBars, line) end --cria a linha do segmento para a compara��o, � o que fica na parte direita da tela --ele � acessado para mostrar quando passar o mouse sobre uma das barras de phase for i = 1, 20 do local line = CreateFrame("button", "$parentSegmentCompareBar" .. i, phaseFrame,"BackdropTemplate") line:SetPoint("topleft", PhaseTimersLabel.widget, "bottomleft", 175+10, -((i-1)*(scrollLineHeight+1)) - 4) line:SetSize(150, scrollLineHeight) line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor(unpack(edTable.defaultBackgroundColor)) line:Hide() local name = line:CreateFontString("$parentName", "overlay", "GameFontNormal") detailsFramework:SetFontSize(name, 9) name:SetPoint("left", line, "left", 2, 0) local done = line:CreateFontString("$parentDone", "overlay", "GameFontNormal") detailsFramework:SetFontSize(done, 9) done:SetPoint("right", line, "right", -2, 0) line.name = name line.done = done name:SetHeight(10) name:SetJustifyH("left") table.insert(phaseFrame.PhasesSegmentCompare, line) end function phaseFrame:ClearPhaseBars() for i = 1, #phaseFrame.PhasesBars do local bar = phaseFrame.PhasesBars[i] bar.name:SetText("") bar.done:SetText("") bar.phase = nil bar:Hide() end end function phaseFrame:ClearSegmentCompareBars() for i = 1, #phaseFrame.PhasesSegmentCompare do phaseFrame.PhasesSegmentCompare[i]:Hide() end end function phaseFrame:GetPhaseTimers(segment, ordered) local t = {} segment = segment or phaseFrame.CurrentSegment for phaseIT = 1, #segment.PhaseData do local phase, startAt = unpack(segment.PhaseData[phaseIT]) --phase iterator local endAt = segment.PhaseData[phaseIT+1] and segment.PhaseData[phaseIT+1][2] or segment:GetCombatTime() local elapsed = endAt - startAt t[phase] = (t[phase] or 0) + elapsed end if (ordered) then local order = {} for phase, _ in pairs(t) do table.insert(order, phase) end table.sort(order, function(a, b) return a < b end) return order, t end return t end --executa quando atualizar o segment geral function phaseFrame:UpdatePhaseBars() local timers, hash = phaseFrame:GetPhaseTimers(phaseFrame.CurrentSegment, true) local i = 1 for index, phase in ipairs(timers) do local timer = hash[phase] phaseFrame.PhasesBars[i].name:SetText("|cFFC0C0C0Phase:|r |cFFFFFFFF" .. phase) phaseFrame.PhasesBars[i].done:SetText(detailsFramework:IntegerToTimer(timer)) phaseFrame.PhasesBars[i].phase = phase phaseFrame.PhasesBars[i]:Show() i = i + 1 end end --executa quando passar o mouse sobre uma bnarra de phase function phaseFrame:UpdateSegmentCompareBars(phase) --segmento atual(numero) local segmentNumber = encounterDetails._segment local segmentTable = phaseFrame.CurrentSegment local bossID = segmentTable:GetBossInfo() and segmentTable:GetBossInfo().id local index = 1 for i, segment in ipairs(Details:GetCombatSegments()) do if (segment:GetBossInfo() and segment:GetBossInfo().id == bossID) then local bar = phaseFrame.PhasesSegmentCompare [index] local timers = phaseFrame:GetPhaseTimers(segment) if (timers [phase]) then if (segment ~= segmentTable) then bar.name:SetText("Segment " .. i .. ":") detailsFramework:SetFontColor(bar.name, "orange") bar.done:SetText(detailsFramework:IntegerToTimer(timers [phase])) detailsFramework:SetFontColor(bar.done, "orange") else bar.name:SetText("Segment " .. i .. ":") detailsFramework:SetFontColor(bar.name, "white") bar.done:SetText(detailsFramework:IntegerToTimer(timers [phase])) detailsFramework:SetFontColor(bar.done, "white") end else bar.name:SetText("Segment " .. i .. ":") detailsFramework:SetFontColor(bar.name, "red") bar.done:SetText("--x--x--") end bar:Show() index = index + 1 end end end