You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

349 lines
13 KiB

local addonName, platerInternal = ...
local Plater = _G.Plater
local DF = DetailsFramework
local _
local IS_WOW_PROJECT_MAINLINE = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
local IS_WOW_PROJECT_NOT_MAINLINE = WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE
local IS_WOW_PROJECT_CLASSIC_ERA = WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
local IS_WOW_PROJECT_CLASSIC_TBC = WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC
local ghostAuraFrame
local y = platerInternal.optionsYStart - 40
local optionsStartX = 300
local optionsStartY = y
local scrollBoxWidth = 280
local scrollBoxHeight = 442
local scrollBoxLinesHeight = 21
local scrollAmoutLines = floor(scrollBoxHeight / scrollBoxLinesHeight)
local scrollbox_line_backdrop_color = {.8, .8, .8, 0.2}
local scrollbox_line_backdrop_color_hightlight = {.8, .8, .8, 0.4}
local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")
local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE")
local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")
--SetSpec is called when this tab is shown and also if the player change its spec while this tab is shown
--this function get the spell list of ghost auras from db and update the scrollbox to show these spells
function Plater.Auras.GhostAuras.SetSpec()
local specIndex, specId, specName = Plater.Auras.GhostAuras.GetPlayerSpecInfo()
if (specIndex) then
if (specId and specName) then
ghostAuraFrame.auraScrollLabel.text = "Auras for specialization: " .. specName
else
ghostAuraFrame.auraScrollLabel.text = "no specialization to show"
end
local auraList = Plater.Auras.GhostAuras.GetAuraListForCurrentSpec()
--order by name
local spellIndexTable = {}
for spellId in pairs(auraList) do
local spellName, _, spellIcon = GetSpellInfo(spellId)
if (spellName) then
spellIndexTable[#spellIndexTable+1] = {spellId, spellName, spellIcon}
end
end
table.sort(spellIndexTable, DF.SortOrder2R)
ghostAuraFrame.spellScrollBox:SetData(spellIndexTable)
ghostAuraFrame.spellScrollBox:Refresh()
end
end
function Plater.Auras.GhostAuras.ApplyAppearance(auraIconFrame, spellName, spellIcon, spellId)
local profile = Plater.db.profile
local ghostAurasSettings = profile.ghost_auras
auraIconFrame.Icon:SetDesaturated(ghostAurasSettings.desaturated)
if (ghostAurasSettings.width ~= 0) then
auraIconFrame:SetWidth(ghostAurasSettings.width)
else
auraIconFrame:SetWidth(profile.aura_width)
end
if (ghostAurasSettings.height ~= 0) then
auraIconFrame:SetHeight(ghostAurasSettings.height)
else
auraIconFrame:SetHeight(profile.aura_height)
end
auraIconFrame:SetAlpha(ghostAurasSettings.alpha)
end
function Plater.Auras.BuildGhostAurasOptionsTab(frame)
--this support frame is just to align widgets more easily
local supportFrame = CreateFrame("frame", "$parentSupportFrame", frame, "BackdropTemplate")
supportFrame:SetPoint("topleft", frame, "topleft", 5, 0)
supportFrame:SetSize(frame:GetSize())
ghostAuraFrame = supportFrame
ghostAuraFrame:SetBackdrop(nil)
--text above the scroll frame
ghostAuraFrame.auraScrollLabel = DF:CreateLabel(ghostAuraFrame, "Auras for specialization") --localize-me
ghostAuraFrame.auraScrollLabel.fontcolor = "orange"
ghostAuraFrame.auraScrollLabel.fontsize = 11
ghostAuraFrame.auraScrollLabel:SetPoint("topleft", ghostAuraFrame, "topleft", 5, y+16)
--create the description
ghostAuraFrame.TitleDescText = Plater:CreateLabel (ghostAuraFrame, "Add an icon as a reminder that a debuff you can cast directly is missing on the enemy.", 10, "silver") --localize-me
ghostAuraFrame.TitleDescText:SetPoint ("bottomleft", ghostAuraFrame.auraScrollLabel, "topleft", 0, 10)
--scroll frame
local refreshAuraList = function(self, data, offset, totalLines)
for i = 1, totalLines do
local index = i + offset
local spellData = data[index]
if (spellData) then
local line = self:GetLine(i)
if (line) then
local spellId, spellName, spellIcon = spellData[1], spellData[2], spellData[3]
line.spellId = spellId
line.removeButton.spellId = spellId
line.spellName:SetText(spellName)
line.spellIcon:SetTexture(spellIcon)
line.spellIcon:SetTexCoord(.1, .9, .1, .9)
end
end
end
end
local spellScrollBox = DF:CreateScrollBox(ghostAuraFrame, "$parentSpellsScroll", refreshAuraList, {}, scrollBoxWidth, scrollBoxHeight, scrollAmoutLines, scrollBoxLinesHeight)
ghostAuraFrame.spellScrollBox = spellScrollBox
DF:ReskinSlider(spellScrollBox)
spellScrollBox:SetPoint("topleft", ghostAuraFrame.auraScrollLabel.widget, "bottomleft", 0, -5)
--spellScrollBox:SetBackdrop(nil)
spellScrollBox.__background:SetAlpha(0.4)
local onRemoveSpellMouseDown = function(self)
self:GetNormalTexture():SetPoint("center", 1, -1)
end
local onRemoveSpellMouseUp = function(self)
self:GetNormalTexture():SetPoint("center", 0, 0)
end
local onClickRemoveSpell = function(self)
local spellId = self.spellId
Plater.Auras.GhostAuras.RemoveGhostAura(spellId)
--refresh the scroll frame
Plater.Auras.GhostAuras.SetSpec()
end
local onEnterLine = function(self)
self:SetBackdropColor(unpack(scrollbox_line_backdrop_color_hightlight))
end
local onLeaveLine = function(self)
self:SetBackdropColor(unpack(scrollbox_line_backdrop_color))
end
--create scroll lines
local createLine = function(self, index)
local line = CreateFrame("button", "$parentLine" .. index, self, "BackdropTemplate")
line:SetPoint("topleft", self, "topleft", 0, -((index-1) * (scrollBoxLinesHeight+1)) - 1)
line:SetSize(scrollBoxWidth, scrollBoxLinesHeight)
line:RegisterForClicks("LeftButtonDown", "RightButtonDown")
DF:ApplyStandardBackdrop(line)
line:SetScript("OnEnter", onEnterLine)
line:SetScript("OnLeave", onLeaveLine)
line.index = index
--spell icon
local spellIcon = line:CreateTexture("$parentIcon", "overlay")
spellIcon:SetSize(scrollBoxLinesHeight-4, scrollBoxLinesHeight-4)
spellIcon:SetPoint("left", line, "left", 2, 0)
line.spellIcon = spellIcon
--spell name
local spellName = line:CreateFontString(nil, "overlay", "GameFontNormal")
spellName:SetPoint("left", spellIcon, "right", 2, 0)
DF:SetFontSize(spellName, 11)
--remove spell button
local removeButton = CreateFrame("button", nil, line, "BackdropTemplate")
removeButton:SetPoint("right", line, "right", -3, 0)
removeButton:SetSize(16, 16)
removeButton:SetScript("OnClick", onClickRemoveSpell)
removeButton:SetScript("OnMouseDown", onRemoveSpellMouseDown)
removeButton:SetScript("OnMouseUp", onRemoveSpellMouseUp)
removeButton:SetNormalTexture([[Interface\GLUES\LOGIN\Glues-CheckBox-Check]])
removeButton:GetNormalTexture():ClearAllPoints()
removeButton:GetNormalTexture():SetPoint("center", 0, 0)
line.spellIcon = spellIcon
line.spellName = spellName
line.removeButton = removeButton
return line
end
--create the scrollbox lines
for i = 1, scrollAmoutLines do
spellScrollBox:CreateLine(createLine, i)
end
ghostAuraFrame:SetScript("OnShow", function()
Plater.Auras.GhostAuras.SetSpec()
end)
--Plater.Auras.GhostAuras.SetSpec() --debug, will update then the plater options is opened instead when the tab is opened
--add a ghost aura
function ghostAuraFrame.LoadGameSpells()
if (not next (Plater.SpellHashTable)) then
--load all spells in the game
DF:LoadAllSpells(Plater.SpellHashTable, Plater.SpellIndexTable)
return true
end
end
local newAuraLabel = DF:CreateLabel(ghostAuraFrame, "Add Ghost Aura", DF:GetTemplate("font", "ORANGE_FONT_TEMPLATE"))
DF:SetFontSize(newAuraLabel, 12)
local newAuraEntry = DF:CreateTextEntry(ghostAuraFrame, function()end, 200, 20, "NewGhostAuraTextBox", _, _, options_dropdown_template)
newAuraEntry.tooltip = "Enter the spell ID or the spell name"
newAuraEntry:SetJustifyH("left")
newAuraEntry:SetHook("OnEditFocusGained", function(self)
ghostAuraFrame.LoadGameSpells()
newAuraEntry.SpellAutoCompleteList = Plater.SpellIndexTable
newAuraEntry:SetAsAutoComplete("SpellAutoCompleteList", nil, true)
end)
local newAuraButton = DF:CreateButton(ghostAuraFrame, function()
local text = newAuraEntry.text
newAuraEntry:SetText("")
newAuraEntry:ClearFocus()
if (text ~= "") then
--get the spellId
local spellId = tonumber(text)
if (not spellId) then
spellId = select(7, GetSpellInfo(text))
if (not spellId) then
Plater:Msg("SpellId not found.")
return
end
end
Plater.Auras.GhostAuras.AddGhostAura(spellId)
--refresh
Plater.Auras.GhostAuras.SetSpec()
else
Plater:Msg("SpellId not found.")
end
end, 100, 20, "Add Aura", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
newAuraEntry:SetPoint ("topleft", spellScrollBox, "topright", 40, 0)
newAuraLabel:SetPoint ("bottomleft", newAuraEntry, "topleft", 0, 2)
newAuraButton:SetPoint ("topleft", newAuraEntry, "bottomleft", 0, -2)
newAuraButton.tooltip = "Add the aura to be tracked."
--image showing ghost aura example
ghostAuraFrame.ExampleImageDesc = DF:CreateLabel (ghostAuraFrame, "Ghost auras look like this:", 14)
ghostAuraFrame.ExampleImageDesc:SetPoint (325, -240)
ghostAuraFrame.ExampleImage = DF:CreateImage (ghostAuraFrame, [[Interface\AddOns\Plater\images\ghostauras_example]], 256*0.8, 128*0.8)
ghostAuraFrame.ExampleImage:SetPoint (325, -254)
ghostAuraFrame.ExampleImage:SetAlpha (.834)
local optionsTable = {
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "blank"},
{type = "label", get = function() return "General Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")}, --localize-me
{
type = "toggle",
get = function() return Plater.db.profile.ghost_auras.enabled end,
set = function (self, fixedparam, value)
Plater.db.profile.ghost_auras.enabled = value
Plater.RefreshAuraCache()
Plater.UpdateAuraCache()
--call an update on auras to remove the ghost auras currently shown
end,
name = "Enabled",
desc = "Enabled",
},
{type = "blank"},
{
type = "range",
get = function() return Plater.db.profile.ghost_auras.width end,
set = function (self, fixedparam, value)
Plater.db.profile.ghost_auras.width = value
end,
min = 0,
max = 32,
step = 1,
name = "Width",
desc = "Use zero to match the size of other auras",
},
{
type = "range",
get = function() return Plater.db.profile.ghost_auras.height end,
set = function (self, fixedparam, value)
Plater.db.profile.ghost_auras.height = value
end,
min = 0,
max = 32,
step = 1,
name = "Height",
desc = "Use zero to match the size of other auras",
},
{
type = "range",
get = function() return Plater.db.profile.ghost_auras.alpha end,
set = function (self, fixedparam, value)
Plater.db.profile.ghost_auras.alpha = value
end,
min = 0,
max = 1,
step = 0.1,
usedecimals = true,
name = "Alpha",
desc = "Alpha",
},
{
type = "toggle",
get = function() return Plater.db.profile.ghost_auras.desaturated end,
set = function (self, fixedparam, value)
Plater.db.profile.ghost_auras.desaturated = value
--call an update on auras to remove the ghost auras currently shown
end,
name = "Desaturated",
desc = "Desaturated",
},
}
local globalCallback = function()
Plater.UpdateAllPlates()
end
_G.C_Timer.After(1.8, function() --~delay
DF:BuildMenu(ghostAuraFrame, optionsTable, 325, -157, 800, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template, globalCallback)
end)
end