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.

985 lines
37 KiB

local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local B = Cell.bFuncs
local A = Cell.animations
local P = Cell.pixelPerfectFuncs
local LCG = LibStub("LibCustomGlow-1.0")
local placeholders, assignmentButtons = {}, {}
local menu, target, targettarget, focus, focustarget, unit, unitname, unitpet, unittarget, tank, boss1target, clear
local tanks, names = {}, {}
local UpdateTanks, UpdateNames
local tankUpdateRequired, nameUpdateRequired
local tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY
local NONE = strlower(_G.NONE)
-------------------------------------------------
-- spotlightFrame
-------------------------------------------------
local spotlightFrame = CreateFrame("Frame", "CellSpotlightFrame", Cell.frames.mainFrame, "SecureFrameTemplate")
Cell.frames.spotlightFrame = spotlightFrame
local anchorFrame = CreateFrame("Frame", "CellSpotlightAnchorFrame", spotlightFrame)
Cell.frames.spotlightFrameAnchor = anchorFrame
PixelUtil.SetPoint(anchorFrame, "TOPLEFT", UIParent, "CENTER", 1, -1)
anchorFrame:SetMovable(true)
anchorFrame:SetClampedToScreen(true)
local hoverFrame = CreateFrame("Frame", nil, spotlightFrame, "BackdropTemplate")
hoverFrame:SetPoint("TOP", anchorFrame, 0, 1)
hoverFrame:SetPoint("BOTTOM", anchorFrame, 0, -1)
hoverFrame:SetPoint("LEFT", anchorFrame, -1, 0)
hoverFrame:SetPoint("RIGHT", anchorFrame, 1, 0)
-- Cell:StylizeFrame(hoverFrame, {1,0,0,0.3}, {0,0,0,0})
A:ApplyFadeInOutToMenu(anchorFrame, hoverFrame)
local config = Cell:CreateButton(anchorFrame, nil, "accent", {20, 10}, false, true, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
config:SetFrameStrata("MEDIUM")
config:SetAllPoints(anchorFrame)
config:RegisterForDrag("LeftButton")
config:SetScript("OnDragStart", function()
anchorFrame:StartMoving()
anchorFrame:SetUserPlaced(false)
end)
config:SetScript("OnDragStop", function()
anchorFrame:StopMovingOrSizing()
P:SavePosition(anchorFrame, Cell.vars.currentLayoutTable["spotlight"]["position"])
end)
config:SetAttribute("_onclick", [[
for i = 1, 15 do
local b = self:GetFrameRef("assignment"..i)
if b:IsShown() then
b:Hide()
else
b:Show()
end
end
self:GetFrameRef("menu"):Hide()
]])
config:HookScript("OnEnter", function()
hoverFrame:GetScript("OnEnter")(hoverFrame)
CellTooltip:SetOwner(config, "ANCHOR_NONE")
CellTooltip:SetPoint(tooltipPoint, config, tooltipRelativePoint, tooltipX, tooltipY)
CellTooltip:AddLine(L["Spotlight Frame"])
local tips = {
{L["Left-Click"]..":", L["menu"]},
{L["Right-Click"]..":", L["clear"]},
{L["Left-Drag"]..":", L["set unit"].." ("..L["not in combat"]..")"},
{"Shift+"..L["Left-Drag"]..":", L["set unit's name"].." ("..L["not in combat"]..")"},
{L["Right-Drag"]..":", L["set unit's pet"].." ("..L["not in combat"]..")"},
}
for i = 1, 5 do
CellTooltip:AddDoubleLine("|cffffb5c5"..tips[i][1], "|cffffffff"..tips[i][2])
end
CellTooltip:Show()
end)
config:HookScript("OnLeave", function()
hoverFrame:GetScript("OnLeave")(hoverFrame)
CellTooltip:Hide()
end)
-------------------------------------------------
-- target frame: drag and set
-------------------------------------------------
local targetFrame = Cell:CreateFrame(nil, spotlightFrame, 50, 20)
targetFrame.label = targetFrame:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
targetFrame.label:SetPoint("CENTER")
targetFrame:EnableMouse(false)
function targetFrame:StartMoving()
targetFrame:Show()
local scale = P:GetEffectiveScale()
targetFrame:SetScript("OnUpdate", function()
local x, y = GetCursorPosition()
targetFrame:SetPoint("BOTTOMLEFT", UIParent, x/scale, y/scale)
targetFrame:SetWidth(targetFrame.label:GetWidth() + 10)
end)
end
function targetFrame:StopMoving()
targetFrame:Hide()
targetFrame:ClearAllPoints()
end
-------------------------------------------------
-- assignment buttons
-------------------------------------------------
local function CreateAssignmentButton(index)
local b = Cell:CreateButton(spotlightFrame, "|cffababab"..NONE, "accent-hover", {20, 20}, false, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
b:GetFontString():SetNonSpaceWrap(true)
b:GetFontString():SetWordWrap(true)
b:SetToplevel(true)
b:RegisterForClicks("LeftButtonUp", "RightButtonUp")
b:SetAttribute("index", index)
b:Hide()
b:SetAttribute("_onclick", [[
local menu = self:GetFrameRef("menu")
if button == "LeftButton" then --! show menu
if menu:IsShown() and menu:GetAttribute("index") == self:GetAttribute("index") then
menu:Hide()
else
menu:ClearAllPoints()
menu:SetPoint(menu:GetAttribute("point"), self, menu:GetAttribute("anchorPoint"), menu:GetAttribute("xOffset"), menu:GetAttribute("yOffset"))
menu:Show()
end
end
local index = self:GetAttribute("index")
-- print(index)
menu:SetAttribute("index", index)
if button == "RightButton" then --! clear
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", nil)
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "none")
menu:Hide()
menu:CallMethod("Save", index, nil)
end
]])
b:SetScript("OnAttributeChanged", function(self, name, value)
if name ~= "text" then return end
b:SetText(value == "none" and "|cffababab"..NONE or value)
end)
--! drag and set
b:RegisterForDrag("LeftButton", "RightButton")
b:SetScript("OnDragStart", function(self, button)
if InCombatLockdown() then return end
menu:Hide()
targetFrame:StartMoving()
-- color, N, frequency, length, thickness
LCG.PixelGlow_Start(b, Cell:GetAccentColorTable(), 9, 0.25, 8, 2)
if button == "LeftButton" then
if IsShiftKeyDown() then
targetFrame.label:SetText(L["Unit's Name"])
targetFrame.type = "name"
else
targetFrame.label:SetText(L["Unit"])
targetFrame.type = "unit"
end
else
targetFrame.label:SetText(L["Unit's Pet"])
targetFrame.type = "pet"
end
end)
b:SetScript("OnDragStop", function()
targetFrame:StopMoving()
LCG.PixelGlow_Stop(b)
if InCombatLockdown() then return end
local f = F:GetMouseFocus()
if f == WorldFrame then
f = F:GetUnitButtonByGUID(UnitGUID("mouseover") or "")
end
if not f then return end -- cursor outside wow window
local unitId
if f.states and f.states.displayedUnit then -- Cell
unitId = f.states.displayedUnit
elseif f.unit then
unitId = f.unit
end
if unitId then
if targetFrame.type == "unit" then
unit:SetUnit(b:GetAttribute("index"), unitId)
elseif targetFrame.type == "name" then
unitname:SetUnit(b:GetAttribute("index"), unitId)
elseif targetFrame.type == "pet" then
unitpet:SetUnit(b:GetAttribute("index"), unitId)
end
end
end)
return b
end
-------------------------------------------------
-- placeholders
-------------------------------------------------
local function CreatePlaceHolder(index)
local placeholder = CreateFrame("Frame", "CellSpotlightFramePlaceholder"..index, spotlightFrame, "BackdropTemplate")
placeholder:Hide()
Cell:StylizeFrame(placeholder, {0, 0, 0, 0.27})
placeholder.text = placeholder:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
placeholder.text:SetPoint("LEFT")
placeholder.text:SetPoint("RIGHT")
placeholder.text:SetWordWrap(true)
placeholder.text:SetNonSpaceWrap(true)
return placeholder
end
-------------------------------------------------
-- unitbuttons
-------------------------------------------------
local wrapFrame = CreateFrame("Frame", "CellSpotlightWrapFrame", nil, "SecureHandlerBaseTemplate")
for i = 1, 15 do
-- placeholder
placeholders[i] = CreatePlaceHolder(i)
-- assignment button
assignmentButtons[i] = CreateAssignmentButton(i)
assignmentButtons[i]:SetAllPoints(placeholders[i])
SecureHandlerSetFrameRef(config, "assignment"..i, assignmentButtons[i])
-- unit button
local b = CreateFrame("Button", "CellSpotlightFrameUnitButton"..i, spotlightFrame, "CellUnitButtonTemplate")
Cell.unitButtons.spotlight[i] = b
-- b.type = "spotlight" -- layout setup
-- b:SetAttribute("unit", "player")
-- RegisterUnitWatch(b)
b:SetAllPoints(placeholders[i])
b.isSpotlight = true --! NOTE: prevent overwrite Cell.vars.guids and Cell.vars.names
--! 天杀的 Secure Codes
SecureHandlerSetFrameRef(b, "placeholder", placeholders[i])
wrapFrame:WrapScript(b, "OnShow", [[
self:GetFrameRef("placeholder"):Hide()
]])
wrapFrame:WrapScript(b, "OnHide", [[
if self:GetAttribute("unit") and not self:GetAttribute("hidePlaceholder") then
self:GetFrameRef("placeholder"):Show()
end
]])
wrapFrame:WrapScript(b, "OnAttributeChanged", [[
if name ~= "unit" then return end
if self:GetAttribute("unit") and not self:IsShown() and not self:GetAttribute("hidePlaceholder") then
self:GetFrameRef("placeholder"):Show()
else
self:GetFrameRef("placeholder"):Hide()
end
]])
b:HookScript("OnAttributeChanged", function(self, name, value)
if name ~= "unit" then return end
if type(value) == "string" then
placeholders[i].text:SetText("|cffababab"..value)
else
placeholders[i].text:SetText("|cffababab"..NONE)
end
self.unit = value
F:UpdateOmniCDPosition("Cell-Spotlight")
end)
end
-------------------------------------------------
-- menu
-------------------------------------------------
menu = CreateFrame("Frame", "CellSpotlightAssignmentMenu", spotlightFrame, "BackdropTemplate,SecureHandlerAttributeTemplate,SecureHandlerShowHideTemplate")
menu:SetFrameStrata("FULLSCREEN_DIALOG")
menu:SetToplevel(true)
menu:SetClampedToScreen(true)
menu:Hide()
--! assignmentBtn -> spotlightButton
for i = 1, 15 do
-- assignmentBtn -> menu
SecureHandlerSetFrameRef(assignmentButtons[i], "menu", menu)
-- menu -> spotlightButton
SecureHandlerSetFrameRef(menu, "spotlight"..i, Cell.unitButtons.spotlight[i])
-- menu -> assignmentBtn
SecureHandlerSetFrameRef(menu, "assignment"..i, assignmentButtons[i])
end
-- hide
SecureHandlerSetFrameRef(menu, "config", config)
SecureHandlerSetFrameRef(config, "menu", menu)
-- menu:SetAttribute("_onhide", [[
-- for i = 1, 15 do
-- self:GetFrameRef("assignment"..i):Hide()
-- end
-- ]])
-- menu items
target = Cell:CreateButton(menu, L["Target"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(target, "TOPLEFT", menu, "TOPLEFT", 1, -1)
P:Point(target, "RIGHT", menu, "RIGHT", -1, 0)
target:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", "target")
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", true)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "target")
menu:Hide()
menu:CallMethod("Save", index, "target")
]])
-- NOTE: no EVENT for this kind of targets, use OnUpdate
targettarget = Cell:CreateButton(menu, L["Target of Target"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(targettarget, "TOPLEFT", target, "BOTTOMLEFT")
P:Point(targettarget, "TOPRIGHT", target, "BOTTOMRIGHT")
targettarget:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", "targettarget")
spotlight:SetAttribute("refreshOnUpdate", true)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "targettarget")
menu:Hide()
menu:CallMethod("Save", index, "targettarget")
]])
focus = Cell:CreateButton(menu, L["Focus"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(focus, "TOPLEFT", targettarget, "BOTTOMLEFT")
P:Point(focus, "TOPRIGHT", targettarget, "BOTTOMRIGHT")
focus:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", "focus")
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "focus")
menu:Hide()
menu:CallMethod("Save", index, "focus")
]])
focustarget = Cell:CreateButton(menu, L["Focus Target"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(focustarget, "TOPLEFT", focus, "BOTTOMLEFT")
P:Point(focustarget, "TOPRIGHT", focus, "BOTTOMRIGHT")
focustarget:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", "focustarget")
spotlight:SetAttribute("refreshOnUpdate", true)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "focustarget")
menu:Hide()
menu:CallMethod("Save", index, "focustarget")
]])
unit = Cell:CreateButton(menu, L["Unit"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(unit, "TOPLEFT", focustarget, "BOTTOMLEFT")
P:Point(unit, "TOPRIGHT", focustarget, "BOTTOMRIGHT")
unit:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
self:CallMethod("SetUnit", index, "target")
menu:Hide()
]])
function unit:SetUnit(index, target)
local unitId = F:GetTargetUnitID(target)
if unitId then
Cell.unitButtons.spotlight[index]:SetAttribute("unit", unitId)
assignmentButtons[index]:SetText(unitId)
menu:Save(index, unitId)
else
F:Print(L["Invalid unit."])
end
end
unitname = Cell:CreateButton(menu, L["Unit's Name"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(unitname, "TOPLEFT", unit, "BOTTOMLEFT")
P:Point(unitname, "TOPRIGHT", unit, "BOTTOMRIGHT")
unitname:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
self:CallMethod("SetUnit", index, "target")
menu:Hide()
]])
function unitname:SetUnit(index, target)
local unitId = F:GetTargetUnitID(target)
if unitId and (UnitIsPlayer(unitId) or UnitInPartyIsAI(unitId)) then
local name = GetUnitName(unitId, true)
Cell.unitButtons.spotlight[index]:SetAttribute("unit", unitId)
assignmentButtons[index]:SetText(name)
menu:Save(index, ":"..name)
local previous = names[name]
names[name] = index
if previous and previous ~= index then -- exists, remove previous
Cell.unitButtons.spotlight[previous]:SetAttribute("unit", nil)
assignmentButtons[previous]:SetText("|cffababab"..NONE)
menu:Save(previous, nil)
end
else
F:Print(L["Invalid unit."])
end
end
unitpet = Cell:CreateButton(menu, L["Unit's Pet"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(unitpet, "TOPLEFT", unitname, "BOTTOMLEFT")
P:Point(unitpet, "TOPRIGHT", unitname, "BOTTOMRIGHT")
unitpet:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
self:CallMethod("SetUnit", index, "target")
menu:Hide()
]])
function unitpet:SetUnit(index, target)
local unitId = F:GetTargetPetID(target)
if unitId then
Cell.unitButtons.spotlight[index]:SetAttribute("unit", unitId)
assignmentButtons[index]:SetText(unitId)
menu:Save(index, unitId)
else
F:Print(L["Invalid unit."])
end
end
unittarget = Cell:CreateButton(menu, L["Unit's Target"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(unittarget, "TOPLEFT", unitpet, "BOTTOMLEFT")
P:Point(unittarget, "TOPRIGHT", unitpet, "BOTTOMRIGHT")
unittarget:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
self:CallMethod("SetUnit", index, "target")
menu:Hide()
]])
function unittarget:SetUnit(index, target)
local unitId = F:GetTargetUnitID(target)
if unitId then
if unitId == "player" then
unitId = "target"
Cell.unitButtons.spotlight[index]:SetAttribute("refreshOnUpdate", nil)
Cell.unitButtons.spotlight[index]:SetAttribute("updateOnTargetChanged", true)
else
unitId = unitId.."target"
-- NOTE: no EVENT for this kind of targets, use OnUpdate
Cell.unitButtons.spotlight[index]:SetAttribute("refreshOnUpdate", true)
Cell.unitButtons.spotlight[index]:SetAttribute("updateOnTargetChanged", nil)
end
Cell.unitButtons.spotlight[index]:SetAttribute("unit", unitId)
assignmentButtons[index]:SetText(unitId)
menu:Save(index, unitId)
else
F:Print(L["Invalid unit."])
end
end
tank = Cell:CreateButton(menu, _G.TANK, "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(tank, "TOPLEFT", unittarget, "BOTTOMLEFT")
P:Point(tank, "TOPRIGHT", unittarget, "BOTTOMRIGHT")
tank:SetEnabled(not Cell.isVanilla)
tank:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "tank")
self:CallMethod("SetUnit", index)
menu:Hide()
]])
function tank:SetUnit(index)
tanks[index] = true
tankUpdateRequired = true
UpdateTanks()
menu:Save(index, "tank")
end
boss1target = Cell:CreateButton(menu, L["Boss1 Target"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(boss1target, "TOPLEFT", tank, "BOTTOMLEFT")
P:Point(boss1target, "TOPRIGHT", tank, "BOTTOMRIGHT")
boss1target:SetEnabled(not Cell.isVanilla)
boss1target:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", "boss1target")
spotlight:SetAttribute("refreshOnUpdate", true)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "boss1target")
menu:Hide()
menu:CallMethod("Save", index, "boss1target")
]])
clear = Cell:CreateButton(menu, L["Clear"], "transparent-accent", {20, 20}, true, false, nil, nil, "SecureHandlerAttributeTemplate,SecureHandlerClickTemplate")
P:Point(clear, "TOPLEFT", boss1target, "BOTTOMLEFT")
P:Point(clear, "TOPRIGHT", boss1target, "BOTTOMRIGHT")
clear:SetAttribute("_onclick", [[
local menu = self:GetParent()
local index = menu:GetAttribute("index")
local spotlight = menu:GetFrameRef("spotlight"..index)
spotlight:SetAttribute("unit", nil)
spotlight:SetAttribute("refreshOnUpdate", nil)
spotlight:SetAttribute("updateOnTargetChanged", nil)
menu:GetFrameRef("assignment"..index):SetAttribute("text", "none")
menu:Hide()
menu:CallMethod("Save", index, nil)
]])
-------------------------------------------------
-- functions
-------------------------------------------------
UpdateTanks = function()
if not tankUpdateRequired then return end
-- search for tanks
local units = {}
for unit in F:IterateGroupMembers() do
if UnitGroupRolesAssigned(unit) == "TANK" then
tinsert(units, unit)
end
end
-- assign
local n = 1
for index = 1, 15 do
if InCombatLockdown() then
tankUpdateRequired = true
return
end
if tanks[index] then
if units[n] then
Cell.unitButtons.spotlight[index]:SetAttribute("unit", units[n])
else
Cell.unitButtons.spotlight[index]:SetAttribute("unit", nil)
end
n = n + 1
end
end
tankUpdateRequired = nil
end
UpdateNames = function()
if not nameUpdateRequired then return end
-- search for names
local found = {}
for unit in F:IterateGroupMembers() do
if InCombatLockdown() then
nameUpdateRequired = true
return
end
local name = GetUnitName(unit, true)
if names[name] then
Cell.unitButtons.spotlight[names[name]]:SetAttribute("unit", unit)
found[name] = true
end
end
-- hide not found
for name, index in pairs(names) do
if InCombatLockdown() then
nameUpdateRequired = true
return
end
if not found[name] then
Cell.unitButtons.spotlight[index]:SetAttribute("unit", nil)
end
end
nameUpdateRequired = nil
end
local timer
local function UpdateAll()
timer = nil
tankUpdateRequired = true
UpdateTanks()
nameUpdateRequired = true
UpdateNames()
end
menu:RegisterEvent("GROUP_ROSTER_UPDATE")
menu:RegisterEvent("PLAYER_REGEN_ENABLED")
menu:RegisterEvent("PLAYER_REGEN_DISABLED")
menu:SetScript("OnEvent", function(self, event)
if event == "GROUP_ROSTER_UPDATE" then
if timer then
timer:Cancel()
end
timer = C_Timer.NewTimer(1, UpdateAll)
elseif event == "PLAYER_REGEN_DISABLED" then
unit:SetEnabled(false)
unitname:SetEnabled(false)
unittarget:SetEnabled(false)
unitpet:SetEnabled(false)
tank:SetEnabled(false)
elseif event == "PLAYER_REGEN_ENABLED" then
unit:SetEnabled(true)
unitname:SetEnabled(true)
unittarget:SetEnabled(true)
unitpet:SetEnabled(true)
tank:SetEnabled(not Cell.isVanilla)
UpdateTanks()
UpdateNames()
end
end)
function menu:Save(index, unit)
Cell.vars.currentLayoutTable["spotlight"]["units"][index] = unit
-- clear
if unit ~= "tank" then
tanks[index] = nil
end
for n, i in pairs(names) do
if i == index then
names[n] = nil
end
end
end
-- update width to show full text
local dumbFS1 = menu:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
dumbFS1:SetText(L["Target of Target"])
local dumbFS2 = menu:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
dumbFS2:SetText(L["Unit's Target"])
function menu:UpdatePixelPerfect()
P:Size(menu, ceil(max(dumbFS1:GetStringWidth(), dumbFS2:GetStringWidth())) + 13, 20*11+2)
Cell:StylizeFrame(menu, nil, Cell:GetAccentColorTable())
target:UpdatePixelPerfect()
focus:UpdatePixelPerfect()
targettarget:UpdatePixelPerfect()
unit:UpdatePixelPerfect()
unitpet:UpdatePixelPerfect()
clear:UpdatePixelPerfect()
end
-------------------------------------------------
-- callbacks
-------------------------------------------------
local function UpdatePosition()
local layout = Cell.vars.currentLayoutTable
local anchor
if layout["spotlight"]["sameArrangementAsMain"] then
anchor = layout["main"]["anchor"]
else
anchor = layout["spotlight"]["anchor"]
end
spotlightFrame:ClearAllPoints()
-- NOTE: detach from spotlightPreviewAnchor
P:LoadPosition(anchorFrame, layout["spotlight"]["position"])
if CellDB["general"]["menuPosition"] == "top_bottom" then
P:Size(anchorFrame, 20, 10)
if anchor == "BOTTOMLEFT" then
spotlightFrame:SetPoint("BOTTOMLEFT", anchorFrame, "TOPLEFT", 0, 4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPLEFT", "BOTTOMLEFT", 0, -3
elseif anchor == "BOTTOMRIGHT" then
spotlightFrame:SetPoint("BOTTOMRIGHT", anchorFrame, "TOPRIGHT", 0, 4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPRIGHT", "BOTTOMRIGHT", 0, -3
elseif anchor == "TOPLEFT" then
spotlightFrame:SetPoint("TOPLEFT", anchorFrame, "BOTTOMLEFT", 0, -4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMLEFT", "TOPLEFT", 0, 3
elseif anchor == "TOPRIGHT" then
spotlightFrame:SetPoint("TOPRIGHT", anchorFrame, "BOTTOMRIGHT", 0, -4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMRIGHT", "TOPRIGHT", 0, 3
end
else -- left_right
P:Size(anchorFrame, 10, 20)
if anchor == "BOTTOMLEFT" then
spotlightFrame:SetPoint("BOTTOMLEFT", anchorFrame, "BOTTOMRIGHT", 4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMRIGHT", "BOTTOMLEFT", -3, 0
elseif anchor == "BOTTOMRIGHT" then
spotlightFrame:SetPoint("BOTTOMRIGHT", anchorFrame, "BOTTOMLEFT", -4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMLEFT", "BOTTOMRIGHT", 3, 0
elseif anchor == "TOPLEFT" then
spotlightFrame:SetPoint("TOPLEFT", anchorFrame, "TOPRIGHT", 4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPRIGHT", "TOPLEFT", -3, 0
elseif anchor == "TOPRIGHT" then
spotlightFrame:SetPoint("TOPRIGHT", anchorFrame, "TOPLEFT", -4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPLEFT", "TOPRIGHT", 3, 0
end
end
end
local function UpdateMenu(which)
if not which or which == "lock" then
if CellDB["general"]["locked"] then
config:RegisterForDrag()
else
config:RegisterForDrag("LeftButton")
end
end
if not which or which == "fadeOut" then
if CellDB["general"]["fadeOut"] then
anchorFrame.fadeOut:Play()
else
anchorFrame.fadeIn:Play()
end
end
if which == "position" then
UpdatePosition()
end
end
Cell:RegisterCallback("UpdateMenu", "SpotlightFrame_UpdateMenu", UpdateMenu)
local previousLayout
local function UpdateLayout(layout, which)
-- if previousLayout == layout and not which then return end
-- previousLayout = layout
layout = Cell.vars.currentLayoutTable
if not which or strfind(which, "size$") then
local width, height
if layout["spotlight"]["sameSizeAsMain"] then
width, height = unpack(layout["main"]["size"])
else
width, height = unpack(layout["spotlight"]["size"])
end
P:Size(spotlightFrame, width, height)
for _, f in pairs(placeholders) do
P:Size(f, width, height)
end
end
if not which or strfind(which, "arrangement$") then
local orientation, anchor, spacingX, spacingY
if layout["spotlight"]["sameArrangementAsMain"] then
orientation = layout["main"]["orientation"]
anchor = layout["main"]["anchor"]
spacingX = layout["main"]["spacingX"]
spacingY = layout["main"]["spacingY"]
else
orientation = layout["spotlight"]["orientation"]
anchor = layout["spotlight"]["anchor"]
spacingX = layout["spotlight"]["spacingX"]
spacingY = layout["spotlight"]["spacingY"]
end
-- anchors
local point, anchorPoint, groupPoint, unitSpacingX, unitSpacingY
local menuAnchorPoint, menuX, menuY
if strfind(orientation, "^vertical") then
if anchor == "BOTTOMLEFT" then
point, anchorPoint = "BOTTOMLEFT", "TOPLEFT"
groupPoint = "BOTTOMRIGHT"
unitSpacingX = spacingX
unitSpacingY = spacingY
menuAnchorPoint = "BOTTOMRIGHT"
menuX, menuY = 4, 0
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint = "BOTTOMRIGHT", "TOPRIGHT"
groupPoint = "BOTTOMLEFT"
unitSpacingX = -spacingX
unitSpacingY = spacingY
menuAnchorPoint = "BOTTOMLEFT"
menuX, menuY = -4, 0
elseif anchor == "TOPLEFT" then
point, anchorPoint = "TOPLEFT", "BOTTOMLEFT"
groupPoint = "TOPRIGHT"
unitSpacingX = spacingX
unitSpacingY = -spacingY
menuAnchorPoint = "TOPRIGHT"
menuX, menuY = 4, 0
elseif anchor == "TOPRIGHT" then
point, anchorPoint = "TOPRIGHT", "BOTTOMRIGHT"
groupPoint = "TOPLEFT"
unitSpacingX = -spacingX
unitSpacingY = -spacingY
menuAnchorPoint = "TOPLEFT"
menuX, menuY = -4, 0
end
else
if anchor == "BOTTOMLEFT" then
point, anchorPoint = "BOTTOMLEFT", "BOTTOMRIGHT"
groupPoint = "TOPLEFT"
unitSpacingX = spacingX
unitSpacingY = spacingY
menuAnchorPoint = "TOPLEFT"
menuX, menuY = 0, 4
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint = "BOTTOMRIGHT", "BOTTOMLEFT"
groupPoint = "TOPRIGHT"
unitSpacingX = -spacingX
unitSpacingY = spacingY
menuAnchorPoint = "TOPRIGHT"
menuX, menuY = 0, 4
elseif anchor == "TOPLEFT" then
point, anchorPoint = "TOPLEFT", "TOPRIGHT"
groupPoint = "BOTTOMLEFT"
unitSpacingX = spacingX
unitSpacingY = -spacingY
menuAnchorPoint = "BOTTOMLEFT"
menuX, menuY = 0, -4
elseif anchor == "TOPRIGHT" then
point, anchorPoint = "TOPRIGHT", "TOPLEFT"
groupPoint = "BOTTOMRIGHT"
unitSpacingX = -spacingX
unitSpacingY = -spacingY
menuAnchorPoint = "BOTTOMRIGHT"
menuX, menuY = 0, -4
end
end
menu:SetAttribute("point", point)
menu:SetAttribute("anchorPoint", menuAnchorPoint)
menu:SetAttribute("xOffset", menuX)
menu:SetAttribute("yOffset", menuY)
menu:Hide()
local last
for i, f in pairs(placeholders) do
f:ClearAllPoints()
if last then
if strfind(orientation, "^vertical") then
if i % 5 == 1 and orientation == "vertical" then
f:SetPoint(point, placeholders[i-5], groupPoint, unitSpacingX, 0)
else
f:SetPoint(point, last, anchorPoint, 0, unitSpacingY)
end
else
if i % 5 == 1 and orientation == "horizontal" then
f:SetPoint(point, placeholders[i-5], groupPoint, 0, unitSpacingY)
else
f:SetPoint(point, last, anchorPoint, unitSpacingX, 0)
end
end
else
f:SetPoint("TOPLEFT", spotlightFrame)
end
last = f
end
UpdatePosition()
end
-- NOTE: SetOrientation BEFORE SetPowerSize
if not which or which == "barOrientation" then
for _, b in pairs(Cell.unitButtons.spotlight) do
B:SetOrientation(b, layout["barOrientation"][1], layout["barOrientation"][2])
end
end
if not which or strfind(which, "power$") or which == "barOrientation" or which == "powerFilter" then
for _, b in pairs(Cell.unitButtons.spotlight) do
if layout["spotlight"]["sameSizeAsMain"] then
B:SetPowerSize(b, layout["main"]["powerSize"])
else
B:SetPowerSize(b, layout["spotlight"]["powerSize"])
end
end
end
if not which or which == "spotlight" then
wipe(tanks)
wipe(names)
if layout["spotlight"]["enabled"] then
for i = 1, 15 do
local unit = layout["spotlight"]["units"][i]
Cell.unitButtons.spotlight[i]:SetAttribute("hidePlaceholder", layout["spotlight"]["hidePlaceholder"])
Cell.unitButtons.spotlight[i]:SetAttribute("refreshOnUpdate", nil)
Cell.unitButtons.spotlight[i]:SetAttribute("updateOnTargetChanged", nil)
if unit == "tank" then -- tank
tanks[i] = true
elseif unit and strfind(unit, "^:") then -- name
unit = strsub(unit, 2)
names[unit] = i
else -- unitid
Cell.unitButtons.spotlight[i]:SetAttribute("unit", unit)
if unit and strfind(unit, "^.+target$") then
Cell.unitButtons.spotlight[i]:SetAttribute("refreshOnUpdate", true)
elseif unit == "target" then
Cell.unitButtons.spotlight[i]:SetAttribute("updateOnTargetChanged", true)
end
end
RegisterUnitWatch(Cell.unitButtons.spotlight[i])
assignmentButtons[i]:SetText(unit or "|cffababab"..NONE)
end
tankUpdateRequired = true
UpdateTanks()
nameUpdateRequired = true
UpdateNames()
spotlightFrame:Show()
else
for i = 1, 15 do
Cell.unitButtons.spotlight[i]:SetAttribute("unit", nil)
Cell.unitButtons.spotlight[i]:SetAttribute("refreshOnUpdate", nil)
Cell.unitButtons.spotlight[i]:SetAttribute("updateOnTargetChanged", nil)
UnregisterUnitWatch(Cell.unitButtons.spotlight[i])
assignmentButtons[i]:SetText("|cffababab"..NONE)
Cell.unitButtons.spotlight[i]:Hide()
end
spotlightFrame:Hide()
menu:Hide()
end
end
-- load position
if not P:LoadPosition(anchorFrame, layout["spotlight"]["position"]) then
P:ClearPoints(anchorFrame)
-- no position, use default
anchorFrame:SetPoint("TOPLEFT", UIParent, "CENTER")
end
end
Cell:RegisterCallback("UpdateLayout", "SpotlightFrame_UpdateLayout", UpdateLayout)
local function UpdatePixelPerfect()
P:Resize(spotlightFrame)
P:Resize(anchorFrame)
targetFrame:UpdatePixelPerfect()
config:UpdatePixelPerfect()
menu:UpdatePixelPerfect()
for _, p in pairs(placeholders) do
Cell:StylizeFrame(p, {0, 0, 0, 0.27})
end
for _, b in pairs(assignmentButtons) do
b:UpdatePixelPerfect()
end
end
Cell:RegisterCallback("UpdatePixelPerfect", "SpotlightFrame_UpdatePixelPerfect", UpdatePixelPerfect)
local function UpdateAppearance(which)
if not which or which == "strata" then
C_Timer.After(0.5, function()
targetFrame:SetFrameStrata("TOOLTIP")
if not InCombatLockdown() then
menu:SetFrameStrata("FULLSCREEN_DIALOG")
menu:SetToplevel(true)
end
end)
end
end
Cell:RegisterCallback("UpdateAppearance", "SpotlightFrame_UpdateAppearance", UpdateAppearance)