local _, Cell = ... local F = Cell.funcs local B = Cell.bFuncs local P = Cell.pixelPerfectFuncs local partyFrame = CreateFrame("Frame", "CellPartyFrame", Cell.frames.mainFrame, "SecureFrameTemplate") Cell.frames.partyFrame = partyFrame partyFrame:SetAllPoints(Cell.frames.mainFrame) local header = CreateFrame("Frame", "CellPartyFrameHeader", partyFrame, "SecureGroupHeaderTemplate") header:SetAttribute("template", "CellUnitButtonTemplate") function header:UpdateButtonUnit(bName, unit) if not unit then return end _G[bName].unit = unit -- OmniCD local petUnit if unit == "player" then petUnit = "pet" else petUnit = string.gsub(unit, "party", "partypet") end Cell.unitButtons.party.units[unit] = _G[bName] Cell.unitButtons.party.units[petUnit] = _G[bName].petButton end -- 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("_initialAttributeNames", "refreshUnitChange") header:SetAttribute("_initialAttribute-refreshUnitChange", [[ local unit = self:GetAttribute("unit") local header = self:GetParent() local petButton = self:GetFrameRef("petButton") -- print(self:GetName(), unit, petButton) if petButton and header:GetAttribute("showPartyPets") and not header:GetAttribute("partyDetached") then local petUnit if unit == "player" then petUnit = "pet" else petUnit = string.gsub(unit, "party", "partypet") end petButton:SetAttribute("unit", petUnit) RegisterUnitWatch(petButton) end header:CallMethod("UpdateButtonUnit", self:GetName(), unit) ]]) header:SetAttribute("point", "TOP") header:SetAttribute("xOffset", 0) header:SetAttribute("yOffset", -1) header:SetAttribute("maxColumns", 1) header:SetAttribute("unitsPerColumn", 5) header:SetAttribute("showPlayer", true) header:SetAttribute("showParty", true) --! to make needButtons == 5 cheat configureChildren in SecureGroupHeaders.lua header:SetAttribute("startingIndex", -4) header:Show() header:SetAttribute("startingIndex", 1) -- init pet buttons for i, playerButton in ipairs(header) do -- playerButton.type = "main" -- layout setup local petButton = CreateFrame("Button", playerButton:GetName().."Pet", playerButton, "CellUnitButtonTemplate") -- petButton.type = "pet" -- layout setup petButton:SetIgnoreParentAlpha(true) --! button for pet/vehicle only, toggleForVehicle MUST be false petButton:SetAttribute("toggleForVehicle", false) playerButton.petButton = petButton SecureHandlerSetFrameRef(playerButton, "petButton", petButton) -- for IterateAllUnitButtons Cell.unitButtons.party["player"..i] = playerButton Cell.unitButtons.party["pet"..i] = petButton -- OmniCD _G["CellPartyFrameMember"..i] = playerButton end local init, previousLayout local function PartyFrame_UpdateLayout(layout, which) if Cell.vars.groupType ~= "party" and init then return end -- visibility if layout == "hide" then UnregisterAttributeDriver(partyFrame, "state-visibility") partyFrame:Hide() if init then return else layout = "default" end else RegisterAttributeDriver(partyFrame, "state-visibility", "[@raid1,exists] hide;[@party1,exists] show;[group:party] show;hide") end -- update init = true layout = CellDB["layouts"][layout] -- anchor if not which or which == "main-arrangement" or which == "pet-arrangement" then local orientation = layout["main"]["orientation"] local anchor = layout["main"]["anchor"] local spacingX = layout["main"]["spacingX"] local spacingY = layout["main"]["spacingY"] local petSpacingX = layout["pet"]["sameArrangementAsMain"] and spacingX or layout["pet"]["spacingX"] local petSpacingY = layout["pet"]["sameArrangementAsMain"] and spacingY or layout["pet"]["spacingY"] local point, playerAnchorPoint, petAnchorPoint, playerSpacing, petSpacing, headerPoint if orientation == "vertical" then if anchor == "BOTTOMLEFT" then point, playerAnchorPoint, petAnchorPoint = "BOTTOMLEFT", "TOPLEFT", "BOTTOMRIGHT" headerPoint = "BOTTOM" playerSpacing = spacingY petSpacing = petSpacingX elseif anchor == "BOTTOMRIGHT" then point, playerAnchorPoint, petAnchorPoint = "BOTTOMRIGHT", "TOPRIGHT", "BOTTOMLEFT" headerPoint = "BOTTOM" playerSpacing = spacingY petSpacing = -petSpacingX elseif anchor == "TOPLEFT" then point, playerAnchorPoint, petAnchorPoint = "TOPLEFT", "BOTTOMLEFT", "TOPRIGHT" headerPoint = "TOP" playerSpacing = -spacingY petSpacing = petSpacingX elseif anchor == "TOPRIGHT" then point, playerAnchorPoint, petAnchorPoint = "TOPRIGHT", "BOTTOMRIGHT", "TOPLEFT" headerPoint = "TOP" playerSpacing = -spacingY petSpacing = -petSpacingX end header:SetAttribute("xOffset", 0) header:SetAttribute("yOffset", P.Scale(playerSpacing)) else -- anchor if anchor == "BOTTOMLEFT" then point, playerAnchorPoint, petAnchorPoint = "BOTTOMLEFT", "BOTTOMRIGHT", "TOPLEFT" headerPoint = "LEFT" playerSpacing = spacingX petSpacing = petSpacingY elseif anchor == "BOTTOMRIGHT" then point, playerAnchorPoint, petAnchorPoint = "BOTTOMRIGHT", "BOTTOMLEFT", "TOPRIGHT" headerPoint = "RIGHT" playerSpacing = -spacingX petSpacing = petSpacingY elseif anchor == "TOPLEFT" then point, playerAnchorPoint, petAnchorPoint = "TOPLEFT", "TOPRIGHT", "BOTTOMLEFT" headerPoint = "LEFT" playerSpacing = spacingX petSpacing = -petSpacingY elseif anchor == "TOPRIGHT" then point, playerAnchorPoint, petAnchorPoint = "TOPRIGHT", "TOPLEFT", "BOTTOMRIGHT" headerPoint = "RIGHT" playerSpacing = -spacingX petSpacing = -petSpacingY end header:SetAttribute("xOffset", P.Scale(playerSpacing)) header:SetAttribute("yOffset", 0) end header:ClearAllPoints() header:SetPoint(point) header:SetAttribute("point", headerPoint) --! force update unitbutton's point for j = 1, 5 do header[j]:ClearAllPoints() -- update petButton's point header[j].petButton:ClearAllPoints() if orientation == "vertical" then header[j].petButton:SetPoint(point, header[j], petAnchorPoint, P.Scale(petSpacing), 0) else header[j].petButton:SetPoint(point, header[j], petAnchorPoint, 0, P.Scale(petSpacing)) end end header:SetAttribute("unitsPerColumn", 5) end if not which or strfind(which, "size$") or strfind(which, "power$") or which == "barOrientation" or which == "powerFilter" then for i, playerButton in ipairs(header) do local petButton = playerButton.petButton if not which or strfind(which, "size$") then local width, height = unpack(layout["main"]["size"]) P.Size(playerButton, width, height) header:SetAttribute("buttonWidth", P.Scale(width)) header:SetAttribute("buttonHeight", P.Scale(height)) if layout["pet"]["sameSizeAsMain"] then P.Size(petButton, width, height) else P.Size(petButton, layout["pet"]["size"][1], layout["pet"]["size"][2]) end end -- NOTE: SetOrientation BEFORE SetPowerSize if not which or which == "barOrientation" then B.SetOrientation(playerButton, layout["barOrientation"][1], layout["barOrientation"][2]) B.SetOrientation(petButton, layout["barOrientation"][1], layout["barOrientation"][2]) end if not which or strfind(which, "power$") or which == "barOrientation" or which == "powerFilter" then B.SetPowerSize(playerButton, layout["main"]["powerSize"]) if layout["pet"]["sameSizeAsMain"] then B.SetPowerSize(petButton, layout["main"]["powerSize"]) else B.SetPowerSize(petButton, layout["pet"]["powerSize"]) end end end end if not which or which == "pet" then header:SetAttribute("showPartyPets", layout["pet"]["partyEnabled"]) header:SetAttribute("partyDetached", layout["pet"]["partyDetached"]) if layout["pet"]["partyEnabled"] and not layout["pet"]["partyDetached"] then for i, playerButton in ipairs(header) do RegisterUnitWatch(playerButton.petButton) end else for i, playerButton in ipairs(header) do UnregisterUnitWatch(playerButton.petButton) playerButton.petButton:Hide() end end end if not which or which == "sort" then if layout["main"]["sortByRole"] then header:SetAttribute("sortMethod", "NAME") local order = table.concat(layout["main"]["roleOrder"], ",")..",NONE" header:SetAttribute("groupingOrder", order) header:SetAttribute("groupBy", "ASSIGNEDROLE") else header:SetAttribute("sortMethod", "INDEX") header:SetAttribute("groupingOrder", "") header:SetAttribute("groupBy", nil) end end if not which or which == "hideSelf" then header:SetAttribute("showPlayer", not layout["main"]["hideSelf"]) end end Cell.RegisterCallback("UpdateLayout", "PartyFrame_UpdateLayout", PartyFrame_UpdateLayout) -- local function PartyFrame_UpdateVisibility(which) -- if not which or which == "party" then -- header:SetAttribute("showParty", CellDB["general"]["showParty"]) -- if CellDB["general"]["showParty"] then -- --! [group] won't fire during combat -- -- RegisterAttributeDriver(partyFrame, "state-visibility", "[group:raid] hide; [group:party] show; hide") -- -- NOTE: [group:party] show: fix for premade, only player in party, but party1 not exists -- RegisterAttributeDriver(partyFrame, "state-visibility", "[@raid1,exists] hide;[@party1,exists] show;[group:party] show;hide") -- else -- UnregisterAttributeDriver(partyFrame, "state-visibility") -- partyFrame:Hide() -- end -- end -- end -- Cell.RegisterCallback("UpdateVisibility", "PartyFrame_UpdateVisibility", PartyFrame_UpdateVisibility) -- local f = CreateFrame("Frame", nil, CellParent, "SecureFrameTemplate") -- RegisterAttributeDriver(f, "state-group", "[@raid1,exists] raid;[@party1,exists] party; solo") -- SecureHandlerWrapScript(f, "OnAttributeChanged", f, [[ -- print(name, value) -- if name ~= "state-group" then return end -- ]]) -- RegisterStateDriver(f, "groupstate", "[group:raid] raid; [group:party] party; solo") -- f:SetAttribute("_onstate-groupstate", [[ -- print(stateid, newstate) -- ]])