local E , L = select ( 2 , ... ) : unpack ( )
local P = E.Party
local IsAddOnLoaded = C_AddOns and C_AddOns.IsAddOnLoaded or IsAddOnLoaded
local L_POINTS = {
[ " LEFT " ] = L [ " LEFT " ] ,
[ " RIGHT " ] = L [ " RIGHT " ] ,
[ " TOPLEFT " ] = L [ " TOPLEFT " ] ,
[ " TOPRIGHT " ] = L [ " TOPRIGHT " ] ,
[ " BOTTOMLEFT " ] = L [ " BOTTOMLEFT " ] ,
[ " BOTTOMRIGHT " ] = L [ " BOTTOMRIGHT " ] ,
}
local isPreset = function ( info )
return E.profile . Party [ info [ 2 ] ] . position.preset ~= " manual "
end
local isManualMode = function ( info )
return E.profile . Party [ info [ 2 ] ] . position.detached
end
local disabledItems = { }
local function GetDisabledItems ( info )
wipe ( disabledItems )
local db = E.profile . Party [ info [ 2 ] ]
local bp = db.priority [ db.position . breakPoint ]
for k in pairs ( E.L_PRIORITY ) do
local prio = db.priority [ k ]
if prio >= bp then
disabledItems [ k ] = true
end
end
return disabledItems
end
local isBySpellPrio = function ( info ) return E.profile . Party [ info [ 2 ] ] . position.sortBy == 1 end
local isBySpellTypePrio = function ( info ) return E.profile . Party [ info [ 2 ] ] . position.sortBy == 2 end
local isSingleLine = function ( info ) local layout = E.profile . Party [ info [ 2 ] ] . position.layout return layout == " vertical " or layout == " horizontal " end
local isSingleOrDoubleLine = function ( info ) local layout = E.profile . Party [ info [ 2 ] ] . position.layout return layout ~= " tripleRow " and layout ~= " tripleColumn " end
local position = {
name = L [ " Position " ] ,
type = " group " ,
order = 20 ,
get = function ( info ) return E.profile . Party [ info [ 2 ] ] . position [ info [ # info ] ] end ,
set = function ( info , value )
local key = info [ 2 ]
local option = info [ # info ]
local db = E.profile . Party [ key ] . position
db [ option ] = value
if option == " preset " then
if value == " TOPLEFT " then
db.anchor = " TOPRIGHT "
db.attach = value
elseif value == " TOPRIGHT " then
db.anchor = " TOPLEFT "
db.attach = value
else
db.anchor = db.anchorMore or " LEFT "
db.attach = db.attachMore or " LEFT "
end
elseif option == " anchor " or option == " attach " then
if db.preset == " manual " then
db [ option .. " More " ] = value
end
end
P : Refresh ( )
end ,
args = {
addOnsSettings = {
disabled = isManualMode ,
name = L [ " Anchor " ] ,
type = " group " ,
inline = true ,
order = 1 ,
args = {
uf = {
name = ADDONS ,
desc = L [ " Select addon to override auto anchoring " ] ,
order = 1 ,
type = " select " ,
values = function ( ) return E.customUF . optionTable end ,
set = function ( info , value )
local key = info [ 2 ]
local db = E.profile . Party [ key ] . position
if P : IsCurrentZone ( key ) then
if value == " blizz " and not db.detached
and not ( IsAddOnLoaded ( " Blizzard_CompactRaidFrames " ) and IsAddOnLoaded ( " Blizzard_CUFProfiles " ) ) then
E.Libs . OmniCDC.StaticPopup_Show ( " OMNICD_RELOADUI " , E.STR . ENABLE_BLIZZARD_CRF )
else
if P.isInTestMode then
P : Test ( )
db.uf = value
P : Test ( key )
else
db.uf = value
P : Refresh ( )
end
end
else
db.uf = value
end
end ,
} ,
}
} ,
positionSettings = {
disabled = isManualMode ,
name = L [ " Position " ] ,
type = " group " ,
inline = true ,
order = 2 ,
args = {
preset = {
name = L [ " Position " ] ,
desc = L [ " Set the spell bar position " ] ,
order = 2 ,
type = " select " ,
values = {
[ " TOPLEFT " ] = L [ " LEFT " ] ,
[ " TOPRIGHT " ] = L [ " RIGHT " ] ,
[ " manual " ] = L [ " More... " ] ,
} ,
} ,
anchor = {
disabled = isPreset ,
name = L [ " Anchor Point " ] ,
desc = format ( " %s \n \n %s " , L [ " Set the anchor point on the spell bar " ] ,
L [ " Having \" RIGHT \" in the anchor point, icons grow left, otherwise right " ] ) ,
order = 3 ,
type = " select " ,
values = L_POINTS ,
} ,
attach = {
disabled = isPreset ,
name = L [ " Attachment Point " ] ,
desc = L [ " Set the anchor attachment point on the party/raid frame " ] ,
order = 4 ,
type = " select " ,
values = L_POINTS ,
} ,
lb1 = {
name = " " , order = 5 , type = " description " ,
} ,
offsetX = {
name = L [ " Offset X " ] ,
desc = E.STR . MAX_RANGE ,
order = 6 ,
type = " range " ,
min = - 999 , max = 999 , softMin = - 100 , softMax = 100 , step = 1 ,
} ,
offsetY = {
name = L [ " Offset Y " ] ,
desc = E.STR . MAX_RANGE ,
order = 7 ,
type = " range " ,
min = - 999 , max = 999 , softMin = - 100 , softMax = 100 , step = 1 ,
} ,
}
} ,
layoutSettings = {
name = L [ " Layout " ] ,
type = " group " ,
inline = true ,
order = 3 ,
args = {
layout = {
name = L [ " Layout " ] ,
desc = L [ " Select the icon layout " ] ,
order = 11 ,
type = " select " ,
values = {
[ " horizontal " ] = L [ " Horizontal " ] ,
[ " vertical " ] = L [ " Vertical " ] ,
[ " doubleRow " ] = L [ " Use Double Row " ] ,
[ " doubleColumn " ] = L [ " Use Double Column " ] ,
[ " tripleRow " ] = L [ " Use Triple Row " ] ,
[ " tripleColumn " ] = L [ " Use Triple Column " ] ,
} ,
sorting = { " horizontal " , " doubleRow " , " tripleRow " , " vertical " , " doubleColumn " , " tripleColumn " } ,
} ,
sortBy = {
name = COMPACT_UNIT_FRAME_PROFILE_SORTBY ,
desc = format ( " %s. \n %s > %s. " , L [ " Spell Priority " ] , L [ " Spell-Type Priority " ] , L [ " Spell Priority " ] ) ,
order = 12 ,
type = " select " ,
values = {
L [ " Spell Priority " ] ,
format ( " %s > %s " , L [ " Spell-Type Priority " ] , L [ " Spell Priority " ] ) ,
} ,
} ,
breakPoint = {
hidden = isBySpellPrio ,
disabled = isSingleLine ,
name = L [ " Breakpoint " ] ,
desc = L [ " Select the highest priority spell type to use as the start of the 2nd row " ] ,
order = 13 ,
type = " select " ,
values = E.L_PRIORITY ,
sorting = function ( info )
return E.SortHashToArray ( E.L_PRIORITY , E.profile . Party [ info [ 2 ] ] . priority )
end ,
} ,
breakPoint2 = {
hidden = isBySpellPrio ,
disabled = isSingleOrDoubleLine ,
name = L [ " Breakpoint " ] .. " 2 " ,
desc = L [ " Select the highest priority spell type to use as the start of the 3rd row " ] ,
order = 14 ,
type = " select " ,
values = E.L_PRIORITY ,
sorting = function ( info )
return E.SortHashToArray ( E.L_PRIORITY , E.profile . Party [ info [ 2 ] ] . priority )
end ,
disabledItem = function ( info )
return GetDisabledItems ( info )
end ,
} ,
breakPoint3 = {
hidden = isBySpellTypePrio ,
disabled = isSingleLine ,
name = L [ " Breakpoint " ] ,
desc = L [ " Select the highest spell priority to use as the start of the 2nd row " ] ,
order = 13 ,
type = " range " , min = 0 , max = 100 , step = 1 ,
} ,
breakPoint4 = {
hidden = isBySpellTypePrio ,
disabled = isSingleOrDoubleLine ,
name = L [ " Breakpoint " ] .. " 2 " ,
desc = L [ " Select the highest spell priority to use as the start of the 3rd row " ] ,
order = 14 ,
type = " range " , min = 0 , max = 100 , step = 1 ,
confirm = function ( info , value ) return value >= E.profile . Party [ info [ 2 ] ] . position.breakPoint3 and L [ " Select a value lower than Breakpoint1 " ] end ,
} ,
lb1 = {
name = " " , order = 15 , type = " description " ,
} ,
columns = {
disabled = function ( info )
local layout = E.profile . Party [ info [ 2 ] ] . position.layout
return layout ~= " vertical " and layout ~= " horizontal "
end ,
name = function ( info )
return E.profile . Party [ info [ 2 ] ] . position.layout == " vertical " and L [ " Row " ] or L [ " Column " ]
end ,
desc = function ( info )
return E.profile . Party [ info [ 2 ] ] . position.layout == " vertical " and L [ " Set the number of icons per column " ] or L [ " Set the number of icons per row " ]
end ,
order = 16 ,
type = " range " ,
min = 1 , max = 100 , softMax = 20 , step = 1 ,
} ,
paddingX = {
name = L [ " Padding X " ] ,
desc = L [ " Set the padding space between icon columns " ] ,
order = 17 ,
type = " range " ,
min = - 5 , max = 100 , softMin = 0 , softMax = 10 , step = 1 ,
} ,
paddingY = {
name = L [ " Padding Y " ] ,
desc = L [ " Set the padding space between icon rows " ] ,
order = 18 ,
type = " range " ,
min = - 5 , max = 100 , softMin = 0 , softMax = 10 , step = 1 ,
} ,
maxNumIcons = {
name = L [ " Max Number of Visible Icons " ] ,
desc = format ( " %s \n \n %s \n \n |cffff2020%s " , L [ " Set the max number of icons that can be displayed per unit " ] , L [ " For double/triple layout, it will limit the number of icons per line " ] , L [ " 0: Disable option " ] ) ,
order = 19 ,
type = " range " ,
min = 0 , max = 100 , softMax = 20 , step = 1 ,
} ,
displayInactive = {
name = L [ " Display Inactive Icons " ] ,
desc = L [ " Display icons not on cooldown " ] ,
order = 21 ,
type = " toggle " ,
} ,
growUpward = {
name = L [ " Grow Rows Upward " ] ,
desc = L [ " Toggle the grow direction of icon rows " ] ,
order = 22 ,
type = " toggle " ,
} ,
}
} ,
manualModeSettings = {
disabled = function ( info )
return info [ 5 ] and not E.profile . Party [ info [ 2 ] ] . position.detached
end ,
name = L [ " Manual Mode " ] ,
order = 4 ,
type = " group " ,
inline = true ,
args = {
detached = {
disabled = false ,
name = ENABLE ,
desc = L [ " Detach from raid frames and set position manually " ] ,
order = 1 ,
type = " toggle " ,
set = function ( info , state )
local key = info [ 2 ]
E.profile . Party [ key ] . position.detached = state
if P : IsCurrentZone ( key ) then
if not state and not E.customUF . active
and not ( IsAddOnLoaded ( " Blizzard_CompactRaidFrames " ) and IsAddOnLoaded ( " Blizzard_CUFProfiles " ) ) then
E.Libs . OmniCDC.StaticPopup_Show ( " OMNICD_RELOADUI " , E.STR . ENABLE_BLIZZARD_CRF )
end
P : Refresh ( )
end
if E.isDF and P.isInTestMode then
local testZone = P.testZone
P : Test ( )
P : Test ( testZone )
end
end ,
} ,
locked = {
name = LOCK_FRAME ,
desc = L [ " Lock frame position " ] ,
order = 2 ,
type = " toggle " ,
} ,
reset = {
name = RESET_POSITION ,
desc = L [ " Reset frame position " ] ,
order = 3 ,
type = " execute " ,
func = function ( info )
local key = info [ 2 ]
for k in pairs ( E.profile . Party [ key ] . manualPos ) do
if type ( k ) == " number " then
E.profile . Party [ key ] . manualPos [ k ] = nil
end
end
P : Refresh ( )
end ,
confirm = E.ConfirmAction ,
} ,
}
} ,
}
}
P : RegisterSubcategory ( " position " , position )