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.

3654 lines
140 KiB

local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local U = Cell.uFuncs
local A = Cell.animations
local P = Cell.pixelPerfectFuncs
local LCG = LibStub("LibCustomGlow-1.0")
-- ----------------------------------------------------------------------- --
-- defaults --
-- ----------------------------------------------------------------------- --
local defaultOffensiveBuffs = {
["DEATHKNIGHT"] = {
47568, -- Empower Rune Weapon, 符文武器增效
},
["DEMONHUNTER"] = {
},
["DRUID"] = {
102543, -- Incarnation: Avatar of Ashamane, 化身:阿莎曼之灵
102560, -- Incarnation: Chosen of Elune, 化身:艾露恩之眷
},
["EVOKER"] = {
375087, -- Dragonrage, 狂龙之怒
},
["HUNTER"] = {
288613, -- Trueshot, 百发百中
360952, -- Coordinated Assault, 协同进攻
359844, -- Call of the Wild, 荒野的召唤
},
["MAGE"] = {
12472, -- Icy Veins, 冰冷血脉
365362, -- Arcane Surge, 奥术涌动
},
["MONK"] = {
},
["PALADIN"] = {
31884, -- Avenging Wrath, 复仇之怒
231895, -- Crusade, 征伐
},
["PRIEST"] = {
194249, -- Voidform, 虚空形态
},
["ROGUE"] = {
121471, -- Shadow Blades, 暗影之刃
13750, -- Adrenaline Rush, 冲动
},
["SHAMAN"] = {
333957, -- Feral Spirit, 野性狼魂
},
["WARLOCK"] = {
},
["WARRIOR"] = {
107574, -- Avatar, 天神下凡
},
}
local defaultOffensiveCasts = {
["DEATHKNIGHT"] = {
"49206:25", -- Summon Gargoyle, 召唤石像鬼
"42650:30", -- Army of the Dead, 亡者大军
},
["DEMONHUNTER"] = {
"191427:20", -- Metamorphosis, 恶魔变形
},
["DRUID"] = {
},
["EVOKER"] = {
},
["HUNTER"] = {
},
["MAGE"] = {
"190319:12", -- Combustion, 燃烧
},
["MONK"] = {
"123904:20", -- Invoke Xuen, the White Tiger, 白虎下凡
},
["PALADIN"] = {
},
["PRIEST"] = {
},
["ROGUE"] = {
"360194:16", -- Deathmark, 死亡印记
},
["SHAMAN"] = {
"192249:30", -- Storm Elemental, 风暴元素
},
["WARLOCK"] = {
"1122:30", -- Summon Infernal, 召唤地狱火
"205180:20", -- Summon Darkglare, 召唤黑眼
"265187:15", -- Summon Demonic Tyrant, 召唤恶魔暴君
},
["WARRIOR"] = {
},
}
local defaultRoleFilter = {
["TANK"] = false,
["HEALER"] = false,
["DAMAGER"] = true,
}
local defaultClassFilter = {}
for class in F:IterateClasses() do
tinsert(defaultClassFilter, {class, true})
end
local defaultSpecFilter = {
{
"DEATHKNIGHT",
{
{250, true}, -- Blood 鲜血
{251, true}, -- Frost 冰霜
{252, true}, -- Unholy 邪恶
},
},
{
"DEMONHUNTER",
{
{581, true}, -- Vengeance 复仇
{577, true}, -- Havoc 浩劫
},
},
{
"DRUID",
{
{104, true}, -- Guardian 守护
{105, true}, -- Restoration 恢复
{103, true}, -- Feral 野性
{102, true}, -- Balance 平衡
},
},
{
"EVOKER",
{
{1468, true}, -- Preservation 恩护
{1467, true}, -- Devastation 湮灭
{1473, true}, -- Augmentation 增辉
},
},
{
"HUNTER",
{
{255, true}, -- Survival 生存
{253, true}, -- Beast Mastery 野兽控制
{254, true}, -- Marksmanship 射击
},
},
{
"MAGE",
{
{62, true}, -- Arcane 奥术
{63, true}, -- Fire 火焰
{64, true}, -- Frost 冰霜
},
},
{
"MONK",
{
{268, true}, -- Brewmaster 酒仙
{270, true}, -- Mistweaver 织雾
{269, true}, -- Windwalker 踏风
},
},
{
"PALADIN",
{
{66, true}, -- Protection 防护
{65, true}, -- Holy 神圣
{70, true}, -- Retribution 惩戒
},
},
{
"PRIEST",
{
{256, true}, -- Discipline 戒律
{257, true}, -- Holy 神圣
{258, true}, -- Shadow 暗影
},
},
{
"ROGUE",
{
{259, true}, -- Assassination 奇袭
{260, true}, -- Combat 狂徒
{261, true}, -- Subtlety 敏锐
},
},
{
"SHAMAN",
{
{264, true}, -- Restoration 恢复
{263, true}, -- Enhancement 增强
{262, true}, -- Elemental 元素
},
},
{
"WARLOCK",
{
{265, true}, -- Affliction 痛苦
{266, true}, -- Demonology 恶魔
{267, true}, -- Destruction 毁灭
},
},
{
"WARRIOR",
{
{73, true}, -- Protection 防护
{71, true}, -- Arms 武器
{72, true}, -- Fury 狂怒
},
},
}
local specIcons = {}
for _, t in pairs(defaultSpecFilter) do
for _, st in pairs(t[2]) do
specIcons[st[1]] = select(4, GetSpecializationInfoForSpecID(st[1]))
end
end
-- for class, classId in F:IterateClasses() do
-- local t = {class, {}}
-- for i = 1, GetNumSpecializationsForClassID(classId) do
-- local id, _, _, icon = GetSpecializationInfoForClassID(classId, i)
-- specIcons[id] = icon
-- tinsert(t[2], {id, true})
-- end
-- tinsert(defaultSpecFilter, t)
-- end
local defaultQuickAssistTable = {
["enabled"] = false,
-- layout
["layout"] = {
["size"] = {75, 25},
["position"] = {},
["orientation"] = "horizontal",
["anchor"] = "TOPLEFT",
["maxColumns"] = 4,
["unitsPerColumn"] = 5,
["spacingX"] = 3,
["spacingY"] = 3,
},
["filters"] = {
{
"role",
F:Copy(defaultRoleFilter),
-- {["role"] = enabled,...}
-- {{"class", enabled},...}
-- {name,...}
false,
},
{"role", F:Copy(defaultRoleFilter), false},
{"role", F:Copy(defaultRoleFilter), false},
{"role", F:Copy(defaultRoleFilter), false},
{"role", F:Copy(defaultRoleFilter), false},
{"role", F:Copy(defaultRoleFilter), false},
{"role", F:Copy(defaultRoleFilter), false},
},
["filterAutoSwitch"] = {
["party"] = 1,
["raid"] = 1,
["mythic"] = 1,
["arena"] = 1,
["battleground"] = 1,
},
-- sytle
["style"] = {
["texture"] = "Cell ".._G.DEFAULT,
["hpColor"] = {"custom", {0.117, 0.117, 0.117, 1}},
["lossColor"] = {"class_color", {0.25, 0, 0, 1}},
["oorAlpha"] = 0.45,
["targetColor"] = {1, 0.31, 0.31, 1},
["mouseoverColor"] = {1, 1, 1, 0.6},
["highlightSize"] = 1,
["name"] = {
["color"] = {"class_color", {1, 1, 1}},
["width"] = {"percentage", 0.75},
["font"] = {"Cell ".._G.DEFAULT, 12, "Outline"},
["position"] = {"CENTER", 0, 0},
},
},
-- spells
["spells"] = {
["mine"] = {
["buffs"] = {
{0, "icon", {0.95, 0.36, 0.71, 1}},
{0, "icon", {0.23, 0.81, 0.67, 1}},
{0, "icon", {0.61, 0.36, 0.9, 1}},
{0, "icon", {0, 0.73, 0.98, 1}},
{0, "icon", {0.98, 0.34, 0.03, 1}},
},
["bar"] = {
["position"] = {"TOPRIGHT", "BOTTOMRIGHT", 0, 1},
["orientation"] = "top-to-bottom",
["size"] = {75, 4},
},
["icon"] = {
["position"] = {"BOTTOMRIGHT", "BOTTOMRIGHT", 0, 0},
["orientation"] = "right-to-left",
["size"] = {12, 20},
["glow"] = "None",
["showStack"] = true,
["showDuration"] = false,
["showAnimation"] = true,
["font"] = {
{"Cell ".._G.DEFAULT, 11, "Outline", "TOPRIGHT", 2, 1, {1, 1, 1}},
{"Cell ".._G.DEFAULT, 11, "Outline", "BOTTOMRIGHT", 2, -1, {1, 1, 1}},
},
},
},
["offensives"] = {
["enabled"] = true,
["buffs"] = F:Copy(defaultOffensiveBuffs),
["casts"] = F:Copy(defaultOffensiveCasts),
["glow"] = {
["fadeOut"] = false,
["options"] = {"None", {0.95, 0.95, 0.32, 1}},
},
["icon"] = {
["position"] = {"TOPLEFT", "TOPLEFT", 0, 0},
["orientation"] = "left-to-right",
["size"] = {12, 20},
["glow"] = "Proc",
["glowColor"] = {1, 1, 1, 1},
["showStack"] = true,
["showDuration"] = false,
["showAnimation"] = true,
["font"] = {
{"Cell ".._G.DEFAULT, 11, "Outline", "TOPRIGHT", 2, 1, {1, 1, 1}},
{"Cell ".._G.DEFAULT, 11, "Outline", "BOTTOMRIGHT", 2, -1, {1, 1, 1}},
},
},
},
},
}
function F:GetDefaultQuickAssistTable()
return F:Copy(defaultQuickAssistTable)
end
-- ----------------------------------------------------------------------- --
-- config pane --
-- ----------------------------------------------------------------------- --
local quickAssistTab = Cell:CreateFrame("CellOptionsFrame_QuickAssistTab", Cell.frames.utilitiesTab, nil, nil, true)
Cell.frames.quickAssistTab = quickAssistTab
quickAssistTab:SetAllPoints(Cell.frames.utilitiesTab)
quickAssistTab:Hide()
-- ----------------------------------------------------------------------- --
-- shared --
-- ----------------------------------------------------------------------- --
local quickAssistTable, layoutTable, styleTable, spellTable
local selectedFilter, selectedClass, activeFilter
local LoadDB, LoadLayout, LoadStyle, LoadSpells, LoadList, LoadMyBuff, ShowFilter, LoadAutoSwitch, UpdateAutoSwitch
local anchorPoints = {"BOTTOM", "BOTTOMLEFT", "BOTTOMRIGHT", "CENTER", "LEFT", "RIGHT", "TOP", "TOPLEFT", "TOPRIGHT"}
local orientations = {"left-to-right", "right-to-left", "top-to-bottom", "bottom-to-top"}
local outlines = {"None", "Shadow", "Outline", "Monochrome,Outline"}
local glows = {"None", "Normal", "Pixel", "Shine", "Proc"}
-- ----------------------------------------------------------------------- --
-- button preview --
-- ----------------------------------------------------------------------- --
local previewButton, previewButtonBG, showIndicatorPreview
local function GetHealthColor(r, g, b)
local hpR, hpG, hpB, lossR, lossG, lossB
-- hp
if styleTable["hpColor"][1] == "class_color" then
hpR, hpG, hpB = r, g, b
elseif styleTable["hpColor"][1] == "class_color_dark" then
hpR, hpG, hpB = r*0.2, g*0.2, b*0.2
else
hpR = styleTable["hpColor"][2][1]
hpG = styleTable["hpColor"][2][2]
hpB = styleTable["hpColor"][2][3]
end
-- bg
if styleTable["lossColor"][1] == "class_color" then
lossR, lossG, lossB = r, g, b
elseif styleTable["lossColor"][1] == "class_color_dark" then
lossR, lossG, lossB = r*0.2, g*0.2, b*0.2
else
lossR = styleTable["lossColor"][2][1]
lossG = styleTable["lossColor"][2][2]
lossB = styleTable["lossColor"][2][3]
end
-- alpha
hpA = styleTable["hpColor"][1] == "custom" and styleTable["hpColor"][2][4] or 1
lossA = styleTable["lossColor"][1] == "custom" and styleTable["lossColor"][2][4] or 1
return hpR, hpG, hpB, hpA, lossR, lossG, lossB, lossA
end
local function UpdatePreviewButton()
if not quickAssistTab:IsVisible() then return end
if not previewButton then
previewButton = CreateFrame("Button", "CellQuickAssistPreviewButton", quickAssistTab, "CellQuickAssistPreviewButtonTemplate")
previewButton:SetPoint("BOTTOMLEFT", quickAssistTab, "BOTTOMRIGHT", 5, 270)
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:SetBackdrop({edgeFile = "Interface\\Buttons\\WHITE8x8", edgeSize = P:Scale(CELL_BORDER_SIZE)})
previewButton:SetBackdropBorderColor(unpack(CELL_BORDER_COLOR))
previewButton.healthBar:SetPoint("TOPLEFT", previewButton, "TOPLEFT", P:Scale(1), P:Scale(-1))
previewButton.healthBar:SetPoint("BOTTOMRIGHT", previewButton, "BOTTOMRIGHT", P:Scale(-1), P:Scale(1))
previewButton.healthBar:SetMinMaxValues(0, 2)
previewButton.healthBar:SetValue(1)
U.QuickAssist_CreateIndicators(previewButton)
previewButton:SetScript("OnShow", function(self, elapsed)
self.elapsed = 13
end)
previewButtonBG = Cell:CreateFrame("CellQuickAssistPreviewButtonBG", quickAssistTab)
previewButtonBG:SetPoint("TOPLEFT", previewButton, 0, 20)
previewButtonBG:SetPoint("BOTTOMRIGHT", previewButton, "TOPRIGHT")
Cell:StylizeFrame(previewButtonBG, {0.1, 0.1, 0.1, 0.77}, {0, 0, 0, 0})
previewButtonBG:Show()
local previewText = previewButtonBG:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET_TITLE")
previewText:SetPoint("TOP", 0, -3)
previewText:SetText(Cell:GetAccentColorString()..L["Preview"])
end
if not quickAssistTable or not quickAssistTable["enabled"] then
previewButton:Hide()
previewButtonBG:Hide()
return
end
previewButton:Show()
previewButtonBG:Show()
-- size ------------------------------------------------------------------ --
P:Size(previewButton, layoutTable["size"][1], layoutTable["size"][2])
-- color ----------------------------------------------------------------- --
local tex = F:GetBarTextureByName(styleTable["texture"])
previewButton.healthBar:SetStatusBarTexture(tex)
previewButton.healthLoss:SetTexture(tex)
local hpR, hpG, hpB, hpA, lossR, lossG, lossB, lossA = GetHealthColor(F:GetClassColor(Cell.vars.playerClass))
previewButton.healthBar:SetStatusBarColor(hpR, hpG, hpB, hpA)
previewButton.healthLoss:SetVertexColor(lossR, lossG, lossB, lossA)
if styleTable["name"]["color"][1] == "class_color" then
previewButton.nameText:SetTextColor(F:GetClassColor(Cell.vars.playerClass))
else
previewButton.nameText:SetTextColor(unpack(styleTable["name"]["color"][2]))
end
-- update nameText ------------------------------------------------------- --
previewButton.nameText:ClearAllPoints()
previewButton.nameText:SetPoint(unpack(styleTable["name"]["position"]))
local font, fontSize, fontFlags = unpack(styleTable["name"]["font"])
font = F:GetFont(font)
if fontFlags == "Shadow" then
previewButton.nameText:SetFont(font, fontSize, "")
previewButton.nameText:SetShadowOffset(1, -1)
previewButton.nameText:SetShadowColor(0, 0, 0, 1)
else
if fontFlags == "None" then
fontFlags = ""
elseif fontFlags == "Outline" then
fontFlags = "OUTLINE"
else
fontFlags = "OUTLINE,MONOCHROME"
end
previewButton.nameText:SetFont(font, fontSize, fontFlags)
previewButton.nameText:SetShadowOffset(0, 0)
previewButton.nameText:SetShadowColor(0, 0, 0, 0)
end
previewButton.name = Cell.vars.playerNameShort
previewButton.nameText.width = styleTable["name"]["width"]
previewButton.nameText:UpdateName()
-- offensiveIcons
local oit = spellTable["offensives"]["icon"]
local offensiveIcons = previewButton.offensiveIcons
-- point
P:ClearPoints(offensiveIcons)
P:Point(offensiveIcons, oit["position"][1], b, oit["position"][2], oit["position"][3], oit["position"][4])
-- size
P:Size(offensiveIcons, oit["size"][1], oit["size"][2])
-- orientation
offensiveIcons:SetOrientation(oit["orientation"])
-- font
offensiveIcons:SetFont(unpack(oit["font"]))
offensiveIcons:ShowDuration(oit["showDuration"])
offensiveIcons:ShowAnimation(oit["showAnimation"])
offensiveIcons:ShowStack(oit["showStack"])
-- offensiveGlow
local ogt = spellTable["offensives"]["glow"]
local offensiveGlow = previewButton.offensiveGlow
offensiveGlow:SetFadeOut(ogt["fadeOut"])
offensiveGlow:UpdateGlowOptions(ogt["options"])
-- buffIcons
local bit = spellTable["mine"]["icon"]
local buffIcons = previewButton.buffIcons
-- point
P:ClearPoints(buffIcons)
P:Point(buffIcons, bit["position"][1], b, bit["position"][2], bit["position"][3], bit["position"][4])
-- size
P:Size(buffIcons, bit["size"][1], bit["size"][2])
-- orientation
buffIcons:SetOrientation(bit["orientation"])
-- font
buffIcons:SetFont(unpack(bit["font"]))
buffIcons:ShowDuration(bit["showDuration"])
buffIcons:ShowAnimation(bit["showAnimation"])
buffIcons:ShowStack(bit["showStack"])
-- buffBars
local bbt = spellTable["mine"]["bar"]
local buffBars = previewButton.buffBars
-- point
P:ClearPoints(buffBars)
P:Point(buffBars, bbt["position"][1], b, bbt["position"][2], bbt["position"][3], bbt["position"][4])
-- size
P:Size(buffBars, bbt["size"][1], bbt["size"][2])
-- orientation
buffBars:SetOrientation(bbt["orientation"])
-- show indicators
previewButton.elapsed = 13
previewButton:SetScript("OnUpdate", function(self, elapsed)
self.elapsed = (self.elapsed or 0) + elapsed
if self.elapsed >= 13 then
self.elapsed = 0
if showIndicatorPreview then
-- offensives
if spellTable["offensives"]["enabled"] then
self.offensiveIcons:Show()
self.offensiveIcons[1]:SetCooldown(GetTime(), 13, nil, 135875, 0, false, oit["glowColor"], oit["glow"])
self.offensiveIcons[2]:SetCooldown(GetTime(), 13, nil, 135838, 0, false, oit["glowColor"], oit["glow"])
self.offensiveIcons:UpdateSize(2)
else
self.offensiveIcons:Hide()
end
self.offensiveGlow:SetCooldown(GetTime(), 13)
-- buffs
self.buffIcons:Show()
self.buffIcons[1]:SetCooldown(GetTime(), 13, nil, 5199639, 0, false, spellTable["mine"]["buffs"][1][3], bit["glow"])
self.buffIcons[2]:SetCooldown(GetTime(), 13, nil, 5061347, 0, false, spellTable["mine"]["buffs"][2][3], bit["glow"])
self.buffIcons:UpdateSize(2)
self.buffBars:Show()
self.buffBars[1]:SetCooldown(GetTime(), 13, spellTable["mine"]["buffs"][1][3])
self.buffBars[2]:SetCooldown(GetTime(), 13, spellTable["mine"]["buffs"][2][3])
self.buffBars:UpdateSize(2)
else
self.offensiveIcons:Hide()
self.buffIcons:Hide()
self.buffBars:Hide()
self.offensiveGlow:Hide()
end
end
end)
end
Cell:RegisterCallback("ReloadQuickAssist", "UpdatePreviewButton", UpdatePreviewButton)
Cell:RegisterCallback("UpdateQuickAssist", "UpdatePreviewButton", UpdatePreviewButton)
-- ----------------------------------------------------------------------- --
-- layout preview --
-- ----------------------------------------------------------------------- --
local layoutPreviewFrame
local layoutPreviewButtons = {}
local function UpdateLayoutPreview()
if not layoutPreviewFrame then
layoutPreviewFrame = CreateFrame("Frame", "CellQuickAssistPreviewFrame", CellQuickAssistFrame)
layoutPreviewFrame:SetAllPoints(CellQuickAssistFrame)
layoutPreviewFrame:SetFrameLevel(1)
layoutPreviewFrame:Hide()
A:CreateFadeIn(layoutPreviewFrame, 0, 1, 0.5)
A:CreateFadeOut(layoutPreviewFrame, 1, 0, 0.5)
for i = 1, 40 do
layoutPreviewButtons[i] = CreateFrame("Frame", nil, layoutPreviewFrame, "BackdropTemplate")
layoutPreviewButtons[i]:SetBackdrop({bgFile="Interface\\Buttons\\WHITE8x8", edgeFile="Interface\\Buttons\\WHITE8x8", edgeSize=P:Scale(1)})
layoutPreviewButtons[i]:SetBackdropColor(0, 0, 0, 0.5)
layoutPreviewButtons[i]:SetBackdropBorderColor(0, 0, 0, 1)
layoutPreviewButtons[i]:EnableMouse(true)
layoutPreviewButtons[i].text = layoutPreviewButtons[i]:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
layoutPreviewButtons[i].text:SetPoint("CENTER")
layoutPreviewButtons[i].text:SetText(i)
-- drag
layoutPreviewButtons[i]:RegisterForDrag("LeftButton")
layoutPreviewButtons[i]:SetScript("OnDragStart", function()
CellQuickAssistAnchorFrame:StartMoving()
CellQuickAssistAnchorFrame:SetUserPlaced(false)
end)
layoutPreviewButtons[i]:SetScript("OnDragStop", function()
CellQuickAssistAnchorFrame:StopMovingOrSizing()
P:SavePosition(CellQuickAssistAnchorFrame, layoutTable["position"])
end)
end
end
local point, relativePoint, groupRelativePoint, unitSpacing, groupSpacing
local spacing, x, y = layoutTable["spacingX"], layoutTable["spacingY"]
if layoutTable["orientation"] == "horizontal" then
if layoutTable["anchor"] == "BOTTOMLEFT" then
point, relativePoint, groupRelativePoint = "BOTTOMLEFT", "BOTTOMRIGHT", "TOPLEFT"
unitSpacing = layoutTable["spacingX"]
groupSpacing = layoutTable["spacingY"]
elseif layoutTable["anchor"] == "BOTTOMRIGHT" then
point, relativePoint, groupRelativePoint = "BOTTOMRIGHT", "BOTTOMLEFT", "TOPRIGHT"
unitSpacing = -layoutTable["spacingX"]
groupSpacing = layoutTable["spacingY"]
elseif layoutTable["anchor"] == "TOPLEFT" then
point, relativePoint, groupRelativePoint = "TOPLEFT", "TOPRIGHT", "BOTTOMLEFT"
unitSpacing = layoutTable["spacingX"]
groupSpacing = -layoutTable["spacingY"]
elseif layoutTable["anchor"] == "TOPRIGHT" then
point, relativePoint, groupRelativePoint = "TOPRIGHT", "TOPLEFT", "BOTTOMRIGHT"
unitSpacing = -layoutTable["spacingX"]
groupSpacing = -layoutTable["spacingY"]
end
else
if layoutTable["anchor"] == "BOTTOMLEFT" then
point, relativePoint, groupRelativePoint = "BOTTOMLEFT", "TOPLEFT", "BOTTOMRIGHT"
unitSpacing = layoutTable["spacingY"]
groupSpacing = layoutTable["spacingX"]
elseif layoutTable["anchor"] == "BOTTOMRIGHT" then
point, relativePoint, groupRelativePoint = "BOTTOMRIGHT", "TOPRIGHT", "BOTTOMLEFT"
unitSpacing = layoutTable["spacingY"]
groupSpacing = -layoutTable["spacingX"]
elseif layoutTable["anchor"] == "TOPLEFT" then
point, relativePoint, groupRelativePoint = "TOPLEFT", "BOTTOMLEFT", "TOPRIGHT"
unitSpacing = -layoutTable["spacingY"]
groupSpacing = layoutTable["spacingX"]
elseif layoutTable["anchor"] == "TOPRIGHT" then
point, relativePoint, groupRelativePoint = "TOPRIGHT", "BOTTOMRIGHT", "TOPLEFT"
unitSpacing = -layoutTable["spacingY"]
groupSpacing = -layoutTable["spacingX"]
end
end
local n = 1
local first
for i = 1, layoutTable["maxColumns"] do
local last
for j = 1, layoutTable["unitsPerColumn"] do
local b = layoutPreviewButtons[n]
b:Show()
b:ClearAllPoints()
P:Size(b, layoutTable["size"][1], layoutTable["size"][2])
if last then -- not the first in this row/column
if layoutTable["orientation"] == "horizontal" then
b:SetPoint(point, last, relativePoint, unitSpacing, 0)
else
b:SetPoint(point, last, relativePoint, 0, unitSpacing)
end
elseif first then -- not the first row/column
if layoutTable["orientation"] == "horizontal" then
b:SetPoint(point, first, groupRelativePoint, 0, groupSpacing)
else
b:SetPoint(point, first, groupRelativePoint, groupSpacing, 0)
end
else -- first row/column
b:SetPoint(point)
end
last = b
n = n + 1
if n > 40 then
break
end
end
if n > 40 then
break
else
first = layoutPreviewButtons[n-layoutTable["unitsPerColumn"]]
end
end
-- hide
for i = n, 40 do
layoutPreviewButtons[i]:Hide()
end
end
local function ShowLayoutPreview()
if not layoutTable then return end
if not layoutPreviewFrame then
UpdateLayoutPreview()
end
layoutPreviewFrame:FadeIn()
end
local function HideLayoutPreview()
if not layoutPreviewFrame then return end
layoutPreviewFrame:FadeOut()
end
-- ----------------------------------------------------------------------- --
-- all widgets --
-- ----------------------------------------------------------------------- --
local qaPane, qaPopup, qaDualPopup
local qaEnabledCB
local layoutBtn, styleBtn, spellBtn
-- layout
local anchorDropdown, orientationDropdown, widthSlider, heightSlider, xSlider, ySlider, unitsSlider, maxSlider
local filterTypeDropdown, hideSelfCB, roleFilter, classFilter, specFilter, nameFilter, nameListFrame, filterResetBtn, filterResetTips
local filterButtons = {}
local autoSwitchFrame, partyDropdown, raidDropdown, mythicDropdown, arenaDropdown, bgDropdown, partyText, raidText, mythicText, arenaText, bgText
-- style
local hpColorDropdown, hpCP, lossColorDropdown, bgCP, textureDropdown, alphaSlider
local targetColorPicker, mouseoverColorPicker, highlightSizeSlider
local nameColorDropdown, nameCP, nameWidth, nameAnchorDropdown, nameXSlider, nameYSlider, nameFontDropdown, nameOutlineDropdown, nameSizeSilder
-- spells
local myBuffWidgets = {}
local classButtons, buffButtons, castButtons = {}, {}, {}
local buffsPane, buffsAddBtn, castsPane, castsAddBtn, offensivesEnabledCB
local function UpdateWidgets(enabled)
Cell:SetEnabled(enabled, layoutBtn, styleBtn, spellBtn)
-- NOTE: switch to layout on disable
Cell:SetEnabled(enabled, anchorDropdown, orientationDropdown, widthSlider, heightSlider, xSlider, ySlider, unitsSlider, maxSlider)
Cell:SetEnabled(enabled, autoSwitchFrame, filterTypeDropdown, hideSelfCB, roleFilter, classFilter, nameFilter)
for _, b in pairs(filterButtons) do
Cell:SetEnabled(enabled, b)
end
qaPopup:Hide()
qaPopup:Hide()
nameListFrame:Hide()
filterResetBtn:Hide()
filterResetTips:Hide()
end
-- ----------------------------------------------------------------------- --
-- quick assist pane --
-- ----------------------------------------------------------------------- --
local function CreateQuickAssistPane()
qaPane = Cell:CreateTitledPane(quickAssistTab, L["Quick Assist"].." |cFF777777"..L["only in group"], 422, 80)
qaPane:SetPoint("TOPLEFT", 5, -5)
local qaTips = qaPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
qaTips:SetPoint("TOPLEFT", 5, -25)
qaTips:SetJustifyH("LEFT")
qaTips:SetSpacing(5)
qaTips:SetText(L["Create several buttons for quick casting and buff monitoring"].."\n"..L["These settings are spec-specific"])
-- enabled ----------------------------------------------------------------------
qaEnabledCB = Cell:CreateCheckButton(qaPane, L["Enabled"], function(checked, self)
if not CellDB["quickAssist"][Cell.vars.playerSpecID] then
CellDB["quickAssist"][Cell.vars.playerSpecID] = F:Copy(defaultQuickAssistTable)
end
CellDB["quickAssist"][Cell.vars.playerSpecID]["enabled"] = checked
LoadDB()
UpdatePreviewButton()
if checked then
ShowLayoutPreview()
else
HideLayoutPreview()
layoutBtn:GetScript("OnClick")()
end
Cell:Fire("UpdateQuickAssist")
end)
qaEnabledCB:SetPoint("TOPLEFT", qaPane, 5, -75)
-- import/export --------------------------------------------------------- --
local export = Cell:CreateButton(qaPane, nil, "accent-hover", {27, 17}, nil, nil, nil, nil, nil, L["Export"])
export:SetPoint("TOPRIGHT")
export:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\export", {15, 15}, {"CENTER", 0, 0})
export:SetScript("OnClick", function()
F:ShowQuickAssistExportFrame(quickAssistTable)
end)
local import = Cell:CreateButton(qaPane, nil, "accent-hover", {27, 17}, nil, nil, nil, nil, nil, L["Import"])
import:SetPoint("TOPRIGHT", export, "TOPLEFT", -1, 0)
import:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\import", {15, 15}, {"CENTER", 0, 0})
import:SetScript("OnClick", function()
F:ShowQuickAssistImportFrame()
end)
-- popup ------------------------------------------------------------------------
qaPopup = Cell:CreatePopupEditBox(qaPane)
qaPopup:SetNumeric(true)
qaPopup:SetFrameStrata("DIALOG")
qaPopup:SetScript("OnTextChanged", function()
local spellId = tonumber(qaPopup:GetText())
if not spellId then
CellSpellTooltip:Hide()
return
end
local name, _, icon = GetSpellInfo(spellId)
if not name then
CellSpellTooltip:Hide()
return
end
CellSpellTooltip:SetOwner(qaPopup, "ANCHOR_NONE")
CellSpellTooltip:SetPoint("TOPLEFT", qaPopup, "BOTTOMLEFT", 0, -1)
CellSpellTooltip:SetSpellByID(spellId, icon)
CellSpellTooltip:Show()
end)
qaPopup:HookScript("OnHide", function()
CellSpellTooltip:Hide()
end)
-- dualPopup --------------------------------------------------------------------
qaDualPopup = Cell:CreateDualPopupEditBox(qaPane, "ID", L["Duration"], true)
qaDualPopup.left:HookScript("OnTextChanged", function(self)
local spellId = tonumber(self:GetText())
if not spellId then
CellSpellTooltip:Hide()
return
end
local name, _, icon = GetSpellInfo(spellId)
if not name then
CellSpellTooltip:Hide()
return
end
CellSpellTooltip:SetOwner(self, "ANCHOR_NONE")
CellSpellTooltip:SetPoint("TOPLEFT", self, "BOTTOMLEFT", 0, -1)
CellSpellTooltip:SetSpellByID(spellId, icon)
CellSpellTooltip:Show()
end)
qaDualPopup:HookScript("OnHide", function()
CellSpellTooltip:Hide()
end)
end
-- ----------------------------------------------------------------------- --
-- setup --
-- ----------------------------------------------------------------------- --
local setupPane
local pages = {}
local function CreateSetupPane()
setupPane = Cell:CreateTitledPane(quickAssistTab, L["Setup"], 422, 384)
setupPane:SetPoint("TOPLEFT", P:Scale(5), P:Scale(-120))
spellBtn = Cell:CreateButton(setupPane, L["Spells"], "accent-hover", {100, 17})
spellBtn:SetPoint("TOPRIGHT")
spellBtn.id = "spell"
styleBtn = Cell:CreateButton(setupPane, L["Style"], "accent-hover", {100, 17})
styleBtn:SetPoint("TOPRIGHT", spellBtn, "TOPLEFT", P:Scale(1), 0)
styleBtn.id = "style"
layoutBtn = Cell:CreateButton(setupPane, L["Layout"], "accent-hover", {100, 17})
layoutBtn:SetPoint("TOPRIGHT", styleBtn, "TOPLEFT", P:Scale(1), 0)
layoutBtn.id = "layout"
Cell:CreateButtonGroup({layoutBtn, styleBtn, spellBtn}, function(tab)
-- show & hide
for name, page in pairs(pages) do
if name == tab then
page:Show()
else
page:Hide()
end
end
if previewButton then
showIndicatorPreview = tab == "spell"
previewButton.elapsed = 13
end
end)
end
-- ----------------------------------------------------------------------- --
-- layout --
-- ----------------------------------------------------------------------- --
-- role filter ----------------------------------------------------------- --
local function UpdateRoleFilter(role)
quickAssistTable["filters"][selectedFilter][2][role] = not quickAssistTable["filters"][selectedFilter][2][role]
ShowFilter(selectedFilter) -- call SetRoles
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
local ROLE_FILTER_SIZE = 100
local function CreateRoleFilter(parent)
local f = CreateFrame("Frame", nil, parent)
f:SetSize(P:Scale(ROLE_FILTER_SIZE)*3-P:Scale(1)*2, P:Scale(20))
f:Hide()
local tank = Cell:CreateButton(f, _G.TANK, "blue-hover", {ROLE_FILTER_SIZE, 20})
tank:SetTexture("Interface\\AddOns\\Cell\\Media\\Roles\\TANK", {16, 16}, {"LEFT", 2, 0})
tank:SetPoint("TOPLEFT")
tank:SetScript("OnClick", function() UpdateRoleFilter("TANK") end)
local healer = Cell:CreateButton(f, _G.HEALER, "green-hover", {ROLE_FILTER_SIZE, 20})
healer:SetTexture("Interface\\AddOns\\Cell\\Media\\Roles\\HEALER", {16, 16}, {"LEFT", 2, 0})
healer:SetPoint("TOPLEFT", tank, "TOPRIGHT", P:Scale(-1), 0)
healer:SetScript("OnClick", function() UpdateRoleFilter("HEALER") end)
local damager = Cell:CreateButton(f, _G.DAMAGER, "red-hover", {ROLE_FILTER_SIZE, 20})
damager:SetTexture("Interface\\AddOns\\Cell\\Media\\Roles\\DAMAGER", {16, 16}, {"LEFT", 2, 0})
damager:SetPoint("TOPLEFT", healer, "TOPRIGHT", P:Scale(-1), 0)
damager:SetScript("OnClick", function() UpdateRoleFilter("DAMAGER") end)
function f:SetRoles(t)
tank.tex:SetAlpha(t.TANK and 1 or 0.4)
tank.tex:SetDesaturated(not t.TANK)
if t.TANK then
tank:SetTextColor(1, 1, 1)
else
tank:SetTextColor(0.4, 0.4, 0.4)
end
healer.tex:SetAlpha(t.HEALER and 1 or 0.4)
healer.tex:SetDesaturated(not t.HEALER)
if t.HEALER then
healer:SetTextColor(1, 1, 1)
else
healer:SetTextColor(0.4, 0.4, 0.4)
end
damager.tex:SetAlpha(t.DAMAGER and 1 or 0.4)
damager.tex:SetDesaturated(not t.DAMAGER)
if t.DAMAGER then
damager:SetTextColor(1, 1, 1)
else
damager:SetTextColor(0.4, 0.4, 0.4)
end
end
return f
end
-- class filter ---------------------------------------------------------- --
local CLASS_FILTER_SIZE = 24
local function CreateClassFilter(parent)
local f = CreateFrame("Frame", nil, parent)
f:SetSize(412, P:Scale(CLASS_FILTER_SIZE))
f:Hide()
local buttons = {}
-- local last
for class in F:IterateClasses() do
buttons[class] = Cell:CreateButton(f, nil, "accent-hover", {CLASS_FILTER_SIZE, CLASS_FILTER_SIZE})
buttons[class]:SetTexture("classicon-"..strlower(class), {CLASS_FILTER_SIZE-4, CLASS_FILTER_SIZE-4}, {"CENTER", 0, 0}, true, true)
buttons[class]._class = class
buttons[class]:SetScript("OnClick", function()
-- find class
for i, t in pairs(quickAssistTable["filters"][selectedFilter][2]) do
if t[1] == class then
t[2] = not t[2]
break
end
end
f:SetClasses(quickAssistTable["filters"][selectedFilter][2])
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end)
buttons[class]:SetScript("OnEnter", function(self) self:SetBackdropColor(F:GetClassColor(class)) end)
buttons[class]:SetMovable(true)
buttons[class]:RegisterForDrag("LeftButton")
buttons[class]:SetScript("OnDragStart", function(self)
self:SetFrameStrata("TOOLTIP")
self:StartMoving()
self:SetUserPlaced(false)
end)
buttons[class]:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
self:SetFrameStrata("LOW")
-- self:Hide() --! Hide() will cause OnDragStop trigger TWICE!!!
C_Timer.After(0.05, function()
local b = GetMouseFocus()
if b and b._class then
local oldIndex, oldValue, newIndex
for i, t in pairs(quickAssistTable["filters"][selectedFilter][2]) do
if class == t[1] then
oldValue = t
oldIndex = i
elseif b._class == t[1] then
newIndex = i
end
end
-- print(class, oldIndex, "->", b._class, newIndex)
if oldIndex and oldValue and newIndex then
tremove(quickAssistTable["filters"][selectedFilter][2], oldIndex)
tinsert(quickAssistTable["filters"][selectedFilter][2], newIndex, oldValue)
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
end
f:SetClasses(quickAssistTable["filters"][selectedFilter][2])
end)
end)
end
function f:SetClasses(t)
for k, v in pairs(t) do
local class, enabled = v[1], v[2]
-- state
if enabled then
buttons[class]:SetBackdropBorderColor(F:GetClassColor(class))
buttons[class].tex:SetDesaturated(false)
buttons[class]:SetAlpha(1)
else
buttons[class]:SetBackdropBorderColor(0, 0, 0)
buttons[class].tex:SetDesaturated(true)
buttons[class]:SetAlpha(0.75)
end
-- order
buttons[class]:SetFrameStrata("DIALOG")
buttons[class]:ClearAllPoints()
buttons[class]:SetPoint("TOPLEFT", (k-1)*(P:Scale(CLASS_FILTER_SIZE)+P:Scale(3)), 0)
buttons[class]:Show()
end
end
return f
end
-- name filter ----------------------------------------------------------- --
local players = {}
local names = {}
-- update button
local function UpdatePlayerList()
for _, b in pairs(players) do
if not b:IsShown() then break end
b.label:SetAlpha(1)
b.index:SetText("")
for k, n in pairs(names) do
if n == b.name then
b.label:SetAlpha(0.3)
b.index:SetText(k)
break
end
end
end
end
local function CreatePlayerList(parent, box)
-- playerlist
local playerListFrame = CreateFrame("Frame", nil, parent)
playerListFrame:SetSize(70, 17)
playerListFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 0)
for i = 1, 40 do
players[i] = Cell:CreateButton(playerListFrame, i, nil, {90, 18})
players[i].label = players[i]:GetFontString()
players[i].label:ClearAllPoints()
players[i].label:SetPoint("LEFT", P:Scale(13), 0)
players[i].index = players[i]:CreateFontString(nil, "OVERLAY")
players[i].index:SetFont("Interface\\AddOns\\Cell\\Media\\Fonts\\Accidental_Presidency.ttf", 12)
players[i].index:SetShadowColor(0, 0, 0)
players[i].index:SetShadowOffset(1, -1)
players[i].index:SetPoint("LEFT", P:Scale(1), 0)
if i == 1 then
players[i]:SetPoint("TOPLEFT")
elseif i % 20 == 1 then
players[i]:SetPoint("TOPLEFT", players[i-20], "TOPRIGHT", P:Scale(-1), 0)
else
players[i]:SetPoint("TOPLEFT", players[i-1], "BOTTOMLEFT", 0, P:Scale(1))
end
players[i]:SetScript("OnClick", function(self)
local found
for k, n in pairs(names) do
if n == self.name then
found = k
break
end
end
if found then
tremove(names, found)
else
tinsert(names, self.name)
end
box:SetText(table.concat(names, "\n"))
UpdatePlayerList()
end)
end
playerListFrame:SetScript("OnShow", function()
names = F:Copy(quickAssistTable["filters"][selectedFilter][2])
local i = 1
for unit in F:IterateGroupMembers() do
players[i]:Show()
local name = GetUnitName(unit, true)
local class = UnitClassBase(unit)
players[i].name = name
F:UpdateTextWidth(players[i].label, name, {"percentage", 0.8}, players[i])
players[i].label:SetTextColor(F:GetClassColor(class))
i = i + 1
end
for j = i, 40 do
players[j]:Hide()
end
UpdatePlayerList()
end)
end
local function CreateNameFilter(parent)
local b = Cell:CreateButton(parent, L["Name List"], "accent-hover", {200, 20})
b.frameLevel = b:GetFrameLevel()
b:Hide()
nameListFrame = CreateFrame("Frame", nil, parent, "BackdropTemplate")
Cell:StylizeFrame(nameListFrame, nil, Cell:GetAccentColorTable())
nameListFrame:SetPoint("BOTTOMLEFT", b, "TOPLEFT", 0, 5)
nameListFrame:SetFrameLevel(parent:GetFrameLevel()+50)
nameListFrame:SetSize(200, 280)
nameListFrame:Hide()
local box = Cell:CreateScrollEditBox(nameListFrame)
box:SetPoint("TOPLEFT", 5, -5)
box:SetPoint("BOTTOMRIGHT", -5, 30)
box.eb:SetScript("OnTextChanged", function(self, userChanged)
if not userChanged then return end
names = {strsplit("\n", box:GetText())}
UpdatePlayerList()
end)
nameListFrame:SetScript("OnShow", function()
b:SetFrameLevel(parent:GetFrameLevel()+50)
Cell:CreateMask(Cell.frames.utilitiesTab, nil, {1, -1, -1, 1})
box:SetText(table.concat(quickAssistTable["filters"][selectedFilter][2], "\n"))
end)
nameListFrame:SetScript("OnHide", function()
b:SetFrameLevel(b.frameLevel)
nameListFrame:Hide()
Cell.frames.utilitiesTab.mask:Hide()
end)
CreatePlayerList(nameListFrame, box)
local saveBtn = Cell:CreateButton(nameListFrame, L["Save"], "green", {93, 20})
saveBtn:SetPoint("BOTTOMLEFT", 5, 5)
saveBtn:SetScript("OnClick", function()
for i = #names, 1, -1 do
names[i] = strtrim(names[i])
if names[i] == "" then
tremove(names, i)
end
end
quickAssistTable["filters"][selectedFilter][2] = F:Copy(names)
nameListFrame:Hide()
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end)
local discardBtn = Cell:CreateButton(nameListFrame, L["Discard"], "red", {92, 20})
discardBtn:SetPoint("BOTTOMRIGHT", -5, 5)
discardBtn:SetScript("OnClick", function()
nameListFrame:Hide()
end)
b:SetScript("OnClick", function()
if nameListFrame:IsShown() then
nameListFrame:Hide()
else
nameListFrame:Show()
end
end)
return b
end
-- spec filter ----------------------------------------------------------- --
local SPEC_FILTER_SIZE = 24
local function CreateSpecFilter(parent)
local f = CreateFrame("Frame", nil, parent)
f:SetSize(412, P:Scale(SPEC_FILTER_SIZE)*4)
f:Hide()
local frames = {}
local buttons = {}
for _, ct in pairs(defaultSpecFilter) do
local class = ct[1]
-- class frame
frames[class] = CreateFrame("Frame", nil, f)
frames[class]:SetSize(P:Scale(SPEC_FILTER_SIZE), P:Scale(SPEC_FILTER_SIZE)*#ct[2]+P:Scale(1)*(#ct[2]-1))
frames[class]._class = class
frames[class]:SetMovable(true)
frames[class].onDragStart = function()
frames[class]:SetFrameStrata("TOOLTIP")
frames[class]:StartMoving()
frames[class]:SetUserPlaced(false)
end
frames[class].onDragStop = function()
frames[class]:StopMovingOrSizing()
frames[class]:SetFrameStrata("LOW")
-- self:Hide() --! Hide() will cause OnDragStop trigger TWICE!!!
C_Timer.After(0.05, function()
local mf = GetMouseFocus()
if mf then mf = mf:GetParent() end
if mf and mf._class then
local oldIndex, oldValue, newIndex
for i, t in pairs(quickAssistTable["filters"][selectedFilter][2]) do
if class == t[1] then
oldValue = t
oldIndex = i
elseif mf._class == t[1] then
newIndex = i
end
end
-- print(class, oldIndex, "->", mf._class, newIndex)
if oldIndex and oldValue and newIndex then
tremove(quickAssistTable["filters"][selectedFilter][2], oldIndex)
tinsert(quickAssistTable["filters"][selectedFilter][2], newIndex, oldValue)
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
end
f:SetSpecs(quickAssistTable["filters"][selectedFilter][2])
end)
end
-- spec buttons
local last
for _, st in pairs(ct[2]) do
local spec = st[1]
buttons[spec] = Cell:CreateButton(frames[class], nil, "accent-hover", {SPEC_FILTER_SIZE, SPEC_FILTER_SIZE})
buttons[spec]:SetTexture(specIcons[spec], {SPEC_FILTER_SIZE-4, SPEC_FILTER_SIZE-4}, {"CENTER", 0, 0}, false, true)
buttons[spec].tex:SetTexCoord(0.12, 0.88, 0.12, 0.88)
buttons[spec]:SetScript("OnClick", function()
-- find spec
for _, t in pairs(quickAssistTable["filters"][selectedFilter][2]) do
if t[1] == class then
for _, _t in pairs(t[2]) do
if _t[1] == spec then
_t[2] = not _t[2]
break
end
end
break
end
end
f:SetSpecs(quickAssistTable["filters"][selectedFilter][2])
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end)
buttons[spec]:SetScript("OnEnter", function(self) self:SetBackdropColor(F:GetClassColor(class)) end)
buttons[spec]:RegisterForDrag("LeftButton")
buttons[spec]:SetScript("OnDragStart", frames[class].onDragStart)
buttons[spec]:SetScript("OnDragStop", frames[class].onDragStop)
if last then
buttons[spec]:SetPoint("TOPLEFT", last, "BOTTOMLEFT", 0, P:Scale(-1))
else
buttons[spec]:SetPoint("TOPLEFT")
end
last = buttons[spec]
end
end
function f:SetSpecs(t)
for k, ct in pairs(t) do
local class = ct[1]
-- class order
frames[class]:SetFrameStrata("DIALOG")
frames[class]:ClearAllPoints()
frames[class]:SetPoint("TOPLEFT", (k-1)*(P:Scale(SPEC_FILTER_SIZE)+P:Scale(3)), 0)
frames[class]:Show()
-- spec state
for _, st in pairs(ct[2]) do
local spec, enabled = unpack(st)
if enabled then -- enabled
buttons[spec]:SetBackdropBorderColor(F:GetClassColor(class))
buttons[spec].tex:SetDesaturated(false)
buttons[spec]:SetAlpha(1)
else
buttons[spec]:SetBackdropBorderColor(0, 0, 0)
buttons[spec].tex:SetDesaturated(true)
buttons[spec]:SetAlpha(0.75)
end
end
end
end
return f
end
-- class order ----------------------------------------------------------- --
--[[
local ORDER_ICON_SIZE = 24
local function CreateClassOrderWidget(parent)
local f = CreateFrame("Frame", nil, parent)
f:SetPoint("TOPLEFT", P:Scale(5), P:Scale(-27))
P:Size(f, 412, ORDER_ICON_SIZE)
local buttons = {}
for class in F:IterateClasses() do
buttons[class] = Cell:CreateButton(f, nil, "accent-hover", {ORDER_ICON_SIZE, ORDER_ICON_SIZE})
buttons[class]:SetTexture("classicon-"..strlower(class), {ORDER_ICON_SIZE-4, ORDER_ICON_SIZE-4}, {"CENTER", 0, 0}, true, true)
buttons[class]._class = class
buttons[class]:SetMovable(true)
buttons[class]:RegisterForDrag("LeftButton")
buttons[class]:SetScript("OnDragStart", function(self)
self:SetFrameStrata("TOOLTIP")
self:StartMoving()
self:SetUserPlaced(false)
end)
buttons[class]:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
self:SetFrameStrata("LOW")
-- self:Hide() --! Hide() will cause OnDragStop trigger TWICE!!!
C_Timer.After(0.05, function()
local b = GetMouseFocus()
if b and b._class then
local classToIndex = F:ConvertTable(layoutTable["order"])
-- print(self._class, "->", b._class)
local oldIndex = classToIndex[self._class]
tremove(layoutTable["order"], oldIndex)
local newIndex = classToIndex[b._class]
tinsert(layoutTable["order"], newIndex, self._class)
Cell:Fire("UpdateQuickAssist", "order")
end
f:Load(layoutTable["order"])
end)
end)
end
function f:Load(t)
for i, class in pairs(t) do
buttons[class]:SetFrameStrata("DIALOG")
buttons[class]:Show()
buttons[class]:ClearAllPoints()
buttons[class]:SetPoint("TOPLEFT", (i-1)*(P:Scale(ORDER_ICON_SIZE)+P:Scale(3)), 0)
end
end
return f
end
]]
local HighlightFilter
local romanNumerals = {"I", "II", "III", "IV", "V", "VI", "VII"}
local function CreateLayoutPane()
pages.layout = CreateFrame("Frame", nil, quickAssistTab)
pages.layout:SetAllPoints(setupPane)
pages.layout:Hide()
pages.layout:SetScript("OnShow", ShowLayoutPreview)
pages.layout:SetScript("OnHide", HideLayoutPreview)
anchorDropdown = Cell:CreateDropdown(pages.layout, 117)
anchorDropdown:SetPoint("TOPLEFT", 5, -42)
anchorDropdown:SetLabel(L["Anchor Point"])
local points = {"BOTTOMLEFT", "BOTTOMRIGHT", "TOPLEFT", "TOPRIGHT"}
local items = {}
for _, p in pairs(points) do
tinsert(items, {
["text"] = L[p],
["value"] = p,
["onClick"] = function()
layoutTable["anchor"] = p
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
})
end
anchorDropdown:SetItems(items)
orientationDropdown = Cell:CreateDropdown(pages.layout, 117)
orientationDropdown:SetPoint("TOPLEFT", anchorDropdown, "TOPRIGHT", 30, 0)
orientationDropdown:SetLabel(L["Orientation"])
orientationDropdown:SetItems({
{
["text"] = L["Horizontal"],
["value"] = "horizontal",
["onClick"] = function()
layoutTable["orientation"] = "horizontal"
unitsSlider:SetLabel(L["Units Per Row"])
maxSlider:SetLabel(L["Max Rows"])
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end,
},
{
["text"] = L["Vertical"],
["value"] = "vertical",
["onClick"] = function()
layoutTable["orientation"] = "vertical"
unitsSlider:SetLabel(L["Units Per Column"])
maxSlider:SetLabel(L["Max Columns"])
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end,
},
})
widthSlider = Cell:CreateSlider(L["Width"], pages.layout, 20, 300, 117, 1)
widthSlider:SetPoint("TOPLEFT", anchorDropdown, 0, -50)
widthSlider.afterValueChangedFn = function(value)
layoutTable["size"][1] = value
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
heightSlider = Cell:CreateSlider(L["Height"], pages.layout, 20, 300, 117, 1)
heightSlider:SetPoint("TOPLEFT", widthSlider, 0, -50)
heightSlider.afterValueChangedFn = function(value)
layoutTable["size"][2] = value
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
xSlider = Cell:CreateSlider(L["Spacing"].." X", pages.layout, -1, 100, 117, 1)
xSlider:SetPoint("TOPLEFT", orientationDropdown, 0, -50)
xSlider.afterValueChangedFn = function(value)
layoutTable["spacingX"] = value
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
ySlider = Cell:CreateSlider(L["Spacing"].." Y", pages.layout, -1, 100, 117, 1)
ySlider:SetPoint("TOPLEFT", xSlider, 0, -50)
ySlider.afterValueChangedFn = function(value)
layoutTable["spacingY"] = value
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
unitsSlider = Cell:CreateSlider(L["Units Per Column"], pages.layout, 2, 20, 117, 1)
unitsSlider:SetPoint("TOPLEFT", xSlider, "TOPRIGHT", 30, 0)
unitsSlider.afterValueChangedFn = function(value)
layoutTable["unitsPerColumn"] = value
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
maxSlider = Cell:CreateSlider(L["Max Columns"], pages.layout, 1, 10, 117, 1)
maxSlider:SetPoint("TOPLEFT", unitsSlider, 0, -50)
maxSlider.afterValueChangedFn = function(value)
layoutTable["maxColumns"] = value
Cell:Fire("UpdateQuickAssist", "layout")
UpdateLayoutPreview()
end
--* filter ---------------------------------------------------------------- --
local filterPane = Cell:CreateTitledPane(pages.layout, L["Unit Filter"], 422, 175)
filterPane:SetPoint("TOPLEFT", 0, -210)
filterTypeDropdown = Cell:CreateDropdown(filterPane, 117)
filterTypeDropdown:SetPoint("TOPLEFT", 5, -27)
filterTypeDropdown:SetItems({
{
["text"] = L["Role Filter"],
["value"] = "role",
["onClick"] = function()
if quickAssistTable["filters"][selectedFilter][1] ~= "role" then
quickAssistTable["filters"][selectedFilter][1] = "role"
quickAssistTable["filters"][selectedFilter][2] = F:Copy(defaultRoleFilter)
ShowFilter(selectedFilter)
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
end,
},
{
["text"] = L["Class Filter"],
["value"] = "class",
["onClick"] = function()
if quickAssistTable["filters"][selectedFilter][1] ~= "class" then
quickAssistTable["filters"][selectedFilter][1] = "class"
quickAssistTable["filters"][selectedFilter][2] = F:Copy(defaultClassFilter)
ShowFilter(selectedFilter)
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
end,
},
{
["text"] = L["Spec Filter"],
["value"] = "spec",
["onClick"] = function()
if quickAssistTable["filters"][selectedFilter][1] ~= "spec" then
quickAssistTable["filters"][selectedFilter][1] = "spec"
quickAssistTable["filters"][selectedFilter][2] = F:Copy(defaultSpecFilter)
ShowFilter(selectedFilter)
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
end,
},
{
["text"] = L["Name Filter"],
["value"] = "name",
["onClick"] = function()
if quickAssistTable["filters"][selectedFilter][1] ~= "name" then
quickAssistTable["filters"][selectedFilter][1] = "name"
quickAssistTable["filters"][selectedFilter][2] = {}
quickAssistTable["filters"][selectedFilter][3] = false
ShowFilter(selectedFilter)
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end
end,
},
})
hideSelfCB = Cell:CreateCheckButton(filterPane, L["Hide Self"].." ("..L["Party"]..")", function(checked, self)
quickAssistTable["filters"][selectedFilter][3] = checked
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end)
hideSelfCB:SetPoint("TOPLEFT", filterTypeDropdown, "TOPRIGHT", 30, -3)
roleFilter = CreateRoleFilter(filterPane)
roleFilter:SetPoint("TOPLEFT", filterTypeDropdown, "BOTTOMLEFT", 0, -10)
classFilter = CreateClassFilter(filterPane)
classFilter:SetPoint("TOPLEFT", filterTypeDropdown, "BOTTOMLEFT", 0, -10)
specFilter = CreateSpecFilter(filterPane)
specFilter:SetPoint("TOPLEFT", filterTypeDropdown, "BOTTOMLEFT", 0, -10)
nameFilter = CreateNameFilter(filterPane)
nameFilter:SetPoint("TOPLEFT", filterTypeDropdown, "BOTTOMLEFT", 0, -10)
filterResetBtn = Cell:CreateButton(filterPane, L["Reset"], "accent", {50, 17})
filterResetBtn:SetPoint("BOTTOMLEFT")
filterResetBtn:SetScript("OnClick", function()
if quickAssistTable["filters"][selectedFilter][1] == "class" then
quickAssistTable["filters"][selectedFilter][2] = F:Copy(defaultClassFilter)
classFilter:SetClasses(quickAssistTable["filters"][selectedFilter][2])
elseif quickAssistTable["filters"][selectedFilter][1] == "spec" then
quickAssistTable["filters"][selectedFilter][2] = F:Copy(defaultSpecFilter)
specFilter:SetSpecs(quickAssistTable["filters"][selectedFilter][2])
end
if selectedFilter == activeFilter then
Cell:Fire("UpdateQuickAssist", "filter")
end
end)
filterResetTips = filterPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
filterResetTips:SetPoint("LEFT", filterResetBtn, "RIGHT", 5, 0)
filterResetTips:SetText("|cffababab"..L["Left-Click"]..": "..L["toggle"]..", "..L["Left-Drag"]..": "..L["change the order"])
for i = 7, 1, -1 do
filterButtons[i] = Cell:CreateButton(filterPane, romanNumerals[i], "accent-hover", {37, 17})
filterButtons[i].id = i
if i == 7 then
filterButtons[i]:SetPoint("TOPRIGHT")
else
filterButtons[i]:SetPoint("TOPRIGHT", filterButtons[i+1], "TOPLEFT", P:Scale(1), 0)
end
end
HighlightFilter = Cell:CreateButtonGroup(filterButtons, function(id)
selectedFilter = id
ShowFilter(id)
end)
--* order ----------------------------------------------------------------- --
-- local orderPane = Cell:CreateTitledPane(pages.layout, L["Class Order"], 422, 80)
-- orderPane:SetPoint("TOPLEFT", 0, P:Scale(-330))
-- classOrderWidget = CreateClassOrderWidget(orderPane)
-- orderResetBtn = Cell:CreateButton(orderPane, L["Reset"], "accent", {50, 17})
-- orderResetBtn:SetPoint("TOPRIGHT")
-- orderResetBtn:SetScript("OnClick", function()
-- layoutTable["order"] = F:GetSortedClasses()
-- classOrderWidget:Load(layoutTable["order"])
-- Cell:Fire("UpdateQuickAssist", "order")
-- end)
end
-- ----------------------------------------------------------------------- --
-- filter auto switch --
-- ----------------------------------------------------------------------- --
local asterisk
local function CreateAutoSwitchFrame()
autoSwitchFrame = Cell:CreateFrame("CellQuickAssistFilterAutoSwitchFrame", pages.layout, 160, 185)
autoSwitchFrame:SetPoint("BOTTOMLEFT", quickAssistTab, "BOTTOMRIGHT", 5, 0)
autoSwitchFrame:Show()
local autoSwitchPane = Cell:CreateTitledPane(autoSwitchFrame, L["Filter Auto Switch"], 150, 171)
autoSwitchPane:SetPoint("TOPLEFT", 5, -5)
asterisk = autoSwitchPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_CLASS")
asterisk:SetText("*")
local items = {}
for i = 0, 7 do
tinsert(items, {
["text"] = i == 0 and "|cffc7c7c7"..L["Hide"] or romanNumerals[i],
["value"] = i,
["onClick"] = function(_, _, id)
quickAssistTable["filterAutoSwitch"][id] = i
if Cell.vars.quickAssistGroupType == id then
if i == 0 then
filterButtons[1]:GetScript("OnClick")()
selectedFilter = 1
else
filterButtons[i]:GetScript("OnClick")()
selectedFilter = i
end
Cell:Fire("UpdateQuickAssist", "filter")
end
end
})
end
-- party
partyDropdown = Cell:CreateDropdown(autoSwitchPane, 40, nil, true, true)
partyDropdown:SetPoint("TOPLEFT", 5, -27)
partyDropdown.id = "party"
partyDropdown:SetItems(items)
partyText = autoSwitchPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
partyText:SetPoint("LEFT", partyDropdown, "RIGHT", 5, 0)
partyText:SetText(_G.PARTY)
-- raid
raidDropdown = Cell:CreateDropdown(autoSwitchPane, 40, nil, true, true)
raidDropdown:SetPoint("TOPLEFT", partyDropdown, "BOTTOMLEFT", 0, -10)
raidDropdown.id = "raid"
raidDropdown:SetItems(items)
raidText = autoSwitchPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
raidText:SetPoint("LEFT", raidDropdown, "RIGHT", 5, 0)
raidText:SetText(_G.RAID)
-- mythic
mythicDropdown = Cell:CreateDropdown(autoSwitchPane, 40, nil, true, true)
mythicDropdown:SetPoint("TOPLEFT", raidDropdown, "BOTTOMLEFT", 0, -10)
mythicDropdown.id = "mythic"
mythicDropdown:SetItems(items)
mythicText = autoSwitchPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
mythicText:SetPoint("LEFT", mythicDropdown, "RIGHT", 5, 0)
mythicText:SetText(_G.RAID.." ".._G.PLAYER_DIFFICULTY6)
-- arena
arenaDropdown = Cell:CreateDropdown(autoSwitchPane, 40, nil, true, true)
arenaDropdown:SetPoint("TOPLEFT", mythicDropdown, "BOTTOMLEFT", 0, -10)
arenaDropdown.id = "arena"
arenaDropdown:SetItems(items)
arenaText = autoSwitchPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
arenaText:SetPoint("LEFT", arenaDropdown, "RIGHT", 5, 0)
arenaText:SetText(_G.ARENA)
-- battleground
bgDropdown = Cell:CreateDropdown(autoSwitchPane, 40, nil, true, true)
bgDropdown:SetPoint("TOPLEFT", arenaDropdown, "BOTTOMLEFT", 0, -10)
bgDropdown.id = "battleground"
bgDropdown:SetItems(items)
bgText = autoSwitchPane:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
bgText:SetPoint("LEFT", bgDropdown, "RIGHT", 5, 0)
bgText:SetText(_G.BATTLEGROUND)
end
-- ----------------------------------------------------------------------- --
-- style --
-- ----------------------------------------------------------------------- --
-- texture --------------------------------------------------------------- --
local LSM = LibStub("LibSharedMedia-3.0", true)
local textures, textureNames
local function LoadTextures()
local items = {}
local defaultTexture, defaultTextureName = "Interface\\AddOns\\Cell\\Media\\statusbar.tga", "Cell ".._G.DEFAULT
textures, textureNames = F:Copy(LSM:HashTable("statusbar")), F:Copy(LSM:List("statusbar"))
-- make default texture first
F:TRemove(textureNames, defaultTextureName)
tinsert(textureNames, 1, defaultTextureName)
for _, name in pairs(textureNames) do
tinsert(items, {
["text"] = name,
["texture"] = textures[name],
["onClick"] = function()
styleTable["texture"] = name
Cell:Fire("UpdateQuickAssist", "style")
end,
})
end
textureDropdown:SetItems(items)
end
-- name width ------------------------------------------------------------ --
local function CreateNameWidth(parent)
local f = CreateFrame("Frame", nil, parent)
P:Size(f, 117, 20)
local dropdown, percentDropdown, lengthEB, lengthEB2
dropdown = Cell:CreateDropdown(f, 117)
dropdown:SetPoint("TOPLEFT")
dropdown:SetLabel(L["Text Width"])
dropdown:SetItems({
{
["text"] = L["Unlimited"],
["onClick"] = function()
styleTable["name"]["width"] = "unlimited"
Cell:Fire("UpdateQuickAssist", "style")
percentDropdown:Hide()
lengthEB:Hide()
lengthEB2:Hide()
lengthEB.value = nil
lengthEB2.value = nil
end,
},
{
["text"] = L["Percentage"],
["onClick"] = function()
styleTable["name"]["width"] = {"percentage", 0.75}
Cell:Fire("UpdateQuickAssist", "style")
percentDropdown:SetSelectedValue(0.75)
percentDropdown:Show()
lengthEB:Hide()
lengthEB2:Hide()
lengthEB.value = nil
lengthEB2.value = nil
end,
},
{
["text"] = L["Length"],
["onClick"] = function()
styleTable["name"]["width"] = {"length", 5, 3}
Cell:Fire("UpdateQuickAssist", "style")
percentDropdown:Hide()
lengthEB:SetText(5)
lengthEB:Show()
lengthEB2:SetText(3)
lengthEB2:Show()
lengthEB.value = 5
lengthEB2.value = 3
end,
},
})
percentDropdown = Cell:CreateDropdown(f, 75)
percentDropdown:SetPoint("TOPLEFT", dropdown, "TOPRIGHT", 30, 0)
Cell:SetTooltips(percentDropdown.button, "ANCHOR_TOP", 0, 3, L["Name Width / UnitButton Width"])
percentDropdown:SetItems({
{
["text"] = "100%",
["value"] = 1,
["onClick"] = function()
styleTable["name"]["width"][2] = 1
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = "75%",
["value"] = 0.75,
["onClick"] = function()
styleTable["name"]["width"][2] = 0.75
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = "50%",
["value"] = 0.5,
["onClick"] = function()
styleTable["name"]["width"][2] = 0.5
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = "25%",
["value"] = 0.25,
["onClick"] = function()
styleTable["name"]["width"][2] = 0.25
Cell:Fire("UpdateQuickAssist", "style")
end,
},
})
lengthEB = Cell:CreateEditBox(f, 34, 20, false, false, true)
lengthEB:SetPoint("TOPLEFT", dropdown, "TOPRIGHT", 30, 0)
lengthEB.text = lengthEB:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
lengthEB.text:SetText(L["En"])
lengthEB.text:SetPoint("BOTTOMLEFT", lengthEB, "TOPLEFT", 0, 1)
lengthEB.confirmBtn = Cell:CreateButton(lengthEB, "OK", "accent", {27, 20})
lengthEB.confirmBtn:SetPoint("TOPLEFT", lengthEB, "TOPRIGHT", -1, 0)
lengthEB.confirmBtn:Hide()
lengthEB.confirmBtn:SetScript("OnHide", function()
lengthEB.confirmBtn:Hide()
end)
lengthEB.confirmBtn:SetScript("OnClick", function()
local length = tonumber(lengthEB:GetText())
lengthEB:SetText(length)
lengthEB:ClearFocus()
lengthEB.confirmBtn:Hide()
lengthEB.value = length
styleTable["name"]["width"][2] = length
Cell:Fire("UpdateQuickAssist", "style")
end)
lengthEB:SetScript("OnTextChanged", function(self, userChanged)
if userChanged then
local length = tonumber(self:GetText())
if length and length ~= lengthEB.value and length ~= 0 then
lengthEB.confirmBtn:Show()
else
lengthEB.confirmBtn:Hide()
end
end
end)
lengthEB2 = Cell:CreateEditBox(f, 33, 20, false, false, true)
lengthEB2:SetPoint("TOPLEFT", lengthEB, "TOPRIGHT", 25, 0)
lengthEB2.text = lengthEB2:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
lengthEB2.text:SetText(L["Non-En"])
lengthEB2.text:SetPoint("BOTTOMLEFT", lengthEB2, "TOPLEFT", 0, 1)
lengthEB2.confirmBtn = Cell:CreateButton(lengthEB2, "OK", "accent", {27, 20})
lengthEB2.confirmBtn:SetPoint("TOPLEFT", lengthEB2, "TOPRIGHT", -1, 0)
lengthEB2.confirmBtn:Hide()
lengthEB2.confirmBtn:SetScript("OnHide", function()
lengthEB2.confirmBtn:Hide()
end)
lengthEB2.confirmBtn:SetScript("OnClick", function()
local length = tonumber(lengthEB2:GetText())
lengthEB2:SetText(length)
lengthEB2:ClearFocus()
lengthEB2.confirmBtn:Hide()
lengthEB2.value = length
styleTable["name"]["width"][3] = length
Cell:Fire("UpdateQuickAssist", "style")
end)
lengthEB2:SetScript("OnTextChanged", function(self, userChanged)
if userChanged then
local length = tonumber(self:GetText())
if length and length ~= lengthEB2.value and length ~= 0 then
lengthEB2.confirmBtn:Show()
else
lengthEB2.confirmBtn:Hide()
end
end
end)
function f:SetNameWidth(t)
if t == "unlimited" then
dropdown:SetSelectedItem(1)
percentDropdown:Hide()
lengthEB:Hide()
lengthEB2:Hide()
elseif t[1] == "percentage" then
dropdown:SetSelectedItem(2)
percentDropdown:SetSelectedValue(t[2])
percentDropdown:Show()
lengthEB:Hide()
lengthEB2:Hide()
elseif t[1] == "length" then
dropdown:SetSelectedItem(3)
lengthEB:SetText(t[2])
lengthEB.value = t[2]
lengthEB:Show()
lengthEB2:SetText(t[3])
lengthEB2.value = t[3]
lengthEB2:Show()
percentDropdown:Hide()
end
end
return f
end
local function CreateStylePane()
pages.style = CreateFrame("Frame", nil, quickAssistTab)
pages.style:SetAllPoints(setupPane)
pages.style:Hide()
hpColorDropdown = Cell:CreateDropdown(pages.style, 160)
hpColorDropdown:SetPoint("TOPLEFT", pages.style, "TOPLEFT", 5, -42)
hpColorDropdown:SetLabel(L["Health Bar Color"])
hpColorDropdown:SetItems({
{
["text"] = L["Class Color"],
["value"] = "class_color",
["onClick"] = function()
styleTable["hpColor"][1] = "class_color"
hpCP:Hide()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = L["Class Color (dark)"],
["value"] = "class_color_dark",
["onClick"] = function()
styleTable["hpColor"][1] = "class_color_dark"
hpCP:Hide()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = L["Custom Color"],
["value"] = "custom",
["onClick"] = function()
styleTable["hpColor"][1] = "custom"
hpCP:Show()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
})
hpCP = Cell:CreateColorPicker(pages.style, "", true, function(r, g, b, a)
styleTable["hpColor"][2][1] = r
styleTable["hpColor"][2][2] = g
styleTable["hpColor"][2][3] = b
styleTable["hpColor"][2][4] = a
Cell:Fire("UpdateQuickAssist", "style")
end)
hpCP:SetPoint("LEFT", hpColorDropdown, "RIGHT", 2, 0)
lossColorDropdown = Cell:CreateDropdown(pages.style, 160)
lossColorDropdown:SetPoint("TOPLEFT", hpColorDropdown, "TOPRIGHT", 57, 0)
lossColorDropdown:SetLabel(L["Health Loss Color"])
lossColorDropdown:SetItems({
{
["text"] = L["Class Color"],
["value"] = "class_color",
["onClick"] = function()
styleTable["lossColor"][1] = "class_color"
bgCP:Hide()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = L["Class Color (dark)"],
["value"] = "class_color_dark",
["onClick"] = function()
styleTable["lossColor"][1] = "class_color_dark"
bgCP:Hide()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = L["Custom Color"],
["value"] = "custom",
["onClick"] = function()
styleTable["lossColor"][1] = "custom"
bgCP:Show()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
})
bgCP = Cell:CreateColorPicker(pages.style, "", true, function(r, g, b, a)
styleTable["lossColor"][2][1] = r
styleTable["lossColor"][2][2] = g
styleTable["lossColor"][2][3] = b
styleTable["lossColor"][2][4] = a
Cell:Fire("UpdateQuickAssist", "style")
end)
bgCP:SetPoint("LEFT", lossColorDropdown, "RIGHT", 2, 0)
textureDropdown = Cell:CreateDropdown(pages.style, 160, "texture")
textureDropdown:SetPoint("TOPLEFT", hpColorDropdown, 0, -50)
textureDropdown:SetLabel(L["Texture"])
LoadTextures()
alphaSlider = Cell:CreateSlider(L["Out of Range Alpha"], pages.style, 0, 100, 160, 1)
alphaSlider:SetPoint("TOPLEFT", textureDropdown, "TOPRIGHT", 57, 0)
alphaSlider.afterValueChangedFn = function(value)
styleTable["oorAlpha"] = value/100
Cell:Fire("UpdateQuickAssist", "style")
end
targetColorPicker = Cell:CreateColorPicker(pages.style, L["Target Highlight Color"], true, function(r, g, b, a)
styleTable["targetColor"][1] = r
styleTable["targetColor"][2] = g
styleTable["targetColor"][3] = b
styleTable["targetColor"][4] = a
Cell:Fire("UpdateQuickAssist", "style")
end)
targetColorPicker:SetPoint("TOPLEFT", textureDropdown, "BOTTOMLEFT", 0, -20)
mouseoverColorPicker = Cell:CreateColorPicker(pages.style, L["Mouseover Highlight Color"], true, function(r, g, b, a)
styleTable["mouseoverColor"][1] = r
styleTable["mouseoverColor"][2] = g
styleTable["mouseoverColor"][3] = b
styleTable["mouseoverColor"][4] = a
Cell:Fire("UpdateQuickAssist", "style")
end)
mouseoverColorPicker:SetPoint("TOPLEFT", targetColorPicker, "BOTTOMLEFT", 0, -10)
highlightSizeSlider = Cell:CreateSlider(L["Highlight Size"], pages.style, -5, 5, 160, 1)
highlightSizeSlider:SetPoint("TOPLEFT", alphaSlider, 0, -50)
highlightSizeSlider.afterValueChangedFn = function(value)
styleTable["highlightSize"] = value
Cell:Fire("UpdateQuickAssist", "style")
end
--* name ------------------------------------------------------------------ --
local namePane = Cell:CreateTitledPane(pages.style, L["Name Text"], 422, 175)
namePane:SetPoint("TOPLEFT", 0, -210)
nameColorDropdown = Cell:CreateDropdown(namePane, 117)
nameColorDropdown:SetPoint("TOPLEFT", namePane, 5, -42)
nameColorDropdown:SetLabel(L["Color"])
nameColorDropdown:SetItems({
{
["text"] = L["Class Color"],
["value"] = "class_color",
["onClick"] = function()
styleTable["name"]["color"][1] = "class_color"
nameCP:Hide()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
{
["text"] = L["Custom Color"],
["value"] = "custom",
["onClick"] = function()
styleTable["name"]["color"][1] = "custom"
nameCP:Show()
Cell:Fire("UpdateQuickAssist", "style")
end,
},
})
nameCP = Cell:CreateColorPicker(namePane, "", false, function(r, g, b, a)
styleTable["name"]["color"][2][1] = r
styleTable["name"]["color"][2][2] = g
styleTable["name"]["color"][2][3] = b
Cell:Fire("UpdateQuickAssist", "style")
end)
nameCP:SetPoint("LEFT", nameColorDropdown, "RIGHT", 2, 0)
nameWidth = CreateNameWidth(namePane)
nameWidth:SetPoint("TOPLEFT", nameColorDropdown, "TOPRIGHT", 30, 0)
nameAnchorDropdown = Cell:CreateDropdown(namePane, 117)
nameAnchorDropdown:SetPoint("TOPLEFT", nameColorDropdown, 0, -50)
nameAnchorDropdown:SetLabel(L["Anchor Point"])
items = {}
for _, v in pairs(anchorPoints) do
tinsert(items, {
["text"] = L[v],
["value"] = v,
["onClick"] = function()
styleTable["name"]["position"][1] = v
Cell:Fire("UpdateQuickAssist", "style")
end,
})
end
nameAnchorDropdown:SetItems(items)
nameXSlider = Cell:CreateSlider(L["X Offset"], namePane, -100, 100, 117, 1)
nameXSlider:SetPoint("TOPLEFT", nameAnchorDropdown, "TOPRIGHT", 30, 0)
nameXSlider.afterValueChangedFn = function(value)
styleTable["name"]["position"][2] = value
Cell:Fire("UpdateQuickAssist", "style")
end
nameYSlider = Cell:CreateSlider(L["Y Offset"], namePane, -100, 100, 117, 1)
nameYSlider:SetPoint("TOPLEFT", nameXSlider, "TOPRIGHT", 30, 0)
nameYSlider.afterValueChangedFn = function(value)
styleTable["name"]["position"][3] = value
Cell:Fire("UpdateQuickAssist", "style")
end
nameFontDropdown = Cell:CreateDropdown(namePane, 117)
nameFontDropdown:SetPoint("TOPLEFT", nameAnchorDropdown, 0, -50)
nameFontDropdown:SetLabel(L["Font"])
local items, fonts, defaultFontName, defaultFont = F:GetFontItems()
for _, item in pairs(items) do
item["onClick"] = function()
styleTable["name"]["font"][1] = item["text"]
Cell:Fire("UpdateQuickAssist", "style")
end
end
nameFontDropdown:SetItems(items)
function nameFontDropdown:SetFont(font)
nameFontDropdown:SetSelected(font, fonts[font])
end
nameOutlineDropdown = Cell:CreateDropdown(namePane, 117)
nameOutlineDropdown:SetPoint("TOPLEFT", nameFontDropdown, "TOPRIGHT", 30, 0)
nameOutlineDropdown:SetLabel(L["Outline"])
items = {}
for _, v in pairs(outlines) do
tinsert(items, {
["text"] = L[v],
["value"] = v,
["onClick"] = function()
styleTable["name"]["font"][3] = v
Cell:Fire("UpdateQuickAssist", "style")
end,
})
end
nameOutlineDropdown:SetItems(items)
nameSizeSilder = Cell:CreateSlider(L["Size"], namePane, 5, 50, 117, 1)
nameSizeSilder:SetPoint("TOPLEFT", nameOutlineDropdown, "TOPRIGHT", 30, 0)
nameSizeSilder.afterValueChangedFn = function(value)
styleTable["name"]["font"][2] = value
Cell:Fire("UpdateQuickAssist", "style")
end
end
-- ----------------------------------------------------------------------- --
-- spells --
-- ----------------------------------------------------------------------- --
-- icon options ---------------------------------------------------------- --
local iconOptionsFrame
local currentIconOptionBtn, currentIconIndex
local function CreateIconOptions(parent)
iconOptionsFrame = CreateFrame("Frame", nil, parent, "BackdropTemplate")
Cell:StylizeFrame(iconOptionsFrame, nil, Cell:GetAccentColorTable())
iconOptionsFrame:SetFrameLevel(parent:GetFrameLevel()+50)
iconOptionsFrame:Hide()
iconOptionsFrame:SetHeight(190)
iconOptionsFrame:SetPoint("TOP", 0, -90)
iconOptionsFrame:SetPoint("LEFT")
iconOptionsFrame:SetPoint("RIGHT")
-- icon tab -------------------------------------------------------------- --
local iconTab = CreateFrame("Frame", nil, iconOptionsFrame)
iconTab:SetAllPoints(iconOptionsFrame)
iconTab:Hide()
local iconAnchorDropdown = Cell:CreateDropdown(iconTab, 117)
iconAnchorDropdown:SetPoint("TOPLEFT", 5, -27)
iconAnchorDropdown:SetLabel(L["Anchor Point"])
local items = {}
for _, point in pairs(anchorPoints) do
tinsert(items, {
["text"] = L[point],
["value"] = point,
["onClick"] = function()
spellTable[currentIconIndex]["icon"]["position"][1] = point
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end,
})
end
iconAnchorDropdown:SetItems(items)
local iconRelativeToDropdown = Cell:CreateDropdown(iconTab, 117)
iconRelativeToDropdown:SetPoint("TOPLEFT", iconAnchorDropdown, "TOPRIGHT", 30, 0)
iconRelativeToDropdown:SetLabel(L["To UnitButton's"])
items = {}
for _, point in pairs(anchorPoints) do
tinsert(items, {
["text"] = L[point],
["value"] = point,
["onClick"] = function()
spellTable[currentIconIndex]["icon"]["position"][2] = point
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end,
})
end
iconRelativeToDropdown:SetItems(items)
local iconOrientationDropdown = Cell:CreateDropdown(iconTab, 117)
iconOrientationDropdown:SetPoint("TOPLEFT", iconRelativeToDropdown, "TOPRIGHT", 30, 0)
iconOrientationDropdown:SetLabel(L["Orientation"])
items = {}
for _, o in pairs(orientations) do
tinsert(items, {
["text"] = L[o],
["value"] = o,
["onClick"] = function()
spellTable[currentIconIndex]["icon"]["orientation"] = o
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end,
})
end
iconOrientationDropdown:SetItems(items)
local iconGlowDropdown = Cell:CreateDropdown(iconTab, 117)
iconGlowDropdown:SetPoint("TOPLEFT", iconOrientationDropdown, 0, -50)
iconGlowDropdown:SetLabel(L["Glow"])
items = {}
for _, g in pairs(glows) do
tinsert(items, {
["text"] = L[g],
["value"] = g,
["onClick"] = function()
spellTable[currentIconIndex]["icon"]["glow"] = g
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end,
})
end
iconGlowDropdown:SetItems(items)
local iconGlowCP = Cell:CreateColorPicker(iconTab, L["Glow Color"], false, nil, function(r, g, b)
spellTable[currentIconIndex]["icon"]["glowColor"][1] = r
spellTable[currentIconIndex]["icon"]["glowColor"][2] = g
spellTable[currentIconIndex]["icon"]["glowColor"][3] = b
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end)
iconGlowCP:SetPoint("TOPLEFT", iconGlowDropdown, 0, -50)
local iconXSlider = Cell:CreateSlider(L["X Offset"], iconTab, -100, 100, 117, 1)
iconXSlider:SetPoint("TOPLEFT", iconAnchorDropdown, 0, -50)
iconXSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["position"][3] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconYSlider = Cell:CreateSlider(L["Y Offset"], iconTab, -100, 100, 117, 1)
iconYSlider:SetPoint("TOPLEFT", iconXSlider, "TOPRIGHT", 30, 0)
iconYSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["position"][4] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconWidthSlider = Cell:CreateSlider(L["Width"], iconTab, 5, 100, 117, 1)
iconWidthSlider:SetPoint("TOPLEFT", iconXSlider, 0, -50)
iconWidthSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["size"][1] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconHeightSlider = Cell:CreateSlider(L["Height"], iconTab, 5, 100, 117, 1)
iconHeightSlider:SetPoint("TOPLEFT", iconWidthSlider, "TOPRIGHT", 30, 0)
iconHeightSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["size"][2] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconShowAnimationCB = Cell:CreateCheckButton(iconTab, L["showAnimation"], function(checked)
spellTable[currentIconIndex]["icon"]["showAnimation"] = checked
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end)
iconShowAnimationCB:SetPoint("TOPLEFT", iconWidthSlider, 0, -40)
function iconTab:Load(t)
iconTab:Show()
iconAnchorDropdown:SetSelectedValue(t["position"][1])
iconRelativeToDropdown:SetSelectedValue(t["position"][2])
iconOrientationDropdown:SetSelectedValue(t["orientation"])
iconGlowDropdown:SetSelectedValue(t["glow"])
iconXSlider:SetValue(t["position"][3])
iconYSlider:SetValue(t["position"][4])
iconWidthSlider:SetValue(t["size"][1])
iconHeightSlider:SetValue(t["size"][2])
iconShowAnimationCB:SetChecked(t["showAnimation"])
if currentIconIndex == "offensives" then
iconGlowCP:Show()
iconGlowCP:SetColor(t["glowColor"])
else
iconGlowCP:Hide()
end
end
-- font tab -------------------------------------------------------------- --
local fontTab = CreateFrame("Frame", nil, iconOptionsFrame)
fontTab:SetAllPoints(iconOptionsFrame)
fontTab:Hide()
local fontIndex
local iconShowStackCB = Cell:CreateCheckButton(fontTab, L["showStack"], function(checked)
spellTable[currentIconIndex]["icon"]["showStack"] = checked
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end)
iconShowStackCB:SetPoint("TOPLEFT", 5, -27)
local iconDurationDropdown = Cell:CreateDropdown(fontTab, 117)
iconDurationDropdown:SetPoint("TOPLEFT", 5, -27)
iconDurationDropdown:SetLabel(L["showDuration"])
local function ShowDuration(_, show)
spellTable[currentIconIndex]["icon"]["showDuration"] = show
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
iconDurationDropdown:SetItems({
{
["text"] = L["Never"],
["value"] = false,
["onClick"] = ShowDuration,
},
{
["text"] = L["Always"],
["value"] = true,
["onClick"] = ShowDuration,
},
{
["text"] = "< 75%",
["value"] = 0.75,
["onClick"] = ShowDuration,
},
{
["text"] = "< 50%",
["value"] = 0.5,
["onClick"] = ShowDuration,
},
{
["text"] = "< 25%",
["value"] = 0.25,
["onClick"] = ShowDuration,
},
{
["text"] = "< 15 "..L["sec"],
["value"] = 15,
["onClick"] = ShowDuration,
},
{
["text"] = "< 10 "..L["sec"],
["value"] = 10,
["onClick"] = ShowDuration,
},
{
["text"] = "< 5 "..L["sec"],
["value"] = 5,
["onClick"] = ShowDuration,
},
})
local iconFontDropdown = Cell:CreateDropdown(fontTab, 117)
iconFontDropdown:SetPoint("TOPLEFT", iconShowStackCB, 0, -50)
iconFontDropdown:SetLabel(L["Font"])
local items, fonts, defaultFontName, defaultFont = F:GetFontItems()
for _, item in pairs(items) do
item["onClick"] = function()
spellTable[currentIconIndex]["icon"]["font"][fontIndex][1] = item["text"]
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
end
iconFontDropdown:SetItems(items)
function iconFontDropdown:SetFont(font)
iconFontDropdown:SetSelected(font, fonts[font])
end
local iconFontOutlineDropdown = Cell:CreateDropdown(fontTab, 117)
iconFontOutlineDropdown:SetPoint("TOPLEFT", iconFontDropdown, "TOPRIGHT", 30, 0)
iconFontOutlineDropdown:SetLabel(L["Outline"])
items = {}
for _, v in pairs(outlines) do
tinsert(items, {
["text"] = L[v],
["value"] = v,
["onClick"] = function()
spellTable[currentIconIndex]["icon"]["font"][fontIndex][3] = v
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end,
})
end
iconFontOutlineDropdown:SetItems(items)
local iconFontSizeSlider = Cell:CreateSlider(L["Size"], fontTab, 5, 50, 117, 1)
iconFontSizeSlider:SetPoint("TOPLEFT", iconFontOutlineDropdown, "TOPRIGHT", 30, 0)
iconFontSizeSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["font"][fontIndex][2] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconFontAnchorDropdown = Cell:CreateDropdown(fontTab, 117)
iconFontAnchorDropdown:SetPoint("TOPLEFT", iconFontDropdown, 0, -50)
iconFontAnchorDropdown:SetLabel(L["Anchor Point"])
items = {}
for _, v in pairs(anchorPoints) do
tinsert(items, {
["text"] = L[v],
["value"] = v,
["onClick"] = function()
spellTable[currentIconIndex]["icon"]["font"][fontIndex][4] = v
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end,
})
end
iconFontAnchorDropdown:SetItems(items)
local iconFontXSlider = Cell:CreateSlider(L["X Offset"], fontTab, -50, 50, 117, 1)
iconFontXSlider:SetPoint("TOPLEFT", iconFontAnchorDropdown, "TOPRIGHT", 30, 0)
iconFontXSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["font"][fontIndex][5] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconFontYSlider = Cell:CreateSlider(L["Y Offset"], fontTab, -50, 50, 117, 1)
iconFontYSlider:SetPoint("TOPLEFT", iconFontXSlider, "TOPRIGHT", 30, 0)
iconFontYSlider.afterValueChangedFn = function(value)
spellTable[currentIconIndex]["icon"]["font"][fontIndex][6] = value
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end
local iconFontCP = Cell:CreateColorPicker(fontTab, L["Color"], false, nil, function(r, g, b)
spellTable[currentIconIndex]["icon"]["font"][fontIndex][7][1] = r
spellTable[currentIconIndex]["icon"]["font"][fontIndex][7][2] = g
spellTable[currentIconIndex]["icon"]["font"][fontIndex][7][3] = b
Cell:Fire("UpdateQuickAssist", currentIconIndex.."-indicator")
end)
iconFontCP:SetPoint("TOPLEFT", iconFontSizeSlider, 0, 47)
function fontTab:Load(t, fIndex)
fontTab:Show()
fontIndex = fIndex
if fIndex == 1 then
iconDurationDropdown:Hide()
iconShowStackCB:Show()
iconShowStackCB:SetChecked(spellTable[currentIconIndex]["icon"]["showStack"])
else
iconShowStackCB:Hide()
iconDurationDropdown:Show()
iconDurationDropdown:SetSelectedValue(spellTable[currentIconIndex]["icon"]["showDuration"])
end
iconFontDropdown:SetFont(t[1])
iconFontOutlineDropdown:SetSelectedValue(t[3])
iconFontSizeSlider:SetValue(t[2])
iconFontAnchorDropdown:SetSelectedValue(t[4])
iconFontXSlider:SetValue(t[5])
iconFontYSlider:SetValue(t[6])
iconFontCP:SetColor(t[7])
end
-- buttons --------------------------------------------------------------- --
local buttons = {}
buttons["icon"] = Cell:CreateButton(iconOptionsFrame, L["Icon"], "accent-hover", {100, 17})
buttons["icon"]:SetPoint("BOTTOMLEFT", iconOptionsFrame, "TOPLEFT")
buttons["icon"].id = "icon"
buttons["stackFont"] = Cell:CreateButton(iconOptionsFrame, L["stackFont"], "accent-hover", {100, 17})
buttons["stackFont"]:SetPoint("BOTTOMLEFT", buttons["icon"], "BOTTOMRIGHT", P:Scale(-1), 0)
buttons["stackFont"].id = "stackFont"
buttons["durationFont"] = Cell:CreateButton(iconOptionsFrame, L["durationFont"], "accent-hover", {100, 17})
buttons["durationFont"]:SetPoint("BOTTOMLEFT", buttons["stackFont"], "BOTTOMRIGHT", P:Scale(-1), 0)
buttons["durationFont"].id = "durationFont"
Cell:CreateButtonGroup(buttons, function(id)
if id == "icon" then
fontTab:Hide()
iconTab:Load(spellTable[currentIconIndex]["icon"])
elseif id == "stackFont" then
iconTab:Hide()
fontTab:Load(spellTable[currentIconIndex]["icon"]["font"][1], 1)
else
iconTab:Hide()
fontTab:Load(spellTable[currentIconIndex]["icon"]["font"][2], 2)
end
end)
iconOptionsFrame:SetScript("OnShow", function()
currentIconOptionBtn:SetFrameLevel(parent:GetFrameLevel()+50)
Cell:CreateMask(Cell.frames.utilitiesTab, nil, {1, -1, -1, 1})
buttons["icon"]:GetScript("OnClick")()
F:Debug("|cff33937FQuickAssist_ShowIconOptions:|r", currentIconIndex)
end)
iconOptionsFrame:SetScript("OnHide", function()
currentIconOptionBtn:SetFrameLevel(currentIconOptionBtn.frameLevel)
iconOptionsFrame:Hide()
Cell.frames.utilitiesTab.mask:Hide()
end)
end
local function SetIconOptions_OnClick(b)
b.frameLevel = b:GetFrameLevel()
b:SetScript("OnClick", function()
currentIconIndex = b.index
currentIconOptionBtn = b
if iconOptionsFrame:IsShown() then
iconOptionsFrame:Hide()
else
iconOptionsFrame:Show()
end
end)
end
-- bar options ----------------------------------------------------------- --
local barOptionsFrame
local currentBarOptionBtn, currentBarIndex
local function CreateBarOptions(parent)
barOptionsFrame = CreateFrame("Frame", nil, parent, "BackdropTemplate")
Cell:StylizeFrame(barOptionsFrame, nil, Cell:GetAccentColorTable())
barOptionsFrame:SetFrameLevel(parent:GetFrameLevel()+50)
barOptionsFrame:Hide()
barOptionsFrame:SetHeight(170)
barOptionsFrame:SetPoint("TOP", 0, -73)
barOptionsFrame:SetPoint("LEFT")
barOptionsFrame:SetPoint("RIGHT")
local barAnchorDropdown = Cell:CreateDropdown(barOptionsFrame, 117)
barAnchorDropdown:SetPoint("TOPLEFT", 5, -27)
barAnchorDropdown:SetLabel(L["Anchor Point"])
local items = {}
for _, point in pairs(anchorPoints) do
tinsert(items, {
["text"] = L[point],
["value"] = point,
["onClick"] = function()
spellTable[currentBarIndex]["bar"]["position"][1] = point
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end,
})
end
barAnchorDropdown:SetItems(items)
local barRelativeToDropdown = Cell:CreateDropdown(barOptionsFrame, 117)
barRelativeToDropdown:SetPoint("TOPLEFT", barAnchorDropdown, "TOPRIGHT", 30, 0)
barRelativeToDropdown:SetLabel(L["To UnitButton's"])
items = {}
for _, point in pairs(anchorPoints) do
tinsert(items, {
["text"] = L[point],
["value"] = point,
["onClick"] = function()
spellTable[currentBarIndex]["bar"]["position"][2] = point
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end,
})
end
barRelativeToDropdown:SetItems(items)
local barOrientationDropdown = Cell:CreateDropdown(barOptionsFrame, 117)
barOrientationDropdown:SetPoint("TOPLEFT", barRelativeToDropdown, "TOPRIGHT", 30, 0)
barOrientationDropdown:SetLabel(L["Orientation"])
items = {}
for _, o in pairs(orientations) do
if strfind(o, "top") then
tinsert(items, {
["text"] = L[o],
["value"] = o,
["onClick"] = function()
spellTable[currentBarIndex]["bar"]["orientation"] = o
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end,
})
end
end
barOrientationDropdown:SetItems(items)
-- local barGlowDropdown = Cell:CreateDropdown(barOptionsFrame, 117)
-- barGlowDropdown:SetPoint("TOPLEFT", barOrientationDropdown, 0, -50)
-- barGlowDropdown:SetLabel(L["Glow"])
-- items = {}
-- for _, g in pairs(glows) do
-- tinsert(items, {
-- ["text"] = L[g],
-- ["value"] = g,
-- ["onClick"] = function()
-- spellTable[currentBarIndex]["bar"]["glow"] = g
-- Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
-- end,
-- })
-- end
-- barGlowDropdown:SetItems(items)
-- local barGlowCP = Cell:CreateColorPicker(barOptionsFrame, L["Glow Color"], false, nil, function(r, g, b)
-- spellTable[currentBarIndex]["bar"]["glowColor"][1] = r
-- spellTable[currentBarIndex]["bar"]["glowColor"][2] = g
-- spellTable[currentBarIndex]["bar"]["glowColor"][3] = b
-- Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
-- end)
-- barGlowCP:SetPoint("TOPLEFT", barGlowDropdown, 0, -50)
local barXSlider = Cell:CreateSlider(L["X Offset"], barOptionsFrame, -100, 100, 117, 1)
barXSlider:SetPoint("TOPLEFT", barAnchorDropdown, 0, -50)
barXSlider.afterValueChangedFn = function(value)
spellTable[currentBarIndex]["bar"]["position"][3] = value
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end
local barYSlider = Cell:CreateSlider(L["Y Offset"], barOptionsFrame, -100, 100, 117, 1)
barYSlider:SetPoint("TOPLEFT", barXSlider, "TOPRIGHT", 30, 0)
barYSlider.afterValueChangedFn = function(value)
spellTable[currentBarIndex]["bar"]["position"][4] = value
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end
local barWidthSlider = Cell:CreateSlider(L["Width"], barOptionsFrame, 10, 300, 117, 1)
barWidthSlider:SetPoint("TOPLEFT", barXSlider, 0, -50)
barWidthSlider.afterValueChangedFn = function(value)
spellTable[currentBarIndex]["bar"]["size"][1] = value
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end
local barHeightSlider = Cell:CreateSlider(L["Height"], barOptionsFrame, 3, 300, 117, 1)
barHeightSlider:SetPoint("TOPLEFT", barWidthSlider, "TOPRIGHT", 30, 0)
barHeightSlider.afterValueChangedFn = function(value)
spellTable[currentBarIndex]["bar"]["size"][2] = value
Cell:Fire("UpdateQuickAssist", currentBarIndex.."-indicator")
end
function barOptionsFrame:Load(t)
barAnchorDropdown:SetSelectedValue(t["position"][1])
barRelativeToDropdown:SetSelectedValue(t["position"][2])
barOrientationDropdown:SetSelectedValue(t["orientation"])
barXSlider:SetValue(t["position"][3])
barYSlider:SetValue(t["position"][4])
barWidthSlider:SetValue(t["size"][1])
barHeightSlider:SetValue(t["size"][2])
end
barOptionsFrame:SetScript("OnShow", function()
currentBarOptionBtn:SetFrameLevel(parent:GetFrameLevel()+50)
Cell:CreateMask(Cell.frames.utilitiesTab, nil, {1, -1, -1, 1})
F:Debug("|cff33937FQuickAssist_ShowBarOptions:|r", currentBarIndex)
end)
barOptionsFrame:SetScript("OnHide", function()
currentBarOptionBtn:SetFrameLevel(currentBarOptionBtn.frameLevel)
barOptionsFrame:Hide()
Cell.frames.utilitiesTab.mask:Hide()
end)
end
local function SetBarOptions_OnClick(b)
b.frameLevel = b:GetFrameLevel()
b:SetScript("OnClick", function()
currentBarIndex = b.index
currentBarOptionBtn = b
if barOptionsFrame:IsShown() then
barOptionsFrame:Hide()
else
barOptionsFrame:Show()
barOptionsFrame:Load(spellTable[currentBarIndex]["bar"])
end
end)
end
-- glow options ---------------------------------------------------------- --
local glowOptionsFrame
local currentGlowOptionBtn, currentGlowIndex
local function CreateGlowOptions(parent)
glowOptionsFrame = CreateFrame("Frame", nil, parent, "BackdropTemplate")
Cell:StylizeFrame(glowOptionsFrame, nil, Cell:GetAccentColorTable())
glowOptionsFrame:SetFrameLevel(parent:GetFrameLevel()+50)
glowOptionsFrame:Hide()
glowOptionsFrame:SetWidth(274)
glowOptionsFrame:SetPoint("TOP", 0, -73)
glowOptionsFrame:SetPoint("RIGHT")
local glowFadeOutCB = Cell:CreateCheckButton(glowOptionsFrame, L["fadeOut"], function(checked)
spellTable[currentGlowIndex]["glow"]["fadeOut"] = checked
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowFadeOutCB:SetPoint("TOPLEFT", 5, -10)
local glowType = Cell:CreateDropdown(glowOptionsFrame, 117)
glowType:SetLabel(L["Glow Type"])
glowType:SetPoint("TOPLEFT", glowFadeOutCB, "BOTTOMLEFT", 0, -25)
local glowColor = Cell:CreateColorPicker(glowOptionsFrame, L["Glow Color"], false, nil, function(r, g, b)
spellTable[currentGlowIndex]["glow"]["options"][2][1] = r
spellTable[currentGlowIndex]["glow"]["options"][2][2] = g
spellTable[currentGlowIndex]["glow"]["options"][2][3] = b
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowColor:SetPoint("LEFT", glowType, "RIGHT", 25, 0)
-- glowNumber
local glowLines = Cell:CreateSlider(L["Lines"], glowOptionsFrame, 1, 30, 117, 1, function(value)
spellTable[currentGlowIndex]["glow"]["options"][3] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowLines:SetPoint("TOPLEFT", glowType, 0, -50)
local glowParticles = Cell:CreateSlider(L["Particles"], glowOptionsFrame, 1, 30, 117, 1, function(value)
spellTable[currentGlowIndex]["glow"]["options"][3] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowParticles:SetPoint("TOPLEFT", glowType, 0, -50)
-- glowDuration
local glowDuration = Cell:CreateSlider(L["Duration"], glowOptionsFrame, 0.1, 3, 117, 0.1, function(value)
spellTable[currentGlowIndex]["glow"]["options"][3] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowDuration:SetPoint("TOPLEFT", glowType, 0, -50)
-- glowFrequency
local glowFrequency = Cell:CreateSlider(L["Frequency"], glowOptionsFrame, -2, 2, 117, 0.01, function(value)
spellTable[currentGlowIndex]["glow"]["options"][4] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowFrequency:SetPoint("TOPLEFT", glowLines, "TOPRIGHT", 30, 0)
-- glowLength
local glowLength = Cell:CreateSlider(L["Length"], glowOptionsFrame, 1, 20, 117, 1, function(value)
spellTable[currentGlowIndex]["glow"]["options"][5] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowLength:SetPoint("TOPLEFT", glowLines, "BOTTOMLEFT", 0, -40)
-- glowThickness
local glowThickness = Cell:CreateSlider(L["Thickness"], glowOptionsFrame, 1, 20, 117, 1, function(value)
spellTable[currentGlowIndex]["glow"]["options"][6] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end)
glowThickness:SetPoint("TOPLEFT", glowLength, "TOPRIGHT", 30, 0)
-- glowScale
local glowScale = Cell:CreateSlider(L["Scale"], glowOptionsFrame, 50, 500, 117, 1, function(value)
spellTable[currentGlowIndex]["glow"]["options"][5] = value
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end, nil, true)
glowScale:SetPoint("TOPLEFT", glowLines, "BOTTOMLEFT", 0, -40)
glowType:SetItems({
{
["text"] = L["None"],
["value"] = "None",
["onClick"] = function()
glowOptionsFrame:SetHeight(80)
glowColor:SetColor({0.95,0.95,0.32,1})
glowLines:Hide()
glowParticles:Hide()
glowDuration:Hide()
glowFrequency:Hide()
glowLength:Hide()
glowThickness:Hide()
glowScale:Hide()
spellTable[currentGlowIndex]["glow"]["options"] = {"None", {0.95,0.95,0.32,1}}
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end,
},
{
["text"] = L["Normal"],
["value"] = "Normal",
["onClick"] = function()
glowOptionsFrame:SetHeight(80)
glowColor:SetColor({0.95,0.95,0.32,1})
glowLines:Hide()
glowParticles:Hide()
glowDuration:Hide()
glowFrequency:Hide()
glowLength:Hide()
glowThickness:Hide()
glowScale:Hide()
spellTable[currentGlowIndex]["glow"]["options"] = {"Normal", {0.95,0.95,0.32,1}}
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end,
},
{
["text"] = L["Pixel"],
["value"] = "Pixel",
["onClick"] = function()
glowOptionsFrame:SetHeight(185)
glowColor:SetColor({0.95,0.95,0.32,1})
glowLines:Show()
glowLines:SetValue(9)
glowFrequency:Show()
glowFrequency:SetValue(0.25)
glowLength:Show()
glowLength:SetValue(8)
glowThickness:Show()
glowThickness:SetValue(2)
glowParticles:Hide()
glowDuration:Hide()
glowScale:Hide()
spellTable[currentGlowIndex]["glow"]["options"] = {"Pixel", {0.95,0.95,0.32,1}, 9, 0.25, 8, 2}
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end,
},
{
["text"] = L["Shine"],
["value"] = "Shine",
["onClick"] = function()
glowOptionsFrame:SetHeight(185)
glowColor:SetColor({0.95,0.95,0.32,1})
glowParticles:Show()
glowParticles:SetValue(9)
glowFrequency:Show()
glowFrequency:SetValue(0.5)
glowScale:Show()
glowScale:SetValue(100)
glowLines:Hide()
glowDuration:Hide()
glowLength:Hide()
glowThickness:Hide()
spellTable[currentGlowIndex]["glow"]["options"] = {"Shine", {0.95,0.95,0.32,1}, 9, 0.5, 1}
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end,
},
{
["text"] = L["Proc"],
["value"] = "Proc",
["onClick"] = function()
glowOptionsFrame:SetHeight(135)
glowColor:SetColor({0.95,0.95,0.32,1})
glowDuration:Show()
glowDuration:SetValue(1)
glowParticles:Hide()
glowFrequency:Hide()
glowScale:Hide()
glowLines:Hide()
glowLength:Hide()
glowThickness:Hide()
spellTable[currentGlowIndex]["glow"]["options"] = {"Proc", {0.95,0.95,0.32,1}, 1}
Cell:Fire("UpdateQuickAssist", currentGlowIndex.."-indicator")
end,
},
})
function glowOptionsFrame:Load(fadeOut, t)
glowFadeOutCB:SetChecked(fadeOut)
glowType:SetSelectedValue(t[1])
glowColor:SetColor(t[2])
if t[1] == "None" or t[1] == "Normal" then
glowLines:Hide()
glowParticles:Hide()
glowDuration:Hide()
glowFrequency:Hide()
glowLength:Hide()
glowThickness:Hide()
glowScale:Hide()
glowOptionsFrame:SetHeight(80)
else
if t[1] == "Pixel" then
glowLines:Show()
glowLines:SetValue(t[3])
glowFrequency:Show()
glowFrequency:SetValue(t[4])
glowLength:Show()
glowLength:SetValue(t[5])
glowThickness:Show()
glowThickness:SetValue(t[6])
glowParticles:Hide()
glowDuration:Hide()
glowScale:Hide()
glowOptionsFrame:SetHeight(185)
elseif t[1] == "Shine" then
glowParticles:Show()
glowParticles:SetValue(t[3])
glowFrequency:Show()
glowFrequency:SetValue(t[4])
glowScale:Show()
glowScale:SetValue(t[5]*100)
glowLines:Hide()
glowDuration:Hide()
glowLength:Hide()
glowThickness:Hide()
glowOptionsFrame:SetHeight(185)
elseif t[1] == "Proc" then
glowDuration:Show()
glowDuration:SetValue(t[3])
glowLines:Hide()
glowParticles:Hide()
glowFrequency:Hide()
glowLength:Hide()
glowScale:Hide()
glowThickness:Hide()
glowOptionsFrame:SetHeight(135)
end
end
end
glowOptionsFrame:SetScript("OnShow", function()
currentGlowOptionBtn:SetFrameLevel(parent:GetFrameLevel()+50)
Cell:CreateMask(Cell.frames.utilitiesTab, nil, {1, -1, -1, 1})
F:Debug("|cff33937FQuickAssist_ShowGlowOptions:|r", currentGlowIndex)
end)
glowOptionsFrame:SetScript("OnHide", function()
currentGlowOptionBtn:SetFrameLevel(currentGlowOptionBtn.frameLevel)
barOptionsFrame:Hide()
Cell.frames.utilitiesTab.mask:Hide()
end)
end
local function SetGlowOptions_OnClick(b)
b.frameLevel = b:GetFrameLevel()
b:SetScript("OnClick", function()
currentGlowIndex = b.index
currentGlowOptionBtn = b
if glowOptionsFrame:IsShown() then
glowOptionsFrame:Hide()
else
glowOptionsFrame:Show()
glowOptionsFrame:Load(spellTable[currentGlowIndex]["glow"]["fadeOut"], spellTable[currentGlowIndex]["glow"]["options"])
end
end)
end
-- my buff --------------------------------------------------------------- --
local function CreateMyBuffWidget(parent, index)
local b = Cell:CreateButton(parent, " ", "accent-hover", {180, 20})
b:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\create", {16, 16}, {"LEFT", 2, 0})
b:RegisterForClicks("LeftButtonUp", "RightButtonUp")
b:GetFontString():SetJustifyH("LEFT")
b:SetScript("OnClick", function(self, button)
if button == "LeftButton" then
local popup = Cell:CreatePopupEditBox(qaPane, function(text)
local spellId = tonumber(text)
local spellName, _, spellIcon = GetSpellInfo(spellId)
if spellId and spellName then
b.id = spellId
b.icon = spellIcon
b:SetText(spellName)
b.tex:SetTexture(spellIcon)
b.tex:SetTexCoord(0.08, 0.92, 0.08, 0.92)
spellTable["mine"]["buffs"][index][1] = spellId
Cell:Fire("UpdateQuickAssist", "mine")
else
F:Print(L["Invalid spell id."])
end
end)
popup:ClearAllPoints()
popup:SetAllPoints(b)
popup:ShowEditBox("")
popup:SetTips("|cffababab"..L["Input spell id"])
else
b.id = nil
b.icon = nil
b:SetText("")
b.tex:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\create")
b.tex:SetTexCoord(0, 1, 0, 1)
spellTable["mine"]["buffs"][index][1] = 0
Cell:Fire("UpdateQuickAssist", "mine")
end
end)
b:HookScript("OnEnter", function(self)
if self.id and self.icon then
CellSpellTooltip:SetOwner(self, "ANCHOR_NONE")
CellSpellTooltip:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 2)
CellSpellTooltip:SetSpellByID(self.id, self.icon)
CellSpellTooltip:Show()
end
end)
b:HookScript("OnLeave", function(self)
CellSpellTooltip:Hide()
end)
b.type = Cell:CreateDropdown(b, 55, nil, true)
b.type:SetPoint("BOTTOMLEFT", b, "TOPLEFT", 0, 2)
-- P:Height(b.type, 17)
b.type:SetItems({
{
["text"] = L["Icon"],
["value"] = "icon",
["onClick"] = function()
spellTable["mine"]["buffs"][index][2] = "icon"
Cell:Fire("UpdateQuickAssist", "mine")
b.cp:EnableAlpha(true)
b.cp:SetColor(spellTable["mine"]["buffs"][index][3])
end
},
{
["text"] = L["Bar"],
["value"] = "bar",
["onClick"] = function()
spellTable["mine"]["buffs"][index][2] = "bar"
spellTable["mine"]["buffs"][index][3][4] = 1 -- reset alpha
Cell:Fire("UpdateQuickAssist", "mine")
b.cp:EnableAlpha(false)
b.cp:SetColor(spellTable["mine"]["buffs"][index][3])
end
},
})
b.cp = Cell:CreateColorPicker(b, "", false, function(r, g, b, a)
spellTable["mine"]["buffs"][index][3][1] = r
spellTable["mine"]["buffs"][index][3][2] = g
spellTable["mine"]["buffs"][index][3][3] = b
spellTable["mine"]["buffs"][index][3][4] = a
Cell:Fire("UpdateQuickAssist", "mine")
end)
b.cp:SetPoint("BOTTOMLEFT", b.type, "BOTTOMRIGHT", 2, 3)
return b
end
local function CreateSpellsPane()
pages.spell = CreateFrame("Frame", nil, quickAssistTab)
pages.spell:SetAllPoints(setupPane)
pages.spell:Hide()
CreateIconOptions(pages.spell)
CreateBarOptions(pages.spell)
CreateGlowOptions(pages.spell)
--* buff tracker ---------------------------------------------------------- --
local myIconsBtn = Cell:CreateButton(pages.spell, L["Icons"], "accent-hover", {80, 20})
myIconsBtn:SetPoint("TOPLEFT", 5, -42)
myIconsBtn.index = "mine"
SetIconOptions_OnClick(myIconsBtn)
local myBarsBtn = Cell:CreateButton(pages.spell, L["Bars"], "accent-hover", {80, 20})
myBarsBtn:SetPoint("TOPLEFT", myIconsBtn, "TOPRIGHT", P:Scale(-1), 0)
myBarsBtn.index = "mine"
SetBarOptions_OnClick(myBarsBtn)
local buffTrackerText = pages.spell:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
buffTrackerText:SetPoint("BOTTOMLEFT", myIconsBtn, "TOPLEFT", 0, 1)
buffTrackerText:SetText(L["Buffs Tracker"].." ("..L["mine"]..")")
for i = 1, 5 do
myBuffWidgets[i] = CreateMyBuffWidget(pages.spell, i)
if i == 1 then
myBuffWidgets[i]:SetPoint("TOPLEFT", myIconsBtn, 0, -60)
else
myBuffWidgets[i]:SetPoint("TOPLEFT", myBuffWidgets[i-1], 0, -57)
end
end
--* offensives tracker ---------------------------------------------------- --
local offensiveIconsBtn = Cell:CreateButton(pages.spell, L["Icons"], "accent-hover", {80, 20})
offensiveIconsBtn:SetPoint("TOPLEFT", 222, -42)
offensiveIconsBtn.index = "offensives"
SetIconOptions_OnClick(offensiveIconsBtn)
local offensiveGlowsBtn = Cell:CreateButton(pages.spell, L["Glows"], "accent-hover", {80, 20})
offensiveGlowsBtn:SetPoint("TOPLEFT", offensiveIconsBtn, "TOPRIGHT", P:Scale(-1), 0)
offensiveGlowsBtn.index = "offensives"
SetGlowOptions_OnClick(offensiveGlowsBtn)
local offensivesTrackerText = pages.spell:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
offensivesTrackerText:SetPoint("BOTTOMLEFT", offensiveIconsBtn, "TOPLEFT", 0, 1)
offensivesTrackerText:SetText(L["Offensives Tracker"])
offensivesEnabledCB = Cell:CreateCheckButton(pages.spell, L["Enabled"], function(checked)
spellTable["offensives"]["enabled"] = checked
Cell:Fire("UpdateQuickAssist", "offensives")
end)
offensivesEnabledCB:SetPoint("TOPLEFT", offensiveIconsBtn, "BOTTOMLEFT", 0, -12)
for class, _, i in F:IterateClasses() do
classButtons[i] = Cell:CreateButton(pages.spell, nil, "accent-hover", {24, 24})
classButtons[i].id = class
classButtons[i]:SetTexture("classicon-"..strlower(class), {20, 20}, {"CENTER", 0, 0}, true)
classButtons[i].tex:SetDesaturated(true)
classButtons[i].hoverColor = {F:GetClassColor(class)}
-- classButtons[i].ShowTooltip = function()
-- CellTooltip:SetOwner(classButtons[i], "ANCHOR_NONE")
-- CellTooltip:SetPoint("BOTTOMLEFT", classButtons[i], "TOPLEFT", 0, 1)
-- CellTooltip:AddLine(F:GetClassColorStr(class)..F:GetLocalizedClassName(class))
-- CellTooltip:Show()
-- end
-- classButtons[i].HideTooltip = function()
-- CellTooltip:Hide()
-- end
if i == 1 then
classButtons[i]:SetPoint("TOPLEFT", offensiveIconsBtn, 0, -60)
elseif i % 7 == 1 then
classButtons[i]:SetPoint("TOPLEFT", classButtons[i-7], "BOTTOMLEFT", 0, -2)
else
classButtons[i]:SetPoint("TOPLEFT", classButtons[i-1], "TOPRIGHT", 2, 0)
end
end
Cell:CreateButtonGroup(classButtons, function(class, b)
selectedClass = class
LoadList(buffsPane, buffButtons, buffsAddBtn, spellTable["offensives"]["buffs"][selectedClass] or {})
LoadList(castsPane, castButtons, castsAddBtn, spellTable["offensives"]["casts"][selectedClass] or {}, ":")
end, function(_, b)
b.tex:SetDesaturated(false)
b:SetBackdropBorderColor(F:GetClassColor(b.id))
end, function(_, b)
b.tex:SetDesaturated(true)
b:SetBackdropBorderColor(0, 0, 0, 1)
end)
--* buffs ----------------------------------------------------------------- --
buffsPane = Cell:CreateTitledPane(pages.spell, L["Buffs"], 205, 85)
buffsPane:SetPoint("TOPLEFT", 217, -165)
Cell:CreateTipsButton(buffsPane, 17, "BOTTOMRIGHT", "UNIT_AURA")
buffsAddBtn = Cell:CreateButton(buffsPane, nil, "accent-hover", {24, 24})
buffsAddBtn:SetPoint("TOPLEFT", 5, -27)
buffsAddBtn:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\create", {20, 20}, {"CENTER", 0, 0})
buffsAddBtn:SetScript("OnClick", function()
local popup = Cell:CreatePopupEditBox(qaPane, function(text)
local spellId = tonumber(text)
local spellName = GetSpellInfo(spellId)
if spellId and spellName then
if not spellTable["offensives"]["buffs"][selectedClass] then
spellTable["offensives"]["buffs"][selectedClass] = {}
end
tinsert(spellTable["offensives"]["buffs"][selectedClass], spellId)
LoadList(buffsPane, buffButtons, buffsAddBtn, spellTable["offensives"]["buffs"][selectedClass])
Cell:Fire("UpdateQuickAssist", "offensives")
else
F:Print(L["Invalid spell id."])
end
end)
popup:ClearAllPoints()
popup:SetPoint("LEFT", buffsPane, 5, 0)
popup:SetPoint("RIGHT", buffsPane, -4, 0)
popup:SetPoint("TOP", buffsAddBtn)
popup:ShowEditBox("")
popup:SetTips("|cffababab"..L["Input spell id"])
end)
--* casts ----------------------------------------------------------------- --
castsPane = Cell:CreateTitledPane(pages.spell, L["Casts"], 205, 85)
castsPane:SetPoint("TOPLEFT", 217, -265)
Cell:CreateTipsButton(castsPane, 17, "BOTTOMRIGHT", "UNIT_SPELLCAST_SUCCEEDED")
castsAddBtn = Cell:CreateButton(castsPane, nil, "accent-hover", {24, 24})
castsAddBtn:SetPoint("TOPLEFT", 5, -27)
castsAddBtn:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\create", {20, 20}, {"CENTER", 0, 0})
castsAddBtn:SetScript("OnClick", function()
local popup = Cell:CreateDualPopupEditBox(qaPane, "ID", L["Duration"], true, function(spellId, duration)
local spellName = GetSpellInfo(spellId)
if spellId and spellName and duration then
if not spellTable["offensives"]["casts"][selectedClass] then
spellTable["offensives"]["casts"][selectedClass] = {}
end
tinsert(spellTable["offensives"]["casts"][selectedClass], spellId..":"..duration)
LoadList(castsPane, castButtons, castsAddBtn, spellTable["offensives"]["casts"][selectedClass], ":")
Cell:Fire("UpdateQuickAssist", "offensives")
else
F:Print(L["Invalid"])
end
end)
popup.left:SetWidth(P:Scale(90))
popup:SetPoint("LEFT", castsPane, 5, 0)
popup:SetPoint("RIGHT", castsPane, -4, 0)
popup:SetPoint("TOP", castsAddBtn)
popup:ShowEditBox()
end)
-- reset ----------------------------------------------------------------- --
local resetBtn = Cell:CreateButton(pages.spell, L["Reset Offensive Spells"], "accent", {205, 17}, nil, nil, nil, nil, nil, L["Reset Offensive Spells"], L["[Ctrl+LeftClick] to reset these settings"])
resetBtn:SetPoint("BOTTOMRIGHT")
resetBtn:SetScript("OnClick", function()
if IsControlKeyDown() then
spellTable["offensives"]["buffs"] = F:Copy(defaultOffensiveBuffs)
spellTable["offensives"]["casts"] = F:Copy(defaultOffensiveCasts)
classButtons[1]:GetScript("OnClick")()
Cell:Fire("UpdateQuickAssist", "offensives")
end
end)
-- tips ------------------------------------------------------------------ --
local tip1 = pages.spell:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
tip1:SetText("|cffababab"..L["Tip: right-click to delete"])
tip1:SetPoint("BOTTOMLEFT")
if not CellDB["quickAssistHelpViewed"] then
local helpFrame = CreateFrame("Frame", nil, pages.spell, "BackdropTemplate")
helpFrame:SetAllPoints(pages.spell)
helpFrame:SetHeight(310)
helpFrame:EnableMouse(true)
helpFrame:SetFrameLevel(pages.spell:GetFrameLevel()+25)
Cell:StylizeFrame(helpFrame, {0.1, 0.1, 0.1, 0.99})
local helpText = helpFrame:CreateFontString(nil, "OVERLAY")
helpText:SetFont(UNIT_NAME_FONT_CHINESE, 12 + CellDB["appearance"]["optionsFontSizeOffset"], "")
helpText:SetTextColor(1, 1, 1, 1)
helpText:SetShadowColor(0, 0, 0)
helpText:SetShadowOffset(1, -1)
helpText:SetText([[
|cffe52b50It's better to use OmniCD to track offensive CDs|r
|cff00ff7fBut if you'd like to contribute to built-in offensive list:|r
1. open |cfffff2b2Cell\Utilities\QuickAssistConfig.lua|r
2. edit |cfffff2b2defaultOffensiveBuffs|r and |cfffff2b2defaultOffensiveCasts|r
3. create a PR on GitHub
*. fill the list by pressing "Reset Offensive Spells" button
|cffe52b50用 OmniCD |r
|cff00ff7f但如果你想要帮忙补充内置爆发法术列表|r
1. |cfffff2b2Cell\Utilities\QuickAssistConfig.lua|r
2. |cfffff2b2defaultOffensiveBuffs|r |cfffff2b2defaultOffensiveCasts|r
3. GitHub PR
*.
]])
helpText:SetPoint("LEFT")
helpText:SetJustifyH("LEFT")
helpText:SetSpacing(5)
local helpBtn = Cell:CreateButton(helpFrame, "OK", "accent", {205, 20})
helpBtn:SetPoint("BOTTOMLEFT")
helpBtn:SetPoint("BOTTOMRIGHT")
helpBtn:SetScript("OnClick", function()
helpFrame:Hide()
CellDB["quickAssistHelpViewed"] = true
end)
end
end
-- ----------------------------------------------------------------------- --
-- load --
-- ----------------------------------------------------------------------- --
ShowFilter = function(index)
local t = quickAssistTable["filters"][index]
filterTypeDropdown:SetSelectedValue(t[1])
hideSelfCB:SetChecked(t[3])
roleFilter:Hide()
classFilter:Hide()
specFilter:Hide()
nameFilter:Hide()
nameListFrame:Hide()
filterResetBtn:Hide()
filterResetTips:Hide()
if t[1] == "role" then
roleFilter:SetRoles(t[2])
roleFilter:Show()
hideSelfCB:Show()
hideSelfCB:SetText(L["Hide Self"].." ("..L["Party"]..")")
elseif t[1] == "class" then
classFilter:SetClasses(t[2])
classFilter:Show()
hideSelfCB:Show()
filterResetBtn:Show()
filterResetTips:Show()
hideSelfCB:SetText(L["Hide Self"].." ("..L["Party"]..")")
elseif t[1] == "spec" then
specFilter:SetSpecs(t[2])
specFilter:Show()
hideSelfCB:Show()
filterResetBtn:Show()
filterResetTips:Show()
hideSelfCB:SetText(L["Hide Self"])
elseif t[1] == "name" then
nameFilter:Show()
hideSelfCB:Hide()
end
end
LoadAutoSwitch = function(t)
partyDropdown:SetSelectedValue(t["party"])
raidDropdown:SetSelectedValue(t["raid"])
mythicDropdown:SetSelectedValue(t["mythic"])
arenaDropdown:SetSelectedValue(t["arena"])
bgDropdown:SetSelectedValue(t["battleground"])
end
LoadLayout = function()
anchorDropdown:SetSelectedValue(layoutTable["anchor"])
orientationDropdown:SetSelectedValue(layoutTable["orientation"])
if layoutTable["orientation"] == "horizontal" then
unitsSlider:SetLabel(L["Units Per Row"])
maxSlider:SetLabel(L["Max Rows"])
else
unitsSlider:SetLabel(L["Units Per Column"])
maxSlider:SetLabel(L["Max Columns"])
end
widthSlider:SetValue(layoutTable["size"][1])
heightSlider:SetValue(layoutTable["size"][2])
xSlider:SetValue(layoutTable["spacingX"])
ySlider:SetValue(layoutTable["spacingY"])
unitsSlider:SetValue(layoutTable["unitsPerColumn"])
maxSlider:SetValue(layoutTable["maxColumns"])
end
LoadStyle = function()
textureDropdown:SetSelected(styleTable["texture"], textures[styleTable["texture"]])
hpColorDropdown:SetSelectedValue(styleTable["hpColor"][1])
lossColorDropdown:SetSelectedValue(styleTable["lossColor"][1])
if styleTable["hpColor"][1] == "custom" then hpCP:Show() else hpCP:Hide() end
hpCP:SetColor(styleTable["hpColor"][2])
if styleTable["lossColor"][1] == "custom" then bgCP:Show() else bgCP:Hide() end
bgCP:SetColor(styleTable["lossColor"][2])
alphaSlider:SetValue(styleTable["oorAlpha"]*100)
targetColorPicker:SetColor(styleTable["targetColor"])
mouseoverColorPicker:SetColor(styleTable["mouseoverColor"])
highlightSizeSlider:SetValue(styleTable["highlightSize"])
nameColorDropdown:SetSelectedValue(styleTable["name"]["color"][1])
nameWidth:SetNameWidth(styleTable["name"]["width"])
if styleTable["name"]["color"][1] == "custom" then nameCP:Show() else nameCP:Hide() end
nameCP:SetColor(styleTable["name"]["color"][2])
nameAnchorDropdown:SetSelectedValue(styleTable["name"]["position"][1])
nameXSlider:SetValue(styleTable["name"]["position"][2])
nameYSlider:SetValue(styleTable["name"]["position"][3])
nameFontDropdown:SetFont(styleTable["name"]["font"][1])
nameSizeSilder:SetValue(styleTable["name"]["font"][2])
nameOutlineDropdown:SetSelectedValue(styleTable["name"]["font"][3])
end
LoadMyBuff = function(b, t)
b.id = nil
b.icon = nil
if t[1] == 0 then -- no setting
b:SetText("")
b.tex:SetTexture("Interface\\AddOns\\Cell\\Media\\Icons\\create")
b.tex:SetTexCoord(0, 1, 0, 1)
else
local name, _, icon = GetSpellInfo(t[1])
if name and icon then
b:SetText(name)
b.tex:SetTexture(icon)
b.id = t[1]
b.icon = icon
else
b:SetText("|cffff2222"..L["Invalid"])
b.tex:SetTexture(134400)
end
b.tex:SetTexCoord(0.08, 0.92, 0.08, 0.92)
end
b.type:SetSelectedValue(t[2])
b.cp:SetColor(t[3])
b.cp:EnableAlpha(t[2] == "icon")
end
-- list shared
local BUTTONS_SIZE = 24
local BUTTONS_PER_ROW = 7
local BUTTONS_SPACING = 2
local BUTTONS_MAX = 14
LoadList = function(parent, buttons, addBtn, t, separator)
for i, id in pairs(t) do
if not buttons[i] then
buttons[i] = Cell:CreateButton(parent, nil, "accent-hover", {BUTTONS_SIZE, BUTTONS_SIZE})
buttons[i]:RegisterForClicks("RightButtonUp")
buttons[i]:SetTexture(134400, {BUTTONS_SIZE-4, BUTTONS_SIZE-4}, {"CENTER", 0, 0})
buttons[i].tex:SetTexCoord(0.08, 0.92, 0.08, 0.92)
if separator then
buttons[i].duration = buttons[i]:CreateFontString(nil, "OVERLAY")
buttons[i].duration:SetFont(GameFontNormal:GetFont(), 12, "OUTLINE")
buttons[i].duration:SetTextColor(1, 1, 1, 1)
buttons[i].duration:SetShadowColor(0, 0, 0, 0)
buttons[i].duration:SetShadowOffset(0, 0)
buttons[i].duration:SetJustifyH("CENTER")
buttons[i].duration:SetPoint("BOTTOMRIGHT")
end
buttons[i]:HookScript("OnEnter", function(self)
if self.id and self.icon then
CellSpellTooltip:SetOwner(self, "ANCHOR_NONE")
CellSpellTooltip:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 2)
CellSpellTooltip:SetSpellByID(self.id, self.icon)
CellSpellTooltip:Show()
end
end)
buttons[i]:HookScript("OnLeave", function(self)
CellSpellTooltip:Hide()
end)
end
buttons[i]:SetScript("OnClick", function()
tremove(t, i)
LoadList(parent, buttons, addBtn, t, separator)
Cell:Fire("UpdateQuickAssist", "offensives")
end)
if separator then
local duration
id, duration = strsplit(separator, id)
buttons[i].duration:SetText(duration)
end
local name, _, icon = GetSpellInfo(id)
if not name then icon = 134400 end
buttons[i].id = id
buttons[i].icon = icon
buttons[i].tex:SetTexture(icon)
buttons[i]:ClearAllPoints()
if i == 1 then
buttons[i]:SetPoint("TOPLEFT", 5, -27)
elseif (i - 1) % BUTTONS_PER_ROW == 0 then
buttons[i]:SetPoint("TOPLEFT", buttons[i-BUTTONS_PER_ROW], "BOTTOMLEFT", 0, -BUTTONS_SPACING)
else
buttons[i]:SetPoint("TOPLEFT", buttons[i-1], "TOPRIGHT", BUTTONS_SPACING, 0)
end
buttons[i]:Show()
end
local n = #t
-- hide
for i = n+1, #buttons do
buttons[i]:Hide()
end
-- update add button
if n == BUTTONS_MAX then --max
addBtn:Hide()
else
addBtn:ClearAllPoints()
if n == 0 then
addBtn:SetPoint("TOPLEFT", 5, -27)
elseif n % BUTTONS_PER_ROW == 0 then
addBtn:SetPoint("TOPLEFT", buttons[n-BUTTONS_PER_ROW+1], "BOTTOMLEFT", 0, -BUTTONS_SPACING)
else
addBtn:SetPoint("TOPLEFT", buttons[n], "TOPRIGHT", BUTTONS_SPACING, 0)
end
addBtn:Show()
end
end
LoadSpells = function()
for i = 1, 5 do
LoadMyBuff(myBuffWidgets[i], spellTable["mine"]["buffs"][i])
end
classButtons[1]:GetScript("OnClick")()
offensivesEnabledCB:SetChecked(spellTable["offensives"]["enabled"])
end
LoadDB = function()
quickAssistTable = CellDB["quickAssist"][Cell.vars.playerSpecID]
if not quickAssistTable or not quickAssistTable["enabled"] then
qaEnabledCB:SetChecked(false)
UpdateWidgets(false)
layoutTable = nil
styleTable = nil
spellTable = nil
return
end
layoutTable = quickAssistTable["layout"]
styleTable = quickAssistTable["style"]
spellTable = quickAssistTable["spells"]
-- update before all loads
UpdateWidgets(quickAssistTable["enabled"])
qaEnabledCB:SetChecked(quickAssistTable["enabled"])
LoadLayout()
LoadStyle()
LoadSpells()
selectedFilter = Cell.vars.quickAssistGroupType and quickAssistTable["filterAutoSwitch"][Cell.vars.quickAssistGroupType] or 0
if selectedFilter == 0 then selectedFilter = 1 end
HighlightFilter(selectedFilter)
ShowFilter(selectedFilter)
LoadAutoSwitch(quickAssistTable["filterAutoSwitch"])
UpdateAutoSwitch()
end
local init
local function ShowUtilitySettings(which)
if which == "quickAssist" then
if not init then
CreateQuickAssistPane()
CreateSetupPane()
CreateLayoutPane()
CreateStylePane()
CreateSpellsPane()
CreateAutoSwitchFrame()
F:ApplyCombatProtectionToFrame(quickAssistTab)
F:ApplyCombatProtectionToFrame(autoSwitchFrame)
end
if not init then
init = true
layoutBtn:GetScript("OnClick")()
end
LoadDB()
quickAssistTab:Show()
UpdatePreviewButton()
elseif init then
quickAssistTab:Hide()
end
end
Cell:RegisterCallback("ShowUtilitySettings", "QuickAssist_ShowUtilitySettings", ShowUtilitySettings)
local function Reload()
if init then
LoadDB()
UpdatePreviewButton()
layoutBtn:GetScript("OnClick")()
if quickAssistTab:IsVisible() then
if quickAssistTable and quickAssistTable["enabled"] then
ShowLayoutPreview()
else
HideLayoutPreview()
end
end
end
end
Cell:RegisterCallback("SpecChanged", "QuickAssistConfig_SpecChanged", Reload)
Cell:RegisterCallback("ReloadQuickAssist", "ReloadQuickAssist", Reload)
UpdateAutoSwitch = function()
if not (init and quickAssistTable and quickAssistTable["enabled"]) then return end
activeFilter = Cell.vars.quickAssistGroupType and quickAssistTable["filterAutoSwitch"][Cell.vars.quickAssistGroupType] or 0
if activeFilter == 0 then
filterButtons[1]:GetScript("OnClick")()
selectedFilter = 1
else
filterButtons[activeFilter]:GetScript("OnClick")()
selectedFilter = activeFilter
end
asterisk:ClearAllPoints()
if Cell.vars.quickAssistGroupType == "party" then
asterisk:SetPoint("LEFT", partyText, "RIGHT")
partyText:SetTextColor(Cell:GetAccentColorRGB())
raidText:SetTextColor(1, 1, 1)
mythicText:SetTextColor(1, 1, 1)
arenaText:SetTextColor(1, 1, 1)
bgText:SetTextColor(1, 1, 1)
elseif Cell.vars.quickAssistGroupType == "raid" then
asterisk:SetPoint("LEFT", raidText, "RIGHT")
partyText:SetTextColor(1, 1, 1)
raidText:SetTextColor(Cell:GetAccentColorRGB())
mythicText:SetTextColor(1, 1, 1)
arenaText:SetTextColor(1, 1, 1)
bgText:SetTextColor(1, 1, 1)
elseif Cell.vars.quickAssistGroupType == "mythic" then
asterisk:SetPoint("LEFT", mythicText, "RIGHT")
partyText:SetTextColor(1, 1, 1)
raidText:SetTextColor(1, 1, 1)
mythicText:SetTextColor(Cell:GetAccentColorRGB())
arenaText:SetTextColor(1, 1, 1)
bgText:SetTextColor(1, 1, 1)
elseif Cell.vars.quickAssistGroupType == "arena" then
asterisk:SetPoint("LEFT", arenaText, "RIGHT")
partyText:SetTextColor(1, 1, 1)
raidText:SetTextColor(1, 1, 1)
mythicText:SetTextColor(1, 1, 1)
arenaText:SetTextColor(Cell:GetAccentColorRGB())
bgText:SetTextColor(1, 1, 1)
elseif Cell.vars.quickAssistGroupType == "battleground" then
asterisk:SetPoint("LEFT", bgText, "RIGHT")
partyText:SetTextColor(1, 1, 1)
raidText:SetTextColor(1, 1, 1)
mythicText:SetTextColor(1, 1, 1)
arenaText:SetTextColor(1, 1, 1)
bgText:SetTextColor(Cell:GetAccentColorRGB())
else -- solo
partyText:SetTextColor(1, 1, 1)
raidText:SetTextColor(1, 1, 1)
mythicText:SetTextColor(1, 1, 1)
arenaText:SetTextColor(1, 1, 1)
bgText:SetTextColor(1, 1, 1)
end
end
Cell:RegisterCallback("UpdateQuickAssist", "UpdateAutoSwitch", UpdateAutoSwitch)