From cd9a11d37694660d8b4c2c0f03be93c5c6979a24 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Sat, 17 Aug 2024 00:03:03 -0300 Subject: [PATCH] Several bug fixes, visual updates on m+ panel, fixed m+ chart again, more updates for Breakdown Wndow --- Libs/DF/charts.lua | 8 +++ Libs/DF/fw.lua | 2 +- boot.lua | 35 +--------- core/control.lua | 10 +-- .../breakdown_spells_genericframes.lua | 2 +- .../breakdown_spells_phaseframes.lua | 2 +- .../breakdown_spells_spellframes.lua | 23 ++++-- .../breakdown_spells_targetframes.lua | 2 +- .../window_playerbreakdown.lua | 14 ++-- .../window_playerbreakdown_list.lua | 12 +++- .../window_playerbreakdown_spells.lua | 6 +- .../window_playerbreakdown_spells_options.lua | 2 +- frames/window_mythicplus/window_chart.lua | 8 +-- .../window_mythicplus/window_end_of_run.lua | 66 +++++++++++------- frames/window_options2_sections.lua | 14 ++++ functions/profiles.lua | 6 +- images/gradient_black_transparent.png | Bin 0 -> 37596 bytes 17 files changed, 122 insertions(+), 90 deletions(-) create mode 100644 images/gradient_black_transparent.png diff --git a/Libs/DF/charts.lua b/Libs/DF/charts.lua index 3f42a5b6f..8acfa1fa9 100644 --- a/Libs/DF/charts.lua +++ b/Libs/DF/charts.lua @@ -740,6 +740,8 @@ local lazyChartUpdate = function(payload, iterationCount, maxIterations) fillLine:SetEndPoint("bottomleft", endX, 0) fillLine:SetDrawLayer("overlay", self.depth) fillLine:SetColorTexture(r, g, b, 0.15 + (self.depth/10)) + + fillLine:Show() end end end @@ -966,6 +968,12 @@ detailsFramework.ChartFrameMixin = { fillLineThickness = fillLineThickness, } + for i = #fillerLines_InUse, 1, -1 do + local line = table.remove(fillerLines_InUse, i) + fillerLines_InAvailable[#fillerLines_InAvailable+1] = line + line:Hide() + end + detailsFramework.Schedules.LazyExecute(lazyChartUpdate, payload) self:ShowBackdropIndicators() diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 4ae1367a6..3cf03adca 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 562 +local dversion = 563 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary(major, minor) diff --git a/boot.lua b/boot.lua index 941f31eff..444435b16 100644 --- a/boot.lua +++ b/boot.lua @@ -1221,6 +1221,8 @@ do ---@type table local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") --default bars + SharedMedia:Register("statusbar", "Details Hyanda Reverse", [[Interface\AddOns\Details\images\bar_textures\bar_hyanda_reverse.png]]) + SharedMedia:Register("statusbar", "You Are the Best!", [[Interface\AddOns\Details\images\bar_textures\bar_best.png]]) SharedMedia:Register("statusbar", "Details Hyanda", [[Interface\AddOns\Details\images\bar_hyanda]]) SharedMedia:Register("statusbar", "Details D'ictum", [[Interface\AddOns\Details\images\bar4]]) @@ -1859,39 +1861,6 @@ function Details:DestroyActor(actorObject, actorContainer, combatObject, callSta actorObject.__destroyedBy = debugstack(callStackDepth or 2, 1, 0) end -local restrictedAddons = { - '!!WWAddOnsFix', -} - -local restrictedAddonFrame = CreateFrame('frame') -restrictedAddonFrame:RegisterEvent('PLAYER_ENTERING_WORLD') - -local function disableRestrictedAddons() - for _, addonName in pairs(restrictedAddons) do - if C_AddOns.GetAddOnEnableState(addonName) ~= 0 then - StaticPopupDialogs["DETAILS_RESTRICTED_ADDON"] = { - text = "You are running " .. addonName .. " which is incompatible with Details! Damage Meter. It must be disabled for Details to function properly.", - button1 = "Disable " .. addonName, - button2 = "Disable Details!", - OnAccept = function() - C_AddOns.DisableAddOn(addonName) - ReloadUI() - end, - OnCancel = function() - C_AddOns.DisableAddOn('Details') - ReloadUI() - end, - timeout = 0, - whileDead = true, - } - StaticPopup_Show("DETAILS_RESTRICTED_ADDON") - break - end - end -end - -restrictedAddonFrame:SetScript('OnEvent', function() C_Timer.After(2, disableRestrictedAddons) end ) - C_Timer.After(5, function() --TutorialPointerFrame_1:HookScript("OnShow", function(self) self:Hide() end) --remove on v11 launch end) diff --git a/core/control.lua b/core/control.lua index 1de4fc857..8fda97787 100644 --- a/core/control.lua +++ b/core/control.lua @@ -1385,10 +1385,12 @@ if (frame.GetActor) then local actor = frame:GetActor() if (actor) then - local class = actor:Class() - local classColor = RAID_CLASS_COLORS[class] - GameCooltip:SetBackdrop(1, backdrop, classColor, borderColor) - GameCooltip:SetColor(1, 0, 0, 0, 0.7) + local class = actor.classe + if (class) then + local classColor = RAID_CLASS_COLORS[class] + GameCooltip:SetBackdrop(1, backdrop, classColor, borderColor) + GameCooltip:SetColor(1, 0, 0, 0, 0.7) + end end end diff --git a/frames/window_breakdown/breakdown_spells_genericframes.lua b/frames/window_breakdown/breakdown_spells_genericframes.lua index a18dfc7b2..06476fd98 100644 --- a/frames/window_breakdown/breakdown_spells_genericframes.lua +++ b/frames/window_breakdown/breakdown_spells_genericframes.lua @@ -324,7 +324,7 @@ local createGenericBar = function(self, index) --~create ~generic ~creategeneric ---@type texture this is the statusbar texture local statusBarTexture = statusBar:CreateTexture("$parentTexture", "artwork") - statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", "Details Hyanda")) + statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", Details.breakdown_general.bar_texture)) statusBar:SetStatusBarTexture(statusBarTexture) statusBar:SetStatusBarColor(1, 1, 1, 1) diff --git a/frames/window_breakdown/breakdown_spells_phaseframes.lua b/frames/window_breakdown/breakdown_spells_phaseframes.lua index 0d792fe23..eae1ceb1d 100644 --- a/frames/window_breakdown/breakdown_spells_phaseframes.lua +++ b/frames/window_breakdown/breakdown_spells_phaseframes.lua @@ -61,7 +61,7 @@ function spellsTab.CreatePhaseBar(self, index) --~create ~createphase ~phasebar ---@type texture this is the statusbar texture local statusBarTexture = statusBar:CreateTexture("$parentTexture", "artwork") - statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", "Details Hyanda")) + statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", Details.breakdown_general.bar_texture)) statusBar:SetStatusBarTexture(statusBarTexture) statusBar:SetStatusBarColor(1, 1, 1, 1) diff --git a/frames/window_breakdown/breakdown_spells_spellframes.lua b/frames/window_breakdown/breakdown_spells_spellframes.lua index 8b868e261..8ad76a182 100644 --- a/frames/window_breakdown/breakdown_spells_spellframes.lua +++ b/frames/window_breakdown/breakdown_spells_spellframes.lua @@ -117,19 +117,22 @@ local onEnterSpellTarget = function(targetFrame) ---@type number the top value of targets local topValue = math.max(targets[1] and targets[1][2] or 0, 0.001) - local cooltip = GameCooltip - cooltip:Preset(2) + local gameCooltip = GameCooltip + --cooltip:Preset(2) + Details:FormatCooltipForSpells() + gameCooltip:SetOption("FixedWidth", 260) + gameCooltip:SetOption("YSpacingMod", -8) for targetIndex, targetTable in ipairs(targets) do local targetName = targetTable[1] local value = targetTable[2] - cooltip:AddLine(targetIndex .. ". " .. targetName, Details:Format(value)) - GameCooltip:AddIcon(CONST_TARGET_TEXTURE, 1, 1, 14, 14) + gameCooltip:AddLine(targetIndex .. ". " .. targetName, Details:Format(value)) + gameCooltip:AddIcon(CONST_TARGET_TEXTURE, 1, 1, 20, 20) Details:AddTooltipBackgroundStatusbar(false, value / topValue * 100) end - cooltip:SetOwner(targetFrame) - cooltip:Show() + gameCooltip:SetOwner(targetFrame) + gameCooltip:Show() end local onLeaveSpellTarget = function(self) @@ -1094,7 +1097,13 @@ local updateSpellBar = function(spellBar, index, actorName, combatObject, scroll textIndex = textIndex + 1 elseif (header.name == "uptime") then --need to get the uptime of the spell with the biggest uptime - text:SetText(string.format("%.1f", uptime / combatTime * 100) .. "%") + local uptimePercent = uptime / combatTime * 100 + if (uptimePercent > 0) then + text:SetText(string.format("%.1f", uptime / combatTime * 100) .. "%") + else + text:SetText("") + end + spellBar:AddFrameToHeaderAlignment(text) textIndex = textIndex + 1 diff --git a/frames/window_breakdown/breakdown_spells_targetframes.lua b/frames/window_breakdown/breakdown_spells_targetframes.lua index ebc33c386..4966cf15e 100644 --- a/frames/window_breakdown/breakdown_spells_targetframes.lua +++ b/frames/window_breakdown/breakdown_spells_targetframes.lua @@ -560,7 +560,7 @@ function spellsTab.CreateTargetBar(self, index) --~create ~target ~createtarget ---@type texture this is the statusbar texture local statusBarTexture = statusBar:CreateTexture("$parentTexture", "artwork") - statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", "Details Hyanda")) + statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", Details.breakdown_general.bar_texture)) statusBar:SetStatusBarTexture(statusBarTexture) statusBar:SetStatusBarColor(1, 1, 1, 1) diff --git a/frames/window_breakdown/window_playerbreakdown.lua b/frames/window_breakdown/window_playerbreakdown.lua index a5a7be807..6f55c5c85 100644 --- a/frames/window_breakdown/window_playerbreakdown.lua +++ b/frames/window_breakdown/window_playerbreakdown.lua @@ -269,7 +269,7 @@ function Details222.BreakdownWindow.RefreshPlayerScroll() end Details.PlayerBreakdown.RoundedCornerPreset = { - roundness = 6, + roundness = 12, color = {.1, .1, .1, 0.834}, } @@ -799,9 +799,13 @@ function Details:CreateBreakdownWindow() breakdownWindowFrame.SummaryWindowWidgets:Hide() local scaleBar = detailsFramework:CreateScaleBar(breakdownWindowFrame, Details.player_details_window) - scaleBar.label:AdjustPointsOffset(-6, 3) + scaleBar.label:AdjustPointsOffset(-3, 1) + scaleBar.label:SetTextColor{0.8902, 0.7294, 0.0157, 1} + scaleBar.label:SetIgnoreParentAlpha(true) breakdownWindowFrame:SetScale(Details.player_details_window.scale) + --1, 0.8235, 0, 1 - text color of the label of the scale bar | plugins text color: 0.8902, 0.7294, 0.0157, 1 | 0.8902, 0.7294, 0.0157, 1 + --class icon breakdownWindowFrame.classIcon = breakdownWindowFrame:CreateTexture(nil, "overlay", nil, 1) breakdownWindowFrame.classIcon:SetPoint("topleft", breakdownWindowFrame, "topleft", 2, -17) @@ -818,7 +822,7 @@ function Details:CreateBreakdownWindow() --title detailsFramework:NewLabel(breakdownWindowFrame, breakdownWindowFrame, nil, "titleText", Loc ["STRING_PLAYER_DETAILS"], "GameFontHighlightLeft", 12, {227/255, 186/255, 4/255}) breakdownWindowFrame.titleText:SetPoint("center", breakdownWindowFrame, "center") - breakdownWindowFrame.titleText:SetPoint("top", breakdownWindowFrame, "top", 0, -3) + breakdownWindowFrame.titleText:SetPoint("top", breakdownWindowFrame, "top", 0, -5) --create the texts shown on the window do @@ -875,7 +879,7 @@ function Details:CreateBreakdownWindow() function breakdownWindowFrame:SetStatusbarText(text, fontSize, fontColor) if (not text) then - breakdownWindowFrame:SetStatusbarText("Details! Damage Meter | Click 'Options' button for settings.", 10, "gray") + breakdownWindowFrame:SetStatusbarText("An AddOn by Terciob | Part of Details! Damage Meter | Click 'Options' button for settings.", 10, "gray") return end statusBar.Text.text = text @@ -884,7 +888,7 @@ function Details:CreateBreakdownWindow() end local rightClickToCloseLabel = Details:CreateRightClickToCloseLabel(statusBar) - rightClickToCloseLabel:SetPoint("right", -332, 4) + rightClickToCloseLabel:SetPoint("right", -283, 3) --set default text breakdownWindowFrame:SetStatusbarText() diff --git a/frames/window_breakdown/window_playerbreakdown_list.lua b/frames/window_breakdown/window_playerbreakdown_list.lua index 74eda3239..ccc806c81 100644 --- a/frames/window_breakdown/window_playerbreakdown_list.lua +++ b/frames/window_breakdown/window_playerbreakdown_list.lua @@ -372,6 +372,9 @@ local createPlayerScrollBox = function(breakdownWindowFrame, breakdownSideMenu, totalStatusBar:SetAlpha(0.5) totalStatusBar:SetPoint("bottomleft", specIcon, "bottomright", 0, 0) + local gradientTexture = DetailsFramework:CreateTexture(OTTFrame, {gradient = "horizontal", fromColor = {.1, .1, .1, .634}, toColor = "transparent"}, 100, 1, "border", {0, 1, 0, 1}, "segmentsGradient") + gradientTexture:SetPoint("lefts") + line.specIcon = specIcon line.roleIcon = roleIcon line.playerName = playerName @@ -558,8 +561,12 @@ local createSegmentsScrollBox = function(breakdownWindowFrame, breakdownSideMenu line.segmentText = segmentText line.segmentIcon = segmentIcon + --create a texture gradient in horizontal with the left side starting from black and the right side ending in transparent, the width is 40 and is placed at the left side of the line + local gradientTexture = DetailsFramework:CreateTexture(line, {gradient = "horizontal", fromColor = {.1, .1, .1, .634}, toColor = "transparent"}, 100, 1, "border", {0, 1, 0, 1}, "segmentsGradient") + gradientTexture:SetPoint("lefts") + segmentIcon:SetPoint("left", line, "left", 2, 0) - segmentText:SetPoint("left", segmentIcon.widget, "right", 3, 1) + segmentText:SetPoint("left", segmentIcon.widget, "right", 5, 0) line.UpdateLine = updateSegmentLine @@ -582,7 +589,8 @@ local createSegmentsScrollBox = function(breakdownWindowFrame, breakdownSideMenu breakdownWindowFrame.segmentScrollBox = segmentsScroll --remove the standard backdrop - segmentsScroll:SetBackdrop({}) + segmentsScroll:SetBackdrop(nil) + segmentsScroll.__background:Hide() --create the scrollbox lines for i = 1, scrollbox_lines do diff --git a/frames/window_breakdown/window_playerbreakdown_spells.lua b/frames/window_breakdown/window_playerbreakdown_spells.lua index 782aa263c..334365369 100644 --- a/frames/window_breakdown/window_playerbreakdown_spells.lua +++ b/frames/window_breakdown/window_playerbreakdown_spells.lua @@ -207,10 +207,10 @@ local spellContainerColumnData = { {name = "persecond", label = "ps", key = "total", width = 50, align = "left", enabled = false, canSort = true, sortKey = "ps", offset = columnOffset, order = "DESC", dataType = "number"}, {name = "percent", label = "%", key = "total", width = 50, align = "left", enabled = true, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, {name = "casts", label = "casts", key = "casts", width = 40, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, - {name = "critpercent", label = "crit %", key = "critpercent", width = 40, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, - {name = "hits", label = "hits", key = "counter", width = 40, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, + {name = "critpercent", label = "crit %", key = "critpercent", width = 40, align = "left", enabled = true, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, + {name = "hits", label = "hits", key = "counter", width = 40, align = "left", enabled = true, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, {name = "castavg", label = "cast avg", key = "castavg", width = 50, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, - {name = "uptime", label = "uptime", key = "uptime", width = 45, align = "left", enabled = false, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, + {name = "uptime", label = "uptime", key = "uptime", width = 45, align = "left", enabled = true, canSort = true, offset = columnOffset, order = "DESC", dataType = "number"}, {name = "overheal", label = "overheal", key = "overheal", width = 70, align = "left", enabled = true, canSort = true, order = "DESC", dataType = "number", attribute = DETAILS_ATTRIBUTE_HEAL, offset = columnOffset}, {name = "absorbed", label = "absorbed", key = "healabsorbed", width = 55, align = "left", enabled = false, canSort = true, order = "DESC", dataType = "number", attribute = DETAILS_ATTRIBUTE_HEAL, offset = columnOffset}, } diff --git a/frames/window_breakdown/window_playerbreakdown_spells_options.lua b/frames/window_breakdown/window_playerbreakdown_spells_options.lua index c40fac8e0..221e1c9f7 100644 --- a/frames/window_breakdown/window_playerbreakdown_spells_options.lua +++ b/frames/window_breakdown/window_playerbreakdown_spells_options.lua @@ -130,7 +130,7 @@ local createOptionsPanel = function() {type = "blank"}, - {type = "label", get = function() return "Spell Header Options" end, text_template = subSectionTitleTextTemplate}, + {type = "label", get = function() return "What to Show" end, text_template = subSectionTitleTextTemplate}, { --per second type = "toggle", get = function() return Details.breakdown_spell_tab.spellcontainer_headers["persecond"].enabled end, diff --git a/frames/window_mythicplus/window_chart.lua b/frames/window_mythicplus/window_chart.lua index 1dd1c88d4..7209c0260 100644 --- a/frames/window_mythicplus/window_chart.lua +++ b/frames/window_mythicplus/window_chart.lua @@ -180,16 +180,16 @@ function mythicDungeonCharts.ShowChart() local combatTime = mythicDungeonCharts.ChartTable.ElapsedTime local opacity = 1 - local smoothnessLevel = 50 + --local smoothnessLevel = 50 + --local smoothMethod = "loess" local smoothnessLevel = 20 - local smoothMethod = "loess" local smoothMethod = "sma" local chartSize = #chartData local shrinkBy = 1 - if (chartSize >= 600) then - shrinkBy = math.max(2, math.floor(chartSize/400)) + if (chartSize >= 800) then + shrinkBy = math.max(2, math.floor(chartSize/800)) end local reducedData = chartFrame:ShrinkData(chartData, shrinkBy) diff --git a/frames/window_mythicplus/window_end_of_run.lua b/frames/window_mythicplus/window_end_of_run.lua index cc0b10051..c91920d75 100644 --- a/frames/window_mythicplus/window_end_of_run.lua +++ b/frames/window_mythicplus/window_end_of_run.lua @@ -32,6 +32,8 @@ local mythicDungeonFrames = Details222.MythicPlus.Frames local CONST_DEBUG_MODE = false local LOOT_DEBUG_MODE = false +local readyFrameName = "DetailsMythicDungeonFinishedRunFrame" + --fallback if the class color isn't found local defaultColor = {r = 0.9, g = 0.9, b = 0.9} @@ -42,8 +44,10 @@ local playerBannerSettings = { playername_background_height = 12, playername_fontsize = 12, playername_fontcolor = {1, 1, 1}, - dungeon_texture_width = 32, - dungeon_texture_height = 32, + dungeon_texture_width = 45, + dungeon_texture_height = 45, + loot_square_width = 32, + loot_square_height = 32, loot_square_amount = 2, trans_anim_duration = 0.5, --time that the translation animation takes to move the banner from right to left } @@ -245,8 +249,8 @@ function lootFrame.UpdateUnitLoot(playerBanner) lootSquare.LootItemLevel:SetText(effectiveILvl or "0") --update size - lootSquare.LootIcon:SetSize(playerBannerSettings.dungeon_texture_width, playerBannerSettings.dungeon_texture_height) - lootSquare.LootIconBorder:SetSize(playerBannerSettings.dungeon_texture_width, playerBannerSettings.dungeon_texture_height) + lootSquare.LootIcon:SetSize(playerBannerSettings.loot_square_width, playerBannerSettings.loot_square_height) + lootSquare.LootIconBorder:SetSize(playerBannerSettings.loot_square_width, playerBannerSettings.loot_square_height) lootSquare:Show() @@ -591,15 +595,15 @@ local createPlayerBanner = function(parent, name, index) local levelFontString = levelUpTextFrame:CreateFontString("$parentLVLText", "artwork", "GameFontNormal") levelFontString:SetPoint("bottom", keyStoneDungeonTexture, "bottom", 0, -4) levelFontString:SetTextColor(1, 1, 1) - detailsFramework:SetFontSize(levelFontString, 11) + detailsFramework:SetFontSize(levelFontString, 15) levelFontString:SetText("") playerBanner.LevelFontString = levelFontString local levelFontStringBackgroundTexture = levelUpTextFrame:CreateTexture("$parentItemLevelBackgroundTexture", "artwork", nil, 6) levelFontStringBackgroundTexture:SetTexture([[Interface\Cooldown\LoC-ShadowBG]]) - levelFontStringBackgroundTexture:SetPoint("bottomleft", keyStoneDungeonTexture, "bottomleft", -7, -3) - levelFontStringBackgroundTexture:SetPoint("bottomright", keyStoneDungeonTexture, "bottomright", 7, -15) - levelFontStringBackgroundTexture:SetHeight(10) + levelFontStringBackgroundTexture:SetPoint("bottomleft", keyStoneDungeonTexture, "bottomleft", -10, -3) + levelFontStringBackgroundTexture:SetPoint("bottomright", keyStoneDungeonTexture, "bottomright", 10, -15) + levelFontStringBackgroundTexture:SetHeight(12) levelUpTextFrame.LevelFontStringBackgroundTexture = levelFontStringBackgroundTexture --> animations for levelFontString @@ -773,20 +777,20 @@ local setOrientation = function(readyFrame, mythicDungeonInfo, overallMythicDung local instanceInfo = Details:GetInstanceInfo(mythicDungeonInfo.MapID) or Details:GetInstanceInfo(Details:GetCurrentCombat().mapId) if (orientation == "horizontal") then - readyFrame:SetSize(256, 430) + readyFrame:SetSize(256, 350) if (growDirection == "left") then --when the grow direction if to the left, the readyFrame is anchored to the right side of the ui parent --header texture readyFrame.HeaderTexture:ClearAllPoints() - readyFrame.HeaderTexture:SetPoint("topright", readyFrame, "topright", -7, -36) + readyFrame.HeaderTexture:SetPoint("topright", readyFrame, "topright", -7, 0) readyFrame.HeaderTexture:SetTexCoord(257/512, 1, 234/512, 298/512) readyFrame.HeaderTexture:SetSize(296, 64) readyFrame.AutoCloseTimeBar:SetSize(readyFrame.HeaderTexture:GetWidth(), 25) readyFrame.AutoCloseTimeBar:ClearAllPoints() readyFrame.AutoCloseTimeBar:SetPoint("topright", readyFrame.HeaderTexture, "topright", 0, -22) - readyFrame.AutoCloseTimeBar:SetTimer(40, true) + readyFrame.AutoCloseTimeBar:SetTimer(Details.mythic_plus.autoclose_time, true) readyFrame.AutoCloseTimeBar:SetColor(1, 0.7, 0.0, 0.9) readyFrame.AutoCloseTimeBar:SetDirection("left") readyFrame.AutoCloseTimeBar:SetFrameLevel(readyFrame:GetFrameLevel()+1) @@ -809,7 +813,7 @@ local setOrientation = function(readyFrame, mythicDungeonInfo, overallMythicDung readyFrame.SandTimeIcon:ClearAllPoints() readyFrame.SandTimeIcon:SetSize(buttonSize, buttonSize) --original size is 32x60, need to adjust to the correct size - readyFrame.SandTimeIcon:SetPoint("left", readyFrame.OutOfCombatIcon, "right", 45, 0) + readyFrame.SandTimeIcon:SetPoint("left", readyFrame.OutOfCombatIcon, "right", 40, 0) readyFrame.StrongArmIcon:ClearAllPoints() readyFrame.StrongArmIcon:SetSize(buttonSize, buttonSize) @@ -840,9 +844,9 @@ local setOrientation = function(readyFrame, mythicDungeonInfo, overallMythicDung playerBanner:ClearAllPoints() if (i == 1) then - playerBanner:SetPoint("topright", readyFrame, "topright", -5, -i*playerBanner:GetHeight()) + playerBanner:SetPoint("topright", readyFrame, "topright", -5, -25) else - playerBanner:SetPoint("topright", readyFrame.PlayerBanners[i-1], "bottomright", 0, -10) + playerBanner:SetPoint("topright", readyFrame.PlayerBanners[i-1], "bottomright", 0, -5) end if (instanceInfo) then @@ -869,10 +873,10 @@ local setOrientation = function(readyFrame, mythicDungeonInfo, overallMythicDung --loot squares for j = 1, playerBannerSettings.loot_square_amount do local lootSquare = playerBanner.LootSquares[j] - lootSquare:SetSize(playerBannerSettings.dungeon_texture_width, playerBannerSettings.dungeon_texture_height) + lootSquare:SetSize(playerBannerSettings.loot_square_width, playerBannerSettings.loot_square_height) lootSquare:ClearAllPoints() if (j == 1) then - lootSquare:SetPoint("right", playerBanner.KeyStoneDungeonTexture, "left", -2, 0) + lootSquare:SetPoint("right", playerBanner.KeyStoneDungeonTexture, "left", -7, 0) else lootSquare:SetPoint("right", playerBanner.LootSquares[j-1], "left", -2, 0) end @@ -880,7 +884,8 @@ local setOrientation = function(readyFrame, mythicDungeonInfo, overallMythicDung --role icon playerBanner.RoleIcon:ClearAllPoints() - playerBanner.RoleIcon:SetPoint("center", playerBanner, "left", 4, 0) + --playerBanner.RoleIcon:SetPoint("center", playerBanner, "bottom", 0, 16) + playerBanner.RoleIcon:SetPoint("center", playerBanner, "top", 0, -5) playerBanner.RoleIcon:SetSize(18, 18) playerBanner.RoleIcon:SetAlpha(0.834) end @@ -924,7 +929,7 @@ local updatPlayerBanner = function(unitId, bannerIndex) end if (UnitExists(unitId)) then - local readyFrame = DetailsMythicDungeonReadyFrame + local readyFrame = _G[readyFrameName] local unitName = Details:GetFullName(unitId) local libOpenRaid = LibStub("LibOpenRaid-1.0", true) @@ -995,7 +1000,7 @@ local updateKeysStoneLevel = function() --update the player banners local libOpenRaid = LibStub("LibOpenRaid-1.0", true) ---@type details_mplus_endframe - local readyFrame = DetailsMythicDungeonReadyFrame + local readyFrame = _G[readyFrameName] for bannerIndex = 1, #readyFrame.PlayerBanners do local unitBanner = readyFrame.PlayerBanners[bannerIndex] @@ -1079,25 +1084,35 @@ function mythicDungeonFrames.ShowEndOfMythicPlusPanel() local textSize = 11 ---@type details_mplus_endframe - mythicDungeonFrames.ReadyFrame = CreateFrame("frame", "DetailsMythicDungeonReadyFrame", UIParent, "BackdropTemplate") + mythicDungeonFrames.ReadyFrame = CreateFrame("frame", readyFrameName, UIParent, "BackdropTemplate") local readyFrame = mythicDungeonFrames.ReadyFrame readyFrame:SetSize(355, 390) - readyFrame:SetPoint("center", UIParent, "center", 350, 0) + readyFrame:SetPoint("right", UIParent, "right", 0, 0) readyFrame:SetFrameStrata("LOW") readyFrame:EnableMouse(true) readyFrame:SetMovable(true) readyFrame:Hide() + local backgroundGradient = readyFrame:CreateTexture("$parentBackgroundGradient", "background", nil, 0) + backgroundGradient:SetTexture([[Interface\AddOns\Details\images\gradient_black_transparent.png]], nil, nil, "TRILINEAR") + backgroundGradient:SetPoint("topleft", readyFrame, "topleft", 0, 0) + backgroundGradient:SetPoint("bottomright", readyFrame, "bottomright", 0, 0) + backgroundGradient:SetWidth(readyFrame:GetWidth()) + ---@type playerbanner[] readyFrame.unitCacheByName = {} do --register to libwindow local LibWindow = LibStub("LibWindow-1.1") - LibWindow.RegisterConfig(readyFrame, Details.mythic_plus.finished_run_frame) - LibWindow.RestorePosition(readyFrame) + LibWindow.RegisterConfig(readyFrame, Details.mythic_plus.finished_run_panel3) LibWindow.MakeDraggable(readyFrame) - LibWindow.SavePosition(readyFrame) + + if (Details.mythic_plus.finished_run_panel3.point) then + LibWindow.RestorePosition(readyFrame) + else + LibWindow.SavePosition(readyFrame) + end --set to use rounded corner local roundedCornerTemplate = { @@ -1465,7 +1480,8 @@ function mythicDungeonFrames.ShowEndOfMythicPlusPanel() if (not color) then color = _G["HIGHLIGHT_FONT_COLOR"] end - readyFrame.RantingLabel.text = _G["CHALLENGE_COMPLETE_DUNGEON_SCORE"]:format(color:WrapTextInColorCode(_G["CHALLENGE_COMPLETE_DUNGEON_SCORE_FORMAT_TEXT"]:format(Details222.MythicPlus.NewDungeonScore, gainedScore))) + local textToFormat = "%d" + readyFrame.RantingLabel.text = color:WrapTextInColorCode(textToFormat:format(Details222.MythicPlus.NewDungeonScore or 0)) --, gainedScore readyFrame.RantingLabel.textcolor = "limegreen" else readyFrame.RantingLabel.text = "0000" diff --git a/frames/window_options2_sections.lua b/frames/window_options2_sections.lua index f236ef5d8..53ed4afe7 100644 --- a/frames/window_options2_sections.lua +++ b/frames/window_options2_sections.lua @@ -7026,6 +7026,20 @@ do name = Loc["STRING_OPTIONS_MPLUS_SHOWENDPANEL"], desc = Loc["STRING_OPTIONS_MPLUS_SHOWENDPANEL"], }, + + {--time to auto hide + type = "range", + get = function() return Details.mythic_plus.autoclose_time end, + set = function(self, fixedparam, value) + Details.mythic_plus.autoclose_time = value + afterUpdate() + end, + min = 20, + max = 300, + step = 1, + name = Loc ["STRING_OPTIONS_MPLUS_AUTO_CLOSE_TIME"], + desc = Loc ["STRING_OPTIONS_MPLUS_AUTO_CLOSE_TIME_DESC"], + }, } sectionFrame.sectionOptions = sectionOptions diff --git a/functions/profiles.lua b/functions/profiles.lua index 262b14fb7..c571611b9 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -1646,12 +1646,14 @@ local default_global_data = { last_mythicrun_chart = {}, mythicrun_chart_frame = {}, mythicrun_chart_frame_minimized = {}, - finished_run_panel = {}, --save window position + finished_run_panel3 = {}, --save window position finished_run_frame_options = { orientation = "horizontal", grow_direction = "left", }, + autoclose_time = 40, + mythicrun_time_type = 1, --1: combat time (the amount of time the player is in combat) 2: run time (the amount of time it took to finish the mythic+ run) }, --implementar esse time_type quando estiver dando refresh na janela @@ -2061,7 +2063,7 @@ function Details:ImportProfile (profileString, newProfileName, bImportAutoRunCod mythicPlusSettings.last_mythicrun_chart = {} mythicPlusSettings.mythicrun_chart_frame = {} mythicPlusSettings.mythicrun_chart_frame_minimized = {} - mythicPlusSettings.finished_run_panel = {} + mythicPlusSettings.finished_run_panel3 = {} --max segments allowed Details.segments_amount = 25 diff --git a/images/gradient_black_transparent.png b/images/gradient_black_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..9951ccfc1093f76ccd4a0ace3cc1bfefa1d2b887 GIT binary patch literal 37596 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 Y7saGD7cFtey#N3J07*qoM6N<$g1jc^{{R30 literal 0 HcmV?d00001