From eb8c9894a58dfd289f6f965d8781fc701969cca9 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Fri, 1 Dec 2023 12:30:19 -0300 Subject: [PATCH] Added Mythic+ Overall's time types --- Libs/DF/editor.lua | 88 ++++++++++++++--------------- Libs/DF/fw.lua | 2 +- Libs/DF/scrollbox.lua | 27 ++++++--- classes/class_damage.lua | 65 ++++++++++++--------- frames/window_options2_sections.lua | 26 +++++++++ functions/profiles.lua | 3 +- 6 files changed, 130 insertions(+), 81 deletions(-) diff --git a/Libs/DF/editor.lua b/Libs/DF/editor.lua index 41583f98..ccddcc63 100644 --- a/Libs/DF/editor.lua +++ b/Libs/DF/editor.lua @@ -519,12 +519,16 @@ detailsFramework.EditorMixin = { ---@param anchorSettings df_anchor StartObjectMovement = function(self, anchorSettings) local object = self:GetEditingObject() - local moverFrame = self:GetMoverFrame() - --self:UpdateGuideLinesAnchors() + local moverFrame = self:GetMoverFrame() + moverFrame:EnableMouse(true) + moverFrame:SetMovable(true) + moverFrame:ClearAllPoints() + moverFrame:Show() --update guidelines if (self:GetEditingOptions().use_guide_lines) then + --self:UpdateGuideLinesAnchors() --show all four guidelines for side, texture in pairs(self.moverGuideLines) do texture:Show() @@ -533,56 +537,43 @@ detailsFramework.EditorMixin = { local optionsFrame = self:GetOptionsFrame() - moverFrame:EnableMouse(true) - moverFrame:SetMovable(true) - moverFrame:ClearAllPoints() - moverFrame:Show() - - --update the mover frame size to match the object size - if (object:GetObjectType() == "FontString") then - ---@cast object fontstring - local width = object:GetStringWidth() - local height = object:GetStringHeight() - moverFrame:SetSize(width, height) - else - local width, height = object:GetSize() - moverFrame:SetSize(width, height) - end - - for i = 1, object:GetNumPoints() do - local point, relativeTo, relativePoint, x, y = object:GetPoint(i) - moverFrame:SetPoint(point, relativeTo, relativePoint, x, y) - end - + local objectWidth, objectHeight = object:GetSize() + moverFrame:SetSize(objectWidth, objectHeight) + detailsFramework:SetAnchor(moverFrame, anchorSettings, object:GetParent()) local currentPosX, currentPosY moverFrame:SetScript("OnMouseDown", function() object:ClearAllPoints() object:SetPoint("topleft", moverFrame, "topleft", 0, 0) + currentPosX, currentPosY = moverFrame:GetCenter() - moverFrame:SetBackdropBorderColor(1, 1, 0, 0) - - for i = 1, object:GetNumPoints() do - local point, relativeTo, relativePoint, x, y = object:GetPoint(i) - moverFrame:SetPoint(point, relativeTo, relativePoint, x, y) - end - - moverFrame:StartMoving() moverFrame.bIsMoving = true + moverFrame:StartMoving() end) moverFrame:SetScript("OnMouseUp", function() moverFrame:StopMovingOrSizing() moverFrame.bIsMoving = false + local originX = anchorSettings.x + local originY = anchorSettings.y + + local newPosX, newPosY = moverFrame:GetCenter() + + local xOffset = newPosX - currentPosX + local yOffset = newPosY - currentPosY + + anchorSettings.x = originX + xOffset + anchorSettings.y = originY + yOffset + + local anchorXSlider = optionsFrame:GetWidgetById("anchoroffsetx") + anchorXSlider:SetValueNoCallback(anchorSettings.x) + + local anchorYSlider = optionsFrame:GetWidgetById("anchoroffsety") + anchorYSlider:SetValueNoCallback(anchorSettings.y) + object:ClearAllPoints() detailsFramework:SetAnchor(object, anchorSettings, object:GetParent()) - - moverFrame:ClearAllPoints() - for i = 1, object:GetNumPoints() do - local point, relativeTo, relativePoint, x, y = object:GetPoint(i) - moverFrame:SetPoint(point, relativeTo, relativePoint, x, y) - end end) --detailsFramework:SetAnchor(moverFrame, anchorSettings) @@ -590,9 +581,9 @@ detailsFramework.EditorMixin = { moverFrame:SetScript("OnUpdate", function() --if the object isn't moving, make the mover follow the object position - if (moverFrame.bIsMoving) then - object:ClearAllPoints() - object:SetPoint("topleft", moverFrame, "topleft", 0, 0) + if (false and moverFrame.bIsMoving) then + --object:ClearAllPoints() + --object:SetPoint("topleft", moverFrame, "topleft", 0, 0) --if the object is moving, check if the moverFrame has moved local newPosX, newPosY = moverFrame:GetCenter() @@ -668,6 +659,10 @@ detailsFramework.EditorMixin = { localizedLabel = type(localizedLabel) == "string" and localizedLabel or "invalid label" + --a button to select the widget + local selectButton = CreateFrame("button", "$parentSelectButton" .. id, object:GetParent()) + selectButton:SetAllPoints(object) + ---@type df_editor_objectinfo local objectRegistered = { object = object, @@ -678,8 +673,13 @@ detailsFramework.EditorMixin = { extraoptions = extraOptions or {}, callback = callback, options = options, + selectButton = selectButton, } + selectButton:SetScript("OnClick", function() + self:EditObject(objectRegistered) + end) + registeredObjects[#registeredObjects+1] = objectRegistered self.registeredObjectsByID[id] = objectRegistered @@ -862,6 +862,7 @@ local editorDefaultOptions = { ---@field extraoptions table ---@field callback function ---@field options df_editobjectoptions +---@field selectButton button function detailsFramework:CreateEditor(parent, name, options) name = name or ("DetailsFrameworkEditor" .. math.random(100000, 10000000)) @@ -904,10 +905,9 @@ function detailsFramework:CreateEditor(parent, name, options) --frame that is used to move the object local moverFrame = CreateFrame("frame", "$parentMoverFrame", OTTFrame, "BackdropTemplate") moverFrame:SetClampedToScreen(true) - moverFrame:SetBackdrop({ - edgeFile = "Interface\\Buttons\\WHITE8x8", - edgeSize = 1, - }) + detailsFramework:ApplyStandardBackdrop(moverFrame) + moverFrame:SetBackdropColor(.10, .10, .10, 0) + moverFrame.__background:SetAlpha(0.1) editorFrame.moverFrame = moverFrame editorFrame:CreateMoverGuideLines() diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 55dea3e5..37409cfa 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 484 +local dversion = 485 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary(major, minor) diff --git a/Libs/DF/scrollbox.lua b/Libs/DF/scrollbox.lua index 67d3bac6..f315daa2 100644 --- a/Libs/DF/scrollbox.lua +++ b/Libs/DF/scrollbox.lua @@ -686,7 +686,23 @@ end detailsFramework.CanvasScrollBoxMixin = { + SetScrollSpeed = function(self, speed) + assert(type(speed) == "number", "CanvasScrollBox:SetScrollSpeed(speed): speed must be a number.") + self.scrollStep = speed + end, + GetScrollSpeed = function(self) + return self.scrollStep + end, + + OnVerticalScroll = function(self, delta) + local scrollStep = self:GetScrollSpeed() + if (delta > 0) then + self:SetVerticalScroll(math.max(self:GetVerticalScroll() - scrollStep, 0)) + else + self:SetVerticalScroll(math.min(self:GetVerticalScroll() + scrollStep, self:GetVerticalScrollRange())) + end + end, } local canvasScrollBoxDefaultOptions = { @@ -707,16 +723,9 @@ function detailsFramework:CreateCanvasScrollBox(parent, child, name, options) ---@type df_canvasscrollbox local canvasScrollBox = CreateFrame("scrollframe", name or ("DetailsFrameworkCanvasScroll" .. math.random(50000, 10000000)), parent, "BackdropTemplate, UIPanelScrollFrameTemplate") canvasScrollBox.scrollStep = 20 + canvasScrollBox.minValue = 0 - canvasScrollBox:SetScript("OnMouseWheel", function(self, value) - local scrollBar = self - local scrollStep = scrollBar.scrollStep or scrollBar:GetHeight() / 2 - if ( value > 0 ) then - scrollBar:SetVerticalScroll(scrollBar:GetVerticalScroll() - scrollStep) - else - scrollBar:SetVerticalScroll(scrollBar:GetVerticalScroll() + scrollStep) - end - end) + canvasScrollBox:SetScript("OnMouseWheel", detailsFramework.CanvasScrollBoxMixin.OnVerticalScroll) detailsFramework:Mixin(canvasScrollBox, detailsFramework.CanvasScrollBoxMixin) detailsFramework:Mixin(canvasScrollBox, detailsFramework.OptionsFunctions) diff --git a/classes/class_damage.lua b/classes/class_damage.lua index 2f034536..03c12628 100644 --- a/classes/class_damage.lua +++ b/classes/class_damage.lua @@ -2738,41 +2738,54 @@ function damageClass:RefreshLine(instanceObject, lineContainer, whichRowLine, ra local currentCombat = Details:GetCurrentCombat() - --calculate the actor dps - if ((Details.time_type == 2 and self.grupo) or not Details:CaptureGet("damage") or instanceObject.segmento == -1 or Details.use_realtimedps) then - if (Details.use_realtimedps and Details.in_combat) then - local currentDps = self.last_dps_realtime - if (currentDps) then - dps = currentDps - end + if (currentCombat:GetCombatType() == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL) then + if (Details.mythic_plus.mythicrun_time_type == 1) then + --total time in combat, activity time + combatTime = currentCombat:GetCombatTime() + elseif (Details.mythic_plus.mythicrun_time_type == 2) then + --elapsed time of the run + combatTime = currentCombat:GetRunTime() end - if (not dps) then - if (instanceObject.segmento == -1 and combatTime == 0) then - local actor = currentCombat(1, self.nome) - if (actor) then - local combatTime = actor:Tempo() - dps = damageTotal / combatTime - self.last_dps = dps + dps = damageTotal / combatTime + self.last_dps = dps + else + --calculate the actor dps + if ((Details.time_type == 2 and self.grupo) or not Details:CaptureGet("damage") or instanceObject.segmento == -1 or Details.use_realtimedps) then + if (Details.use_realtimedps and Details.in_combat) then + local currentDps = self.last_dps_realtime + if (currentDps) then + dps = currentDps + end + end + + if (not dps) then + if (instanceObject.segmento == -1 and combatTime == 0) then + local actor = currentCombat(1, self.nome) + if (actor) then + local combatTime = actor:Tempo() + dps = damageTotal / combatTime + self.last_dps = dps + else + dps = damageTotal / combatTime + self.last_dps = dps + end else dps = damageTotal / combatTime self.last_dps = dps end - else - dps = damageTotal / combatTime - self.last_dps = dps end - end - else - if (not self.on_hold) then - dps = damageTotal/self:Tempo() --calcula o dps deste objeto - self.last_dps = dps --salva o dps dele else - if (self.last_dps == 0) then --n�o calculou o dps dele ainda mas entrou em standby - dps = damageTotal/self:Tempo() - self.last_dps = dps + if (not self.on_hold) then + dps = damageTotal/self:Tempo() --calcula o dps deste objeto + self.last_dps = dps --salva o dps dele else - dps = self.last_dps + if (self.last_dps == 0) then --n�o calculou o dps dele ainda mas entrou em standby + dps = damageTotal/self:Tempo() + self.last_dps = dps + else + dps = self.last_dps + end end end end diff --git a/frames/window_options2_sections.lua b/frames/window_options2_sections.lua index 1420cc76..a568ecf6 100644 --- a/frames/window_options2_sections.lua +++ b/frames/window_options2_sections.lua @@ -6891,6 +6891,32 @@ do local sectionOptions = { {type = "label", get = function() return Loc["STRING_OPTIONS_GENERAL_ANCHOR"] end, text_template = subSectionTitleTextTemplate}, + { + type = "toggle", + get = function() return Details.mythic_plus.mythicrun_time_type == 1 end, + set = function(self, fixedparam, value) + Details.mythic_plus.mythicrun_time_type = value and 1 + sectionFrame:GetWidgetById("mythic_time_2"):SetValue(not value) + end, + name = "Use Total Combat Time", + desc = "The overall segment for the Mythic+ run will use 'totalDamage / totalCombatTime' to calculate DPS.", + id = "mythic_time_1", + }, + + { + type = "toggle", + get = function() return Details.mythic_plus.mythicrun_time_type == 2 end, + set = function(self, fixedparam, value) + Details.mythic_plus.mythicrun_time_type = value and 2 + sectionFrame:GetWidgetById("mythic_time_1"):SetValue(not value) + end, + name = "Use Run Time", + desc = "The overall segment for the Mythic+ run will use 'totalDamage / runTime' to calculate DPS.", + id = "mythic_time_2", + }, + + {type = "blank"}, + {--dedicated segment for bosses type = "toggle", get = function() return Details.mythic_plus.boss_dedicated_segment end, diff --git a/functions/profiles.lua b/functions/profiles.lua index f96e4402..090a442b 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -495,6 +495,7 @@ function Details:ApplyProfile(profileName, bNoSave, bIsCopy) Details.time_type = 2 end + --enable all captures, this is a fix for the old performance profiles which doesn't exiss anymore Details.capture_real["damage"] = true Details.capture_real["heal"] = true Details.capture_real["energy"] = true @@ -1523,7 +1524,7 @@ local default_global_data = { ctrl_click_close_tutorial = false, }, - performance_profiles = { + performance_profiles = { --deprecated ["RaidFinder"] = {enabled = false, update_speed = 1, use_row_animations = false, damage = true, heal = true, aura = true, energy = false, miscdata = true}, ["Raid15"] = {enabled = false, update_speed = 1, use_row_animations = false, damage = true, heal = true, aura = true, energy = false, miscdata = true}, ["Raid30"] = {enabled = false, update_speed = 1, use_row_animations = false, damage = true, heal = true, aura = true, energy = false, miscdata = true},