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.

275 lines
11 KiB

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") 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
init = true
-- if previousLayout == layout and not which then return end
-- previousLayout = layout
layout = CellDB["layouts"][layout]
-- anchor
if not which or which == "main-arrangement" then
local orientation = layout["main"]["orientation"]
local anchor = layout["main"]["anchor"]
local spacingX = layout["main"]["spacingX"]
local spacingY = layout["main"]["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 = spacingX
elseif anchor == "BOTTOMRIGHT" then
point, playerAnchorPoint, petAnchorPoint = "BOTTOMRIGHT", "TOPRIGHT", "BOTTOMLEFT"
headerPoint = "BOTTOM"
playerSpacing = spacingY
petSpacing = -spacingX
elseif anchor == "TOPLEFT" then
point, playerAnchorPoint, petAnchorPoint = "TOPLEFT", "BOTTOMLEFT", "TOPRIGHT"
headerPoint = "TOP"
playerSpacing = -spacingY
petSpacing = spacingX
elseif anchor == "TOPRIGHT" then
point, playerAnchorPoint, petAnchorPoint = "TOPRIGHT", "BOTTOMRIGHT", "TOPLEFT"
headerPoint = "TOP"
playerSpacing = -spacingY
petSpacing = -spacingX
end
header:SetAttribute("xOffset", 0)
header:SetAttribute("yOffset", playerSpacing)
else
-- anchor
if anchor == "BOTTOMLEFT" then
point, playerAnchorPoint, petAnchorPoint = "BOTTOMLEFT", "BOTTOMRIGHT", "TOPLEFT"
headerPoint = "LEFT"
playerSpacing = spacingX
petSpacing = spacingY
elseif anchor == "BOTTOMRIGHT" then
point, playerAnchorPoint, petAnchorPoint = "BOTTOMRIGHT", "BOTTOMLEFT", "TOPRIGHT"
headerPoint = "RIGHT"
playerSpacing = -spacingX
petSpacing = spacingY
elseif anchor == "TOPLEFT" then
point, playerAnchorPoint, petAnchorPoint = "TOPLEFT", "TOPRIGHT", "BOTTOMLEFT"
headerPoint = "LEFT"
playerSpacing = spacingX
petSpacing = -spacingY
elseif anchor == "TOPRIGHT" then
point, playerAnchorPoint, petAnchorPoint = "TOPRIGHT", "TOPLEFT", "BOTTOMRIGHT"
headerPoint = "RIGHT"
playerSpacing = -spacingX
petSpacing = -spacingY
end
header:SetAttribute("xOffset", 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, petSpacing, 0)
else
header[j].petButton:SetPoint(point, header[j], petAnchorPoint, 0, 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"])
if layout["pet"]["partyEnabled"] 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, UIParent, "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)
-- ]])