From 81b6edddd83da7111bd9cf24a2c8b2ce9618a0f9 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Sat, 7 May 2022 15:31:01 -0300 Subject: [PATCH] Added Arena auto hide option --- Libs/DF/button.lua | 23 +++-- Libs/DF/fw.lua | 2 +- Libs/DF/panel.lua | 129 +++++++++++++++++++++------- frames/window_main.lua | 23 +++++ frames/window_options2_sections.lua | 14 +-- 5 files changed, 142 insertions(+), 49 deletions(-) diff --git a/Libs/DF/button.lua b/Libs/DF/button.lua index 6e28b87a..7eede29a 100644 --- a/Libs/DF/button.lua +++ b/Libs/DF/button.lua @@ -1228,21 +1228,20 @@ function DF:NewColorPickButton (parent, name, member, callback, alpha, button_te button:SetBackdrop ({edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 6, bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]], insets = {left = 0, right = 0, top = 0, bottom = 0}}) end - - --textura do fundo - local background = DF:NewImage (button, nil, color_button_width, color_button_height, nil, nil, nil, "$parentBck") - --background:SetTexture ([[Interface\AddOns\Details\images\icons]]) - background:SetPoint ("topleft", button.widget, "topleft", 1, -2) - background:SetPoint ("bottomright", button.widget, "bottomright", -1, 1) - background:SetTexCoord (0.337890625, 0.390625, 0.625, 0.658203125) - background:SetDrawLayer ("background", 1) - + + local background = button:CreateTexture(nil, "background", nil, 2) + background:SetPoint("topleft", button.widget, "topleft", 0, 0) + background:SetPoint("bottomright", button.widget, "bottomright", 0, 0) + background:SetTexture([[Interface\ITEMSOCKETINGFRAME\UI-EMPTYSOCKET]]) + background:SetTexCoord(3/16, 13/16, 3/16, 13/16) + background:SetAlpha(0.3) + --textura da cor local img = DF:NewImage (button, nil, color_button_width, color_button_height, nil, nil, "color_texture", "$parentTex") img:SetColorTexture (1, 1, 1) - img:SetPoint ("topleft", button.widget, "topleft", 1, -2) - img:SetPoint ("bottomright", button.widget, "bottomright", -1, 1) - img:SetDrawLayer ("background", 2) + img:SetPoint ("topleft", button.widget, "topleft", 0, 0) + img:SetPoint ("bottomright", button.widget, "bottomright", 0, 0) + img:SetDrawLayer ("background", 3) return button diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 26be2f76..50b675c4 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 307 +local dversion = 313 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary (major, minor) diff --git a/Libs/DF/panel.lua b/Libs/DF/panel.lua index 9f17fd24..82192bb0 100644 --- a/Libs/DF/panel.lua +++ b/Libs/DF/panel.lua @@ -5289,6 +5289,19 @@ DF.IconRowFunctions = { return iconFrame end, + --adds only if not existing already in the cache + AddSpecificIcon = function (self, identifierKey, spellId, borderColor, startTime, duration, forceTexture, descText, count, debuffType, caster, canStealOrPurge, spellName, isBuff) + if not identifierKey or identifierKey == "" then + return + end + + if not self.AuraCache[identifierKey] then + local icon = self:SetIcon (spellId, borderColor, startTime, duration, forceTexture, descText, count, debuffType, caster, canStealOrPurge, spellName, isBuff or false) + icon.identifierKey = identifierKey + self.AuraCache[identifierKey] = true + end + end, + SetIcon = function (self, spellId, borderColor, startTime, duration, forceTexture, descText, count, debuffType, caster, canStealOrPurge, spellName, isBuff) local actualSpellName, _, spellIcon = GetSpellInfo (spellId) @@ -5321,7 +5334,7 @@ DF.IconRowFunctions = { iconFrame.timeRemaining = startTime + duration - now iconFrame.expirationTime = startTime + duration - local formattedTime = (iconFrame.timeRemaining > 0) and iconFrame.parentIconRow.FormatCooldownTime(iconFrame.timeRemaining) or "" + local formattedTime = (iconFrame.timeRemaining > 0) and self.options.decimal_timer and iconFrame.parentIconRow.FormatCooldownTimeDecimal(iconFrame.timeRemaining) or iconFrame.parentIconRow.FormatCooldownTime(iconFrame.timeRemaining) or "" iconFrame.CountdownText:SetText (formattedTime) iconFrame.CountdownText:SetPoint (self.options.text_anchor or "center", iconFrame, self.options.text_rel_anchor or "center", self.options.text_x_offset or 0, self.options.text_y_offset or 0) @@ -5341,6 +5354,7 @@ DF.IconRowFunctions = { iconFrame.CountdownText:Hide() end + iconFrame.Cooldown:SetReverse (self.options.cooldown_reverse) iconFrame.Cooldown:SetHideCountdownNumbers (self.options.surpress_blizzard_cd_timer) else iconFrame.timeRemaining = nil @@ -5391,6 +5405,8 @@ DF.IconRowFunctions = { iconFrame.isBuff = isBuff iconFrame.spellName = spellName + iconFrame.identifierKey = nil -- only used for "specific" add/remove + --add the spell into the cache self.AuraCache [spellId or -1] = true self.AuraCache [spellName] = true @@ -5409,7 +5425,11 @@ DF.IconRowFunctions = { if (self.lastUpdateCooldown + 0.05) <= now then self.timeRemaining = self.expirationTime - now if self.timeRemaining > 0 then - self.CountdownText:SetText (self.parentIconRow.FormatCooldownTime(self.timeRemaining)) + if self.parentIconRow.options.decimal_timer then + self.CountdownText:SetText (self.parentIconRow.FormatCooldownTimeDecimal(self.timeRemaining)) + else + self.CountdownText:SetText (self.parentIconRow.FormatCooldownTime(self.timeRemaining)) + end else self.CountdownText:SetText ("") end @@ -5430,47 +5450,98 @@ DF.IconRowFunctions = { return formattedTime end, + FormatCooldownTimeDecimal = function (formattedTime) + if formattedTime < 10 then + return ("%.1f"):format(formattedTime) + elseif formattedTime < 60 then + return ("%d"):format(formattedTime) + elseif formattedTime < 3600 then + return ("%d:%02d"):format(formattedTime/60%60, formattedTime%60) + elseif formattedTime < 86400 then + return ("%dh %02dm"):format(formattedTime/(3600), formattedTime/60%60) + else + return ("%dd %02dh"):format(formattedTime/86400, (formattedTime/3600) - (floor(formattedTime/86400) * 24)) + end + end, + + RemoveSpecificIcon = function (self, identifierKey) + if not identifierKey or identifierKey == "" then + return + end + + table.wipe (self.AuraCache) + + local iconPool = self.IconPool + local countStillShown = 0 + for i = 1, self.NextIcon -1 do + local iconFrame = iconPool[i] + if iconFrame.identifierKey and iconFrame.identifierKey == identifierKey then + iconFrame:Hide() + iconFrame:ClearAllPoints() + iconFrame.identifierKey = nil + else + self.AuraCache [iconFrame.spellId] = true + self.AuraCache [iconFrame.spellName] = true + self.AuraCache.canStealOrPurge = self.AuraCache.canStealOrPurge or iconFrame.canStealOrPurge + self.AuraCache.hasEnrage = self.AuraCache.hasEnrage or iconFrame.debuffType == "" --yes, enrages are empty-string... + countStillShown = countStillShown + 1 + end + end + + self:AlignAuraIcons() + + end, + ClearIcons = function (self, resetBuffs, resetDebuffs) resetBuffs = resetBuffs ~= false resetDebuffs = resetDebuffs ~= false table.wipe (self.AuraCache) local iconPool = self.IconPool - local countStillShown = 0 for i = 1, self.NextIcon -1 do - if iconPool[i].isBuff == nil then - iconPool[i]:Hide() - iconPool[i]:ClearAllPoints() - elseif resetBuffs and iconPool[i].isBuff then - iconPool[i]:Hide() - iconPool[i]:ClearAllPoints() - elseif resetDebuffs and not iconPool[i].isBuff then - iconPool[i]:Hide() - iconPool[i]:ClearAllPoints() + local iconFrame = iconPool[i] + if iconFrame.isBuff == nil then + iconFrame:Hide() + iconFrame:ClearAllPoints() + elseif resetBuffs and iconFrame.isBuff then + iconFrame:Hide() + iconFrame:ClearAllPoints() + elseif resetDebuffs and not iconFrame.isBuff then + iconFrame:Hide() + iconFrame:ClearAllPoints() else - self.AuraCache [iconPool[i].spellId] = true - self.AuraCache [iconPool[i].spellName] = true - self.AuraCache.canStealOrPurge = self.AuraCache.canStealOrPurge or iconPool[i].canStealOrPurge - self.AuraCache.hasEnrage = self.AuraCache.hasEnrage or iconPool[i].debuffType == "" --yes, enrages are empty-string... - countStillShown = countStillShown + 1 + self.AuraCache [iconFrame.spellId] = true + self.AuraCache [iconFrame.spellName] = true + self.AuraCache.canStealOrPurge = self.AuraCache.canStealOrPurge or iconFrame.canStealOrPurge + self.AuraCache.hasEnrage = self.AuraCache.hasEnrage or iconFrame.debuffType == "" --yes, enrages are empty-string... end end - if countStillShown == 0 then - self.NextIcon = 1 + self:AlignAuraIcons() + + end, + + AlignAuraIcons = function (self) + + local iconPool = self.IconPool + local iconAmount = #iconPool + local countStillShown = 0 + + table.sort (iconPool, function(i1, i2) return i1:IsShown() and not i2:IsShown() end) + + if iconAmount == 0 then self:Hide() else - self.NextIcon = countStillShown + 1 - table.sort (iconPool, function(i1, i2) return i1:IsShown() and not i2:IsShown() end) - -- re-anchor not hidden - for i = 1, countStillShown do + for i = 1, iconAmount do local iconFrame = iconPool[i] local anchor = self.options.anchor local anchorTo = i == 1 and self or self.IconPool [i - 1] local xPadding = i == 1 and self.options.left_padding or self.options.icon_padding or 1 local growDirection = self.options.grow_direction + countStillShown = countStillShown + (iconFrame:IsShown() and 1 or 0) + iconFrame:ClearAllPoints() if (growDirection == 1) then --grow to right if (i == 1) then @@ -5490,6 +5561,8 @@ DF.IconRowFunctions = { end end + self.NextIcon = countStillShown + 1 + end, GetIconGrowDirection = function (self) @@ -5572,6 +5645,8 @@ local default_icon_row_options = { surpress_blizzard_cd_timer = false, surpress_tulla_omni_cc = false, on_tick_cooldown_update = true, + decimal_timer = false, + cooldown_reverse = false, } function DF:CreateIconRow (parent, name, options) @@ -8538,13 +8613,7 @@ DF.CastFrameFunctions = { end, UpdateCastingInfo = function (self, unit) - local name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID - if not IS_WOW_PROJECT_CLASSIC_TBC then - name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID = UnitCastingInfo (unit) - else - name, text, texture, startTime, endTime, isTradeSkill, castID, spellID = UnitCastingInfo (unit) - notInterruptible = false - end + local name, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible, spellID = UnitCastingInfo (unit) --> is valid? if (not self:IsValid (unit, name, isTradeSkill, true)) then diff --git a/frames/window_main.lua b/frames/window_main.lua index 6fe64a8f..6d4d63ad 100644 --- a/frames/window_main.lua +++ b/frames/window_main.lua @@ -7604,6 +7604,29 @@ function _detalhes:AdjustAlphaByContext(interacting) end end + --in arena + if (self.hide_on_context[9].enabled) then + local contextId = 9 + local isInInstance = IsInInstance() + if (isInInstance and Details.zone_type == "arena") then + --player is within a pvp arena + if (not self.hide_on_context[contextId].inverse) then + self:SetWindowAlphaForCombat(true, true, getAlphaByContext(self, contextId)) + self:SetWindowAlphaForCombat(true, true, getAlphaByContext(self, contextId)) + else + self:SetWindowAlphaForCombat(false, false, getAlphaByContext(self, contextId)) --> deshida a janela + end + hasRuleEnabled = true + else + --player is not inside an arena + if (self.hide_on_context[contextId].inverse) then + self:SetWindowAlphaForCombat (true, true, getAlphaByContext(self, contextId)) + self:SetWindowAlphaForCombat (true, true, getAlphaByContext(self, contextId)) + hasRuleEnabled = true + end + end + end + --in battleground if (self.hide_on_context[7].enabled) then local isInInstance = IsInInstance() diff --git a/frames/window_options2_sections.lua b/frames/window_options2_sections.lua index 5732112c..9ee334be 100644 --- a/frames/window_options2_sections.lua +++ b/frames/window_options2_sections.lua @@ -5230,9 +5230,10 @@ do Loc["STRING_OPTIONS_COMBAT_ALPHA_7"], Loc["STRING_OPTIONS_COMBAT_ALPHA_8"], Loc["STRING_OPTIONS_COMBAT_ALPHA_9"], + _G.ARENA or "_G.ARENA", } - local optionsOrder = {3, 4, 5, 6, 7, 8, 1, 2} + local optionsOrder = {3, 4, 5, 6, 9, 7, 8, 1, 2} local header1Label = _G.DetailsFramework:CreateLabel(sectionFrame, Loc["STRING_CONTEXT"]) local header2Label = _G.DetailsFramework:CreateLabel(sectionFrame, Loc["STRING_ENABLED"]) @@ -5270,27 +5271,28 @@ do local line = _G.CreateFrame("frame", nil, sectionFrame,"BackdropTemplate") line:SetSize(300, 22) line:SetPoint("topleft", sectionFrame, "topleft", right_start_at, yyy + ((id) * -23) + 4) - _G.DetailsFramework:ApplyStandardBackdrop(line) + DetailsFramework:ApplyStandardBackdrop(line) - local contextLabel = _G.DetailsFramework:CreateLabel(line, typeCombatAlpha[i]) + local contextLabel = DetailsFramework:CreateLabel(line, typeCombatAlpha[i]) contextLabel:SetPoint("left", line, "left", 2, 0) - local enabledCheckbox = _G.DetailsFramework:NewSwitch(line, nil, nil, nil, 20, 20, nil, nil, false, nil, nil, nil, nil, options_switch_template) + local enabledCheckbox = DetailsFramework:NewSwitch(line, nil, nil, nil, 20, 20, nil, nil, false, nil, nil, nil, nil, options_switch_template) enabledCheckbox:SetPoint("left", line, "left", 118, 0) enabledCheckbox:SetAsCheckBox() enabledCheckbox.OnSwitch = onEnableHideContext enabledCheckbox:SetFixedParameter(i) - local reverseCheckbox = _G.DetailsFramework:NewSwitch(line, nil, nil, nil, 20, 20, nil, nil, false, nil, nil, nil, nil, options_switch_template) + local reverseCheckbox = DetailsFramework:NewSwitch(line, nil, nil, nil, 20, 20, nil, nil, false, nil, nil, nil, nil, options_switch_template) reverseCheckbox:SetPoint("left", line, "left", 140, 0) reverseCheckbox:SetAsCheckBox() reverseCheckbox.OnSwitch = onInverseValue reverseCheckbox:SetFixedParameter(i) - local alphaSlider = _G.DetailsFramework:CreateSlider(line, 138, 20, 0, 100, 1, 100, false, nil, nil, nil, options_slider_template) + local alphaSlider = DetailsFramework:CreateSlider(line, 138, 20, 0, 100, 1, 100, false, nil, nil, nil, options_slider_template) alphaSlider:SetPoint("left", line, "left", 162, 0) alphaSlider:SetHook("OnValueChanged", onAlphaChanged) alphaSlider:SetFixedParameter(i) + alphaSlider.thumb:SetWidth(32) line.contextLabel = contextLabel line.enabledCheckbox = enabledCheckbox