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 )