You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

561 lines
26 KiB

local _, Cell = ...
local F = Cell.funcs
local B = Cell.bFuncs
local P = Cell.pixelPerfectFuncs
local raidFrame = CreateFrame("Frame", "CellRaidFrame", Cell.frames.mainFrame, "SecureHandlerAttributeTemplate")
Cell.frames.raidFrame = raidFrame
raidFrame:SetAllPoints(Cell.frames.mainFrame)
local npcFrameAnchor = CreateFrame("Frame", "CellNPCFrameAnchor", raidFrame, "SecureFrameTemplate,BackDropTemplate")
raidFrame:SetFrameRef("npcAnchor", npcFrameAnchor)
-- npcFrameAnchor:Hide()
-- Cell:StylizeFrame(npcFrameAnchor)
raidFrame:SetAttribute("_onattributechanged", [[
if not (name == "combinegroups" or name == "visibility") then
return
end
local header
local combineGroups = self:GetAttribute("combineGroups")
if combineGroups then
header = self:GetFrameRef("combinedHeader")
else
local maxGroup
for i = 1, 8 do
if self:GetFrameRef("visibilityHelper"..i):IsVisible() then
maxGroup = i
end
end
if not maxGroup then return end -- NOTE: empty subgroup will cause maxGroup == nil
header = self:GetFrameRef("subgroup"..maxGroup)
end
local npcFrameAnchor = self:GetFrameRef("npcAnchor")
local spacing = self:GetAttribute("spacing") or 0
local orientation = self:GetAttribute("orientation") or "vertical"
local anchor = self:GetAttribute("anchor") or "TOPLEFT"
npcFrameAnchor:ClearAllPoints()
local point, anchorPoint
if orientation == "vertical" then
if anchor == "BOTTOMLEFT" then
point, anchorPoint = "BOTTOMLEFT", "BOTTOMRIGHT"
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint = "BOTTOMRIGHT", "BOTTOMLEFT"
elseif anchor == "TOPLEFT" then
point, anchorPoint = "TOPLEFT", "TOPRIGHT"
elseif anchor == "TOPRIGHT" then
point, anchorPoint = "TOPRIGHT", "TOPLEFT"
end
npcFrameAnchor:SetPoint(point, header, anchorPoint, spacing, 0)
else
if anchor == "BOTTOMLEFT" then
point, anchorPoint = "BOTTOMLEFT", "TOPLEFT"
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint = "BOTTOMRIGHT", "TOPRIGHT"
elseif anchor == "TOPLEFT" then
point, anchorPoint = "TOPLEFT", "BOTTOMLEFT"
elseif anchor == "TOPRIGHT" then
point, anchorPoint = "TOPRIGHT", "BOTTOMRIGHT"
end
npcFrameAnchor:SetPoint(point, header, anchorPoint, 0, spacing)
end
]])
--[[ Interface\FrameXML\SecureGroupHeaders.lua
List of the various configuration attributes
======================================================
showRaid = [BOOLEAN] -- true if the header should be shown while in a raid
showParty = [BOOLEAN] -- true if the header should be shown while in a party and not in a raid
showPlayer = [BOOLEAN] -- true if the header should show the player when not in a raid
showSolo = [BOOLEAN] -- true if the header should be shown while not in a group (implies showPlayer)
nameList = [STRING] -- a comma separated list of player names (not used if 'groupFilter' is set)
groupFilter = [1-8, STRING] -- a comma seperated list of raid group numbers and/or uppercase class names and/or uppercase roles
roleFilter = [STRING] -- a comma seperated list of MT/MA/Tank/Healer/DPS role strings
strictFiltering = [BOOLEAN]
-- if true, then
---- if only groupFilter is specified then characters must match both a group and a class from the groupFilter list
---- if only roleFilter is specified then characters must match at least one of the specified roles
---- if both groupFilter and roleFilters are specified then characters must match a group and a class from the groupFilter list and a role from the roleFilter list
point = [STRING] -- a valid XML anchoring point (Default: "TOP")
xOffset = [NUMBER] -- the x-Offset to use when anchoring the unit buttons (Default: 0)
yOffset = [NUMBER] -- the y-Offset to use when anchoring the unit buttons (Default: 0)
sortMethod = ["INDEX", "NAME", "NAMELIST"] -- defines how the group is sorted (Default: "INDEX")
sortDir = ["ASC", "DESC"] -- defines the sort order (Default: "ASC")
template = [STRING] -- the XML template to use for the unit buttons
templateType = [STRING] - specifies the frame type of the managed subframes (Default: "Button")
groupBy = [nil, "GROUP", "CLASS", "ROLE", "ASSIGNEDROLE"] - specifies a "grouping" type to apply before regular sorting (Default: nil)
groupingOrder = [STRING] - specifies the order of the groupings (ie. "1,2,3,4,5,6,7,8")
maxColumns = [NUMBER] - maximum number of columns the header will create (Default: 1)
unitsPerColumn = [NUMBER or nil] - maximum units that will be displayed in a singe column, nil is infinite (Default: nil)
startingIndex = [NUMBER] - the index in the final sorted unit list at which to start displaying units (Default: 1)
columnSpacing = [NUMBER] - the amount of space between the rows/columns (Default: 0)
columnAnchorPoint = [STRING] - the anchor point of each new column (ie. use LEFT for the columns to grow to the right)
--]]
-------------------------------------------------
-- combinedHeader
-------------------------------------------------
local combinedHeader
do
local headerName = "CellRaidFrameHeader0"
combinedHeader = CreateFrame("Frame", headerName, raidFrame, "SecureGroupHeaderTemplate")
Cell.unitButtons.raid[headerName] = combinedHeader
combinedHeader:SetAttribute("template", "CellUnitButtonTemplate")
combinedHeader:SetAttribute("columnAnchorPoint", "LEFT")
combinedHeader:SetAttribute("point", "TOP")
combinedHeader:SetAttribute("groupFilter", "1,2,3,4,5,6,7,8")
-- combinedHeader:SetAttribute("groupingOrder", "TANK,HEALER,DAMAGER,NONE")
-- combinedHeader:SetAttribute("groupBy", "ASSIGNEDROLE")
combinedHeader:SetAttribute("xOffset", 0)
combinedHeader:SetAttribute("yOffset", -1)
combinedHeader:SetAttribute("unitsPerColumn", 5)
combinedHeader:SetAttribute("maxColumns", 8)
-- combinedHeader:SetAttribute("showRaid", true)
combinedHeader:SetAttribute("startingIndex", -39)
combinedHeader:Show()
combinedHeader:SetAttribute("startingIndex", 1)
-- for npcFrame's point
raidFrame:SetFrameRef("combinedHeader", combinedHeader)
end
-------------------------------------------------
-- separatedHeaders
-------------------------------------------------
local separatedHeaders = {}
local function CreateGroupHeader(group)
local headerName = "CellRaidFrameHeader"..group
local header = CreateFrame("Frame", headerName, raidFrame, "SecureGroupHeaderTemplate")
separatedHeaders[group] = header
Cell.unitButtons.raid[headerName] = header
-- header:SetAttribute("initialConfigFunction", [[
-- RegisterUnitWatch(self)
-- local header = self:GetParent()
-- self:SetWidth(header:GetAttribute("buttonWidth") or 66)
-- self:SetHeight(header:GetAttribute("buttonHeight") or 46)
-- ]])
header:SetAttribute("template", "CellUnitButtonTemplate")
header:SetAttribute("columnAnchorPoint", "LEFT")
header:SetAttribute("point", "TOP")
header:SetAttribute("groupFilter", group)
header:SetAttribute("xOffset", 0)
header:SetAttribute("yOffset", -1)
header:SetAttribute("unitsPerColumn", 5)
header:SetAttribute("columnSpacing", 1)
header:SetAttribute("maxColumns", 1)
-- header:SetAttribute("startingIndex", 1)
header:SetAttribute("showRaid", true)
--[[ Interface\FrameXML\SecureGroupHeaders.lua line 150
local loopStart = startingIndex;
local loopFinish = min((startingIndex - 1) + unitsPerColumn * numColumns, unitCount)
-- ensure there are enough buttons
numDisplayed = loopFinish - (loopStart - 1)
local needButtons = max(1, numDisplayed); --! to make needButtons == 5
]]
--! to make needButtons == 5 cheat configureChildren in SecureGroupHeaders.lua
header:SetAttribute("startingIndex", -4)
header:Show()
header:SetAttribute("startingIndex", 1)
-- for i, b in ipairs(header) do
-- b.type = "main" -- layout setup
-- end
-- for npcFrame's point
raidFrame:SetFrameRef("subgroup"..group, header)
local helper = CreateFrame("Frame", nil, header[1], "SecureHandlerShowHideTemplate")
helper:SetFrameRef("raidframe", raidFrame)
raidFrame:SetFrameRef("visibilityHelper"..group, helper)
helper:SetAttribute("_onshow", [[ self:GetFrameRef("raidframe"):SetAttribute("visibility", 1) ]])
helper:SetAttribute("_onhide", [[ self:GetFrameRef("raidframe"):SetAttribute("visibility", 0) ]])
end
for i = 1, 8 do
CreateGroupHeader(i)
end
-- arena pet
local arenaPetButtons = {}
for i = 1, (Cell.isRetail and 3 or 5) do
arenaPetButtons[i] = CreateFrame("Button", "CellArenaPet"..i, raidFrame, "CellUnitButtonTemplate")
arenaPetButtons[i]:SetAttribute("unit", "raidpet"..i)
Cell.unitButtons.arena["raidpet"..i] = arenaPetButtons[i]
end
-------------------------------------------------
-- update
-------------------------------------------------
local function GetPoints(layout)
local orientation = layout["main"]["orientation"]
local anchor = layout["main"]["anchor"]
local spacingX = layout["main"]["spacingX"]
local spacingY = layout["main"]["spacingY"]
local point, anchorPoint, groupAnchorPoint, unitSpacing, groupSpacing, verticalSpacing, horizontalSpacing, headerPoint, headerColumnAnchorPoint
if orientation == "vertical" then
if anchor == "BOTTOMLEFT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMLEFT", "TOPLEFT", "BOTTOMRIGHT"
headerPoint, headerColumnAnchorPoint = "BOTTOM", "LEFT"
unitSpacing = spacingY
groupSpacing = spacingX
unitSpacingX, unitSpacingY = spacingX, spacingY
verticalSpacing = spacingY+layout["main"]["groupSpacing"]
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMRIGHT", "TOPRIGHT", "BOTTOMLEFT"
headerPoint, headerColumnAnchorPoint = "BOTTOM", "RIGHT"
unitSpacing = spacingY
groupSpacing = -spacingX
unitSpacingX, unitSpacingY = spacingX, spacingY
verticalSpacing = spacingY+layout["main"]["groupSpacing"]
elseif anchor == "TOPLEFT" then
point, anchorPoint, groupAnchorPoint = "TOPLEFT", "BOTTOMLEFT", "TOPRIGHT"
headerPoint, headerColumnAnchorPoint = "TOP", "LEFT"
unitSpacing = -spacingY
groupSpacing = spacingX
unitSpacingX, unitSpacingY = spacingX, -spacingY
verticalSpacing = -spacingY-layout["main"]["groupSpacing"]
elseif anchor == "TOPRIGHT" then
point, anchorPoint, groupAnchorPoint = "TOPRIGHT", "BOTTOMRIGHT", "TOPLEFT"
headerPoint, headerColumnAnchorPoint = "TOP", "RIGHT"
unitSpacing = -spacingY
groupSpacing = -spacingX
unitSpacingX, unitSpacingY = spacingX, -spacingY
verticalSpacing = -spacingY-layout["main"]["groupSpacing"]
end
else
if anchor == "BOTTOMLEFT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMLEFT", "BOTTOMRIGHT", "TOPLEFT"
headerPoint, headerColumnAnchorPoint = "LEFT", "BOTTOM"
unitSpacing = spacingX
groupSpacing = spacingY
unitSpacingX, unitSpacingY = spacingX, spacingY
horizontalSpacing = spacingX+layout["main"]["groupSpacing"]
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMRIGHT", "BOTTOMLEFT", "TOPRIGHT"
headerPoint, headerColumnAnchorPoint = "RIGHT", "BOTTOM"
unitSpacing = -spacingX
groupSpacing = spacingY
unitSpacingX, unitSpacingY = -spacingX, spacingY
horizontalSpacing = -spacingX-layout["main"]["groupSpacing"]
elseif anchor == "TOPLEFT" then
point, anchorPoint, groupAnchorPoint = "TOPLEFT", "TOPRIGHT", "BOTTOMLEFT"
headerPoint, headerColumnAnchorPoint = "LEFT", "TOP"
unitSpacing = spacingX
groupSpacing = -spacingY
unitSpacingX, unitSpacingY = spacingX, spacingY
horizontalSpacing = spacingX+layout["main"]["groupSpacing"]
elseif anchor == "TOPRIGHT" then
point, anchorPoint, groupAnchorPoint = "TOPRIGHT", "TOPLEFT", "BOTTOMRIGHT"
headerPoint, headerColumnAnchorPoint = "RIGHT", "TOP"
unitSpacing = -spacingX
groupSpacing = -spacingY
unitSpacingX, unitSpacingY = -spacingX, spacingY
horizontalSpacing = -spacingX-layout["main"]["groupSpacing"]
end
end
return point, anchorPoint, groupAnchorPoint, unitSpacing, groupSpacing, unitSpacingX, unitSpacingY, verticalSpacing, horizontalSpacing, headerPoint, headerColumnAnchorPoint
end
local function UpdateHeadersShowRaidAttribute()
local shouldShowRaid = CellDB["general"]["showRaid"]
if Cell.vars.currentLayoutTable["main"]["combineGroups"] then
combinedHeader:SetAttribute("showRaid", shouldShowRaid)
for _, header in ipairs(separatedHeaders) do
header:SetAttribute("showRaid", nil)
end
else
combinedHeader:SetAttribute("showRaid", nil)
for _, header in ipairs(separatedHeaders) do
header:SetAttribute("showRaid", shouldShowRaid)
end
end
end
local function UpdateHeader(header, layout, which)
if not which or which == "header" or which == "main-size" or which == "main-power" or which == "groupFilter" or which == "barOrientation" or which == "powerFilter" then
local width, height = unpack(layout["main"]["size"])
for _, b in ipairs(header) do
if not which or which == "header" or which == "main-size" or which == "groupFilter" then
P:Size(b, width, height)
b:ClearAllPoints()
end
-- NOTE: SetOrientation BEFORE SetPowerSize
if not which or which == "header" or which == "barOrientation" then
B:SetOrientation(b, layout["barOrientation"][1], layout["barOrientation"][2])
end
if not which or which == "header" or which == "main-power" or which == "groupFilter" or which == "barOrientation" or which == "powerFilter" then
B:SetPowerSize(b, layout["main"]["powerSize"])
end
end
if not which or which == "header" or which == "main-size" or which == "groupFilter" then
-- 确保按钮在“一定程度上”对齐
header:SetAttribute("minWidth", P:Scale(width))
header:SetAttribute("minHeight", P:Scale(height))
P:Size(npcFrameAnchor, width, height) -- REVIEW: check same as main
end
end
-- REVIEW: fix name width
if which == "header" or which == "groupFilter" then
for j, b in ipairs(header) do
b.widgets.healthBar:GetScript("OnSizeChanged")(b.widgets.healthBar)
end
for k, arenaPet in ipairs(arenaPetButtons) do
arenaPet.widgets.healthBar:GetScript("OnSizeChanged")(arenaPet.widgets.healthBar)
end
end
end
local init, previousLayout
local function RaidFrame_UpdateLayout(layout, which)
if Cell.vars.groupType ~= "raid" and init then return end
init = true
-- if previousLayout == layout and not which then return end
-- previousLayout = layout
layout = CellDB["layouts"][layout]
-- arena pets
if Cell.vars.inBattleground == 5 and layout["pet"]["partyEnabled"] then
for i, arenaPet in ipairs(arenaPetButtons) do
RegisterAttributeDriver(arenaPet, "state-visibility", "[@raidpet"..i..", exists] show;hide")
end
else
for i, arenaPet in ipairs(arenaPetButtons) do
UnregisterAttributeDriver(arenaPet, "state-visibility")
arenaPet:Hide()
end
end
local point, anchorPoint, groupAnchorPoint, unitSpacing, groupSpacing, unitSpacingX, unitSpacingY, verticalSpacing, horizontalSpacing, headerPoint, headerColumnAnchorPoint = GetPoints(layout)
if not which or which == "main-arrangement" or which == "rows_columns" or which == "groupSpacing" or which == "groupFilter" then
-- arena pets
for k in ipairs(arenaPetButtons) do
arenaPetButtons[k]:ClearAllPoints()
if k == 1 then
arenaPetButtons[k]:SetPoint(point, npcFrameAnchor)
else
if layout["main"]["orientation"] == "vertical" then
arenaPetButtons[k]:SetPoint(point, arenaPetButtons[k-1], anchorPoint, 0, unitSpacing)
else
arenaPetButtons[k]:SetPoint(point, arenaPetButtons[k-1], anchorPoint, unitSpacing, 0)
end
end
end
end
local shownGroups = {}
for i, isShown in ipairs(layout["groupFilter"]) do
if isShown then
UpdateHeader(separatedHeaders[i], layout, which)
tinsert(shownGroups, i)
end
end
if not which or which == "header" then
UpdateHeadersShowRaidAttribute()
end
if layout["main"]["combineGroups"] then
UpdateHeader(combinedHeader, layout, which)
if not which or which == "header" or which == "main-arrangement" or which == "rows_columns" or which == "groupSpacing" or which == "unitsPerColumn" then
combinedHeader:ClearAllPoints()
if layout["main"]["orientation"] == "vertical" then
combinedHeader:SetAttribute("columnAnchorPoint", headerColumnAnchorPoint)
combinedHeader:SetAttribute("point", headerPoint)
combinedHeader:SetAttribute("xOffset", 0)
combinedHeader:SetAttribute("yOffset", unitSpacingY)
combinedHeader:SetAttribute("columnSpacing", unitSpacingX)
combinedHeader:SetAttribute("maxColumns", layout["main"]["maxColumns"])
else
combinedHeader:SetAttribute("columnAnchorPoint", headerColumnAnchorPoint)
combinedHeader:SetAttribute("point", headerPoint)
combinedHeader:SetAttribute("xOffset", unitSpacingX)
combinedHeader:SetAttribute("yOffset", 0)
combinedHeader:SetAttribute("columnSpacing", unitSpacingY)
combinedHeader:SetAttribute("maxColumns", layout["main"]["maxColumns"])
end
--! force update unitbutton's point
for _, b in ipairs(combinedHeader) do
b:ClearAllPoints()
end
combinedHeader:SetAttribute("unitsPerColumn", layout["main"]["unitsPerColumn"])
combinedHeader:SetPoint(point)
raidFrame:SetAttribute("spacing", groupSpacing)
raidFrame:SetAttribute("orientation", layout["main"]["orientation"])
raidFrame:SetAttribute("anchor", layout["main"]["anchor"])
raidFrame:SetAttribute("combineGroups", true) -- NOTE: trigger _onattributechanged to set npcFrameAnchor point!
end
if not which or which == "header" or which == "sort" then
if layout["main"]["sortByRole"] then
combinedHeader:SetAttribute("sortMethod", "NAME")
local order = table.concat(layout["main"]["roleOrder"], ",")..",NONE"
combinedHeader:SetAttribute("groupingOrder", order)
combinedHeader:SetAttribute("groupBy", "ASSIGNEDROLE")
else
combinedHeader:SetAttribute("sortMethod", "INDEX")
combinedHeader:SetAttribute("groupingOrder", "")
combinedHeader:SetAttribute("groupBy", nil)
end
end
if not which or which == "header" or which == "groupFilter" then
combinedHeader:SetAttribute("groupFilter", F:TableToString(shownGroups, ","))
end
else
if not which or which == "header" or which == "main-arrangement" or which == "rows_columns" or which == "groupSpacing" or which == "groupFilter" then
for i, group in ipairs(shownGroups) do
local header = separatedHeaders[group]
header:ClearAllPoints()
if layout["main"]["orientation"] == "vertical" then
header:SetAttribute("columnAnchorPoint", headerColumnAnchorPoint)
header:SetAttribute("point", headerPoint)
header:SetAttribute("xOffset", 0)
header:SetAttribute("yOffset", unitSpacing)
--! force update unitbutton's point
for j = 1, 5 do
header[j]:ClearAllPoints()
end
header:SetAttribute("unitsPerColumn", 5)
if i == 1 then
header:SetPoint(point)
else
local headersPerRow = layout["main"]["maxColumns"]
local headerCol = i % layout["main"]["maxColumns"]
headerCol = headerCol == 0 and headersPerRow or headerCol
if headerCol == 1 then -- first column on each row
header:SetPoint(point, separatedHeaders[shownGroups[i-headersPerRow]], anchorPoint, 0, verticalSpacing)
else
header:SetPoint(point, separatedHeaders[shownGroups[i-1]], groupAnchorPoint, groupSpacing, 0)
end
end
else
header:SetAttribute("columnAnchorPoint", headerColumnAnchorPoint)
header:SetAttribute("point", headerPoint)
header:SetAttribute("xOffset", unitSpacing)
header:SetAttribute("yOffset", 0)
--! force update unitbutton's point
for j = 1, 5 do
header[j]:ClearAllPoints()
end
header:SetAttribute("unitsPerColumn", 5)
if i == 1 then
header:SetPoint(point)
else
local headersPerCol = layout["main"]["maxColumns"]
local headerRow = i % layout["main"]["maxColumns"]
headerRow = headerRow == 0 and headersPerCol or headerRow
if headerRow == 1 then -- first row on each column
header:SetPoint(point, separatedHeaders[shownGroups[i-headersPerCol]], anchorPoint, horizontalSpacing, 0)
else
header:SetPoint(point, separatedHeaders[shownGroups[i-1]], groupAnchorPoint, 0, groupSpacing)
end
end
end
end
raidFrame:SetAttribute("spacing", groupSpacing)
raidFrame:SetAttribute("orientation", layout["main"]["orientation"])
raidFrame:SetAttribute("anchor", layout["main"]["anchor"])
raidFrame:SetAttribute("combineGroups", false) -- NOTE: trigger _onattributechanged to set npcFrameAnchor point!
end
if not which or which == "header" or which == "sort" then
if layout["main"]["sortByRole"] then
for i = 1, 8 do
separatedHeaders[i]:SetAttribute("sortMethod", "NAME")
local order = table.concat(layout["main"]["roleOrder"], ",")..",NONE"
separatedHeaders[i]:SetAttribute("groupingOrder", order)
separatedHeaders[i]:SetAttribute("groupBy", "ASSIGNEDROLE")
end
else
for i = 1, 8 do
separatedHeaders[i]:SetAttribute("sortMethod", "INDEX")
separatedHeaders[i]:SetAttribute("groupingOrder", "")
separatedHeaders[i]:SetAttribute("groupBy", nil)
end
end
end
-- show/hide groups
if not which or which == "header" or which == "groupFilter" then
for i = 1, 8 do
if layout["groupFilter"][i] then
separatedHeaders[i]:Show()
else
separatedHeaders[i]:Hide()
end
end
end
end
-- raid pets
if not which or strfind(which, "size$") or strfind(which, "power$") or which == "barOrientation" or which == "powerFilter" then
local width, height = unpack(layout["main"]["size"])
for i, arenaPet in ipairs(arenaPetButtons) do
-- NOTE: SetOrientation BEFORE SetPowerSize
B:SetOrientation(arenaPet, layout["barOrientation"][1], layout["barOrientation"][2])
if layout["pet"]["sameSizeAsMain"] then
P:Size(arenaPet, width, height)
B:SetPowerSize(arenaPet, layout["main"]["powerSize"])
else
P:Size(arenaPet, layout["pet"]["size"][1], layout["pet"]["size"][2])
B:SetPowerSize(arenaPet, layout["pet"]["powerSize"])
end
end
end
end
Cell:RegisterCallback("UpdateLayout", "RaidFrame_UpdateLayout", RaidFrame_UpdateLayout)
local function RaidFrame_UpdateVisibility(which)
if not which or which == "raid" then
UpdateHeadersShowRaidAttribute()
if CellDB["general"]["showRaid"] then
RegisterAttributeDriver(raidFrame, "state-visibility", "show")
else
UnregisterAttributeDriver(raidFrame, "state-visibility")
raidFrame:Hide()
end
end
end
Cell:RegisterCallback("UpdateVisibility", "RaidFrame_UpdateVisibility", RaidFrame_UpdateVisibility)