From 97e83c95e3b76ebe95fd2b3df23d6830a888da29 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 | 2 + 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(+), 57 deletions(-) create mode 100644 images/gradient_black_transparent.png diff --git a/Libs/DF/charts.lua b/Libs/DF/charts.lua index e98d2059..6fef0fcb 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 665919ed..133622f7 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 02a20523..bd006ad2 100644 --- a/boot.lua +++ b/boot.lua @@ -1240,6 +1240,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]]) diff --git a/core/control.lua b/core/control.lua index b5566a0d..9beb2fa7 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 02dc5b0b..ca78da1e 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 a3619062..9ad50ff2 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 5dedd446..961d6d8c 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 a432d8f8..86f345ac 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 d1fac28f..61eccea0 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:SetPointOffset(-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 3cba8d5e..5b99fc60 100644 --- a/frames/window_breakdown/window_playerbreakdown_list.lua +++ b/frames/window_breakdown/window_playerbreakdown_list.lua @@ -338,6 +338,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 @@ -524,8 +527,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 @@ -548,7 +555,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 89ef5ee4..fbec089b 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 c40fac8e..221e1c9f 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 26f481bb..0733af90 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 7b797640..b4a7f725 100644 --- a/frames/window_mythicplus/window_end_of_run.lua +++ b/frames/window_mythicplus/window_end_of_run.lua @@ -31,6 +31,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} @@ -41,8 +43,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 } @@ -235,8 +239,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() @@ -567,15 +571,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 @@ -742,20 +746,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) @@ -778,7 +782,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) @@ -809,9 +813,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 @@ -838,10 +842,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 @@ -849,7 +853,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 @@ -893,7 +898,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) @@ -964,7 +969,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] @@ -1045,25 +1050,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 = { @@ -1431,7 +1446,8 @@ function mythicDungeonFrames.ShowEndOfMythicPlusPanel() if (not color) then color = HIGHLIGHT_FONT_COLOR end - readyFrame.RantingLabel.text = CHALLENGE_COMPLETE_DUNGEON_SCORE:format(color:WrapTextInColorCode(CHALLENGE_COMPLETE_DUNGEON_SCORE_FORMAT_TEXT:format(Details222.MythicPlus.NewDungeonScore, gainedScore))) + local textToFormat = "%d" + readyFrame.RantingLabel.text = color:WrapText(textToFormat:format(Details222.MythicPlus.NewDungeonScore or 0)) --, gainedScore readyFrame.RantingLabel.textcolor = "limegreen" else readyFrame.RantingLabel.text = "" diff --git a/frames/window_options2_sections.lua b/frames/window_options2_sections.lua index f821eda4..92c02665 100644 --- a/frames/window_options2_sections.lua +++ b/frames/window_options2_sections.lua @@ -7030,6 +7030,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 12a89f31..542cb371 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -1453,12 +1453,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 @@ -1863,7 +1865,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 = {} --make the max amount of segments be 25 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