Quantcast
--[[
##############################################################################
_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
        ___\///////////___________\///___________\/////////_____\///////////_#
##############################################################################
S U P E R - V I L L A I N - U I   By: Munglunch                              #
##############################################################################
--]]
local SuperVillain, L = unpack(select(2, ...));
local MOD = SuperVillain.Registry:Expose('SVUnit');
local _, ns = ...;
local oUF_SuperVillain = ns.oUF;
--[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
local assert = enforce;
assert(oUF_SuperVillain, "SVUI was unable to locate oUF.");
local tinsert = table.insert;
--[[
##########################################################
TANK HANDLERS
##########################################################
]]--
local function UpdateTankFrame(header)
	local db = MOD.db["tank"]
	header.colors = oUF_SuperVillain.colors;
	header:RegisterForClicks(MOD.db.fastClickTarget and "AnyDown" or "AnyUp")
	if header.isChild and header.originalParent then
		local targets = db.targetsGroup;
		if not header.originalParent.childList then
			header.originalParent.childList = {}
		end
		header.originalParent.childList[header] = true;
		if not InCombatLockdown()then
			if targets.enable then
				header:SetParent(header.originalParent)
				header:Size(targets.width, targets.height)
				header:ClearAllPoints()
				SuperVillain:ReversePoint(header, targets.anchorPoint, header.originalParent, targets.xOffset, targets.yOffset)
			else
				header:SetParent(SuperVillain.Cloaked)
			end
		end
	elseif not InCombatLockdown()then
		header:Size(db.width, db.height)
	end
	MOD:RefreshUnitLayout(header, "tank")
	do
		local nametext = header.InfoPanel.Name;
		if oUF_SuperVillain.colors.healthclass then
			header:Tag(nametext, "[name:10]")
		else
			header:Tag(nametext, "[name:color][name:10]")
		end
	end
	header:UpdateAllElements()
end

function MOD.Construct:tank()
	self:SetScript("OnEnter", UnitFrame_OnEnter)
	self:SetScript("OnLeave", UnitFrame_OnLeave)
	MOD:SetActionPanel(self, "tank")
	self.Health = MOD:CreateHealthBar(self, true)
	self.RaidIcon = MOD:CreateRaidIcon(self)
	self.RaidIcon:SetPoint("BOTTOMRIGHT")
	self.Range = { insideAlpha = 1, outsideAlpha = 1 }
	UpdateTankFrame(self)
	self.originalParent = self:GetParent()
	return self
end

function MOD.HeaderUpdate:tank()
	local db = MOD.db["tank"]
	local header = self
	if db.enable ~= true then
		UnregisterAttributeDriver(header, "state-visibility")
		header:Hide()
		return
	end
	header:Hide()
	MOD:DetachSubFrames(header:GetChildren())
	header:SetAttribute("startingIndex", -1)
	RegisterAttributeDriver(header, "state-visibility", "show")
	header.dirtyWidth, header.dirtyHeight = header:GetSize()
	RegisterAttributeDriver(header, "state-visibility", "[@raid1, exists] show;hide")
	header:SetAttribute("startingIndex", 1)
	header:SetAttribute("point", "BOTTOM")
	header:SetAttribute("columnAnchorPoint", "LEFT")
	MOD:DetachSubFrames(header:GetChildren())
	header:SetAttribute("yOffset", 7)
	if not header.positioned then
		header:ClearAllPoints()
		header:Point("TOPLEFT", SuperVillain.UIParent, "TOPLEFT", 4, -40)
		SuperVillain:SetSVMovable(header, header:GetName().."_MOVE", L["Tank Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
		header.Avatar.positionOverride = "TOPLEFT"
		header:SetAttribute("minHeight", header.dirtyHeight)
		header:SetAttribute("minWidth", header.dirtyWidth)
		header.positioned = true
	end
	for i = 1, header:GetNumChildren() do
		local childFrame = select(i, header:GetChildren())
		UpdateTankFrame(childFrame)
		if(_G[childFrame:GetName().."Pet"]) then
			UpdateTankFrame(_G[childFrame:GetName().."Pet"])
		end
		if(_G[childFrame:GetName().."Target"]) then
			UpdateTankFrame(_G[childFrame:GetName().."Target"])
		end
	end
end
--[[
##########################################################
ASSIST UPDATE
##########################################################
]]--
local function UpdateAssistFrame(header)
	local db = MOD.db["assist"]
	header.colors = oUF_SuperVillain.colors;
	header:RegisterForClicks(MOD.db.fastClickTarget and "AnyDown" or "AnyUp")
	if header.isChild and header.originalParent then
		local targets = db.targetsGroup;
		if not header.originalParent.childList then
			header.originalParent.childList = {}
		end
		header.originalParent.childList[header] = true;
		if not InCombatLockdown()then
			if targets.enable then
				header:SetParent(header.originalParent)
				header:Size(targets.width, targets.height)
				header:ClearAllPoints()
				SuperVillain:ReversePoint(header, targets.anchorPoint, header.originalParent, targets.xOffset, targets.yOffset)
			else
				header:SetParent(SuperVillain.Cloaked)
			end
		end
	elseif not InCombatLockdown()then
		header:Size(db.width, db.height)
	end

	MOD:RefreshUnitLayout(header, "assist")

	do
		local nametext = header.InfoPanel.Name;
		if oUF_SuperVillain.colors.healthclass then
			header:Tag(nametext, "[name:10]")
		else
			header:Tag(nametext, "[name:color][name:10]")
		end
	end
	header:UpdateAllElements()
end

function MOD.Construct:assist()
	self:SetScript("OnEnter", UnitFrame_OnEnter)
	self:SetScript("OnLeave", UnitFrame_OnLeave)
	MOD:SetActionPanel(self, "assist")
	self.Health = MOD:CreateHealthBar(self, true)
	self.RaidIcon = MOD:CreateRaidIcon(self)
	self.RaidIcon:SetPoint("BOTTOMRIGHT")
	self.Range = { insideAlpha = 1, outsideAlpha = 1 }
	UpdateAssistFrame(self)
	self.originalParent = self:GetParent()
	return self
end

function MOD.HeaderUpdate:assist()
	local db = MOD.db["assist"]
	local header = self
	header:Hide()
	MOD:DetachSubFrames(header:GetChildren())
	header:SetAttribute("startingIndex", -1)
	RegisterAttributeDriver(header, "state-visibility", "show")
	header.dirtyWidth, header.dirtyHeight = header:GetSize()
	RegisterAttributeDriver(header, "state-visibility", "[@raid1, exists] show;hide")
	header:SetAttribute("startingIndex", 1)
	header:SetAttribute("point", "BOTTOM")
	header:SetAttribute("columnAnchorPoint", "LEFT")
	MOD:DetachSubFrames(header:GetChildren())
	header:SetAttribute("yOffset", 7)
	if not header.positioned then
		header:ClearAllPoints()
		header:Point("TOPLEFT", SuperVillain.UIParent, "TOPLEFT", 4, -140)
		SuperVillain:SetSVMovable(header, header:GetName().."_MOVE", L["Assist Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
		header.Avatar.positionOverride = "TOPLEFT"
		header:SetAttribute("minHeight", header.dirtyHeight)
		header:SetAttribute("minWidth", header.dirtyWidth)
		header.positioned = true
	end
	for i = 1, header:GetNumChildren() do
		local childFrame = select(i, header:GetChildren())
		UpdateAssistFrame(childFrame)
		if(_G[childFrame:GetName().."Pet"]) then
			UpdateAssistFrame(_G[childFrame:GetName().."Pet"])
		end
		if(_G[childFrame:GetName().."Target"]) then
			UpdateAssistFrame(_G[childFrame:GetName().."Target"])
		end
	end
end