Files
coa-weakauras/WeakAuras/RegionTypes/Group.lua
T
Bunny67 7cbc40c959 beta
2020-11-15 23:43:10 +03:00

175 lines
5.1 KiB
Lua

if not WeakAuras.IsCorrectVersion() then return end
local AddonName, Private = ...
local SharedMedia = LibStub("LibSharedMedia-3.0");
-- Default settings
local default = {
controlledChildren = {},
anchorPoint = "CENTER",
anchorFrameType = "SCREEN",
xOffset = 0,
yOffset = 0,
frameStrata = 1,
border = false,
borderColor = { 0, 0, 0, 1 },
backdropColor = { 1, 1, 1, 0.5 },
borderEdge = "Square Full White",
borderOffset = 4,
borderInset = 1,
borderSize = 2,
borderBackdrop = "Blizzard Tooltip",
scale = 1,
};
-- Called when first creating a new region/display
local function create(parent)
-- Main region
local region = CreateFrame("FRAME", nil, parent);
region:SetMovable(true);
region:SetWidth(2);
region:SetHeight(2);
-- Border region
local border = CreateFrame("frame", nil, region);
region.border = border;
WeakAuras.regionPrototype.create(region);
return region;
end
-- Calculate bounding box
local function getRect(data, region)
-- Temp variables
local blx, bly, trx, try;
blx, bly = data.xOffset or 0, data.yOffset or 0;
local width = data.width or (region and region.width)
local height = data.height or (region and region.height)
if width == nil or height == nil then
return blx, bly, blx, bly;
end
-- Calc bounding box
if(data.selfPoint:find("LEFT")) then
trx = blx + width;
elseif(data.selfPoint:find("RIGHT")) then
trx = blx;
blx = blx - width;
else
blx = blx - (width/2);
trx = blx + width;
end
if(data.selfPoint:find("BOTTOM")) then
try = bly + height;
elseif(data.selfPoint:find("TOP")) then
try = bly;
bly = bly - height;
else
bly = bly - (height/2);
try = bly + height;
end
-- Return data
return blx, bly, trx, try;
end
-- Modify a given region/display
local function modify(parent, region, data)
if data.information.groupOffset then
data.selfPoint = "BOTTOMLEFT";
else
data.selfPoint = "CENTER";
end
WeakAuras.regionPrototype.modify(parent, region, data);
-- Localize
local border = region.border;
-- Scale
region:SetScale(data.scale and data.scale > 0 and data.scale or 1)
-- Get overall bounding box
local leftest, rightest, lowest, highest = 0, 0, 0, 0;
local minLevel
for index, childId in ipairs(data.controlledChildren) do
local childData = WeakAuras.GetData(childId);
local childRegion = WeakAuras.GetRegion(childId)
if(childData) then
local blx, bly, trx, try = getRect(childData, childRegion);
leftest = math.min(leftest, blx);
rightest = math.max(rightest, trx);
lowest = math.min(lowest, bly);
highest = math.max(highest, try);
local frameLevel = childRegion and childRegion:GetFrameLevel()
if frameLevel then
minLevel = minLevel and math.min(minLevel, frameLevel) or frameLevel
end
end
end
region.blx = leftest;
region.bly = lowest;
region.trx = rightest;
region.try = highest;
-- Adjust frame-level sorting
Private.FixGroupChildrenOrderForGroup(data);
-- Control children (does not happen with "group")
function region:UpdateBorder(childRegion)
local border = region.border;
-- Apply border settings
if data.border then
-- Initial visibility (of child that originated UpdateBorder(...))
local childVisible = childRegion and childRegion.toShow or false;
-- Scan children for visibility
if not childVisible then
for index, childId in ipairs(data.controlledChildren) do
local childRegion = WeakAuras.regions[childId] and WeakAuras.regions[childId].region;
if childRegion and childRegion.toShow then
childVisible = true;
break;
end
end
end
-- Show border if child is visible
if childVisible then
border:SetBackdrop({
edgeFile = data.borderEdge ~= "None" and SharedMedia:Fetch("border", data.borderEdge) or "",
edgeSize = data.borderSize,
bgFile = data.borderBackdrop ~= "None" and SharedMedia:Fetch("background", data.borderBackdrop) or "",
insets = {
left = data.borderInset,
right = data.borderInset,
top = data.borderInset,
bottom = data.borderInset,
},
});
border:SetBackdropBorderColor(data.borderColor[1], data.borderColor[2], data.borderColor[3], data.borderColor[4]);
border:SetBackdropColor(data.backdropColor[1], data.backdropColor[2], data.backdropColor[3], data.backdropColor[4]);
border:ClearAllPoints();
border:SetPoint("bottomleft", region, "bottomleft", leftest-data.borderOffset, lowest-data.borderOffset);
border:SetPoint("topright", region, "topright", rightest+data.borderOffset, highest+data.borderOffset);
if minLevel then
border:SetFrameLevel(minLevel - 1)
end
border:Show();
else
border:Hide();
end
else
border:Hide();
end
end
region:UpdateBorder()
WeakAuras.regionPrototype.modifyFinish(parent, region, data);
end
-- Register new region type with WeakAuras
WeakAuras.RegisterRegionType("group", create, modify, default);