From eb4fc5a9279730bb4f55fdc1db4bbc83edec1681 Mon Sep 17 00:00:00 2001 From: Munglunch Date: Mon, 27 Oct 2014 10:06:15 -0500 Subject: [PATCH] 5.1.4 --- .../SVUI/packages/unit/elements/essentials.lua | 3 +- .../AddOns/SVUI/packages/unit/frames/raid.lua | 1168 ++++++++++++++++++++ Interface/AddOns/SVUI/packages/unit/groups.lua | 2 +- 3 files changed, 1171 insertions(+), 2 deletions(-) create mode 100644 Interface/AddOns/SVUI/packages/unit/frames/raid.lua diff --git a/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua b/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua index 17f5170..c454359 100644 --- a/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua +++ b/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua @@ -350,7 +350,6 @@ end function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText) if(unit and (unit == "target" or unit == "player")) then frame.ActionPanel = CreateActionPanel(frame, 3) - frame.Threat = CreateThreat(frame.ActionPanel, unit) local info = CreateFrame("Frame", nil, frame) info:SetFrameStrata("BACKGROUND") @@ -466,6 +465,8 @@ function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText) frame.InfoPanel:Point("BOTTOMRIGHT", frame.ActionPanel, "BOTTOMRIGHT", -2, 2) end + frame.Threat = CreateThreat(frame.ActionPanel, unit) + frame.InfoPanel.Name = CreateNameText(frame.InfoPanel, unit) local reverse = unit and (unit == "target" or unit == "focus" or unit == "boss" or unit == "arena") or false; diff --git a/Interface/AddOns/SVUI/packages/unit/frames/raid.lua b/Interface/AddOns/SVUI/packages/unit/frames/raid.lua new file mode 100644 index 0000000..80ca094 --- /dev/null +++ b/Interface/AddOns/SVUI/packages/unit/frames/raid.lua @@ -0,0 +1,1168 @@ +--[[ +############################################################################## +_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_ # + ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__ # + __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____ # + ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____ # + ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____ # + _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____ # + __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ # + _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_# + ___\///////////___________\///___________\/////////_____\///////////_# +############################################################################## +S U P E R - V I L L A I N - U I By: Munglunch # +############################################################################## +--]] +--LUA +local unpack = unpack; +local select = select; +local pairs = pairs; +local type = type; +local rawset = rawset; +local rawget = rawget; +local tostring = tostring; +local error = error; +local next = next; +local pcall = pcall; +local getmetatable = getmetatable; +local setmetatable = setmetatable; +local assert = assert; +--BLIZZARD +local _G = _G; +local tinsert = _G.tinsert; +local tremove = _G.tremove; +local twipe = _G.wipe; +--STRING +local string = string; +local format = string.format; +local sub = string.sub; +local upper = string.upper; +local match = string.match; +local gsub = string.gsub; +--MATH +local math = math; +local numMin = math.min; +--TABLE +local table = table; +local tsort = table.sort; +local tremove = table.remove; + +local SV = select(2, ...) +local oUF_Villain = SV.oUF + +assert(oUF_Villain, "SVUI was unable to locate oUF.") + +local L = SV.L; +local MOD = SV.SVUnit + +if(not MOD) then return end +--[[ +########################################################## +LOCAL DATA +########################################################## +]]-- +local sortMapping = { + ["DOWN_RIGHT"] = {[1]="TOP",[2]="TOPLEFT",[3]="LEFT",[4]=1,[5]=-1,[6]=false}, + ["DOWN_LEFT"] = {[1]="TOP",[2]="TOPRIGHT",[3]="RIGHT",[4]=1,[5]=-1,[6]=false}, + ["UP_RIGHT"] = {[1]="BOTTOM",[2]="BOTTOMLEFT",[3]="LEFT",[4]=1,[5]=1,[6]=false}, + ["UP_LEFT"] = {[1]="BOTTOM",[2]="BOTTOMRIGHT",[3]="RIGHT",[4]=-1,[5]=1,[6]=false}, + ["RIGHT_DOWN"] = {[1]="LEFT",[2]="TOPLEFT",[3]="TOP",[4]=1,[5]=-1,[6]=true}, + ["RIGHT_UP"] = {[1]="LEFT",[2]="BOTTOMLEFT",[3]="BOTTOM",[4]=1,[5]=1,[6]=true}, + ["LEFT_DOWN"] = {[1]="RIGHT",[2]="TOPRIGHT",[3]="TOP",[4]=-1,[5]=-1,[6]=true}, + ["LEFT_UP"] = {[1]="RIGHT",[2]="BOTTOMRIGHT",[3]="BOTTOM",[4]=-1,[5]=1,[6]=true}, + ["UP"] = {[1]="BOTTOM",[2]="BOTTOM",[3]="BOTTOM",[4]=1,[5]=1,[6]=false}, + ["DOWN"] = {[1]="TOP",[2]="TOP",[3]="TOP",[4]=1,[5]=1,[6]=false}, +} +local GroupDistributor = { + ["CLASS"] = function(x) + x:SetAttribute("groupingOrder","DEATHKNIGHT,DRUID,HUNTER,MAGE,PALADIN,PRIEST,SHAMAN,WARLOCK,WARRIOR,MONK") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy","CLASS") + end, + ["MTMA"] = function(x) + x:SetAttribute("groupingOrder","MAINTANK,MAINASSIST,NONE") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy","ROLE") + end, + ["ROLE_TDH"] = function(x) + x:SetAttribute("groupingOrder","TANK,DAMAGER,HEALER,NONE") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy","ASSIGNEDROLE") + end, + ["ROLE_HTD"] = function(x) + x:SetAttribute("groupingOrder","HEALER,TANK,DAMAGER,NONE") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy","ASSIGNEDROLE") + end, + ["ROLE_HDT"] = function(x) + x:SetAttribute("groupingOrder","HEALER,DAMAGER,TANK,NONE") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy","ASSIGNEDROLE") + end, + ["ROLE"] = function(x) + x:SetAttribute("groupingOrder","TANK,HEALER,DAMAGER,NONE") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy","ASSIGNEDROLE") + end, + ["NAME"] = function(x) + x:SetAttribute("groupingOrder","1,2,3,4,5,6,7,8") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy",nil) + end, + ["GROUP"] = function(x) + x:SetAttribute("groupingOrder","1,2,3,4,5,6,7,8") + x:SetAttribute("sortMethod","INDEX") + x:SetAttribute("groupBy","GROUP") + end, + ["PETNAME"] = function(x) + x:SetAttribute("groupingOrder","1,2,3,4,5,6,7,8") + x:SetAttribute("sortMethod","NAME") + x:SetAttribute("groupBy", nil) + x:SetAttribute("filterOnPet", true) + end +} +--[[ +########################################################## +FRAME HELPERS +########################################################## +]]-- +local DetachSubFrames = function(...) + for i = 1, select("#", ...) do + local frame = select(i,...) + frame:ClearAllPoints() + end +end + +local UpdateTargetGlow = function(self) + if not self.unit then return end + local unit = self.unit; + if(UnitIsUnit(unit, "target")) then + self.TargetGlow:Show() + local reaction = UnitReaction(unit, "player") + if(UnitIsPlayer(unit)) then + local _, class = UnitClass(unit) + if class then + local colors = RAID_CLASS_COLORS[class] + self.TargetGlow:SetBackdropBorderColor(colors.r, colors.g, colors.b) + else + self.TargetGlow:SetBackdropBorderColor(1, 1, 1) + end + elseif(reaction) then + local colors = FACTION_BAR_COLORS[reaction] + self.TargetGlow:SetBackdropBorderColor(colors.r, colors.g, colors.b) + else + self.TargetGlow:SetBackdropBorderColor(1, 1, 1) + end + else + self.TargetGlow:Hide() + end +end +--[[ +########################################################## +TEMPLATES AND PROTOTYPES +########################################################## +]]-- +local BuildTemplates = {}; +local UpdateTemplates = {}; +--[[ +########################################################## +COMMON +########################################################## +]]-- +local AllowElement = function(self) + if InCombatLockdown() then return; end + + if not self.isForced then + self.sourceElement = self.unit; + self.unit = "player" + self.isForced = true; + self.sourceEvent = self:GetScript("OnUpdate") + end + + self:SetScript("OnUpdate", nil) + self.forceShowAuras = true; + + UnregisterUnitWatch(self) + RegisterUnitWatch(self, true) + + self:Show() + if self:IsVisible() and self.Update then + self:Update() + end +end + +local RestrictElement = function(self) + if(InCombatLockdown() or (not self.isForced)) then return; end + + self.forceShowAuras = nil + self.isForced = nil + + UnregisterUnitWatch(self) + RegisterUnitWatch(self) + + if self.sourceEvent then + self:SetScript("OnUpdate", self.sourceEvent) + self.sourceEvent = nil + end + + self.unit = self.sourceElement or self.unit; + + if self:IsVisible() and self.Update then + self:Update() + end +end +--[[ +########################################################## +PARTY FRAMES +########################################################## +]]-- +local PartyUnitUpdate = function(self) + local db = SV.db.SVUnit.party + self.colors = oUF_Villain.colors; + self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and 'AnyDown' or 'AnyUp') + MOD.RefreshUnitMedia(self, "party") + if self.isChild then + local altDB = db.petsGroup; + if self == _G[self.originalParent:GetName()..'Target'] then + altDB = db.targetsGroup + end + if not self.originalParent.childList then + self.originalParent.childList = {} + end + self.originalParent.childList[self] = true; + if not InCombatLockdown()then + if altDB.enable then + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(altDB, "partychild") + self:SetParent(self.originalParent) + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + self:ClearAllPoints() + SV:ReversePoint(self, altDB.anchorPoint, self.originalParent, altDB.xOffset, altDB.yOffset) + else + self:SetParent(SV.Cloaked) + end + end + do + local health = self.Health; + health.Smooth = nil; + health.frequentUpdates = nil; + health.colorSmooth = nil; + health.colorHealth = nil; + health.colorClass = true; + health.colorReaction = true; + health:ClearAllPoints() + health:Point("TOPRIGHT", self, "TOPRIGHT", -1, -1) + health:Point("BOTTOMLEFT", self, "BOTTOMLEFT", 1, 1) + end + do + local nametext = self.InfoPanel.Name + self:Tag(nametext, altDB.tags) + end + else + if not InCombatLockdown() then + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db, "party") + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + end + MOD:RefreshUnitLayout(self, "party") + MOD:UpdateAuraWatch(self, "party") + end + self:EnableElement('ReadyCheck') + self:UpdateAllElements() +end + +UpdateTemplates["party"] = function(self) + if(SV.NeedsFrameAudit) then return end + local db = SV.db.SVUnit.party + local groupFrame = self:GetParent() + + if not groupFrame.positioned then + groupFrame:ClearAllPoints() + groupFrame:Point("LEFT",SV.Screen,"LEFT",40,0) + RegisterStateDriver(groupFrame, "visibility", "[group:raid][nogroup] hide;show") + SV.Mentalo:Add(groupFrame, L['Party Frames'], nil, nil, nil, 'ALL,PARTY,ARENA'); + groupFrame.positioned = true; + end + + local index = 1; + local attIndex = ("child%d"):format(index) + local childFrame = self:GetAttribute(attIndex) + if(not childFrame) then return end + local childName = childFrame:GetName() + local petFrame = _G[("%sPet"):format(childName)] + local targetFrame = _G[("%sTarget"):format(childName)] + + while childFrame do + childFrame:UnitUpdate() + + childName = childFrame:GetName() + petFrame = _G[("%sPet"):format(childName)] + targetFrame = _G[("%sTarget"):format(childName)] + + if(petFrame) then + petFrame:UnitUpdate() + end + + if(targetFrame) then + targetFrame:UnitUpdate() + end + + index = index + 1; + attIndex = ("child%d"):format(index) + childFrame = self:GetAttribute(attIndex) + end +end + +BuildTemplates["party"] = function(self, unit) + self.unit = unit + self.___key = "party" + self:SetScript("OnEnter", UnitFrame_OnEnter) + self:SetScript("OnLeave", UnitFrame_OnLeave) + + MOD:SetActionPanel(self, "party") + self.Health = MOD:CreateHealthBar(self, true) + + if self.isChild then + self.originalParent = self:GetParent() + else + self.Power = MOD:CreatePowerBar(self, true) + self.Power.frequentUpdates = false + MOD:CreatePortrait(self, true) + self.Buffs = MOD:CreateBuffs(self, "party") + self.Debuffs = MOD:CreateDebuffs(self, "party") + self.AuraWatch = MOD:CreateAuraWatch(self, "party") + self.Afflicted = MOD:CreateAfflicted(self) + self.ResurrectIcon = MOD:CreateResurectionIcon(self) + self.LFDRole = MOD:CreateRoleIcon(self) + self.RaidRoleFramesAnchor = MOD:CreateRaidRoleFrames(self) + self.RaidIcon = MOD:CreateRaidIcon(self) + self.ReadyCheck = MOD:CreateReadyCheckIcon(self) + self.HealPrediction = MOD:CreateHealPrediction(self) + --self.GPS = MOD:CreateGPS(self, true) + + local shadow = CreateFrame("Frame", nil, self) + shadow:SetFrameLevel(1) + shadow:SetFrameStrata(self:GetFrameStrata()) + shadow:WrapOuter(self, 3, 3) + shadow:SetBackdrop({ + edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]], + edgeSize = 3, + insets = { + left = 5, + right = 5, + top = 5, + bottom = 5 + } + }) + shadow:SetBackdropColor(0, 0, 0, 0) + shadow:SetBackdropBorderColor(0, 0, 0, 0.9) + shadow:Hide() + self.TargetGlow = shadow + tinsert(self.__elements, UpdateTargetGlow) + self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow) + self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow) + self:RegisterEvent("GROUP_ROSTER_UPDATE", UpdateTargetGlow) + end + + self.Range = { insideAlpha = 1, outsideAlpha = 1 } + + self.Restrict = RestrictElement + self.Allow = AllowElement + self.UnitUpdate = PartyUnitUpdate + + return self +end +--[[ +########################################################## +RAID FRAMES +########################################################## +]]-- +local RaidUnitUpdate = function(self) + local db = SV.db.SVUnit.raid + self.colors = oUF_Villain.colors; + self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and "AnyDown" or "AnyUp") + + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db) + if not InCombatLockdown() then + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + end + + do + local rdBuffs = self.RaidDebuffs; + if db.rdebuffs.enable then + if not self:IsElementEnabled('RaidDebuffs') then + self:EnableElement("RaidDebuffs") + end + local actualSz = numMin(db.rdebuffs.size, (UNIT_HEIGHT - 8)) + rdBuffs:Size(actualSz) + rdBuffs:Point("CENTER", self, "CENTER", db.rdebuffs.xOffset, db.rdebuffs.yOffset) + rdBuffs:Show() + else + self:DisableElement("RaidDebuffs") + rdBuffs:Hide() + end + end + + MOD.RefreshUnitMedia(self, token) + MOD:UpdateAuraWatch(self, token) + MOD:RefreshUnitLayout(self, token) + + if(token ~= "raidpet") then + self:EnableElement("ReadyCheck") + end + self:UpdateAllElements() +end + +UpdateTemplates["raid"] = function(self) + if(SV.NeedsFrameAudit) then return end + local db = SV.db.SVUnit.raid + local groupFrame = self:GetParent() + + if not groupFrame.positioned then + groupFrame:ClearAllPoints() + groupFrame:Point("LEFT", SV.Screen, "LEFT", 4, 0) + RegisterStateDriver(groupFrame, "visibility", "[group:raid] show; hide") + SV.Mentalo:Add(groupFrame, "Raid Frames") + groupFrame.positioned = true + end + + local index = 1; + local attIndex = ("child%d"):format(index) + local childFrame = self:GetAttribute(attIndex) + if(not childFrame) then return end + local childName = childFrame:GetName() + local petFrame = _G[("%sPet"):format(childName)] + local targetFrame = _G[("%sTarget"):format(childName)] + + while childFrame do + childFrame:UnitUpdate() + + childName = childFrame:GetName() + petFrame = _G[("%sPet"):format(childName)] + targetFrame = _G[("%sTarget"):format(childName)] + + if(petFrame) then + petFrame:UnitUpdate() + end + + if(targetFrame) then + targetFrame:UnitUpdate() + end + + index = index + 1; + attIndex = ("child%d"):format(index) + childFrame = self:GetAttribute(attIndex) + end +end + +BuildTemplates["raid"] = function(self, unit) + self.unit = unit + self.___key = "raid" + MOD:SetActionPanel(self, "raid") + self.Health = MOD:CreateHealthBar(self, true) + self.Health.frequentUpdates = false + self.Power = MOD:CreatePowerBar(self, true) + self.Power.frequentUpdates = false + self.Buffs = MOD:CreateBuffs(self, "raid") + self.Debuffs = MOD:CreateDebuffs(self, "raid") + self.AuraWatch = MOD:CreateAuraWatch(self, "raid") + self.RaidDebuffs = MOD:CreateRaidDebuffs(self) + self.Afflicted = MOD:CreateAfflicted(self) + self.ResurrectIcon = MOD:CreateResurectionIcon(self) + self.LFDRole = MOD:CreateRoleIcon(self) + self.RaidRoleFramesAnchor = MOD:CreateRaidRoleFrames(self) + self.RaidIcon = MOD:CreateRaidIcon(self) + self.ReadyCheck = MOD:CreateReadyCheckIcon(self) + self.HealPrediction = MOD:CreateHealPrediction(self) + self.Range = { insideAlpha = 1, outsideAlpha = 1 } + + self.Restrict = RestrictElement + self.Allow = AllowElement + self.UnitUpdate = RaidUnitUpdate + + local shadow = CreateFrame("Frame", nil, self) + shadow:SetFrameLevel(1) + shadow:SetFrameStrata(self:GetFrameStrata()) + shadow:WrapOuter(self, 3, 3) + shadow:SetBackdrop({ + edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]], + edgeSize = 3, + insets = { + left = 5, + right = 5, + top = 5, + bottom = 5 + } + }) + shadow:SetBackdropColor(0, 0, 0, 0) + shadow:SetBackdropBorderColor(0, 0, 0, 0.9) + shadow:Hide() + self.TargetGlow = shadow + + tinsert(self.__elements, UpdateTargetGlow) + + self:SetScript("OnEnter", UnitFrame_OnEnter) + self:SetScript("OnLeave", UnitFrame_OnLeave) + self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow) + self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow) + + return self +end +--[[ +########################################################## +RAID PETS +########################################################## +]]-- +UpdateTemplates["raidpet"] = function(self) + if(SV.NeedsFrameAudit) then return end + local db = SV.db.SVUnit.raidpet + local groupFrame = self:GetParent() + + if not groupFrame.positioned then + groupFrame:ClearAllPoints() + groupFrame:Point("BOTTOMLEFT", SV.Screen, "BOTTOMLEFT", 4, 433) + RegisterStateDriver(groupFrame, "visibility", "[group:raid] show; hide") + SV.Mentalo:Add(groupFrame, L["Raid Pet Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40") + groupFrame.positioned = true; + end + + RaidPetVisibility(groupFrame) + + local index = 1; + local attIndex = ("child%d"):format(index) + local childFrame = self:GetAttribute(attIndex) + if(not childFrame) then return end + local childName = childFrame:GetName() + local petFrame = _G[("%sPet"):format(childName)] + local targetFrame = _G[("%sTarget"):format(childName)] + + while childFrame do + childFrame:UnitUpdate() + + childName = childFrame:GetName() + petFrame = _G[("%sPet"):format(childName)] + targetFrame = _G[("%sTarget"):format(childName)] + + if(petFrame) then + petFrame:UnitUpdate() + end + + if(targetFrame) then + targetFrame:UnitUpdate() + end + + index = index + 1; + attIndex = ("child%d"):format(index) + childFrame = self:GetAttribute(attIndex) + end +end + +BuildTemplates["raidpet"] = function(self, unit) + self.unit = unit + self.___key = "raidpet" + self:SetScript("OnEnter", UnitFrame_OnEnter) + self:SetScript("OnLeave", UnitFrame_OnLeave) + MOD:SetActionPanel(self, "raidpet") + self.Health = MOD:CreateHealthBar(self, true) + self.Debuffs = MOD:CreateDebuffs(self, "raidpet") + self.AuraWatch = MOD:CreateAuraWatch(self, "raidpet") + self.RaidDebuffs = MOD:CreateRaidDebuffs(self) + self.Afflicted = MOD:CreateAfflicted(self) + self.RaidIcon = MOD:CreateRaidIcon(self) + self.Range = { insideAlpha = 1, outsideAlpha = 1 } + + self.Restrict = RestrictElement + self.Allow = AllowElement + self.UnitUpdate = RaidUnitUpdate + + local shadow = CreateFrame("Frame", nil, self) + shadow:SetFrameLevel(1) + shadow:SetFrameStrata(self:GetFrameStrata()) + shadow:WrapOuter(self, 3, 3) + shadow:SetBackdrop({ + edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]], + edgeSize = 3, + insets = { + left = 5, + right = 5, + top = 5, + bottom = 5 + } + }) + shadow:SetBackdropColor(0, 0, 0, 0) + shadow:SetBackdropBorderColor(0, 0, 0, 0.9) + shadow:Hide() + self.TargetGlow = shadow + tinsert(self.__elements, UpdateTargetGlow) + + self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow) + self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow) + return self +end +--[[ +########################################################## +TANK +########################################################## +]]-- +local TankUnitUpdate = function(self) + local db = SV.db.SVUnit.tank + self.colors = oUF_Villain.colors; + self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and "AnyDown" or "AnyUp") + MOD.RefreshUnitMedia(self, "tank") + if self.isChild and self.originalParent then + local targets = db.targetsGroup; + if not self.originalParent.childList then + self.originalParent.childList = {} + end + self.originalParent.childList[self] = true; + if not InCombatLockdown()then + if targets.enable then + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(targets) + self:SetParent(self.originalParent) + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + self:ClearAllPoints() + SV:ReversePoint(self, targets.anchorPoint, self.originalParent, targets.xOffset, targets.yOffset) + else + self:SetParent(SV.Cloaked) + end + end + elseif not InCombatLockdown() then + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db) + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + end + MOD:RefreshUnitLayout(self, "tank") + do + local nametext = self.InfoPanel.Name; + if oUF_Villain.colors.healthclass then + self:Tag(nametext, "[name:10]") + else + self:Tag(nametext, "[name:color][name:10]") + end + end + self:UpdateAllElements() +end + +UpdateTemplates["tank"] = function(self) + if(SV.NeedsFrameAudit) then return end + local db = SV.db.SVUnit.tank + + if db.enable ~= true then + UnregisterAttributeDriver(self, "state-visibility") + self:Hide() + return + end + + self:Hide() + DetachSubFrames(self:GetChildren()) + self:SetAttribute("startingIndex", -1) + RegisterAttributeDriver(self, "state-visibility", "show") + self.dirtyWidth, self.dirtyHeight = self:GetSize() + RegisterAttributeDriver(self, "state-visibility", "[@raid1, exists] show;hide") + self:SetAttribute("startingIndex", 1) + self:SetAttribute("point", "BOTTOM") + self:SetAttribute("columnAnchorPoint", "LEFT") + DetachSubFrames(self:GetChildren()) + self:SetAttribute("yOffset", 7) + + if not self.positioned then + self:ClearAllPoints() + self:Point("TOPLEFT", SV.Screen, "TOPLEFT", 4, -40) + SV.Mentalo:Add(self, L["Tank Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40") + self.Avatar.positionOverride = "TOPLEFT" + self:SetAttribute("minHeight", self.dirtyHeight) + self:SetAttribute("minWidth", self.dirtyWidth) + self.positioned = true + end + + local childFrame, childName, petFrame, targetFrame + for i = 1, self:GetNumChildren() do + childFrame = select(i, self:GetChildren()) + childFrame:UnitUpdate() + + childName = childFrame:GetName() + petFrame = _G[("%sPet"):format(childName)] + targetFrame = _G[("%sTarget"):format(childName)] + + if(petFrame) then + petFrame:UnitUpdate() + end + if(targetFrame) then + targetFrame:UnitUpdate() + end + end +end + +BuildTemplates["tank"] = function(self, unit) + local db = SV.db.SVUnit.tank + self.unit = unit + self.___key = "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.Restrict = RestrictElement + self.Allow = AllowElement + self.UnitUpdate = TankUnitUpdate + + self.Range = { insideAlpha = 1, outsideAlpha = 1 } + self.originalParent = self:GetParent() + + self:UnitUpdate() + return self +end +--[[ +########################################################## +ASSIST +########################################################## +]]-- +local AssistUnitUpdate = function(self) + local db = SV.db.SVUnit.assist + self.colors = oUF_Villain.colors; + self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and "AnyDown" or "AnyUp") + MOD.RefreshUnitMedia(self, "assist") + if self.isChild and self.originalParent then + local targets = db.targetsGroup; + if not self.originalParent.childList then + self.originalParent.childList = {} + end + self.originalParent.childList[self] = true; + if not InCombatLockdown()then + if targets.enable then + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(targets) + self:SetParent(self.originalParent) + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + self:ClearAllPoints() + SV:ReversePoint(self, targets.anchorPoint, self.originalParent, targets.xOffset, targets.yOffset) + else + self:SetParent(SV.Cloaked) + end + end + elseif not InCombatLockdown() then + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db) + self:Size(UNIT_WIDTH, UNIT_HEIGHT) + end + + MOD:RefreshUnitLayout(self, "assist") + + do + local nametext = self.InfoPanel.Name; + if oUF_Villain.colors.healthclass then + self:Tag(nametext, "[name:10]") + else + self:Tag(nametext, "[name:color][name:10]") + end + end + self:UpdateAllElements() +end + +UpdateTemplates["assist"] = function(self) + if(SV.NeedsFrameAudit) then return end + local db = SV.db.SVUnit.assist + + self:Hide() + DetachSubFrames(self:GetChildren()) + self:SetAttribute("startingIndex", -1) + RegisterAttributeDriver(self, "state-visibility", "show") + self.dirtyWidth, self.dirtyHeight = self:GetSize() + RegisterAttributeDriver(self, "state-visibility", "[@raid1, exists] show;hide") + self:SetAttribute("startingIndex", 1) + self:SetAttribute("point", "BOTTOM") + self:SetAttribute("columnAnchorPoint", "LEFT") + DetachSubFrames(self:GetChildren()) + self:SetAttribute("yOffset", 7) + + if not self.positioned then + self:ClearAllPoints() + self:Point("TOPLEFT", SV.Screen, "TOPLEFT", 4, -140) + SV.Mentalo:Add(self, L["Assist Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40") + self.Avatar.positionOverride = "TOPLEFT" + self:SetAttribute("minHeight", self.dirtyHeight) + self:SetAttribute("minWidth", self.dirtyWidth) + self.positioned = true + end + + local childFrame, childName, petFrame, targetFrame + for i = 1, self:GetNumChildren() do + childFrame = select(i, self:GetChildren()) + childFrame:UnitUpdate() + + childName = childFrame:GetName() + petFrame = _G[("%sPet"):format(childName)] + targetFrame = _G[("%sTarget"):format(childName)] + + if(petFrame) then + petFrame:UnitUpdate() + end + if(targetFrame) then + targetFrame:UnitUpdate() + end + end +end + +BuildTemplates["assist"] = function(self, unit) + local db = SV.db.SVUnit.assist + self.unit = unit + self.___key = "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 } + + self.Restrict = RestrictElement + self.Allow = AllowElement + self.UnitUpdate = AssistUnitUpdate + + self.originalParent = self:GetParent() + + self:UnitUpdate() + return self +end +--[[ +########################################################## +HEADER CONSTRUCTS +########################################################## +]]-- +local HeaderMediaUpdate = function(self) + local token = self.___groupkey + local index = 1; + local attIndex = ("child%d"):format(index) + local childFrame = self:GetAttribute(attIndex) + local childName = childFrame:GetName() + local petFrame = _G[("%sPet"):format(childName)] + local targetFrame = _G[("%sTarget"):format(childName)] + + while childFrame do + MOD.RefreshUnitMedia(childFrame, token) + + if(petFrame) then + MOD.RefreshUnitMedia(petFrame, token) + end + + if(targetFrame) then + MOD.RefreshUnitMedia(targetFrame, token) + end + + index = index + 1; + attIndex = ("child%d"):format(index) + childFrame = self:GetAttribute(attIndex) + childName = childFrame:GetName() + petFrame = _G[("%sPet"):format(childName)] + targetFrame = _G[("%sTarget"):format(childName)] + end +end + +local HeaderUnsetAttributes = function(self) + self:Hide() + self:SetAttribute("showPlayer", true) + self:SetAttribute("showSolo", true) + self:SetAttribute("showParty", true) + self:SetAttribute("showRaid", true) + self:SetAttribute("columnSpacing", nil) + self:SetAttribute("columnAnchorPoint", nil) + self:SetAttribute("sortMethod", nil) + self:SetAttribute("groupFilter", nil) + self:SetAttribute("groupingOrder", nil) + self:SetAttribute("maxColumns", nil) + self:SetAttribute("nameList", nil) + self:SetAttribute("point", nil) + self:SetAttribute("sortDir", nil) + self:SetAttribute("sortMethod", "NAME") + self:SetAttribute("startingIndex", nil) + self:SetAttribute("strictFiltering", nil) + self:SetAttribute("unitsPerColumn", nil) + self:SetAttribute("xOffset", nil) + self:SetAttribute("yOffset", nil) +end + +local HeaderEnableChildren = function(self) + self.isForced = true; + for i=1, select("#", self:GetChildren()) do + local childFrame = select(i, self:GetChildren()) + childFrame:RegisterForClicks(nil) + childFrame:SetID(i) + childFrame.TargetGlow:SetAlpha(0) + childFrame:Allow() + end +end + +local HeaderDisableChildren = function(self) + self.isForced = nil; + for i=1,select("#", self:GetChildren()) do + local childFrame = select(i, self:GetChildren()) + childFrame:RegisterForClicks(SV.db.SVUnit.fastClickTarget and 'AnyDown' or 'AnyUp') + childFrame.TargetGlow:SetAlpha(1) + childFrame:Restrict() + end +end + +function MOD:SetGroupHeader(parentFrame, filter, layout, headerName, token) + local db = SV.db.SVUnit[token] + + local template1, template2 + if(token == "raidpet") then + template1 = "SVUI_UNITPET" + template2 = "SecureGroupPetHeaderTemplate" + elseif(token == "tank") then + filter = "MAINTANK" + template1 = "SVUI_UNITTARGET" + elseif(token == "assist") then + filter = "MAINASSIST" + template1 = "SVUI_UNITTARGET" + end + + local UNIT_WIDTH, UNIT_HEIGHT = self:GetActiveSize(db) + local groupHeader = oUF_Villain:SpawnHeader(headerName, template2, nil, + "oUF-initialConfigFunction", ("self:SetWidth(%d); self:SetHeight(%d); self:SetFrameLevel(5)"):format(UNIT_WIDTH, UNIT_HEIGHT), + "groupFilter", filter, + "showParty", true, + "showRaid", true, + "showSolo", true, + template1 and "template", template1 + ) + groupHeader.___groupkey = token + groupHeader:SetParent(parentFrame) + groupHeader.Update = UpdateTemplates[token] + groupHeader.MediaUpdate = HeaderMediaUpdate + groupHeader.UnsetAttributes = HeaderUnsetAttributes + groupHeader.EnableChildren = HeaderEnableChildren + groupHeader.DisableChildren = HeaderDisableChildren + + return groupHeader +end +--[[ +########################################################## +GROUP CONSTRUCTS +########################################################## +]]-- +local GroupUpdate = function(self) + local token = self.___groupkey + if SV.db.SVUnit[token].enable ~= true then + UnregisterAttributeDriver(self, "state-visibility") + self:Hide() + return + end + for i=1,#self.groups do + self.groups[i]:Update() + end +end + +local GroupMediaUpdate = function(self) + for i=1,#self.groups do + self.groups[i]:MediaUpdate() + end +end + +local GroupSetVisibility = function(self) + if not self.isForced then + local token = self.___groupkey + local db = SV.db.SVUnit[token] + if(db) then + for i=1,#self.groups do + local frame = self.groups[i] + if(i <= db.groupCount) then + frame:Show() + else + if frame.forceShow then + frame:Hide() + frame:DisableChildren() + frame:SetAttribute('startingIndex',1) + else + frame:UnsetAttributes() + end + end + end + end + end +end + +local GroupConfigure = function(self) + local token = self.___groupkey + local settings = SV.db.SVUnit[token] + local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(settings) + local sorting = settings.showBy + local sortMethod = settings.sortMethod + local widthCalc, heightCalc, xCalc, yCalc = 0, 0, 0, 0; + local point, anchorPoint, columnAnchor, horizontal, vertical, isHorizontal = unpack(sortMapping[sorting]); + local groupCount = settings.groupCount + + self.groupCount = groupCount + + for i = 1, groupCount do + + local frame = self.groups[i] + + if(frame) then + if(settings.showBy == "UP") then + settings.showBy = "UP_RIGHT" + end + + if(settings.showBy == "DOWN") then + settings.showBy = "DOWN_RIGHT" + end + + if(isHorizontal) then + frame:SetAttribute("xOffset", settings.wrapXOffset * horizontal) + frame:SetAttribute("yOffset", 0) + frame:SetAttribute("columnSpacing", settings.wrapYOffset) + else + frame:SetAttribute("xOffset", 0) + frame:SetAttribute("yOffset", settings.wrapYOffset * vertical) + frame:SetAttribute("columnSpacing", settings.wrapXOffset) + end + + if(not frame.isForced) then + if not frame.initialized then + frame:SetAttribute("startingIndex", -4) + frame:Show() + frame.initialized = true + end + frame:SetAttribute("startingIndex", 1) + end + + frame:ClearAllPoints() + frame:SetAttribute("columnAnchorPoint", columnAnchor) + + DetachSubFrames(frame:GetChildren()) + + frame:SetAttribute("point", point) + + if(not frame.isForced) then + frame:SetAttribute("maxColumns", 1) + frame:SetAttribute("unitsPerColumn", 5) + GroupDistributor[sortMethod](frame) + frame:SetAttribute("sortDir", settings.sortDir) + frame:SetAttribute("showPlayer", settings.showPlayer) + end + + frame:SetAttribute("groupFilter", tostring(i)) + end + + if (i - 1) % settings.gRowCol == 0 then + if isHorizontal then + if(frame) then + frame:SetPoint(anchorPoint, self, anchorPoint, 0, heightCalc * vertical) + end + + heightCalc = heightCalc + UNIT_HEIGHT + settings.wrapYOffset; + yCalc = yCalc + 1 + else + if(frame) then frame:SetPoint(anchorPoint, self, anchorPoint, widthCalc * horizontal, 0) end + + widthCalc = widthCalc + UNIT_WIDTH + settings.wrapXOffset; + xCalc = xCalc + 1 + end + else + if isHorizontal then + if yCalc == 1 then + if(frame) then + frame:SetPoint(anchorPoint, self, anchorPoint, widthCalc * horizontal, 0) + end + + widthCalc = widthCalc + (UNIT_WIDTH + settings.wrapXOffset) * 5; + xCalc = xCalc + 1 + elseif(frame) then + frame:SetPoint(anchorPoint, self, anchorPoint, (((UNIT_WIDTH + settings.wrapXOffset) * 5) * ((i - 1) % settings.gRowCol)) * horizontal, ((UNIT_HEIGHT + settings.wrapYOffset) * (yCalc - 1)) * vertical) + end + else + if xCalc == 1 then + if(frame) then + frame:SetPoint(anchorPoint, self, anchorPoint, 0, heightCalc * vertical) + end + + heightCalc = heightCalc + (UNIT_HEIGHT + settings.wrapYOffset) * 5; + yCalc = yCalc + 1 + elseif(frame) then + frame:SetPoint(anchorPoint, self, anchorPoint, ((UNIT_WIDTH + settings.wrapXOffset) * (xCalc - 1)) * horizontal, (((UNIT_HEIGHT + settings.wrapYOffset) * 5) * ((i - 1) % settings.gRowCol)) * vertical) + end + end + end + + if heightCalc == 0 then + heightCalc = heightCalc + (UNIT_HEIGHT + settings.wrapYOffset) * 5 + elseif widthCalc == 0 then + widthCalc = widthCalc + (UNIT_WIDTH + settings.wrapXOffset) * 5 + end + end + + self:SetSize(widthCalc - settings.wrapXOffset, heightCalc - settings.wrapYOffset) +end + +function MOD:GetGroupFrame(token, layout) + if(not self.Headers[token]) then + oUF_Villain:RegisterStyle(layout, BuildTemplates[token]) + oUF_Villain:SetActiveStyle(layout) + local groupFrame = CreateFrame("Frame", layout, SVUI_UnitFrameParent, "SecureHandlerStateTemplate") + groupFrame.___groupkey = token; + groupFrame.groups = {} + groupFrame.Update = GroupUpdate + groupFrame.MediaUpdate = GroupMediaUpdate + groupFrame.SetVisibility = GroupSetVisibility + groupFrame.Configure = GroupConfigure + + groupFrame:Show() + self.Headers[token] = groupFrame + end + return self.Headers[token] +end + +function MOD:SetCustomFrame(token, layout) + if(not self.Headers[token]) then + oUF_Villain:RegisterStyle(layout, BuildTemplates[token]) + oUF_Villain:SetActiveStyle(layout) + local groupFrame = self:SetGroupHeader(SVUI_UnitFrameParent, nil, layout, layout, token) + self.Headers[token] = groupFrame + end + self.Headers[token]:Show() + self.Headers[token]:Update() +end + +function MOD:SetGroupFrame(token, forceUpdate) + if(InCombatLockdown()) then self:RegisterEvent("PLAYER_REGEN_ENABLED"); return end + if(not SV.db.SVUnit.enable) then return end + local settings = SV.db.SVUnit[token] + local realName = token:gsub("(.)", upper, 1) + local layout = "SVUI_"..realName + + if(token == "tank" or token == "assist") then + return self:SetCustomFrame(token, layout) + end + + local groupFrame = self:GetGroupFrame(token, layout) + + if(token ~= "raidpet" and settings.enable ~= true) then + UnregisterStateDriver(groupFrame, "visibility") + groupFrame:Hide() + return + end + + local groupName + for i = 1, settings.groupCount do + if(not groupFrame.groups[i]) then + groupName = layout .. "Group" .. i + groupFrame.groups[i] = self:SetGroupHeader(groupFrame, i, layout, groupName, token) + groupFrame.groups[i]:Show() + end + end + + groupFrame:SetVisibility() + + if(forceUpdate or not groupFrame.Avatar) then + groupFrame:Configure() + if(not groupFrame.isForced and settings.visibility) then + RegisterStateDriver(groupFrame, "visibility", settings.visibility) + end + else + groupFrame:Configure() + groupFrame:Update() + end + + if(token == "raidpet" and settings.enable ~= true) then + UnregisterStateDriver(groupFrame, "visibility") + groupFrame:Hide() + return + end +end \ No newline at end of file diff --git a/Interface/AddOns/SVUI/packages/unit/groups.lua b/Interface/AddOns/SVUI/packages/unit/groups.lua index bd96a09..ea80e91 100644 --- a/Interface/AddOns/SVUI/packages/unit/groups.lua +++ b/Interface/AddOns/SVUI/packages/unit/groups.lua @@ -377,7 +377,6 @@ BuildTemplates["party"] = function(self, unit) self.RaidIcon = MOD:CreateRaidIcon(self) self.ReadyCheck = MOD:CreateReadyCheckIcon(self) self.HealPrediction = MOD:CreateHealPrediction(self) - --self.GPS = MOD:CreateGPS(self, true) local shadow = CreateFrame("Frame", nil, self) shadow:SetFrameLevel(1) @@ -398,6 +397,7 @@ BuildTemplates["party"] = function(self, unit) shadow:Hide() self.TargetGlow = shadow tinsert(self.__elements, UpdateTargetGlow) + self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow) self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow) self:RegisterEvent("GROUP_ROSTER_UPDATE", UpdateTargetGlow) -- 1.7.9.5