(fix/WeakAuras): Resolve long-standing frame level overflow
Switches frame level assignment to depth-based ordering to avoid overflow and ensure deterministic ordering. WeakAurasFrame now correctly lives on FrameStrata MEDIUM without interfering with Blizzard UI elements. (cherry picked from commit e92edf5700ad70587a71c3a403e5cc672dbc9e8e)
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
-- Fix FrameStrata of ChatFrame
|
||||
for i = 1, NUM_CHAT_WINDOWS do
|
||||
local chatFrame = _G["ChatFrame" .. i]
|
||||
if chatFrame and type(chatFrame.GetFrameStrata) == "function" and type(chatFrame.SetFrameStrata) == "function" then
|
||||
if chatFrame:GetFrameStrata() == "BACKGROUND" then
|
||||
chatFrame:SetFrameStrata("MEDIUM")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -41,7 +41,8 @@ local default = {
|
||||
centerType = "LR",
|
||||
gridWidth = 5,
|
||||
rowSpace = 1,
|
||||
columnSpace = 1
|
||||
columnSpace = 1,
|
||||
sharedFrameLevel = true, -- true to ensure identical behavior on newer clients
|
||||
}
|
||||
|
||||
Private.regionPrototype.AddAlphaToDefault(default);
|
||||
|
||||
@@ -21,6 +21,7 @@ local default = {
|
||||
borderSize = 2,
|
||||
borderBackdrop = "Blizzard Tooltip",
|
||||
scale = 1,
|
||||
sharedFrameLevel = true, -- true to ensure identical behavior on newer clients
|
||||
};
|
||||
|
||||
Private.regionPrototype.AddAlphaToDefault(default);
|
||||
|
||||
+25
-26
@@ -1244,7 +1244,7 @@ end
|
||||
local WeakAurasFrame = CreateFrame("Frame", "WeakAurasFrame", UIParent);
|
||||
Private.frames["WeakAuras Main Frame"] = WeakAurasFrame;
|
||||
WeakAurasFrame:SetAllPoints(UIParent);
|
||||
WeakAurasFrame:SetFrameStrata("BACKGROUND");
|
||||
WeakAurasFrame:SetFrameLevel(0)
|
||||
|
||||
local loadedFrame = CreateFrame("Frame");
|
||||
Private.frames["Addon Initialization Handler"] = loadedFrame;
|
||||
@@ -4159,56 +4159,55 @@ function Private.ValueToPath(data, path, value)
|
||||
end
|
||||
end
|
||||
|
||||
Private.frameLevels = {};
|
||||
Private.frameLevels = {}
|
||||
local function SetFrameLevel(id, frameLevel)
|
||||
frameLevel = math.min(120, frameLevel)
|
||||
if (Private.frameLevels[id] == frameLevel) then
|
||||
return;
|
||||
if Private.frameLevels[id] == frameLevel then
|
||||
return
|
||||
end
|
||||
if (Private.regions[id] and Private.regions[id].region) then
|
||||
if Private.regions[id] and Private.regions[id].region then
|
||||
Private.ApplyFrameLevel(Private.regions[id].region, frameLevel)
|
||||
end
|
||||
if (clones[id]) then
|
||||
for i,v in pairs(clones[id]) do
|
||||
if clones[id] then
|
||||
for _, v in pairs(clones[id]) do
|
||||
Private.ApplyFrameLevel(v, frameLevel)
|
||||
end
|
||||
end
|
||||
Private.frameLevels[id] = frameLevel;
|
||||
Private.frameLevels[id] = frameLevel
|
||||
end
|
||||
|
||||
local function FixGroupChildrenOrderImpl(data, frameLevel)
|
||||
-- DepthBasedFrameLevels:
|
||||
-- Root Group (0)
|
||||
-- ├─ Aura (4)
|
||||
-- ├─ Child Group (4)
|
||||
-- │ ├─ Aura (8)
|
||||
-- │ └─ Aura (8)
|
||||
-- Root Aura (0)
|
||||
local function ApplyDepthBasedFrameLevels(data, depth)
|
||||
local frameLevel = depth * 4
|
||||
SetFrameLevel(data.id, frameLevel)
|
||||
local offset
|
||||
if data.sharedFrameLevel then
|
||||
offset = 0
|
||||
else
|
||||
offset = 4
|
||||
|
||||
if not data.controlledChildren then
|
||||
return
|
||||
end
|
||||
|
||||
for _, childId in ipairs(data.controlledChildren) do
|
||||
local childData = WeakAuras.GetData(childId)
|
||||
if childData.regionType ~= "group" and childData.regionType ~= "dynamicgroup" then
|
||||
frameLevel = frameLevel + offset
|
||||
SetFrameLevel(childId, frameLevel)
|
||||
else
|
||||
frameLevel = frameLevel + offset
|
||||
local endFrameLevel = FixGroupChildrenOrderImpl(childData, frameLevel)
|
||||
if not data.sharedFrameLevel then
|
||||
frameLevel = endFrameLevel
|
||||
end
|
||||
if childData then
|
||||
ApplyDepthBasedFrameLevels(childData, depth + 1)
|
||||
end
|
||||
end
|
||||
return frameLevel
|
||||
end
|
||||
|
||||
function Private.FixGroupChildrenOrderForGroup(data)
|
||||
if data.parent then
|
||||
return
|
||||
end
|
||||
FixGroupChildrenOrderImpl(data, 0)
|
||||
ApplyDepthBasedFrameLevels(data, 0)
|
||||
end
|
||||
|
||||
local function GetFrameLevelFor(id)
|
||||
return Private.frameLevels[id] or 5;
|
||||
return Private.frameLevels[id] or 5
|
||||
end
|
||||
|
||||
function Private.ApplyFrameLevel(region, frameLevel)
|
||||
|
||||
@@ -561,12 +561,11 @@ local function createOptions(id, data)
|
||||
name = L["Flat Framelevels"],
|
||||
desc = L["The group and all direct children will share the same base frame level."],
|
||||
order = 30,
|
||||
set = function(info, v)
|
||||
data.sharedFrameLevel = v
|
||||
WeakAuras.Add(data)
|
||||
for parent in OptionsPrivate.Private.TraverseParents(data) do
|
||||
WeakAuras.Add(parent)
|
||||
end
|
||||
get = function()
|
||||
return true
|
||||
end,
|
||||
set = function()
|
||||
-- Frame levels are flattened by default and cannot be changed on this version
|
||||
end
|
||||
},
|
||||
endHeader = {
|
||||
|
||||
@@ -603,12 +603,11 @@ local function createOptions(id, data)
|
||||
name = L["Flat Framelevels"],
|
||||
desc = L["The group and all direct children will share the same base frame level."],
|
||||
order = 47,
|
||||
set = function(info, v)
|
||||
data.sharedFrameLevel = v
|
||||
WeakAuras.Add(data)
|
||||
for parent in OptionsPrivate.Private.TraverseParents(data) do
|
||||
WeakAuras.Add(parent)
|
||||
end
|
||||
get = function()
|
||||
return true
|
||||
end,
|
||||
set = function()
|
||||
-- Frame levels are flattened by default and cannot be changed on this version
|
||||
end
|
||||
},
|
||||
endHeader = {
|
||||
|
||||
Reference in New Issue
Block a user