From c4040ac4de673d7ecc85174f926f89508f1f21a2 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Mon, 26 Feb 2024 13:53:27 -0300 Subject: [PATCH] Added report to breakdown window --- .../breakdown_spells_phaseframes.lua | 29 ++++ .../breakdown_spells_spellframes.lua | 56 +++++++- .../breakdown_spells_targetframes.lua | 38 ++++- .../window_playerbreakdown_spells.lua | 135 +++++++++++------- 4 files changed, 205 insertions(+), 53 deletions(-) diff --git a/frames/window_breakdown/breakdown_spells_phaseframes.lua b/frames/window_breakdown/breakdown_spells_phaseframes.lua index eee80ba8..bb3e163c 100644 --- a/frames/window_breakdown/breakdown_spells_phaseframes.lua +++ b/frames/window_breakdown/breakdown_spells_phaseframes.lua @@ -12,6 +12,7 @@ local _GetSpellInfo = Details.GetSpellInfo local GameTooltip = GameTooltip local IsShiftKeyDown = IsShiftKeyDown local DF = DetailsFramework +local detailsFramework = DetailsFramework local tinsert = table.insert local spellsTab = DetailsSpellBreakdownTab @@ -246,6 +247,34 @@ function spellsTab.CreatePhasesContainer(tabFrame) --~phase ~createphasecontaine local phaseScrollFrame = DF:CreateScrollBox(container, "$parentPhaseScroll", refreshPhaseFunc, {}, width, height, defaultAmountOfLines, CONST_SPELLSCROLL_LINEHEIGHT) DF:ReskinSlider(phaseScrollFrame) + ---@param self breakdownphasescrollframe + ---@return breakdownreporttable + function phaseScrollFrame:GetReportData() + local instance = spellsTab.GetInstance() + local data = phaseScrollFrame:GetData() + local formatFunc = Details:GetCurrentToKFunction() + local actorObject = spellsTab.GetActor() + local displayId, subDisplayId = instance:GetDisplay() + local subDisplayName = Details:GetSubAttributeName(displayId, subDisplayId) + local combatName = instance:GetCombat():GetCombatName() + + ---@type breakdownreporttable + local reportData = { + title = "Phases for " .. detailsFramework:RemoveRealmName(actorObject:Name()) .. " | " .. subDisplayName .. " | " .. combatName + } + + for i = 1, #data do + local dataTable = data[i] + reportData[#reportData+1] = { + name = "Phase:" .. dataTable.phaseName, + amount = formatFunc(nil, dataTable.amountDone), + percent = string.format("%.1f", dataTable.percentDone) .. "%", + } + end + + return reportData + end + phaseScrollFrame:SetBackdrop({}) phaseScrollFrame:SetAllPoints() diff --git a/frames/window_breakdown/breakdown_spells_spellframes.lua b/frames/window_breakdown/breakdown_spells_spellframes.lua index 89b22144..08e65130 100644 --- a/frames/window_breakdown/breakdown_spells_spellframes.lua +++ b/frames/window_breakdown/breakdown_spells_spellframes.lua @@ -15,6 +15,8 @@ local tinsert = table.insert ---@type detailsframework local DF = DetailsFramework +---@type detailsframework +local detailsFramework = DetailsFramework local spellsTab = DetailsSpellBreakdownTab @@ -191,7 +193,7 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom local elapsedTime = spellBar.combatTime --this should be actorObject:Tempo() ---@type string - local actorName = spellsTab.GetActor():Name() --attempt to index a nil value + local actorName = spellsTab.GetActor():Name() --attempt to index a nil value x2 ---@type spelltable local spellTable = spellBar.spellTable @@ -511,7 +513,7 @@ local spellBlockMixin = { function spellsTab.CreateSpellBlock(spellBlockContainer, index) --~breakdownspellblock ~create ~spellblocks ---@type breakdownspellblock local spellBlock = CreateFrame("statusbar", "$parentBlock" .. index, spellBlockContainer, "BackdropTemplate") - DetailsFramework:Mixin(spellBlock, spellBlockMixin) + detailsFramework:Mixin(spellBlock, spellBlockMixin) local statusBarTexture = spellBlock:CreateTexture("$parentTexture", "artwork") statusBarTexture:SetColorTexture(unpack(CONST_SPELLBLOCK_DEFAULT_COLOR)) @@ -570,7 +572,7 @@ function spellsTab.CreateSpellBlock(spellBlockContainer, index) --~breakdownspel spellBlock.sparkTexture:SetTexture("Interface\\AddOns\\Details\\images\\bar_detalhes2_end") spellBlock.sparkTexture:SetBlendMode("ADD") - local gradientDown = DetailsFramework:CreateTexture(spellBlock, {gradient = "vertical", fromColor = {0, 0, 0, 0.1}, toColor = "transparent"}, 1, spellBlock:GetHeight(), "background", {0, 1, 0, 1}) + local gradientDown = detailsFramework:CreateTexture(spellBlock, {gradient = "vertical", fromColor = {0, 0, 0, 0.1}, toColor = "transparent"}, 1, spellBlock:GetHeight(), "background", {0, 1, 0, 1}) gradientDown:SetPoint("bottoms") spellBlock.gradientTexture = gradientDown spellBlock.gradientTexture:Hide() @@ -776,7 +778,7 @@ function spellsTab.CreateSpellBlockContainer(tabFrame) --~create ~createblock ~s spellBlockFrame:SetResizable(false) spellBlockFrame:SetMovable(false) spellBlockFrame:SetAllPoints() - DetailsFramework:Mixin(spellBlockFrame, spellBlockContainerMixin) + detailsFramework:Mixin(spellBlockFrame, spellBlockContainerMixin) tabFrame.SpellBlockFrame = spellBlockFrame spellsTab.SpellBlockFrame = spellBlockFrame @@ -1313,6 +1315,52 @@ function spellsTab.CreateSpellScrollContainer(tabFrame) --~scroll ~create ~spell spellsTab.ApplyStandardBackdrop(container, scrollFrame) + ---@param self breakdownphasescrollframe + ---@return breakdownreporttable + function scrollFrame:GetReportData() + local instance = spellsTab.GetInstance() + + ---@type breakdownspelldatalist + local data = self:GetData() + + local formatFunc = Details:GetCurrentToKFunction() + local actorObject = spellsTab.GetActor() + local displayId, subDisplayId = instance:GetDisplay() + local subDisplayName = Details:GetSubAttributeName(displayId, subDisplayId) + local combatName = instance:GetCombat():GetCombatName() + + ---@type breakdownreporttable + local reportData = { + title = subDisplayName .. " for " .. detailsFramework:RemoveRealmName(actorObject:Name()) .. " | " .. combatName + } + + local topValue = data[1] and data[1].total or 0 + + for i = 1, #data do + ---@type spelltableadv + local bkSpellData = data[i] + local spellId = bkSpellData.id + local spellName = Details.GetSpellInfo(spellId) + + if (not spellName) then + --dumpt(bkSpellData) + if (bkSpellData.npcId) then + spellName = detailsFramework:CleanUpName(bkSpellData.actorName) + end + else + spellName = detailsFramework:CleanUpName(spellName) + end + + reportData[#reportData+1] = { + name = spellName, + amount = formatFunc(nil, bkSpellData.total), + percent = string.format("%.1f", bkSpellData.total/topValue*100) .. "%", + } + end + + return reportData + end + --~header local headerOptions = { padding = 2, diff --git a/frames/window_breakdown/breakdown_spells_targetframes.lua b/frames/window_breakdown/breakdown_spells_targetframes.lua index c3a13f00..0c493770 100644 --- a/frames/window_breakdown/breakdown_spells_targetframes.lua +++ b/frames/window_breakdown/breakdown_spells_targetframes.lua @@ -11,9 +11,13 @@ local GetSpellInfo = GetSpellInfo local _GetSpellInfo = Details.GetSpellInfo local GameTooltip = GameTooltip local IsShiftKeyDown = IsShiftKeyDown -local DF = DetailsFramework local tinsert = table.insert +---@type detailsframework +local DF = DetailsFramework +---@type detailsframework +local detailsFramework = DetailsFramework + local spellsTab = DetailsSpellBreakdownTab local headerContainerType = spellsTab.headerContainerType @@ -280,6 +284,38 @@ function spellsTab.CreateTargetContainer(tabFrame) --~create ~target ~createtarg targetScrollFrame:SetBackdrop({}) targetScrollFrame:SetAllPoints() + ---@param self breakdownphasescrollframe + ---@return breakdownreporttable + function targetScrollFrame:GetReportData() + local instance = spellsTab.GetInstance() + local data = targetScrollFrame:GetData() + local formatFunc = Details:GetCurrentToKFunction() + local actorObject = spellsTab.GetActor() + local displayId, subDisplayId = instance:GetDisplay() + local subDisplayName = Details:GetSubAttributeName(displayId, subDisplayId) + local combatName = instance:GetCombat():GetCombatName() + + ---@type breakdownreporttable + local reportData = { + title = "Target of " .. detailsFramework:RemoveRealmName(actorObject:Name()) .. " | " .. subDisplayName .. " | " .. combatName + } + + local topValue = data[1] and data[1].total or 0 + + for i = 1, #data do + ---@type breakdowntargettable + local dataTable = data[i] + + reportData[#reportData+1] = { + name = dataTable.name, + amount = formatFunc(nil, dataTable.total), + percent = string.format("%.1f", dataTable.total / topValue * 100) .. "%", + } + end + + return reportData + end + container:RegisterChildForDrag(targetScrollFrame) targetScrollFrame.DontHideChildrenOnPreRefresh = false diff --git a/frames/window_breakdown/window_playerbreakdown_spells.lua b/frames/window_breakdown/window_playerbreakdown_spells.lua index 8eb4bbed..06b6cf81 100644 --- a/frames/window_breakdown/window_playerbreakdown_spells.lua +++ b/frames/window_breakdown/window_playerbreakdown_spells.lua @@ -13,11 +13,22 @@ local GetSpellInfo = GetSpellInfo local _GetSpellInfo = Details.GetSpellInfo local GameTooltip = GameTooltip local IsShiftKeyDown = IsShiftKeyDown -local DF = DetailsFramework local tinsert = table.insert +---@type detailsframework +local DF = DetailsFramework +---@type detailsframework +local detailsFramework = DetailsFramework + ---@type breakdownspelltab local spellsTab = {} +spellsTab.ReportOverlays = {} + +function spellsTab.SetShownReportOverlay(bIsShown) + for robIndex, ROB in ipairs(spellsTab.ReportOverlays) do + ROB:SetShown(bIsShown) + end +end --expose the object to the global namespace DetailsSpellBreakdownTab = spellsTab @@ -521,6 +532,8 @@ function spellsTab.OnShownTab() spellsTab.UpdateHeadersSettings("phases") spellsTab.UpdateHeadersSettings("generic_left") spellsTab.UpdateHeadersSettings("generic_right") + + spellsTab.SetShownReportOverlay(false) end ---called when the tab is getting created, run only once @@ -550,63 +563,89 @@ function spellsTab.OnCreateTabCallback(tabButton, tabFrame) --~init local optionsButton = DF:CreateButton(tabFrame, Details.OpenSpellBreakdownOptions, 130, 18, Loc["STRING_OPTIONS_PLUGINS_OPTIONS"], 14) --optionsButton:SetTemplate(DF:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE")) optionsButton:SetPoint("bottomright", tabFrame, "bottomright", -10, -19) + optionsButton:SetTemplate("OPTIONS_BUTTON_TEMPLATE") + optionsButton:SetIcon(Details:GetTextureAtlas("breakdown-icon-optionsbutton")) optionsButton.textsize = 12 - optionsButton.textcolor = "orange" - - ---@type df_roundedpanel_preset - local preset = { - roundness = 5, - color = {.2, .2, .2, 0.98}, - border_color = {.1, .1, .1, 0.834}, - } - DF:AddRoundedCornersToFrame(optionsButton, preset) + optionsButton.textcolor = "DETAILS_STATISTICS_ICON" + optionsButton:SetAlpha(0.834) --create a report button local onClickReportButton = function(blizButton, buttonType, param1, param2) - --get what is shown in the breakdown window - local instance = spellsTab.GetInstance() - local actor = spellsTab.GetActor() - local combat = spellsTab.GetCombat() - - local displayId, subDisplayId = instance:GetDisplay() - - local spellScroll = spellsTab.GetSpellScrollFrame() - local getNumLines = spellScroll:GetNumFramesShown() - - local dataToReport = {} - - for i = 1, getNumLines do - ---@type breakdownspellbar - local thisLine = spellScroll:GetLine(i) - - --get the spell id - local spellId = thisLine.spellId - local spellName = GetSpellInfo(spellId) - - --get the amount - local bkSpellData = thisLine.bkSpellData - - if (bkSpellData) then - --dumpt(bkSpellData) - if (displayId == DETAILS_ATTRIBUTE_DAMAGE) then - if (subDisplayId == DETAILS_ATTRIBUTE_DAMAGE) then - dataToReport[#dataToReport+1] = spellName .. " .. " .. bkSpellData.total --, {bkSpellData.total, spellName, spellId} - end - end - end + if (spellsTab.ReportOverlays[1]:IsShown()) then + spellsTab.SetShownReportOverlay(false) + else + spellsTab.SetShownReportOverlay(true) end - - if (#dataToReport > 0) then - instance:Reportar(dataToReport, {}, nil, nil) - end - end + ---~report + local reportScrollContents = function(self, buttonPressed) + local scrollFrame = self.scrollFrame + + ---@type breakdownreporttable + local reportData = scrollFrame:GetReportData() + local reportDataBuilt = {reportData.title} + + for i = 1, #reportData do + local data = reportData[i] + local str = data.name .. " ...... " .. data.amount .. " (" .. data.percent .. ")" + reportDataBuilt[#reportDataBuilt+1] = str + end + + spellsTab.SetShownReportOverlay(false) + + Details:Reportar(reportDataBuilt, {_no_current = true, _no_inverse = true, _custom = true}) + end + + --create a report overlay for each of the containers + local createReportOverlay = function(scrollFrame) + local reportOverlayButton = CreateFrame("button", "DetailsSpellScrollSelectionButton", scrollFrame, "BackdropTemplate") + local ROB = reportOverlayButton + + spellsTab.ReportOverlays[#spellsTab.ReportOverlays+1] = ROB + + --backdrop + ROB:SetBackdrop({ + edgeFile = [[Interface\AddOns\Details\images\border_2]], + edgeSize = 16, + }) + + ROB:SetFrameLevel(scrollFrame:GetFrameLevel()+5) + ROB:SetAllPoints() + ROB:EnableMouse(true) + + local backgroundTexture = ROB:CreateTexture("DetailsSpellScrollSelectionButtonTexture", "overlay") + --instead of all point, do topleft and bottomright + backgroundTexture:SetPoint("topleft", ROB, "topleft", 0, 0) + backgroundTexture:SetPoint("bottomright", ROB, "bottomright", 0, 0) + ROB.backgroundTexture = backgroundTexture + + backgroundTexture:SetColorTexture(.1, .1, .1, 0.834) + + local text = ROB:CreateFontString(nil, "overlay", "GameFontNormal") + text:SetText("REPORT") + text:SetTextColor(1, 1, 1, 1) + text:SetPoint("center", ROB, "center", 0, 0) + ROB.reportText = text + + ROB.scrollFrame = scrollFrame + ROB:SetScript("OnClick", reportScrollContents) + + ROB:Hide() + end + + createReportOverlay(spellsTab.GetSpellScrollFrame()) + createReportOverlay(spellsTab.GetTargetScrollFrame()) + createReportOverlay(spellsTab.GetPhaseScrollFrame()) + createReportOverlay(spellsTab.GetGenericScrollFrame()) + local reportButton = DF:CreateButton(tabFrame, onClickReportButton, 130, 18, Loc["STRING_REPORT_TEXT"], 1, 2) --will have a text? reportButton:SetPoint("right", optionsButton, "left", -5, 0) reportButton.textsize = 12 - reportButton.textcolor = "orange" - DF:AddRoundedCornersToFrame(reportButton, preset) + reportButton.textcolor = "DETAILS_STATISTICS_ICON" + reportButton:SetTemplate("OPTIONS_BUTTON_TEMPLATE") + reportButton:SetIcon(Details:GetTextureAtlas("breakdown-icon-reportbutton")) + reportButton:SetAlpha(0.834) --open the breakdown window at startup for testing --[=[ debug