local _ , Cell = ...
local L = Cell.L
local F = Cell.funcs
local B = Cell.bFuncs
local I = Cell.iFuncs
local P = Cell.pixelPerfectFuncs
local LCG = LibStub ( " LibCustomGlow-1.0 " )
CELL_RECTANGULAR_CUSTOM_INDICATOR_ICONS = false
local indicatorsTab = Cell : CreateFrame ( " CellOptionsFrame_IndicatorsTab " , Cell.frames . optionsFrame , nil , nil , true )
Cell.frames . indicatorsTab = indicatorsTab
indicatorsTab : SetAllPoints ( Cell.frames . optionsFrame )
local selected , currentLayout , currentLayoutTable
local LoadIndicatorList
local listButtons = { }
local ListHighlightFn
-------------------------------------------------
-- preview
-------------------------------------------------
local previewButton , previewButtonBG , previewAlphaSlider , previewScaleSlider , previewShowAllCB
local function CreatePreviewButton ( )
previewButton = CreateFrame ( " Button " , " CellIndicatorsPreviewButton " , indicatorsTab , " CellPreviewButtonTemplate " )
-- previewButton.type = "main" -- layout setup
-- previewButton:SetPoint("TOPLEFT", indicatorsTab, "TOPRIGHT", 10, -55)
previewButton : UnregisterAllEvents ( )
previewButton : SetScript ( " OnEnter " , nil )
previewButton : SetScript ( " OnLeave " , nil )
previewButton : SetScript ( " OnShow " , nil )
previewButton : SetScript ( " OnHide " , nil )
previewButton : SetScript ( " OnUpdate " , nil )
previewButton : Show ( )
previewButton.states . class = Cell.vars . playerClass
previewButton.widgets . healthBar : SetMinMaxValues ( 0 , 1 )
previewButton.widgets . healthBar : SetValue ( 1 )
previewButton.widgets . powerBar : SetMinMaxValues ( 0 , 1 )
previewButton.widgets . powerBar : SetValue ( 1 )
previewButtonBG = Cell : CreateFrame ( " CellIndicatorsPreviewButtonBG " , indicatorsTab )
-- previewButtonBG:SetPoint("TOPLEFT", indicatorsTab, "TOPRIGHT", 5, -1)
-- previewButtonBG:SetPoint("BOTTOMRIGHT", previewButton, 5, -5)
previewButtonBG : SetPoint ( " BOTTOM " , previewButton , 0 , - 5 )
previewButtonBG : SetFrameStrata ( " BACKGROUND " )
Cell : StylizeFrame ( previewButtonBG , { 0.1 , 0.1 , 0.1 , 0.77 } , { 0 , 0 , 0 , 0 } )
previewButtonBG : Show ( )
function previewButton : UpdatePoint ( )
previewButton : ClearAllPoints ( )
previewButtonBG : ClearAllPoints ( )
previewButtonBG : SetPoint ( " TOPLEFT " , indicatorsTab , " TOPRIGHT " , 5 , - 1 )
local x = 10
local y = Round ( - 70 / CellDB [ " indicatorPreview " ] [ " scale " ] )
if ( previewButton.width * CellDB [ " indicatorPreview " ] [ " scale " ] ) <= 105 then
x = Round ( ( 115 - previewButton.width ) / 2 ) + 5
previewButtonBG : SetPoint ( " BOTTOM " , previewButton , 0 , - 5 )
P : Width ( previewButtonBG , 115 )
else
previewButtonBG : SetPoint ( " BOTTOMRIGHT " , previewButton , 5 , - 5 )
end
x = Round ( x / CellDB [ " indicatorPreview " ] [ " scale " ] )
previewButton : SetPoint ( " TOPLEFT " , indicatorsTab , " TOPRIGHT " , x , y )
end
local previewText = previewButtonBG : CreateFontString ( nil , " OVERLAY " , " CELL_FONT_CLASS_TITLE " )
previewText : SetPoint ( " TOP " , 0 , - 3 )
previewText : SetText ( L [ " Preview " ] )
-- preview alpha
-- previewAlphaSlider = Cell:CreateSlider(L["Alpha"], previewButtonBG, 0, 1, 50, 0.1, nil, function(value)
-- CellDB["indicatorPreview"]["alpha"] = value
-- listButtons[selected]:Click()
-- end)
-- previewAlphaSlider:SetPoint("TOPLEFT", 5, -35)
-- previewAlphaSlider.currentEditBox:Hide()
-- previewAlphaSlider.lowText:Hide()
-- previewAlphaSlider.highText:Hide()
-- preview scale
previewScaleSlider = Cell : CreateSlider ( L [ " Scale " ] , previewButtonBG , 1 , 5 , 50 , 1 , nil , function ( value )
CellDB [ " indicatorPreview " ] [ " scale " ] = value
previewButton : SetScale ( value )
previewButton : UpdatePoint ( )
end )
previewScaleSlider : SetPoint ( " TOPLEFT " , 5 , - 35 )
previewScaleSlider.currentEditBox : Hide ( )
previewScaleSlider.lowText : Hide ( )
previewScaleSlider.highText : Hide ( )
-- preview show all active indicators
previewShowAllCB = Cell : CreateCheckButton ( previewButtonBG , L [ " Show All " ] , function ( checked )
CellDB [ " indicatorPreview " ] [ " showAll " ] = checked
-- listButtons[selected]:Click()
ListHighlightFn ( selected )
end )
previewShowAllCB : SetPoint ( " TOPLEFT " , previewScaleSlider , " TOPRIGHT " , 7 , 2 )
Cell : Fire ( " CreatePreview " , previewButton )
end
local function UpdatePreviewButton ( )
P : Size ( previewButton , currentLayoutTable [ " main " ] [ " size " ] [ 1 ] , currentLayoutTable [ " main " ] [ " size " ] [ 2 ] )
B : SetOrientation ( previewButton , currentLayoutTable [ " barOrientation " ] [ 1 ] , currentLayoutTable [ " barOrientation " ] [ 2 ] )
B : SetPowerSize ( previewButton , currentLayoutTable [ " main " ] [ " powerSize " ] )
previewButton : UpdatePoint ( )
previewButton.widgets . healthBar : SetStatusBarTexture ( Cell.vars . texture )
previewButton.widgets . healthBar : GetStatusBarTexture ( ) : SetDrawLayer ( " ARTWORK " , - 7 ) --! VERY IMPORTANT
previewButton.widgets . powerBar : SetStatusBarTexture ( Cell.vars . texture )
previewButton.widgets . powerBar : GetStatusBarTexture ( ) : SetDrawLayer ( " ARTWORK " , - 7 ) --! VERY IMPORTANT
-- health color
local r , g , b = F : GetHealthBarColor ( 1 , false , F : GetClassColor ( Cell.vars . playerClass ) )
previewButton.widgets . healthBar : SetStatusBarColor ( r , g , b , CellDB [ " appearance " ] [ " barAlpha " ] )
-- power color
r , g , b = F : GetPowerBarColor ( " player " , Cell.vars . playerClass )
previewButton.widgets . powerBar : SetStatusBarColor ( r , g , b )
-- alpha
previewButton : SetBackdropColor ( 0 , 0 , 0 , CellDB [ " appearance " ] [ " bgAlpha " ] )
Cell : Fire ( " UpdatePreview " , previewButton )
end
-- indicator preview onupdate
local function SetOnUpdate ( indicator , type , icon , stack , extra )
indicator.preview = indicator.preview or CreateFrame ( " Frame " , nil , indicator )
indicator.preview : SetScript ( " OnUpdate " , function ( self , elapsed )
self.elapsedTime = ( self.elapsedTime or 0 ) + elapsed
if self.elapsedTime >= 13 then
self.elapsedTime = 0
indicator : SetCooldown ( GetTime ( ) , 13 , type , icon , stack , false , extra )
end
end )
indicator : SetScript ( " OnShow " , function ( )
indicator.preview . elapsedTime = 0
indicator : SetCooldown ( GetTime ( ) , 13 , type , icon , stack , false , extra )
end )
end
-- init preview button indicator animation
local function InitIndicator ( indicatorName )
local indicator = previewButton.indicators [ indicatorName ]
if indicator.init then return end
if indicatorName == " nameText " then
previewButton.states . name = UnitName ( " player " )
previewButton.states . isPlayer = true
indicator.isPreview = true
indicator : UpdateName ( )
indicator : UpdateVehicleName ( )
-- texture type cannot glow by LCG
indicator.preview = indicator.preview or CreateFrame ( " Frame " , nil , previewButton )
indicator.preview : SetAllPoints ( indicator )
elseif indicatorName == " statusText " then
local count = 2
local maxCount = Cell.isRetail and 9 or 6
local ticker
indicator : SetScript ( " OnShow " , function ( )
if indicator.showTimer then
indicator.timer : Show ( )
else
indicator.timer : Hide ( )
end
indicator : SetStatus ( " AFK " )
indicator.timer : SetText ( " 13m " )
ticker = C_Timer.NewTicker ( 1 , function ( )
if count == 1 then
indicator : SetStatus ( " AFK " )
indicator.timer : SetText ( " 13m " )
elseif count == 2 then
indicator : SetStatus ( " OFFLINE " )
indicator.timer : SetText ( " 13m " )
elseif count == 3 then
indicator : SetStatus ( " DEAD " )
indicator.timer : SetText ( )
elseif count == 4 then
indicator : SetStatus ( " GHOST " )
indicator.timer : SetText ( )
elseif count == 5 then
indicator : SetStatus ( " FEIGN " )
indicator.timer : SetText ( )
elseif count == 6 then
indicator : SetStatus ( " DRINKING " )
indicator.timer : SetText ( )
elseif count == 7 then
indicator : SetStatus ( " PENDING " )
indicator.timer : SetText ( )
elseif count == 8 then
indicator : SetStatus ( " ACCEPTED " )
indicator.timer : SetText ( )
elseif count == 9 then
indicator : SetStatus ( " DECLINED " )
indicator.timer : SetText ( )
end
if count < maxCount then
count = count + 1
else
count = 1
end
end )
end )
indicator : SetScript ( " OnHide " , function ( )
if ticker then
ticker : Cancel ( )
ticker = nil
count = 2
end
end )
elseif indicatorName == " statusIcon " then
indicator : SetTexture ( " Interface \\ RaidFrame \\ Raid-Icon-Rez " )
elseif indicatorName == " roleIcon " then
-- texture type cannot glow by LCG
indicator.preview = indicator.preview or CreateFrame ( " Frame " , nil , previewButton )
indicator.preview : SetAllPoints ( indicator )
indicator.roles = { " TANK " , " HEALER " , " DAMAGER " }
indicator.role = 1
indicator.elapsed = 0
indicator.preview : SetScript ( " OnUpdate " , function ( self , elapsed )
indicator.elapsed = indicator.elapsed + elapsed
if indicator.elapsed >= 1.5 then
indicator.elapsed = 0
indicator.role = ( indicator.role + 1 > 3 ) and 1 or indicator.role + 1
indicator : SetRole ( indicator.roles [ indicator.role ] )
end
end )
elseif indicatorName == " partyAssignmentIcon " then
-- texture type cannot glow by LCG
indicator.preview = indicator.preview or CreateFrame ( " Frame " , nil , previewButton )
indicator.preview : SetAllPoints ( indicator )
indicator.roles = { " Interface \\ GroupFrame \\ UI-Group-MainTankIcon " , " Interface \\ GroupFrame \\ UI-Group-MainAssistIcon " }
indicator.role = 1
indicator.elapsed = 0
indicator.preview : SetScript ( " OnUpdate " , function ( self , elapsed )
indicator.elapsed = indicator.elapsed + elapsed
if indicator.elapsed >= 1.5 then
indicator.elapsed = 0
indicator.role = ( indicator.role + 1 > 2 ) and 1 or indicator.role + 1
indicator : SetTexture ( indicator.roles [ indicator.role ] )
end
end )
elseif indicatorName == " leaderIcon " then
indicator : SetTexture ( " Interface \\ GroupFrame \\ UI-Group-LeaderIcon " )
-- texture type cannot glow by LCG
indicator.preview = indicator.preview or CreateFrame ( " Frame " , nil , previewButton )
indicator.preview : SetAllPoints ( indicator )
elseif indicatorName == " readyCheckIcon " then
local status = { " ready " , " notready " , " waiting " }
indicator : SetScript ( " OnShow " , function ( )
indicator.elapsed = 0
indicator.current = 1
indicator : SetStatus ( " ready " )
end )
indicator : SetScript ( " OnUpdate " , function ( self , elapsed )
indicator.elapsed = ( indicator.elapsed or 0 ) + elapsed
if indicator.elapsed >= 2 then
indicator.elapsed = 0
indicator.current = indicator.current + 1
if indicator.current > 3 then indicator.current = 1 end
indicator : SetStatus ( status [ indicator.current ] )
end
end )
-- elseif indicatorName == "aggroBlink" then
-- indicator.isAggroBlink = true
elseif indicatorName == " aggroBorder " then
indicator.isAggroBorder = true
elseif indicatorName == " playerRaidIcon " then
SetRaidTargetIconTexture ( indicator.tex , 6 )
elseif indicatorName == " targetRaidIcon " then
SetRaidTargetIconTexture ( indicator.tex , 8 )
elseif indicatorName == " aggroBar " then
indicator : SetStatusBarColor ( 1 , 0 , 0 )
indicator.value = 0
indicator : SetScript ( " OnUpdate " , function ( self , elapsed )
self.value = self.value + 1
if self.value >= 100 then
self.value = 0
end
self : SetValue ( self.value )
end )
elseif indicatorName == " shieldBar " then
indicator : SetValue ( 0.5 )
elseif indicatorName == " powerWordShield " then
indicator : SetScript ( " OnShow " , function ( )
indicator.elapsed = 0
indicator : UpdateShield ( 200 , 200 )
indicator : SetShieldCooldown ( GetTime ( ) , 30 )
indicator : SetWeakenedSoulCooldown ( GetTime ( ) , 15 )
end )
indicator : SetScript ( " OnUpdate " , function ( self , elapsed )
indicator.elapsed = ( indicator.elapsed or 0 ) + elapsed
indicator : UpdateShield ( 200 - indicator.elapsed * 10 )
if indicator.elapsed >= 20 then
indicator.elapsed = 0
indicator : SetShieldCooldown ( GetTime ( ) , 30 )
indicator : SetWeakenedSoulCooldown ( GetTime ( ) , 15 )
end
end )
elseif indicatorName == " tankActiveMitigation " then
indicator.value = 0
indicator : SetMinMaxValues ( 0 , 100 )
indicator : SetValue ( 0 )
indicator : SetScript ( " OnUpdate " , function ( self , elapsed )
self.value = self.value + 1
if self.value >= 100 then
self.value = 0
end
self : SetValue ( self.value )
end )
function indicator : SetColor ( cType , cTable )
if cType == " class_color " then
indicator.tex : SetColorTexture ( F : GetClassColor ( Cell.vars . playerClass ) )
else
indicator.tex : SetColorTexture ( cTable [ 1 ] , cTable [ 2 ] , cTable [ 3 ] )
end
end
elseif indicatorName == " debuffs " then
local types = { " " , " Curse " , " Disease " , " Magic " , " Poison " , " " , " Curse " , " Disease " , " Magic " , " Poison " }
local icons = { 132155 , 136139 , 136128 , 240443 , 136182 , 132155 , 136139 , 136128 , 240443 , 136182 }
for i = 1 , 10 do
SetOnUpdate ( indicator [ i ] , types [ i ] , icons [ i ] , i )
end
elseif indicatorName == " dispels " then
indicator.isDispels = true
local debuffTypes = {
{ [ " Curse " ] = true } ,
{ [ " Disease " ] = true } ,
{ [ " Magic " ] = true } ,
{ [ " Poison " ] = true } ,
{ [ " Bleed " ] = true } ,
}
-- override
indicator.SetDispels = function ( self , dispelTypes )
local r , g , b = 0 , 0 , 0
local found
self.highlight : Hide ( )
local i = 1
for dispelType , showHighlight in pairs ( dispelTypes ) do
-- highlight
if not found and self.highlightType ~= " none " and dispelType and showHighlight then
found = true
local r , g , b = I.GetDebuffTypeColor ( dispelType )
if self.highlightType == " entire " then
self.highlight : SetVertexColor ( r , g , b , 0.5 )
elseif self.highlightType == " current " or self.highlightType == " current+ " then
self.highlight : SetVertexColor ( r , g , b , 1 )
elseif self.highlightType == " gradient " or self.highlightType == " gradient-half " then
self.highlight : SetGradient ( " VERTICAL " , CreateColor ( r , g , b , 1 ) , CreateColor ( r , g , b , 0 ) )
end
if indicator.isVisible then self.highlight : Show ( ) end
end
-- icons
if self.showIcons then
self [ i ] : SetDispel ( dispelType )
i = i + 1
end
end
self : UpdateSize ( i )
-- hide unused
for j = i , 5 do
self [ j ] : Hide ( )
end
end
if not indicator._UpdateHighlight then
indicator._UpdateHighlight = indicator.UpdateHighlight
end
indicator.UpdateHighlight = function ( self , highlightType )
indicator : _UpdateHighlight ( highlightType )
-- preview
indicator.elapsed = 1
indicator.current = 1
indicator : SetScript ( " OnUpdate " , function ( self , elapsed )
indicator.elapsed = indicator.elapsed + elapsed
if indicator.elapsed >= 1 then
indicator.elapsed = 0
indicator : SetDispels ( debuffTypes [ indicator.current ] )
indicator.current = indicator.current + 1
if indicator.current == 6 then indicator.current = 1 end
end
end )
end
elseif indicatorName == " raidDebuffs " then
indicator.isRaidDebuffs = true
local types = { " " , " Curse " , " Magic " }
for i = 1 , 3 do
indicator [ i ] : HookScript ( " OnShow " , function ( )
indicator [ i ] : SetCooldown ( GetTime ( ) , 13 , types [ i ] , " Interface \\ Icons \\ INV_Misc_QuestionMark " , 7 )
indicator [ i ] . cooldown : SetScript ( " OnCooldownDone " , function ( )
indicator [ i ] : SetCooldown ( GetTime ( ) , 13 , types [ i ] , " Interface \\ Icons \\ INV_Misc_QuestionMark " , 7 )
end )
end )
indicator [ i ] : HookScript ( " OnHide " , function ( )
indicator [ i ] . cooldown : Hide ( )
indicator [ i ] . cooldown : SetScript ( " OnCooldownDone " , nil )
end )
end
elseif indicatorName == " privateAuras " then
indicator.isPrivateAuras = true
indicator.mask = indicator : CreateMaskTexture ( )
indicator.mask : SetTexture ( " interface/framegeneral/uiframeiconmask " , " CLAMPTOBLACKADDITIVE " , " CLAMPTOBLACKADDITIVE " )
indicator.mask : SetAllPoints ( indicator )
indicator.icon = indicator : CreateTexture ( nil , " ARTWORK " )
indicator.icon : SetAllPoints ( indicator )
indicator.icon : SetTexture ( 237555 )
indicator.icon : AddMaskTexture ( indicator.mask )
indicator.border = indicator : CreateTexture ( nil , " BORDER " )
indicator.border : SetPoint ( " TOPLEFT " , indicator.icon , - 1 , 0 )
indicator.border : SetPoint ( " BOTTOMRIGHT " , indicator.icon , 1 , 0 )
indicator.border : SetTexture ( [[Interface\Buttons\UI-Debuff-Overlays]] )
indicator.border : SetTexCoord ( 0.296875 , 0.5703125 , 0 , 0.515625 )
indicator.border : SetVertexColor ( 0.8 , 0 , 0 )
indicator.cooldown = CreateFrame ( " Cooldown " , nil , indicator , " CooldownFrameTemplate " )
indicator.cooldown : SetAllPoints ( indicator )
indicator.cooldown : SetReverse ( true )
indicator.cooldown : SetDrawEdge ( false )
indicator.cooldown : SetDrawBling ( false )
local timer
indicator : HookScript ( " OnShow " , function ( )
if timer then timer : Cancel ( ) end
indicator.cooldown : SetCooldown ( GetTime ( ) , 15 )
timer = C_Timer.NewTicker ( 15 , function ( )
indicator.cooldown : SetCooldown ( GetTime ( ) , 15 )
end )
end )
indicator : HookScript ( " OnHide " , function ( )
if timer then timer : Cancel ( ) end
end )
elseif indicatorName == " targetedSpells " then
indicator.isTargetedSpells = true
for _ , f in ipairs ( indicator ) do
f : HookScript ( " OnShow " , function ( )
f : SetCooldown ( GetTime ( ) , 3 , " Interface \\ Icons \\ ability_warlock_chaosbolt " , 7 )
f.cooldown : SetScript ( " OnCooldownDone " , function ( )
f : SetCooldown ( GetTime ( ) , 3 , " Interface \\ Icons \\ ability_warlock_chaosbolt " , 7 )
end )
end )
f : HookScript ( " OnHide " , function ( )
f.cooldown : Hide ( )
f.cooldown : SetScript ( " OnCooldownDone " , nil )
end )
end
elseif indicatorName == " targetCounter " then
indicator : SetCount ( 3 )
elseif indicatorName == " crowdControls " then
indicator.isCrowdControls = true
local spells = {
{ " Magic " , " Interface \\ Icons \\ spell_nature_polymorph " } ,
{ " Magic " , " Interface \\ Icons \\ spell_shadow_psychicscream " } ,
{ " " , " Interface \\ Icons \\ spell_nature_earthbind " } ,
}
for i = 1 , 3 do
indicator [ i ] : HookScript ( " OnShow " , function ( )
indicator [ i ] : SetCooldown ( GetTime ( ) , 13 , spells [ i ] [ 1 ] , spells [ i ] [ 2 ] , 7 )
indicator [ i ] . cooldown : SetScript ( " OnCooldownDone " , function ( )
indicator [ i ] : SetCooldown ( GetTime ( ) , 13 , spells [ i ] [ 1 ] , spells [ i ] [ 2 ] , 7 )
end )
end )
indicator [ i ] : HookScript ( " OnHide " , function ( )
indicator [ i ] . cooldown : Hide ( )
indicator [ i ] . cooldown : SetScript ( " OnCooldownDone " , nil )
end )
end
elseif indicatorName == " externalCooldowns " then
local icons = { 135936 , 135964 , 135966 , 237510 , 237542 }
for i = 1 , 5 do
SetOnUpdate ( indicator [ i ] , nil , icons [ i ] , 0 )
end
elseif indicatorName == " defensiveCooldowns " then
local icons = { 135919 , 136120 , 135841 , 132362 , 132199 }
for i = 1 , 5 do
SetOnUpdate ( indicator [ i ] , nil , icons [ i ] , 0 )
end
elseif indicatorName == " allCooldowns " then
local icons = { 135936 , 136120 , 135966 , 132362 , 237542 }
for i = 1 , 5 do
SetOnUpdate ( indicator [ i ] , nil , icons [ i ] , 0 )
end
elseif indicatorName == " missingBuffs " then
local buffs = I.GetDefaultMissingBuffs ( )
for i = 1 , 5 do
indicator [ i ] : SetCooldown ( 0 , 0 , nil , buffs [ i ] [ " icon " ] , 0 )
end
elseif string.find ( indicatorName , " indicator " ) then
if indicator.indicatorType == " icons " then
for i = 1 , 10 do
SetOnUpdate ( indicator [ i ] , nil , 134400 , i )
end
elseif indicator.indicatorType == " blocks " then
local blocks_color = { 1 , 0.26667 , 0.4 }
for i = 1 , 10 do
SetOnUpdate ( indicator [ i ] , nil , 134400 , i , blocks_color )
end
elseif indicator.indicatorType == " text " then
indicator.isCustomText = true -- mark for custom glow
SetOnUpdate ( indicator , nil , 134400 , 5 )
--! overwrite
indicator : SetScript ( " OnShow " , function ( )
indicator : SetCooldown ( GetTime ( ) , 13 , nil , 134400 , 5 )
indicator.preview . elapsedTime = 0
C_Timer.After ( 0.2 , function ( )
indicator : SetWidth ( indicator.text : GetStringWidth ( ) )
end )
end )
elseif indicator.indicatorType == " color " then
-- texture type cannot glow by LCG
indicator.preview = indicator.preview or CreateFrame ( " Frame " , nil , previewButton )
indicator.preview : SetAllPoints ( indicator )
SetOnUpdate ( indicator )
elseif indicator.indicatorType == " texture " then
function indicator : SetFadeOut ( fadeOut )
indicator.fadeOut = fadeOut
indicator.preview . elapsedTime = 13 -- update now!
end
SetOnUpdate ( indicator , nil , 134400 , 0 )
elseif indicator.indicatorType == " glow " then
function indicator : SetFadeOut ( fadeOut )
indicator.fadeOut = fadeOut
indicator.preview . elapsedTime = 13 -- update now!
end
hooksecurefunc ( indicator , " UpdateGlowOptions " , function ( )
indicator.preview . elapsedTime = 13 -- update now!
end )
SetOnUpdate ( indicator , nil , 134400 , 0 )
elseif indicator.indicatorType == " border " then
function indicator : SetFadeOut ( fadeOut )
indicator.fadeOut = fadeOut
indicator.preview . elapsedTime = 13 -- update now!
end
local color = { 1 , 0.26667 , 0.4 }
SetOnUpdate ( indicator , nil , 134400 , 0 , color )
else
SetOnUpdate ( indicator , nil , 134400 , 5 )
end
end
indicator.init = true
end
local function UpdateIndicators ( layout , indicatorName , setting , value , value2 )
if not indicatorsTab : IsShown ( ) then return end
if not indicatorName then -- init
if not layout then --! call from UpdateIndicators() not from Cell:Fire("UpdateIndicators", ...)
if not previewButton._indicatorsCreated then
previewButton._indicatorsCreated = true
I.CreateDefensiveCooldowns ( previewButton )
I.CreateExternalCooldowns ( previewButton )
I.CreateAllCooldowns ( previewButton )
I.CreateDebuffs ( previewButton )
end
I.RemoveAllCustomIndicators ( previewButton )
for i , t in pairs ( currentLayoutTable [ " indicators " ] ) do
local indicator = previewButton.indicators [ t [ " indicatorName " ] ] or I.CreateIndicator ( previewButton , t , true )
indicator.configs = t
InitIndicator ( t [ " indicatorName " ] )
-- update position
if t [ " position " ] then
if t [ " indicatorName " ] == " statusText " then
indicator : SetPosition ( t [ " position " ] [ 1 ] , t [ " position " ] [ 2 ] , t [ " position " ] [ 3 ] )
else
P : ClearPoints ( indicator )
P : Point ( indicator , t [ " position " ] [ 1 ] , previewButton , t [ " position " ] [ 2 ] , t [ " position " ] [ 3 ] , t [ " position " ] [ 4 ] )
end
end
-- update anchor
if t [ " anchor " ] then
indicator : SetAnchor ( t [ " anchor " ] )
end
-- update frameLevel
if t [ " frameLevel " ] then
indicator : SetFrameLevel ( indicator : GetParent ( ) : GetFrameLevel ( ) + t [ " frameLevel " ] )
end
-- update size
if t [ " size " ] then
-- NOTE: debuffs: ["size"] = {{normalSize}, {bigSize}}
if t [ " indicatorName " ] == " debuffs " then
indicator : SetSize ( t [ " size " ] [ 1 ] , t [ " size " ] [ 2 ] )
else
P : Size ( indicator , t [ " size " ] [ 1 ] , t [ " size " ] [ 2 ] )
end
end
-- update thickness
if t [ " thickness " ] then
indicator : SetThickness ( t [ " thickness " ] )
if t [ " indicatorName " ] == " healthThresholds " then
indicator : UpdateThresholdsPreview ( )
end
end
-- update textWidth
if t [ " textWidth " ] then
indicator : UpdateTextWidth ( t [ " textWidth " ] )
end
-- update border
if t [ " border " ] then
indicator : SetBorder ( t [ " border " ] )
end
-- update height
if t [ " height " ] then
P : Height ( indicator , t [ " height " ] )
end
-- update alpha
if t [ " alpha " ] then
indicator : SetAlpha ( t [ " alpha " ] )
-- indicator.alpha = t["alpha"]
end
-- update num
if t [ " num " ] then
for i , frame in ipairs ( indicator ) do
if i <= t [ " num " ] then
frame : Show ( )
else
frame : Hide ( )
end
end
if indicator.UpdateSize then indicator : UpdateSize ( t [ " num " ] ) end
end
-- update format
if t [ " format " ] then
indicator : SetFormat ( t [ " format " ] )
if t [ " indicatorName " ] == " healthText " then
indicator : SetValue ( 21377 , 65535 , 16384 )
elseif t [ " indicatorName " ] == " powerText " then
indicator : SetValue ( 25000 , 50000 )
end
end
-- update numPerLine
if t [ " numPerLine " ] then
indicator : SetNumPerLine ( t [ " numPerLine " ] )
end
-- update spacing
if t [ " spacing " ] then
indicator : SetSpacing ( t [ " spacing " ] )
end
-- update orientation
if t [ " orientation " ] then
indicator : SetOrientation ( t [ " orientation " ] )
end
-- update font
if t [ " font " ] then
indicator : SetFont ( unpack ( t [ " font " ] ) )
end
-- update color
if t [ " color " ] then
if t [ " indicatorName " ] == " nameText " or t [ " indicatorName " ] == " healthText " or t [ " indicatorName " ] == " powerText " then
indicator : UpdatePreviewColor ( t [ " color " ] )
else
indicator : SetColor ( unpack ( t [ " color " ] ) )
end
end
-- update colors
if t [ " colors " ] then
indicator : SetColors ( t [ " colors " ] )
end
-- update groupNumber
if type ( t [ " showGroupNumber " ] ) == " boolean " then
indicator : ShowGroupNumber ( t [ " showGroupNumber " ] )
end
-- update vehicleNamePosition
if t [ " vehicleNamePosition " ] then
indicator : UpdateVehicleNamePosition ( t [ " vehicleNamePosition " ] )
end
-- update timer
if type ( t [ " showTimer " ] ) == " boolean " then
indicator : SetShowTimer ( t [ " showTimer " ] )
end
-- update background
if type ( t [ " showBackground " ] ) == " boolean " then
indicator : ShowBackground ( t [ " showBackground " ] )
end
-- update role texture
if t [ " roleTexture " ] then
indicator : SetRoleTexture ( t [ " roleTexture " ] )
indicator : SetRole ( indicator.roles [ indicator.role ] )
end
-- update texture
if t [ " texture " ] then
indicator : SetTexture ( t [ " texture " ] )
end
-- update duration
if type ( t [ " showDuration " ] ) == " boolean " or type ( t [ " showDuration " ] ) == " number " then
indicator : ShowDuration ( t [ " showDuration " ] )
end
-- update animation
if type ( t [ " showAnimation " ] ) == " boolean " then
indicator : ShowAnimation ( t [ " showAnimation " ] )
end
-- update stack
if type ( t [ " showStack " ] ) == " boolean " then
indicator : ShowStack ( t [ " showStack " ] )
end
-- update duration
if t [ " duration " ] then
indicator : SetDuration ( t [ " duration " ] )
end
-- speed
if t [ " speed " ] then
indicator : SetSpeed ( t [ " speed " ] )
end
-- update circled nums
if type ( t [ " circledStackNums " ] ) == " boolean " then
indicator : SetCircledStackNums ( t [ " circledStackNums " ] )
end
-- update dispel highlight
if t [ " highlightType " ] then
indicator : UpdateHighlight ( t [ " highlightType " ] )
end
-- update dispel icons
if type ( t [ " showDispelTypeIcons " ] ) == " boolean " then
indicator : ShowIcons ( t [ " showDispelTypeIcons " ] )
indicator.init = false
InitIndicator ( t [ " indicatorName " ] )
end
-- privateAuraOptions
if t [ " privateAuraOptions " ] then
indicator.cooldown : SetDrawSwipe ( t [ " privateAuraOptions " ] [ 1 ] )
indicator.cooldown : SetHideCountdownNumbers ( not ( t [ " privateAuraOptions " ] [ 1 ] and t [ " privateAuraOptions " ] [ 2 ] ) )
end
-- update glow
if t [ " glowOptions " ] then
indicator : UpdateGlowOptions ( t [ " glowOptions " ] )
end
-- update fadeOut
if type ( t [ " fadeOut " ] ) == " boolean " then
indicator : SetFadeOut ( t [ " fadeOut " ] )
end
-- update shape
if t [ " shape " ] then
indicator : SetShape ( t [ " shape " ] )
end
-- update smooth
if type ( t [ " smooth " ] ) == " boolean " then
indicator : EnableSmooth ( t [ " smooth " ] )
end
-- after init
indicator.enabled = t [ " enabled " ]
-- if (CellDB["indicatorPreview"]["showAll"] and t["enabled"]) or i == selected then
-- indicator:Show()
-- if indicator.preview then indicator.preview:Show() end
-- else
-- indicator:Hide()
-- if indicator.preview then indicator.preview:Hide() end
-- end
end
-- pixel perfect
B : UpdatePixelPerfect ( previewButton , true )
end
else
local indicator = previewButton.indicators [ indicatorName ]
-- changed in IndicatorsTab
if setting == " enabled " then
indicator.enabled = value
-- if value then
-- indicator.enabled = true
-- indicator:Show()
-- if indicator.preview then indicator.preview:Show() end
-- if indicator.isTargetedSpells then indicator:ShowGlowPreview() end
-- if indicator.isDispels then
-- indicator.elapsed = 1
-- indicator.current = 1
-- indicator.isVisible = true
-- end
-- else
-- indicator.enabled = false
-- indicator:Hide()
-- if indicator.preview then indicator.preview:Hide() end
-- if indicator.isTargetedSpells then indicator:HideGlowPreview() end
-- end
elseif setting == " position " then
if indicatorName == " statusText " then
indicator : SetPosition ( value [ 1 ] , value [ 2 ] , value [ 3 ] )
else
P : ClearPoints ( indicator )
P : Point ( indicator , value [ 1 ] , previewButton , value [ 2 ] , value [ 3 ] , value [ 4 ] )
end
-- update arrangement
if indicator.indicatorType == " icons " then
indicator : SetOrientation ( indicator.orientation )
end
elseif setting == " anchor " then
indicator : SetAnchor ( value )
elseif setting == " frameLevel " then
indicator : SetFrameLevel ( indicator : GetParent ( ) : GetFrameLevel ( ) + value )
elseif setting == " size " then
if indicatorName == " debuffs " then
indicator : SetSize ( value [ 1 ] , value [ 2 ] )
else
P : Size ( indicator , value [ 1 ] , value [ 2 ] )
end
ListHighlightFn ( selected ) -- NOTE: update glow
elseif setting == " size-border " then
P : Size ( indicator , value [ 1 ] , value [ 2 ] )
indicator : SetBorder ( value [ 3 ] )
elseif setting == " thickness " then
indicator : SetThickness ( value )
if indicatorName == " healthThresholds " then
indicator : UpdateThresholdsPreview ( )
end
elseif setting == " height " then
P : Height ( indicator , value )
elseif setting == " textWidth " then
indicator : UpdateTextWidth ( value )
elseif setting == " alpha " then
indicator : SetAlpha ( value )
-- indicator.alpha = value
elseif setting == " num " then
for i , frame in ipairs ( indicator ) do
if i <= value then
frame : Show ( )
else
frame : Hide ( )
end
if indicator.UpdateSize then indicator : UpdateSize ( value ) end
end
elseif setting == " numPerLine " then
indicator : SetNumPerLine ( value )
elseif setting == " format " then
indicator : SetFormat ( value )
if indicatorName == " healthText " then
indicator : SetValue ( 21377 , 65535 , 16384 )
elseif indicatorName == " powerText " then
indicator : SetValue ( 25000 , 50000 )
end
elseif setting == " spacing " then
indicator : SetSpacing ( value )
elseif setting == " orientation " then
indicator : SetOrientation ( value )
elseif setting == " font " then
indicator : SetFont ( unpack ( value ) )
if indicator.isCustomText and indicator.enabled then
indicator : Hide ( )
indicator : Show ( )
end
elseif setting == " color " then
if indicatorName == " nameText " or indicatorName == " healthText " or indicatorName == " powerText " then
indicator : UpdatePreviewColor ( value )
else
indicator : SetColor ( unpack ( value ) )
end
elseif setting == " colors " then
indicator : SetColors ( value )
indicator.preview . elapsedTime = 13 -- update now!
elseif setting == " vehicleNamePosition " then
indicator : UpdateVehicleNamePosition ( value )
elseif setting == " statusColors " then
if indicator.enabled then
indicator : Hide ( )
indicator : Show ( )
end
elseif setting == " roleTexture " then
indicator : SetRoleTexture ( value )
indicator : SetRole ( indicator.roles [ indicator.role ] )
elseif setting == " texture " then
indicator : SetTexture ( value )
elseif setting == " duration " then
-- indicator:SetDuration(value)
if indicator.enabled then
indicator : Hide ( )
indicator : Show ( )
end
elseif setting == " highlightType " then
indicator : UpdateHighlight ( value )
indicator.init = false
InitIndicator ( indicatorName )
elseif setting == " thresholds " then
indicator : UpdateThresholdsPreview ( )
elseif setting == " showDuration " then
indicator : ShowDuration ( value )
if indicator.enabled then
-- update through OnShow
indicator : Hide ( )
indicator : Show ( )
end
elseif setting == " privateAuraOptions " then
indicator.cooldown : SetDrawSwipe ( value [ 1 ] )
indicator.cooldown : SetHideCountdownNumbers ( not ( value [ 1 ] and value [ 2 ] ) )
elseif setting == " speed " then
indicator : SetSpeed ( value )
elseif setting == " shape " then
indicator : SetShape ( value )
elseif setting == " glowOptions " then
indicator : UpdateGlowOptions ( value )
indicator : SetCooldown ( GetTime ( ) , 13 )
elseif setting == " checkbutton " then
if value == " showGroupNumber " then
indicator : ShowGroupNumber ( value2 )
elseif value == " showTimer " then
indicator : SetShowTimer ( value2 )
indicator : Hide ( )
indicator : Show ( )
elseif value == " showBackground " then
indicator : ShowBackground ( value2 )
elseif value == " showAnimation " then
indicator : ShowAnimation ( value2 )
if indicator.enabled then
-- update through OnShow
indicator : Hide ( )
indicator : Show ( )
end
elseif value == " showStack " then
indicator : ShowStack ( value2 )
elseif value == " circledStackNums " then
indicator : SetCircledStackNums ( value2 )
if indicator.enabled then
-- update through OnShow
indicator : Hide ( )
indicator : Show ( )
end
elseif value == " showDispelTypeIcons " then
indicator : ShowIcons ( value2 )
indicator.init = false
InitIndicator ( indicatorName )
elseif value == " fadeOut " then
indicator : SetFadeOut ( value2 )
-- indicator:SetCooldown(GetTime(), 13)
elseif value == " smooth " then
indicator : EnableSmooth ( value2 )
end
elseif setting == " create " then
indicator = I.CreateIndicator ( previewButton , value , true )
indicator.configs = value
-- update position
if value [ " position " ] then
P : ClearPoints ( indicator )
P : Point ( indicator , value [ " position " ] [ 1 ] , previewButton , value [ " position " ] [ 2 ] , value [ " position " ] [ 3 ] , value [ " position " ] [ 4 ] )
end
-- update anchor
if value [ " anchor " ] then
indicator : SetAnchor ( value [ " anchor " ] )
end
-- update size
if value [ " size " ] then
P : Size ( indicator , value [ " size " ] [ 1 ] , value [ " size " ] [ 2 ] )
end
-- update thickness
if value [ " thickness " ] then
indicator : SetThickness ( value [ " thickness " ] )
end
-- update frameLevel
if value [ " frameLevel " ] then
indicator : SetFrameLevel ( indicator : GetParent ( ) : GetFrameLevel ( ) + value [ " frameLevel " ] )
end
-- update num
if value [ " num " ] then
for i , frame in ipairs ( indicator ) do
if i <= value [ " num " ] then
frame : Show ( )
else
frame : Hide ( )
end
end
if indicator.UpdateSize then indicator : UpdateSize ( value [ " num " ] ) end
end
-- update numPerLine
if value [ " numPerLine " ] then
indicator : SetNumPerLine ( value [ " numPerLine " ] )
end
-- update spacing
if value [ " spacing " ] then
indicator : SetSpacing ( value [ " spacing " ] )
end
-- update orientation
if value [ " orientation " ] then
indicator : SetOrientation ( value [ " orientation " ] )
end
-- update font
if value [ " font " ] then
indicator : SetFont ( unpack ( value [ " font " ] ) )
end
-- update color
if value [ " color " ] then
indicator : SetColor ( unpack ( value [ " color " ] ) )
end
-- update colors
if value [ " colors " ] then
indicator : SetColors ( value [ " colors " ] )
end
-- update colors
if value [ " texture " ] then
indicator : SetTexture ( value [ " texture " ] )
end
-- update duration
if type ( value [ " showDuration " ] ) ~= " nil " then
indicator : ShowDuration ( value [ " showDuration " ] )
end
-- update animation
if type ( value [ " showAnimation " ] ) == " boolean " then
indicator : ShowAnimation ( value [ " showAnimation " ] )
end
-- update stack
if type ( value [ " showStack " ] ) ~= " nil " then
indicator : ShowStack ( value [ " showStack " ] )
end
-- update duration
if value [ " duration " ] then
indicator : SetDuration ( value [ " duration " ] )
end
-- update circled nums
if type ( value [ " circledStackNums " ] ) == " boolean " then
indicator : SetCircledStackNums ( value [ " circledStackNums " ] )
end
-- update fadeOut
if type ( value [ " fadeOut " ] ) == " boolean " then
indicator : SetFadeOut ( value [ " fadeOut " ] )
end
-- update glow
if value [ " glowOptions " ] then
indicator : UpdateGlowOptions ( value [ " glowOptions " ] )
end
InitIndicator ( indicatorName )
indicator : Show ( )
indicator.enabled = true
elseif setting == " remove " then
if indicator.preview then
indicator.preview : SetParent ( nil )
indicator.preview : Hide ( )
indicator.preview = nil
end
I.RemoveIndicator ( previewButton , indicatorName , value )
end
end
end
Cell : RegisterCallback ( " UpdateIndicators " , " PreviewButton_UpdateIndicators " , UpdateIndicators )
-------------------------------------------------
-- layout
-------------------------------------------------
local layoutDropdown , LoadLayoutDropdown , LoadSyncDropdown
local function CreateLayoutPane ( )
local layoutPane = Cell : CreateTitledPane ( indicatorsTab , L [ " Layout " ] , 136 , 50 )
layoutPane : SetPoint ( " TOPLEFT " , indicatorsTab , " TOPLEFT " , 5 , - 5 )
layoutDropdown = Cell : CreateDropdown ( layoutPane , 136 )
layoutDropdown : SetPoint ( " TOPLEFT " , 0 , - 25 )
end
LoadLayoutDropdown = function ( )
local indices = { }
for name , _ in pairs ( CellDB [ " layouts " ] ) do
if name ~= " default " then
tinsert ( indices , name )
end
end
table.sort ( indices )
tinsert ( indices , 1 , " default " ) -- make default first
local items = { }
for _ , value in pairs ( indices ) do
table.insert ( items , {
[ " text " ] = value == " default " and _G.DEFAULT or value ,
[ " onClick " ] = function ( )
currentLayout = value
currentLayoutTable = CellDB [ " layouts " ] [ value ]
LoadSyncDropdown ( )
UpdateIndicators ( )
UpdatePreviewButton ( )
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
end ,
} )
end
layoutDropdown : SetItems ( items )
end
-------------------------------------------------
-- indicator sync
-------------------------------------------------
local syncDropdown , syncStatus
local masters , slaves = { } , { }
local function ColorName ( layout )
if layout == currentLayout then
if layout == " default " then
return " |cffff0066 " .. _G.DEFAULT .. " |r "
else
return " |cffff0066 " .. layout .. " |r "
end
end
if layout == " default " then
return _G.DEFAULT
end
return layout
end
local function UpdateSyncedLayouts ( )
--! CLEAR SYNC
for slave , master in pairs ( slaves ) do
if CellDB [ " layouts " ] [ slave ] then -- not deleted
CellDB [ " layouts " ] [ slave ] [ " indicators " ] = F : Copy ( CellDB [ " layouts " ] [ slave ] [ " indicators " ] )
end
end
wipe ( masters )
wipe ( slaves )
for layout , t in pairs ( CellDB [ " layouts " ] ) do
local master = t [ " syncWith " ]
if master then
if CellDB [ " layouts " ] [ master ] then -- master exists
if not masters [ master ] then masters [ master ] = { } end
masters [ master ] [ layout ] = true
slaves [ layout ] = master
else -- master missing
t [ " syncWith " ] = nil
end
end
end
--! SYNC NOW
for slave , master in pairs ( slaves ) do
CellDB [ " layouts " ] [ slave ] [ " indicators " ] = CellDB [ " layouts " ] [ master ] [ " indicators " ]
end
-- update syncStatus
if F : Getn ( masters ) == 0 then
syncStatus : Hide ( )
else
local text = " "
-- check synced
for master , t in pairs ( masters ) do
text = text .. ColorName ( master ) .. " \n "
for slave in pairs ( t ) do
text = text .. " - " .. ColorName ( slave ) .. " \n "
end
end
-- text = text.."\n"
-- check non-synced
for layout in pairs ( CellDB [ " layouts " ] ) do
if not masters [ layout ] and not slaves [ layout ] then
text = text .. ColorName ( layout ) .. " \n "
end
end
syncStatus : SetText ( text )
syncStatus : Show ( )
end
end
function F : GetNotifiedLayoutName ( layout )
-- if currentlyEnabled is a slave
local masterOfCurrentlyEnabled = slaves [ Cell.vars . currentLayout ]
if masterOfCurrentlyEnabled then
-- if layout is currentlyEnabled's master or they share a same master
if layout == masterOfCurrentlyEnabled or slaves [ layout ] == masterOfCurrentlyEnabled then
return Cell.vars . currentLayout
end
end
-- if currentlyEnabled is a master
local slaves = masters [ Cell.vars . currentLayout ]
if slaves then
-- if layout is a slave of currentlyEnabled
if slaves [ layout ] then
return Cell.vars . currentLayout
end
end
return layout
end
LoadSyncDropdown = function ( )
UpdateSyncedLayouts ( )
if masters [ currentLayout ] then
-- NOTE: a master layout can not sync with others
syncDropdown : SetItems ( {
{
[ " text " ] = L [ " None " ] ,
[ " value " ] = " none " ,
}
} )
syncDropdown : SetSelectedValue ( " none " )
syncDropdown : SetEnabled ( false )
else
-- check
local indices = { }
for layout , _ in pairs ( CellDB [ " layouts " ] ) do
-- NOTE: not current, not default, not slave
if layout ~= currentLayout and layout ~= " default " and not slaves [ layout ] then
tinsert ( indices , layout )
end
end
table.sort ( indices )
-- NOTE: if current is not default, and default is not a slave
if currentLayout ~= " default " and not slaves [ " default " ] then
tinsert ( indices , 1 , " default " )
end
-- make items
local items = { }
for _ , layout in ipairs ( indices ) do
tinsert ( items , {
[ " text " ] = layout == " default " and _G.DEFAULT or layout ,
[ " value " ] = layout ,
[ " onClick " ] = function ( )
local popup = Cell : CreateConfirmPopup ( indicatorsTab , 200 , L [ " All indicators of %s will be replaced with those in %s " ] : format ( " |cffff0066 " .. ( currentLayout == " default " and _G.DEFAULT or currentLayout ) .. " |r " , " |cffff0066 " .. ( layout == " default " and _G.DEFAULT or layout ) .. " |r " ) , function ( self )
currentLayoutTable [ " syncWith " ] = layout
-- currentLayoutTable = CellDB["layouts"][currentLayout]
UpdateSyncedLayouts ( )
--! notify unitbuttons to update current indicators
Cell : Fire ( " UpdateIndicators " , currentLayout )
--! update indicators preview
UpdateIndicators ( )
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
end , function ( )
syncDropdown : SetSelectedValue ( " none " )
end , true )
popup : SetPoint ( " TOPLEFT " , 117 , - 117 )
end
} )
end
-- add "none"
tinsert ( items , 1 , {
[ " text " ] = L [ " None " ] ,
[ " value " ] = " none " ,
[ " onClick " ] = function ( )
currentLayoutTable [ " syncWith " ] = nil
-- currentLayoutTable = CellDB["layouts"][currentLayout]
UpdateSyncedLayouts ( )
--! notify unitbuttons to update current indicators
Cell : Fire ( " UpdateIndicators " , currentLayout )
--! update indicators preview
UpdateIndicators ( )
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
end
} )
syncDropdown : SetItems ( items )
syncDropdown : SetSelectedValue ( currentLayoutTable [ " syncWith " ] or " none " )
syncDropdown : SetEnabled ( true )
end
end
local function CreateSyncPane ( )
local syncPane = Cell : CreateTitledPane ( indicatorsTab , L [ " Sync With " ] , 136 , 50 )
syncPane : SetPoint ( " TOPLEFT " , 5 , - 60 )
-- tip
syncTip = Cell : CreateButton ( syncPane , nil , " accent-hover " , { 17 , 17 } , nil , nil , nil , nil , nil , L [ " Indicator Sync " ] , L [ " syncTips " ] )
syncTip : SetPoint ( " TOPRIGHT " )
syncTip.tex = syncTip : CreateTexture ( nil , " ARTWORK " )
syncTip.tex : SetAllPoints ( syncTip )
syncTip.tex : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ info2.tga " )
-- sync
syncDropdown = Cell : CreateDropdown ( syncPane , 136 )
syncDropdown : SetPoint ( " TOPLEFT " , 0 , - 25 )
-- sync status
syncStatus = CreateFrame ( " Frame " , " CellIndicatorsSyncStatus " , indicatorsTab , " BackdropTemplate " )
Cell : StylizeFrame ( syncStatus , nil , Cell : GetAccentColorTable ( ) )
syncStatus : SetSize ( 150 , 30 )
syncStatus : SetPoint ( " TOPRIGHT " , syncPane , " TOPLEFT " , - 10 , 3 )
syncStatus.title = syncStatus : CreateFontString ( nil , " OVERLAY " , " CELL_FONT_CLASS_TITLE " )
syncStatus.title : SetText ( L [ " Sync Status " ] )
syncStatus.title : SetPoint ( " BOTTOMLEFT " , syncStatus , " TOPLEFT " , 5 , - 18 )
syncStatus.text = syncStatus : CreateFontString ( nil , " OVERLAY " , " CELL_FONT_WIDGET " )
syncStatus.text : SetPoint ( " TOPLEFT " , syncStatus.title , " BOTTOMLEFT " , 5 , - 5 )
syncStatus.text : SetJustifyH ( " LEFT " )
syncStatus.text : SetSpacing ( 3 )
function syncStatus : SetText ( text )
syncStatus.text : SetText ( text )
syncStatus : SetScript ( " OnUpdate " , function ( )
syncStatus : SetWidth ( math.max ( syncStatus.title : GetStringWidth ( ) , syncStatus.text : GetStringWidth ( ) ) + 10 )
syncStatus : SetHeight ( syncStatus.title : GetStringHeight ( ) + syncStatus.text : GetStringHeight ( ) + 15 )
syncStatus : SetScript ( " OnUpdate " , nil )
end )
end
end
-------------------------------------------------
-- indicator list
-------------------------------------------------
local listFrame , renameBtn , deleteBtn
local typeItems = {
{
[ " text " ] = L [ " Icons " ] ,
[ " value " ] = " icons " ,
} ,
{
[ " text " ] = L [ " Icon " ] ,
[ " value " ] = " icon " ,
} ,
{
[ " text " ] = L [ " Blocks " ] ,
[ " value " ] = " blocks " ,
} ,
{
[ " text " ] = L [ " Block " ] ,
[ " value " ] = " block " ,
} ,
{
[ " text " ] = L [ " Rect " ] ,
[ " value " ] = " rect " ,
} ,
{
[ " text " ] = L [ " Bar " ] ,
[ " value " ] = " bar " ,
} ,
{
[ " text " ] = L [ " Overlay " ] ,
[ " value " ] = " overlay " ,
} ,
{
[ " text " ] = L [ " Color " ] ,
[ " value " ] = " color " ,
} ,
{
[ " text " ] = L [ " Text " ] ,
[ " value " ] = " text " ,
} ,
{
[ " text " ] = L [ " Glow " ] ,
[ " value " ] = " glow " ,
} ,
{
[ " text " ] = L [ " Border " ] ,
[ " value " ] = " border " ,
} ,
{
[ " text " ] = L [ " Texture " ] ,
[ " value " ] = " texture " ,
} ,
}
local auraTypeItems = {
{
[ " text " ] = L [ " Buff " ] ,
[ " value " ] = " buff " ,
} ,
{
[ " text " ] = L [ " Debuff " ] ,
[ " value " ] = " debuff " ,
} ,
}
local function CreateListPane ( )
local listPane = Cell : CreateTitledPane ( indicatorsTab , L [ " Indicators " ] , 136 , 487 )
listPane : SetPoint ( " TOPLEFT " , 5 , - 115 )
listFrame = Cell : CreateFrame ( " IndicatorsTab_ListFrame " , listPane )
listFrame : SetPoint ( " TOPLEFT " , 0 , - 25 )
listFrame : SetPoint ( " BOTTOMRIGHT " , 0 , 43 )
listFrame : Show ( )
Cell : CreateScrollFrame ( listFrame )
listFrame.scrollFrame : SetScrollStep ( 19 )
-- buttons
local createBtn = Cell : CreateButton ( listPane , nil , " green-hover " , { 46 , 20 } , nil , nil , nil , nil , nil , L [ " Create " ] )
createBtn : SetPoint ( " TOPLEFT " , listFrame , " BOTTOMLEFT " , 0 , - 4 )
createBtn : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ create " , { 16 , 16 } , { " CENTER " , 0 , 0 } )
createBtn : SetScript ( " OnClick " , function ( )
local popup = Cell : CreateConfirmPopup ( indicatorsTab , 200 , L [ " Create new indicator " ] , function ( self )
local name = strtrim ( self.editBox : GetText ( ) )
local indicatorName
local indicatorType , indicatorAuraType = self.dropdown1 : GetSelected ( ) , self.dropdown2 : GetSelected ( )
local last = # currentLayoutTable [ " indicators " ]
indicatorName = " indicator " .. ( last - Cell.defaults . builtIns + 1 )
tinsert ( currentLayoutTable [ " indicators " ] , I.GetDefaultCustomIndicatorTable ( name , indicatorName , indicatorType , indicatorAuraType ) )
Cell : Fire ( " UpdateIndicators " , F : GetNotifiedLayoutName ( currentLayout ) , indicatorName , " create " , currentLayoutTable [ " indicators " ] [ last + 1 ] )
LoadIndicatorList ( )
listButtons [ last + 1 ] : Click ( )
-- check scroll
if last + 1 > 15 then
listFrame.scrollFrame : ScrollToBottom ( )
end
end , nil , true , true , 2 )
popup : SetPoint ( " TOPLEFT " , 117 , - 187 )
popup.dropdown1 : SetItems ( typeItems )
popup.dropdown1 : SetSelectedItem ( 1 )
-- popup.dropdown1:SetEnabled(false)
popup.dropdown2 : SetItems ( auraTypeItems )
popup.dropdown2 : SetSelectedItem ( 1 )
end )
Cell : RegisterForCloseDropdown ( createBtn )
renameBtn = Cell : CreateButton ( listPane , nil , " blue-hover " , { 46 , 20 } , nil , nil , nil , nil , nil , L [ " Rename " ] )
renameBtn : SetPoint ( " TOPLEFT " , createBtn , " TOPRIGHT " , P : Scale ( - 1 ) , 0 )
renameBtn : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ rename " , { 16 , 16 } , { " CENTER " , 0 , 0 } )
renameBtn : SetEnabled ( false )
renameBtn : SetScript ( " OnClick " , function ( )
local name = currentLayoutTable [ " indicators " ] [ selected ] [ " name " ]
local popup = Cell : CreateConfirmPopup ( indicatorsTab , 200 , L [ " Rename indicator " ] .. " \n " .. name , function ( self )
local newName = strtrim ( self.editBox : GetText ( ) )
currentLayoutTable [ " indicators " ] [ selected ] [ " name " ] = newName
listButtons [ selected ] : SetText ( newName )
end , nil , true , true )
popup : SetPoint ( " TOPLEFT " , 117 , - 187 )
end )
Cell : RegisterForCloseDropdown ( renameBtn )
deleteBtn = Cell : CreateButton ( listPane , nil , " red-hover " , { 46 , 20 } , nil , nil , nil , nil , nil , L [ " Delete " ] )
deleteBtn : SetPoint ( " TOPLEFT " , renameBtn , " TOPRIGHT " , P : Scale ( - 1 ) , 0 )
deleteBtn : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ trash " , { 16 , 16 } , { " CENTER " , 0 , 0 } )
deleteBtn : SetEnabled ( false )
deleteBtn : SetScript ( " OnClick " , function ( )
local name = currentLayoutTable [ " indicators " ] [ selected ] [ " name " ]
local indicatorName = currentLayoutTable [ " indicators " ] [ selected ] [ " indicatorName " ]
local auraType = currentLayoutTable [ " indicators " ] [ selected ] [ " auraType " ]
local popup = Cell : CreateConfirmPopup ( indicatorsTab , 200 , L [ " Delete indicator " ] .. " ? \n " .. name , function ( self )
Cell : Fire ( " UpdateIndicators " , F : GetNotifiedLayoutName ( currentLayout ) , indicatorName , " remove " , auraType )
tremove ( currentLayoutTable [ " indicators " ] , selected )
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
end , nil , true )
popup : SetPoint ( " TOPLEFT " , 117 , - 187 )
end )
Cell : RegisterForCloseDropdown ( deleteBtn )
local importBtn = Cell : CreateButton ( listPane , nil , " accent-hover " , { 46 , 20 } , nil , nil , nil , nil , nil , L [ " Import " ] , L [ " Custom indicators will not be overwritten, even with same name " ] )
importBtn : SetPoint ( " TOPLEFT " , createBtn , " BOTTOMLEFT " , 0 , P : Scale ( 1 ) )
importBtn : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ import " , { 16 , 16 } , { " TOPLEFT " , 14 , - 2 } )
importBtn : SetScript ( " OnClick " , function ( )
F : ShowIndicatorsImportFrame ( currentLayout )
end )
Cell : RegisterForCloseDropdown ( importBtn )
local exportBtn = Cell : CreateButton ( listPane , nil , " accent-hover " , { 46 , 20 } , nil , nil , nil , nil , nil , L [ " Export " ] )
exportBtn : SetPoint ( " TOPLEFT " , importBtn , " TOPRIGHT " , P : Scale ( - 1 ) , 0 )
exportBtn : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ export " , { 16 , 16 } , { " TOPLEFT " , 14 , - 2 } )
exportBtn : SetScript ( " OnClick " , function ( )
F : ShowIndicatorsExportFrame ( currentLayout )
end )
Cell : RegisterForCloseDropdown ( exportBtn )
local copyBtn = Cell : CreateButton ( listPane , nil , " accent-hover " , { 46 , 20 } , nil , nil , nil , nil , nil , L [ " Copy " ] , L [ " Copy indicators from one layout to another " ] , L [ " Custom indicators will not be overwritten, even with same name " ] )
copyBtn : SetPoint ( " TOPLEFT " , exportBtn , " TOPRIGHT " , P : Scale ( - 1 ) , 0 )
copyBtn : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Icons \\ copy " , { 16 , 16 } , { " TOPLEFT " , 14 , - 2 } )
copyBtn : SetScript ( " OnClick " , function ( )
F : ShowIndicatorsCopyFrame ( )
end )
Cell : RegisterForCloseDropdown ( copyBtn )
end
-------------------------------------------------
-- indicator settings
-------------------------------------------------
local settingsFrame
local function CreateSettingsPane ( )
local settingsPane = Cell : CreateTitledPane ( indicatorsTab , L [ " Indicator Settings " ] , 274 , 597 )
settingsPane : SetPoint ( " TOPLEFT " , 153 , P : Scale ( - 5 ) )
-- settings frame
settingsFrame = Cell : CreateFrame ( " IndicatorsTab_SettingsFrame " , settingsPane , 10 , 10 , true )
settingsFrame : SetPoint ( " TOPLEFT " , 0 , P : Scale ( - 25 ) )
settingsFrame : SetPoint ( " BOTTOMRIGHT " )
settingsFrame : Show ( )
Cell : CreateScrollFrame ( settingsFrame )
settingsFrame.scrollFrame : SetScrollStep ( 50 )
end
local indicatorSettings
local DEBUFFS_TOOLTIP1 = L [ " This will make these icons not click-through-able " ] .. " | " .. L [ " Tooltips need to be enabled in General tab " ]
local DEBUFFS_TOOLTIP2 = L [ " This will make these icons not click-through-able " ]
if Cell.isRetail then
indicatorSettings = {
[ " nameText " ] = { " enabled " , " color-class " , " textWidth " , " checkbutton:showGroupNumber " , " vehicleNamePosition " , " namePosition " , " frameLevel " , " font-noOffset " } ,
[ " statusText " ] = { " enabled " , " checkbutton:showTimer " , " checkbutton2:showBackground " , " statusColors " , " statusPosition " , " frameLevel " , " font-noOffset " } ,
[ " healthText " ] = { " enabled " , " color-class " , " healthFormat " , " checkbutton:hideIfEmptyOrFull " , " position " , " frameLevel " , " font-noOffset " } ,
[ " powerText " ] = { " enabled " , " color-power " , " powerFormat " , " checkbutton:hideIfEmptyOrFull " , " position " , " frameLevel " , " font-noOffset " } ,
[ " statusIcon " ] = {
-- "|A:dungeonskull:18:18|a "..
" |TInterface \\ LFGFrame \\ LFG-Eye:18:18:0:0:512:256:72:120:72:120|t " ..
" |TInterface \\ RaidFrame \\ Raid-Icon-Rez:18:18|t " ..
" |TInterface \\ TargetingFrame \\ UI-PhasingIcon:18:18:0:0:31:31:3:28:3:28|t " ..
" |A:nameplates-icon-flag-horde:18:18|a " ..
" |A:nameplates-icon-flag-alliance:18:18|a " ..
" |A:nameplates-icon-orb-blue:18:18|a " ..
" |A:nameplates-icon-orb-green:18:18|a " ..
" |A:nameplates-icon-orb-orange:18:18|a " ..
" |A:nameplates-icon-orb-purple:18:18|a " , " enabled " , " size-square " , " position " , " frameLevel " } ,
[ " roleIcon " ] = { " enabled " , " checkbutton:hideDamager " , " size-square " , " roleTexture " , " position " , " frameLevel " } ,
[ " leaderIcon " ] = { " enabled " , " checkbutton:hideInCombat " , " size-square " , " position " } ,
[ " readyCheckIcon " ] = { " enabled " , " size-square " , " position " , " frameLevel " } ,
[ " playerRaidIcon " ] = { " enabled " , " size-square " , " alpha " , " position " , " frameLevel " } ,
[ " targetRaidIcon " ] = { " enabled " , " size-square " , " alpha " , " position " , " frameLevel " } ,
[ " aggroBlink " ] = { " enabled " , " size " , " position " , " frameLevel " } ,
[ " aggroBorder " ] = { " enabled " , " thickness " , " frameLevel " } ,
[ " aggroBar " ] = { " enabled " , " size-bar " , " position " , " frameLevel " } ,
[ " shieldBar " ] = { " enabled " , " checkbutton:onlyShowOvershields " , " color-alpha " , " height " , " shieldBarPosition " , " frameLevel " } ,
[ " aoeHealing " ] = { " |cffb7b7b7 " .. L [ " Display a gradient texture when the unit receives a heal from your certain AoE healing spells. " ] , " enabled " , " color " , " height " } ,
[ " externalCooldowns " ] = { L [ " Even if disabled, the settings below affect \" Externals + Defensives \" indicator " ] , " enabled " , " builtInExternals " , " customExternals " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " defensiveCooldowns " ] = { L [ " Even if disabled, the settings below affect \" Externals + Defensives \" indicator " ] , " enabled " , " builtInDefensives " , " customDefensives " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " allCooldowns " ] = { " enabled " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " tankActiveMitigation " ] = { " |cffb7b7b7 " .. I.GetTankActiveMitigationString ( ) , " enabled " , " color-class " , " size-bar " , " position " , " frameLevel " } ,
[ " dispels " ] = { " enabled " , " dispelFilters " , " highlightType " , " dispelBlacklist " , " checkbutton2:showDispelTypeIcons " , " orientation " , " size-square " , " position " , " frameLevel " } ,
[ " debuffs " ] = { " enabled " , " checkbutton:dispellableByMe " , " debuffBlacklist " , " bigDebuffs " , " durationVisibility " , " checkbutton2:showAnimation " , " checkbutton3:showTooltip: " .. DEBUFFS_TOOLTIP1 , " checkbutton4:enableBlacklistShortcut: " .. DEBUFFS_TOOLTIP2 , " size-normal-big " , " num:10 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " raidDebuffs " ] = { " |cffb7b7b7 " .. L [ " You can config debuffs in %s " ] : format ( Cell : GetAccentColorString ( ) .. L [ " Raid Debuffs " ] .. " |r " ) , " enabled " , " checkbutton:onlyShowTopGlow " , " durationVisibility " , " checkbutton2:showTooltip: " .. DEBUFFS_TOOLTIP1 , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " privateAuras " ] = { " |cffb7b7b7 " .. L [ " Due to restrictions of the private aura system, this indicator can only use Blizzard style. " ] , " enabled " , " privateAuraOptions " , " size-square " , " position " , " frameLevel " } ,
[ " targetedSpells " ] = { " enabled " , " checkbutton:showAllSpells: " .. L [ " Glow is only available to the spells in the list below " ] , " targetedSpellsList " , " targetedSpellsGlow " , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font " } ,
[ " targetCounter " ] = { " |cffff2727 " .. L [ " HIGH CPU USAGE " ] .. " !|r |cffb7b7b7 " .. L [ " Check all visible enemy nameplates. " ] , " enabled " , " targetCounterFilters " , " color " , " position " , " frameLevel " , " font-noOffset " } ,
[ " crowdControls " ] = { " enabled " , " builtInCrowdControls " , " customCrowdControls " , " durationVisibility " , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " actions " ] = { " |cffb7b7b7 " .. L [ " Play animation when the unit uses a specific spell/item. The list is global shared, not layout-specific. " ] , " enabled " , " actionsPreview " , " actionsList " } ,
[ " healthThresholds " ] = { " enabled " , " thresholds " , " thickness " } ,
[ " missingBuffs " ] = { I.GetMissingBuffsString ( ) .. " |cffb7b7b7 " .. ( L [ " %s in Utilities must be enabled to make this indicator work. " ] : format ( Cell : GetAccentColorString ( ) .. L [ " Buff Tracker " ] .. " |r " ) ) , " enabled " , " missingBuffsFilters " , " size-square " , " num:5 " , " orientation " , " position " , " frameLevel " } ,
}
elseif Cell.isCata or Cell.isWrath then
indicatorSettings = {
[ " nameText " ] = { " enabled " , " color-class " , " textWidth " , " checkbutton:showGroupNumber " , " vehicleNamePosition " , " namePosition " , " frameLevel " , " font-noOffset " } ,
[ " statusText " ] = { " enabled " , " checkbutton:showTimer " , " checkbutton2:showBackground " , " statusColors " , " statusPosition " , " frameLevel " , " font-noOffset " } ,
[ " healthText " ] = { " enabled " , " color-class " , " healthFormat " , " checkbutton:hideIfEmptyOrFull " , " position " , " frameLevel " , " font-noOffset " } ,
[ " powerText " ] = { " enabled " , " color-power " , " powerFormat " , " checkbutton:hideIfEmptyOrFull " , " position " , " frameLevel " , " font-noOffset " } ,
[ " statusIcon " ] = {
-- "|A:dungeonskull:18:18|a "..
" |TInterface \\ LFGFrame \\ LFG-Eye:18:18:0:0:512:256:72:120:72:120|t " ..
" |TInterface \\ RaidFrame \\ Raid-Icon-Rez:18:18|t " ..
" |TInterface \\ TargetingFrame \\ UI-PhasingIcon:18:18:0:0:31:31:3:28:3:28|t " ..
" |A:horde_icon_and_flag-dynamicIcon:18:18|a " ..
" |A:alliance_icon_and_flag-dynamicIcon:18:18|a " , " enabled " , " size-square " , " position " , " frameLevel " } ,
[ " roleIcon " ] = { " enabled " , " checkbutton:hideDamager " , " size-square " , " roleTexture " , " position " , " frameLevel " } ,
[ " leaderIcon " ] = { " enabled " , " checkbutton:hideInCombat " , " size-square " , " position " } ,
[ " readyCheckIcon " ] = { " enabled " , " size-square " , " position " , " frameLevel " } ,
[ " playerRaidIcon " ] = { " enabled " , " size-square " , " alpha " , " position " , " frameLevel " } ,
[ " targetRaidIcon " ] = { " enabled " , " size-square " , " alpha " , " position " , " frameLevel " } ,
[ " aggroBlink " ] = { " enabled " , " size " , " position " , " frameLevel " } ,
[ " aggroBorder " ] = { " enabled " , " thickness " , " frameLevel " } ,
[ " aggroBar " ] = { " enabled " , " size-bar " , " position " , " frameLevel " } ,
[ " shieldBar " ] = { " enabled " , " checkbutton:onlyShowOvershields " , " color-alpha " , " height " , " shieldBarPosition " , " frameLevel " } ,
[ " powerWordShield " ] = { L [ " To show shield value, |cffff2727Glyph of Power Word: Shield|r is required " ] , " enabled " , " checkbutton:shieldByMe " , " shape " , " size-square " , " position " , " frameLevel " } ,
[ " aoeHealing " ] = { " |cffb7b7b7 " .. L [ " Display a gradient texture when the unit receives a heal from your certain AoE healing spells. " ] , " enabled " , " color " , " height " } ,
[ " externalCooldowns " ] = { L [ " Even if disabled, the settings below affect \" Externals + Defensives \" indicator " ] , " enabled " , " builtInExternals " , " customExternals " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " defensiveCooldowns " ] = { L [ " Even if disabled, the settings below affect \" Externals + Defensives \" indicator " ] , " enabled " , " builtInDefensives " , " customDefensives " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " allCooldowns " ] = { " enabled " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " dispels " ] = { " enabled " , " dispelFilters " , " highlightType " , " dispelBlacklist " , " checkbutton2:showDispelTypeIcons " , " orientation " , " size-square " , " position " , " frameLevel " } ,
[ " debuffs " ] = { " enabled " , " checkbutton:dispellableByMe " , " debuffBlacklist " , " bigDebuffs " , " durationVisibility " , " checkbutton2:showAnimation " , " checkbutton3:showTooltip: " .. DEBUFFS_TOOLTIP1 , " checkbutton4:enableBlacklistShortcut: " .. DEBUFFS_TOOLTIP2 , " size-normal-big " , " num:10 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " raidDebuffs " ] = { " |cffb7b7b7 " .. L [ " You can config debuffs in %s " ] : format ( Cell : GetAccentColorString ( ) .. L [ " Raid Debuffs " ] .. " |r " ) , " enabled " , " checkbutton:onlyShowTopGlow " , " durationVisibility " , " checkbutton2:showTooltip: " .. DEBUFFS_TOOLTIP1 , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " targetedSpells " ] = { " enabled " , " checkbutton:showAllSpells: " .. L [ " Glow is only available to the spells in the list below " ] , " targetedSpellsList " , " targetedSpellsGlow " , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font " } ,
[ " targetCounter " ] = { " |cffff2727 " .. L [ " HIGH CPU USAGE " ] .. " !|r |cffb7b7b7 " .. L [ " Check all visible enemy nameplates. " ] , " enabled " , " targetCounterFilters " , " color " , " position " , " frameLevel " , " font-noOffset " } ,
[ " actions " ] = { " |cffb7b7b7 " .. L [ " Play animation when the unit uses a specific spell/item. The list is global shared, not layout-specific. " ] , " enabled " , " actionsPreview " , " actionsList " } ,
[ " healthThresholds " ] = { " enabled " , " thresholds " , " thickness " } ,
[ " missingBuffs " ] = { " |cffb7b7b7 " .. ( L [ " %s in Utilities must be enabled to make this indicator work. " ] : format ( Cell : GetAccentColorString ( ) .. L [ " Buff Tracker " ] .. " |r " ) ) .. " " .. ( L [ " If you are a paladin or warrior, and the unit has no buffs from you, a %s icon will be displayed. " ] : format ( " |T254882:14:14:0:0:14:14:1:13:1:13|t " ) ) , " enabled " , " missingBuffsFilters " , " size-square " , " num:5 " , " orientation " , " position " , " frameLevel " } ,
}
elseif Cell.isVanilla then
indicatorSettings = {
[ " nameText " ] = { " enabled " , " color-class " , " textWidth " , " checkbutton:showGroupNumber " , " vehicleNamePosition " , " namePosition " , " frameLevel " , " font-noOffset " } ,
[ " statusText " ] = { " enabled " , " checkbutton:showTimer " , " checkbutton2:showBackground " , " statusColors " , " statusPosition " , " frameLevel " , " font-noOffset " } ,
[ " healthText " ] = { " enabled " , " color-class " , " healthFormat " , " checkbutton:hideIfEmptyOrFull " , " position " , " frameLevel " , " font-noOffset " } ,
[ " powerText " ] = { " enabled " , " color-power " , " powerFormat " , " checkbutton:hideIfEmptyOrFull " , " position " , " frameLevel " , " font-noOffset " } ,
[ " statusIcon " ] = {
-- "|A:dungeonskull:18:18|a "..
" |TInterface \\ LFGFrame \\ LFG-Eye:18:18:0:0:512:256:72:120:72:120|t " ..
" |TInterface \\ RaidFrame \\ Raid-Icon-Rez:18:18|t " ..
" |TInterface \\ TargetingFrame \\ UI-PhasingIcon:18:18:0:0:31:31:3:28:3:28|t " ..
" |A:horde_icon_and_flag-dynamicIcon:18:18|a " ..
" |A:alliance_icon_and_flag-dynamicIcon:18:18|a " , " enabled " , " size-square " , " position " , " frameLevel " } ,
[ " partyAssignmentIcon " ] = { " enabled " , " size-square " , " position " } ,
[ " leaderIcon " ] = { " enabled " , " checkbutton:hideInCombat " , " size-square " , " position " } ,
[ " readyCheckIcon " ] = { " enabled " , " size-square " , " position " , " frameLevel " } ,
[ " playerRaidIcon " ] = { " enabled " , " size-square " , " alpha " , " position " , " frameLevel " } ,
[ " targetRaidIcon " ] = { " enabled " , " size-square " , " alpha " , " position " , " frameLevel " } ,
[ " aggroBlink " ] = { " enabled " , " size " , " position " , " frameLevel " } ,
[ " aggroBorder " ] = { " enabled " , " thickness " , " frameLevel " } ,
[ " aggroBar " ] = { " enabled " , " size-bar " , " position " , " frameLevel " } ,
[ " aoeHealing " ] = { " |cffb7b7b7 " .. L [ " Display a gradient texture when the unit receives a heal from your certain AoE healing spells. " ] , " enabled " , " color " , " height " } ,
[ " externalCooldowns " ] = { L [ " Even if disabled, the settings below affect \" Externals + Defensives \" indicator " ] , " enabled " , " builtInExternals " , " customExternals " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " defensiveCooldowns " ] = { L [ " Even if disabled, the settings below affect \" Externals + Defensives \" indicator " ] , " enabled " , " builtInDefensives " , " customDefensives " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " allCooldowns " ] = { " enabled " , " durationVisibility " , " checkbutton:showAnimation " , " size " , " num:5 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " dispels " ] = { " enabled " , " dispelFilters " , " highlightType " , " dispelBlacklist " , " checkbutton2:showDispelTypeIcons " , " orientation " , " size-square " , " position " , " frameLevel " } ,
[ " debuffs " ] = { " enabled " , " checkbutton:dispellableByMe " , " debuffBlacklist " , " bigDebuffs " , " durationVisibility " , " checkbutton2:showAnimation " , " checkbutton3:showTooltip: " .. DEBUFFS_TOOLTIP1 , " checkbutton4:enableBlacklistShortcut: " .. DEBUFFS_TOOLTIP2 , " size-normal-big " , " num:10 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " raidDebuffs " ] = { " |cffb7b7b7 " .. L [ " You can config debuffs in %s " ] : format ( Cell : GetAccentColorString ( ) .. L [ " Raid Debuffs " ] .. " |r " ) , " enabled " , " checkbutton:onlyShowTopGlow " , " durationVisibility " , " checkbutton2:showTooltip: " .. DEBUFFS_TOOLTIP1 , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " } ,
[ " targetedSpells " ] = { " enabled " , " checkbutton:showAllSpells: " .. L [ " Glow is only available to the spells in the list below " ] , " targetedSpellsList " , " targetedSpellsGlow " , " size-border " , " num:3 " , " orientation " , " position " , " frameLevel " , " font " } ,
[ " targetCounter " ] = { " |cffff2727 " .. L [ " HIGH CPU USAGE " ] .. " !|r |cffb7b7b7 " .. L [ " Check all visible enemy nameplates. " ] , " enabled " , " targetCounterFilters " , " color " , " position " , " frameLevel " , " font-noOffset " } ,
[ " actions " ] = { " |cffb7b7b7 " .. L [ " Play animation when the unit uses a specific spell/item. The list is global shared, not layout-specific. " ] , " enabled " , " actionsPreview " , " actionsList " } ,
[ " healthThresholds " ] = { " enabled " , " thresholds " , " thickness " } ,
[ " missingBuffs " ] = { " |cffb7b7b7 " .. ( L [ " %s in Utilities must be enabled to make this indicator work. " ] : format ( Cell : GetAccentColorString ( ) .. L [ " Buff Tracker " ] .. " |r " ) ) .. " " .. ( L [ " If you are a paladin or warrior, and the unit has no buffs from you, a %s icon will be displayed. " ] : format ( " |T254882:14:14:0:0:14:14:1:13:1:13|t " ) ) , " enabled " , " missingBuffsFilters " , " size-square " , " num:5 " , " orientation " , " position " , " frameLevel " } ,
}
end
local function ShowIndicatorSettings ( id )
-- if selected == id then return end
settingsFrame.scrollFrame : ResetScroll ( )
settingsFrame.scrollFrame : ResetHeight ( )
local notifiedLayout = F : GetNotifiedLayoutName ( currentLayout )
local indicatorTable = currentLayoutTable [ " indicators " ] [ id ]
local indicatorName = indicatorTable [ " indicatorName " ]
local indicatorType = indicatorTable [ " type " ]
-- texplore(indicatorTable)
local settingsTable
if indicatorType == " built-in " then
settingsTable = indicatorSettings [ indicatorName ]
-- if indicatorName == "tankActiveMitigation" then
-- tinsert(settingsTable, 1, "|cffb7b7b7"..L["Tank Active Mitigation refers to a single, specific ability that a Tank must use as a counter to specific Boss abilities. These Boss abilities are designated as Mitigation Checks."])
-- end
else
if indicatorType == " icon " then
settingsTable = { " enabled " , " auras " , " checkbutton3:showStack " , " durationVisibility " , " checkbutton4:showAnimation " , CELL_RECTANGULAR_CUSTOM_INDICATOR_ICONS and " size " or " size-square " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " }
elseif indicatorType == " text " then
settingsTable = { " enabled " , " auras " , " duration " , " checkbutton3:circledStackNums: " .. L [ " Require font support " ] , " colors " , " position " , " frameLevel " , " font-noOffset " }
elseif indicatorType == " bar " then
settingsTable = { " enabled " , " auras " , " colors " , " checkbutton3:showStack " , " durationVisibility " , " barOrientation " , " size-bar " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " }
elseif indicatorType == " rect " then
settingsTable = { " enabled " , " auras " , " colors " , " checkbutton3:showStack " , " durationVisibility " , " size " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " }
elseif indicatorType == " icons " then
settingsTable = { " enabled " , " auras " , " checkbutton3:showStack " , " durationVisibility " , " checkbutton4:showAnimation " , CELL_RECTANGULAR_CUSTOM_INDICATOR_ICONS and " size " or " size-square " , " num:10 " , " numPerLine:10 " , " spacing " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " }
elseif indicatorType == " color " then
settingsTable = { " enabled " , " auras " , " customColors " , " anchor " , " frameLevel:50 " }
elseif indicatorType == " texture " then
settingsTable = { " enabled " , " checkbutton3:fadeOut " , " auras " , " texture " , " size " , " position " , " frameLevel " }
elseif indicatorType == " glow " then
settingsTable = { " enabled " , " checkbutton3:fadeOut " , " auras " , " glowOptions " , " frameLevel " }
elseif indicatorType == " overlay " then
settingsTable = { " enabled " , " auras " , " overlayColors " , " checkbutton3:smooth " , " barOrientation " , " frameLevel:50 " }
elseif indicatorType == " block " then
settingsTable = { " enabled " , " auras " , " blockColors " , " checkbutton3:showStack " , " durationVisibility " , " size " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " }
elseif indicatorType == " blocks " then
settingsTable = { " enabled " , " auras " , " checkbutton3:showStack " , " durationVisibility " , " size " , " num:10 " , " numPerLine:10 " , " spacing " , " orientation " , " position " , " frameLevel " , " font1:stackFont " , " font2:durationFont " }
elseif indicatorType == " border " then
settingsTable = { " enabled " , " checkbutton3:fadeOut " , " auras " , " thickness " , " frameLevel:50 " }
end
if indicatorTable [ " auraType " ] == " buff " then
tinsert ( settingsTable , 2 , " castBy " )
tinsert ( settingsTable , 3 , " checkbutton2:trackByName " )
-- tinsert(settingsTable, 4, "showOn")
end
-- tips
if indicatorType == " glow " then
tinsert ( settingsTable , 1 , " |cffb7b7b7 " .. L [ " The spells list of a icons indicator is unordered (no priority). " ] .. " " .. L [ " Indicator settings are part of Layout settings which are account-wide. " ] )
else
tinsert ( settingsTable , 1 , " |cffb7b7b7 " .. L [ " The priority of spells decreases from top to bottom. " ] .. " " .. L [ " Indicator settings are part of Layout settings which are account-wide. " ] )
end
end
local widgets = Cell : CreateIndicatorSettings ( settingsFrame.scrollFrame . content , settingsTable )
local last
for i , w in pairs ( widgets ) do
if last then
w : SetPoint ( " TOPLEFT " , last , " BOTTOMLEFT " , 0 , P : Scale ( - 10 ) )
else
w : SetPoint ( " TOPLEFT " )
end
w : SetPoint ( " RIGHT " )
last = w
local currentSetting = settingsTable [ i ]
--! convert currentSetting to ACTUAL TABLE INDEX
if currentSetting == " color-alpha " or currentSetting == " color-class " or currentSetting == " color-power " then currentSetting = " color " end
if currentSetting == " customColors " or currentSetting == " overlayColors " or currentSetting == " blockColors " then currentSetting = " colors " end
if currentSetting == " size-square " or currentSetting == " size-bar " or currentSetting == " size-normal-big " then currentSetting = " size " end
if currentSetting == " namePosition " or currentSetting == " statusPosition " or currentSetting == " position-noHCenter " or currentSetting == " shieldBarPosition " then currentSetting = " position " end
if currentSetting == " barOrientation " then currentSetting = " orientation " end
if currentSetting == " durationVisibility " then currentSetting = " showDuration " end
if currentSetting == " healthFormat " or currentSetting == " powerFormat " then currentSetting = " format " end
-- enabled
if currentSetting == " enabled " then
w : SetDBValue ( indicatorTable [ currentSetting ] )
w : SetFunc ( function ( value )
indicatorTable [ currentSetting ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , currentSetting , value )
-- show enabled/disabled status
if value then
listButtons [ id ] : SetTextColor ( 1 , 1 , 1 , 1 )
else
listButtons [ id ] : SetTextColor ( 0.466 , 0.466 , 0.466 , 1 )
end
if listButtons [ id ] . typeIcon then
listButtons [ id ] . typeIcon : SetAlpha ( value and 0.55 or 0.15 )
end
end )
-- checkbutton
elseif string.find ( currentSetting , " ^checkbutton " ) then
local _ , setting , tooltip = string.split ( " : " , currentSetting )
w : SetDBValue ( setting , indicatorTable [ setting ] , tooltip )
w : SetFunc ( function ( value )
indicatorTable [ setting ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " checkbutton " , setting , value ) -- indicatorName, setting, value, value2
end )
-- font
elseif currentSetting == " font " or currentSetting == " font-noOffset " then
w : SetDBValue ( indicatorTable [ " font " ] )
w : SetFunc ( function ( )
-- NOTE: values already changed in widget
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " font " , indicatorTable [ " font " ] )
end )
-- font1, font2
elseif string.find ( currentSetting , " ^font%d " ) then
local index , setting = strmatch ( currentSetting , " ^font(%d):(.+) " )
index = tonumber ( index )
w : SetDBValue ( indicatorTable [ " font " ] [ index ] , setting )
w : SetFunc ( function ( )
-- NOTE: values already changed in widget
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " font " , indicatorTable [ " font " ] )
end )
-- auras
elseif currentSetting == " auras " then
w : SetDBValue ( L [ F : UpperFirst ( indicatorTable [ " auraType " ] ) .. " List " ] , indicatorTable [ " auras " ] , indicatorType == " glow " , indicatorType == " icons " ,
indicatorType == " blocks " or indicatorType == " border " )
w : SetFunc ( function ( value )
-- NOTE: already changed in widget
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " auras " , indicatorTable [ " auraType " ] , value )
end )
-- debuffBlacklist
elseif currentSetting == " debuffBlacklist " then
w : SetDBValue ( L [ " Debuff Filter (blacklist) " ] , CellDB [ " debuffBlacklist " ] , true )
w : SetFunc ( function ( value )
CellDB [ " debuffBlacklist " ] = value
Cell.vars . debuffBlacklist = F : ConvertTable ( CellDB [ " debuffBlacklist " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " debuffBlacklist " )
end )
-- dispelBlacklist
elseif currentSetting == " dispelBlacklist " then
w : SetDBValue ( L [ " Highlight Filter (blacklist) " ] , CellDB [ " dispelBlacklist " ] , true )
w : SetFunc ( function ( value )
CellDB [ " dispelBlacklist " ] = value
Cell.vars . dispelBlacklist = F : ConvertTable ( CellDB [ " dispelBlacklist " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " dispelBlacklist " )
end )
-- builtInDefensives
elseif currentSetting == " builtInDefensives " then
w : SetDBValue ( I.GetDefensives ( ) , CellDB [ " defensives " ] [ " disabled " ] )
w : SetFunc ( function ( )
I.UpdateDefensives ( CellDB [ " defensives " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " defensives " )
end )
-- customDefensives
elseif currentSetting == " customDefensives " then
w : SetDBValue ( _G.CUSTOM , CellDB [ " defensives " ] [ " custom " ] , true )
w : SetFunc ( function ( value )
CellDB [ " defensives " ] [ " custom " ] = value
I.UpdateDefensives ( CellDB [ " defensives " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " defensives " )
end )
-- builtInExternals
elseif currentSetting == " builtInExternals " then
w : SetDBValue ( I.GetExternals ( ) , CellDB [ " externals " ] [ " disabled " ] )
w : SetFunc ( function ( )
I.UpdateExternals ( CellDB [ " externals " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " externals " )
end )
-- customExternals
elseif currentSetting == " customExternals " then
w : SetDBValue ( _G.CUSTOM , CellDB [ " externals " ] [ " custom " ] , true )
w : SetFunc ( function ( value )
CellDB [ " externals " ] [ " custom " ] = value
I.UpdateExternals ( CellDB [ " externals " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " externals " )
end )
-- builtInCrowdControls
elseif currentSetting == " builtInCrowdControls " then
w : SetDBValue ( I.GetCrowdControls ( ) , CellDB [ " crowdControls " ] [ " disabled " ] )
w : SetFunc ( function ( )
I.UpdateCrowdControls ( CellDB [ " crowdControls " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " crowdControls " )
end )
-- customCrowdControls
elseif currentSetting == " customCrowdControls " then
w : SetDBValue ( _G.CUSTOM , CellDB [ " crowdControls " ] [ " custom " ] , true )
w : SetFunc ( function ( value )
CellDB [ " crowdControls " ] [ " custom " ] = value
I.UpdateCrowdControls ( CellDB [ " crowdControls " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " crowdControls " )
end )
-- cleuAuras
-- elseif currentSetting == "cleuAuras" then
-- w:SetDBValue(CellDB["cleuAuras"])
-- w:SetFunc(function(value)
-- CellDB["cleuAuras"] = value
-- I.UpdateCleuAuras(value)
-- end)
-- bigDebuffs
elseif currentSetting == " bigDebuffs " then
w : SetDBValue ( L [ " Big Debuffs " ] , CellDB [ " bigDebuffs " ] , true )
w : SetFunc ( function ( value )
CellDB [ " bigDebuffs " ] = value
Cell.vars . bigDebuffs = F : ConvertTable ( CellDB [ " bigDebuffs " ] )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , " " , " bigDebuffs " )
end )
-- actionsPreview
elseif currentSetting == " actionsPreview " then
w : SetDBValue ( indicatorTable [ " speed " ] )
w : SetFunc ( function ( value )
indicatorTable [ " speed " ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " speed " , value )
end )
-- actionsList
elseif currentSetting == " actionsList " then
w : SetDBValue ( CellDB [ " actions " ] )
w : SetFunc ( function ( value )
CellDB [ " actions " ] = value
Cell.vars . actions = I.ConvertActions ( value )
end )
-- targetedSpellsList
elseif currentSetting == " targetedSpellsList " then
w : SetDBValue ( L [ " Spell List " ] , CellDB [ " targetedSpellsList " ] , true )
w : SetFunc ( function ( value )
CellDB [ " targetedSpellsList " ] = value
Cell.vars . targetedSpellsList = F : ConvertTable ( CellDB [ " targetedSpellsList " ] )
end )
-- targetedSpellsGlow
elseif currentSetting == " targetedSpellsGlow " then
w : SetDBValue ( CellDB [ " targetedSpellsGlow " ] )
w : SetFunc ( function ( value )
CellDB [ " targetedSpellsGlow " ] = value
Cell.vars . targetedSpellsGlow = CellDB [ " targetedSpellsGlow " ]
CellIndicatorsPreviewButton.indicators . targetedSpells : ShowGlowPreview ( )
end )
-- glowOptions
elseif currentSetting == " glowOptions " then
w : SetDBValue ( indicatorTable [ " glowOptions " ] , true )
w : SetFunc ( function ( value )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , currentSetting , value )
end )
-- size-border
elseif currentSetting == " size-border " then
w : SetDBValue ( indicatorTable [ " size " ] , indicatorTable [ " border " ] )
w : SetFunc ( function ( value )
indicatorTable [ " size " ] [ 1 ] = value [ 1 ]
indicatorTable [ " size " ] [ 2 ] = value [ 2 ]
indicatorTable [ " border " ] = value [ 3 ]
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , currentSetting , value )
end )
-- colors
elseif currentSetting == " colors " then
w : SetDBValue ( indicatorTable [ " colors " ] , indicatorTable [ " auraType " ] )
w : SetFunc ( function ( value )
-- NOTE: already changed in widget
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " colors " , value )
end )
-- statusColors
elseif currentSetting == " statusColors " then
w : SetDBValue ( indicatorTable [ " colors " ] )
w : SetFunc ( function ( )
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " statusColors " )
end )
-- num:X
elseif string.find ( currentSetting , " ^num: " ) then
w : SetDBValue ( indicatorTable [ " num " ] , tonumber ( select ( 2 , string.split ( " : " , currentSetting ) ) ) )
w : SetFunc ( function ( value )
indicatorTable [ " num " ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " num " , value )
end )
-- numPerLine:X
elseif string.find ( currentSetting , " ^numPerLine: " ) then
w : SetDBValue ( indicatorTable [ " numPerLine " ] , tonumber ( select ( 2 , string.split ( " : " , currentSetting ) ) ) )
w : SetFunc ( function ( value )
indicatorTable [ " numPerLine " ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " numPerLine " , value )
end )
-- frameLevel:X
elseif string.find ( currentSetting , " ^frameLevel " ) then
w : SetDBValue ( indicatorTable [ " frameLevel " ] , tonumber ( select ( 2 , string.split ( " : " , currentSetting ) ) or 100 ) )
w : SetFunc ( function ( value )
indicatorTable [ " frameLevel " ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , " frameLevel " , value )
end )
-- missingBuffsFilters / targetCounterFilters / dispelFilters
elseif currentSetting == " missingBuffsFilters " or currentSetting == " targetCounterFilters " or currentSetting == " dispelFilters " then
w : SetDBValue ( indicatorTable [ " filters " ] )
w : SetFunc ( function ( )
-- NOTE: already changed in widget
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , currentSetting )
end )
-- common
else
w : SetDBValue ( indicatorTable [ currentSetting ] )
w : SetFunc ( function ( value )
indicatorTable [ currentSetting ] = value
Cell : Fire ( " UpdateIndicators " , notifiedLayout , indicatorName , currentSetting , value )
end )
end
end
Cell : UpdateIndicatorSettingsHeight ( )
if string.find ( indicatorName , " indicator " ) then
renameBtn : SetEnabled ( true )
deleteBtn : SetEnabled ( true )
else
renameBtn : SetEnabled ( false )
deleteBtn : SetEnabled ( false )
end
selected = id
end
local function MoveIndicator ( from , to )
local scroll = listFrame.scrollFrame : GetVerticalScroll ( )
if to and from ~= to then
F : Debug ( from , " -> " , to )
if selected == from then
selected = to
else
if from > to then
if selected == to or ( selected < from and selected > to ) then
selected = selected + 1
end
else
if selected == to or ( selected < to and selected > from ) then
selected = selected - 1
end
end
end
local temp = currentLayoutTable [ " indicators " ] [ from ]
tremove ( currentLayoutTable [ " indicators " ] , from )
tinsert ( currentLayoutTable [ " indicators " ] , to , temp )
end
LoadIndicatorList ( )
listFrame.scrollFrame : SetVerticalScroll ( scroll )
ListHighlightFn ( selected )
end
LoadIndicatorList = function ( )
F : Debug ( " |cffff7777LoadIndicatorList:|r " , currentLayout )
listFrame.scrollFrame : Reset ( )
local n = 0
for i , t in pairs ( currentLayoutTable [ " indicators " ] ) do
if not listButtons [ i ] then
listButtons [ i ] = Cell : CreateButton ( listFrame.scrollFrame . content , " " , " transparent-accent " , { 20 , 20 } )
listButtons [ i ] . typeIcon = listButtons [ i ] : CreateTexture ( nil , " ARTWORK " )
listButtons [ i ] . typeIcon : SetPoint ( " RIGHT " , - 2 , 0 )
P : Size ( listButtons [ i ] . typeIcon , 16 , 16 )
listButtons [ i ] . ShowTooltip = function ( )
if listButtons [ i ] : GetFontString ( ) : IsTruncated ( ) then
CellTooltip : SetOwner ( listButtons [ i ] , " ANCHOR_NONE " )
CellTooltip : SetPoint ( " RIGHT " , listButtons [ i ] , " LEFT " )
CellTooltip : AddLine ( listButtons [ i ] : GetText ( ) )
CellTooltip : Show ( )
end
end
listButtons [ i ] . HideTooltip = function ( )
CellTooltip : Hide ( )
end
listButtons [ i ] : SetMovable ( true )
listButtons [ i ] : RegisterForDrag ( " LeftButton " )
listButtons [ i ] : SetScript ( " OnDragStart " , function ( self )
if self.isBuiltIn then return end
if listButtons [ i + 1 ] then
listButtons [ i + 1 ] : ClearAllPoints ( )
end
self.oldStrata = self : GetFrameStrata ( )
self : SetFrameStrata ( " TOOLTIP " )
self : StartMoving ( )
self : SetUserPlaced ( false )
end )
listButtons [ i ] : SetScript ( " OnDragStop " , function ( self )
if self.isBuiltIn then return end
self : StopMovingOrSizing ( )
self : SetFrameStrata ( " LOW " )
-- self:Hide() --! Hide() will cause OnDragStop trigger TWICE!!!
C_Timer.After ( 0.05 , function ( )
local b = F : GetMouseFocus ( )
self : SetFrameStrata ( self.oldStrata )
self.oldStrata = nil
MoveIndicator ( self.id , ( b and b.typeIcon and not b.isBuiltIn ) and b.id )
end )
end )
end
local b = listButtons [ i ]
if t [ " type " ] == " built-in " then
b.isBuiltIn = true
b : SetText ( L [ t [ " name " ] ] )
b : GetFontString ( ) : ClearAllPoints ( )
b : GetFontString ( ) : SetPoint ( " LEFT " , 5 , 0 )
b : GetFontString ( ) : SetPoint ( " RIGHT " , - 5 , 0 )
b.typeIcon : Hide ( )
else
b.isBuiltIn = false
b : SetText ( t [ " name " ] )
b : GetFontString ( ) : ClearAllPoints ( )
b : GetFontString ( ) : SetPoint ( " LEFT " , 5 , 0 )
b : GetFontString ( ) : SetPoint ( " RIGHT " , b.typeIcon , " LEFT " , - 2 , 0 )
b.typeIcon : Show ( )
b.typeIcon : SetTexture ( " Interface \\ AddOns \\ Cell \\ Media \\ Indicators \\ indicator- " .. t [ " type " ] )
if t [ " auraType " ] == " buff " then
b.typeIcon : SetVertexColor ( 0.75 , 1 , 0.75 )
else -- debuff
b.typeIcon : SetVertexColor ( 1 , 0.75 , 0.75 )
end
end
b.id = i
n = i
-- show enabled/disabled status
if t [ " enabled " ] then
b : SetTextColor ( 1 , 1 , 1 , 1 )
b.typeIcon : SetAlpha ( 0.55 )
else
b : SetTextColor ( 0.466 , 0.466 , 0.466 , 1 )
b.typeIcon : SetAlpha ( 0.15 )
end
b : SetParent ( listFrame.scrollFrame . content )
b : SetPoint ( " RIGHT " )
if i == 1 then
b : SetPoint ( " TOPLEFT " )
else
b : SetPoint ( " TOPLEFT " , listButtons [ i - 1 ] , " BOTTOMLEFT " , 0 , P : Scale ( 1 ) )
end
b : Show ( )
end
listFrame.scrollFrame : SetContentHeight ( P : Scale ( 20 ) , n , - P : Scale ( 1 ) )
ListHighlightFn = Cell : CreateButtonGroup ( listButtons , ShowIndicatorSettings , function ( id )
local i = previewButton.indicators [ currentLayoutTable [ " indicators " ] [ id ] [ " indicatorName " ] ]
-- always show selected indicator
i : Show ( )
if i.preview then i.preview : Show ( ) end
if i.indicatorType == " glow " then
-- i:Show()
return
end
if i.isDispels then
i.isVisible = true
i.highlight : Show ( )
elseif i.isTargetedSpells then
i : ShowGlowPreview ( )
end
if CellDB [ " indicatorPreview " ] [ " showAll " ] then
if i : IsObjectType ( " Texture " ) or i : IsObjectType ( " FontString " ) then
LCG.PixelGlow_Start ( i.preview )
else
if i.isRaidDebuffs or i.isPrivateAuras or i.isCrowdControls then
LCG.PixelGlow_Start ( i , nil , nil , nil , nil , nil , 2 , 2 )
elseif i.isTargetedSpells then
LCG.PixelGlow_Start ( i , nil , nil , nil , nil , nil , 2 , 2 )
elseif i.isAggroBorder then
LCG.PixelGlow_Start ( i , nil , nil , nil , nil , nil , 2 , 2 )
else
LCG.PixelGlow_Start ( i )
end
if i._PixelGlow then
i._PixelGlow : SetIgnoreParentAlpha ( true )
end
end
else
if i : IsObjectType ( " Texture " ) or i : IsObjectType ( " FontString " ) then
LCG.PixelGlow_Stop ( i.preview )
else
LCG.PixelGlow_Stop ( i )
end
end
end , function ( id )
if not currentLayoutTable [ " indicators " ] [ id ] then return end
local i = previewButton.indicators [ currentLayoutTable [ " indicators " ] [ id ] [ " indicatorName " ] ]
if CellDB [ " indicatorPreview " ] [ " showAll " ] and i.enabled then
-- show all enabled if showAll
i : Show ( )
if i.preview then i.preview : Show ( ) end
else
-- hide none selected indicators
i : Hide ( )
if i.preview then i.preview : Hide ( ) end
end
if i.indicatorType == " glow " then
i : Hide ( )
return
end
if i : IsObjectType ( " Texture " ) or i : IsObjectType ( " FontString " ) then
LCG.PixelGlow_Stop ( i.preview )
else
LCG.PixelGlow_Stop ( i )
if i.isTargetedSpells then
i : HideGlowPreview ( )
end
end
if i.isDispels then
i.isVisible = false
i.highlight : Hide ( )
end
end )
end
-------------------------------------------------
-- functions
-------------------------------------------------
local init
local function ShowTab ( tab )
if tab == " indicators " then
if not init then
init = true
CreatePreviewButton ( )
CreateLayoutPane ( )
CreateSyncPane ( )
CreateListPane ( )
CreateSettingsPane ( )
-- texplore(masters)
previewScaleSlider : SetValue ( CellDB [ " indicatorPreview " ] [ " scale " ] )
previewShowAllCB : SetChecked ( CellDB [ " indicatorPreview " ] [ " showAll " ] )
previewButton : SetScale ( CellDB [ " indicatorPreview " ] [ " scale " ] )
end
LoadLayoutDropdown ( )
indicatorsTab : Show ( )
local noUpdateIndicators = currentLayout == Cell.vars . currentLayout
currentLayout = Cell.vars . currentLayout
currentLayoutTable = Cell.vars . currentLayoutTable
LoadSyncDropdown ( )
if noUpdateIndicators then return end
UpdatePreviewButton ( )
UpdateIndicators ( )
layoutDropdown : SetSelected ( currentLayout == " default " and _G.DEFAULT or currentLayout )
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
-- texplore(previewButton)
else
indicatorsTab : Hide ( )
end
end
Cell : RegisterCallback ( " ShowOptionsTab " , " IndicatorsTab_ShowTab " , ShowTab )
function F : ReloadIndicatorList ( )
if not init then return end
if indicatorsTab : IsShown ( ) then
LoadIndicatorList ( )
listFrame.scrollFrame : ScrollToBottom ( )
listButtons [ # listButtons ] : Click ( )
else
indicatorsTab : SetScript ( " OnShow " , function ( )
indicatorsTab : SetScript ( " OnShow " , nil )
UpdateIndicators ( )
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
end )
end
end
function F : ReloadIndicatorOptions ( index )
if not init then return end
if selected == index then
listButtons [ index ] : Click ( )
end
end
local function UpdateLayout ( )
if previewButton and currentLayout == Cell.vars . currentLayout then
UpdatePreviewButton ( )
end
end
Cell : RegisterCallback ( " UpdateLayout " , " IndicatorsTab_UpdateLayout " , UpdateLayout )
local function UpdateAppearance ( )
if previewButton and currentLayout == Cell.vars . currentLayout then
UpdatePreviewButton ( )
end
end
Cell : RegisterCallback ( " UpdateAppearance " , " IndicatorsTab_UpdateAppearance " , UpdateAppearance )
local function IndicatorsChanged ( layout )
-- reload after indicator copy
if currentLayout == layout then
F : Debug ( " Reload Indicator List: " , layout )
-- update indicators for preview button
UpdateIndicators ( )
-- reload list
LoadIndicatorList ( )
listButtons [ 1 ] : Click ( )
end
end
Cell : RegisterCallback ( " IndicatorsChanged " , " IndicatorsTab_IndicatorsChanged " , IndicatorsChanged )