Add Class Resources and Debuff Highlighting modules; migrate settings to AceDB profiles
Move CoA settings from E.global/E.private into a proper AceDB-3.0 database (CoA.db, SavedVariables ElvUI_CoADB) with a Profiles options tab, since ElvUI doesn't ship AceDBOptions-3.0 (vendored under Libraries/). Add ClassResources.lua: hooks the custom-class resource frames (segment bar, orb, bar, multi-cast bar) into ElvUI's Toggle Anchors, with a per-frame hide checkbox in a new "Class Resources" options tab. Add DispelHighlight.lua: highlights dispellable debuffs on unitframes, with talent-aware filtering for custom classes. Fix mover/anchor reliability for Class Resources and the Instance (LayerPicker) button: - Movers were only retried until the target frame existed, not until the mover was actually created, so frames that start at zero size (e.g. a resource bar before that resource is ever active) permanently lost their mover. - Class resource frames re-anchor themselves on refresh, stomping the mover's anchor; hook SetPoint to snap back to the mover holder whenever something else repositions the frame. - Native click-drag on these frames ends with the engine calling SetPoint directly, severing the mover anchor entirely. Permanently block drag (script and RegisterForDrag) instead of clearing it once.
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
local E, L, V, P, G = unpack(ElvUI)
|
||||
local EP = E.Libs.EP
|
||||
local ACH = LibStub("LibAceConfigHelper")
|
||||
local AceDB = LibStub("AceDB-3.0")
|
||||
local AceDBOptions = LibStub("AceDBOptions-3.0")
|
||||
|
||||
local AddOnName = ...
|
||||
|
||||
@@ -9,25 +11,118 @@ BINDING_HEADER_COA = "Conquest of Azeroth"
|
||||
local CoA = E:NewModule("CoA", "AceEvent-3.0", "AceTimer-3.0")
|
||||
E.CoA = CoA
|
||||
|
||||
V.CoA = {}
|
||||
|
||||
G.CoA = {
|
||||
extraActionButtonSize = 52,
|
||||
instanceButtonFont = "PT Sans Narrow",
|
||||
instanceButtonFontSize = 12,
|
||||
instanceButtonFontOutline = "OUTLINE",
|
||||
local defaults = {
|
||||
profile = {
|
||||
extraActionButtonSize = 52,
|
||||
instanceButtonFont = "PT Sans Narrow",
|
||||
instanceButtonFontSize = 12,
|
||||
instanceButtonFontOutline = "OUTLINE",
|
||||
dispelHighlightOnlyMine = false,
|
||||
hasBlightAntidote = false,
|
||||
hasDevourCurse = false,
|
||||
hasBurnImpurities = false,
|
||||
hideResourceSegmentBar = false,
|
||||
hideResourceOrb = false,
|
||||
hideResourceBar = false,
|
||||
hideMultiCastActionBar = false,
|
||||
},
|
||||
}
|
||||
|
||||
CoA.db = AceDB:New("ElvUI_CoADB", defaults, true)
|
||||
|
||||
function CoA:RefreshConfig()
|
||||
if self.UpdateExtraActionButtonSize then self:UpdateExtraActionButtonSize() end
|
||||
if self.UpdateInstanceButtonFont then self:UpdateInstanceButtonFont() end
|
||||
if self.UpdateDispelHighlight then self:UpdateDispelHighlight() end
|
||||
if self.UpdateClassResourceVisibility then self:UpdateClassResourceVisibility() end
|
||||
end
|
||||
|
||||
CoA.db.RegisterCallback(CoA, "OnProfileChanged", "RefreshConfig")
|
||||
CoA.db.RegisterCallback(CoA, "OnProfileCopied", "RefreshConfig")
|
||||
CoA.db.RegisterCallback(CoA, "OnProfileReset", "RefreshConfig")
|
||||
|
||||
local function getOptions()
|
||||
local profiles = AceDBOptions:GetOptionsTable(CoA.db)
|
||||
profiles.order = 5
|
||||
|
||||
local options = {
|
||||
order = 55,
|
||||
type = "group",
|
||||
childGroups = "tab",
|
||||
name = string.format("|cff1784d1%s|r", "Conquest of Azeroth"),
|
||||
args = {
|
||||
extraActionButton = {
|
||||
classResources = {
|
||||
order = 1,
|
||||
type = "group",
|
||||
name = "Class Resources",
|
||||
args = {
|
||||
header = {
|
||||
order = 1,
|
||||
type = "header",
|
||||
name = "Class Resources",
|
||||
},
|
||||
desc = {
|
||||
order = 2,
|
||||
type = "description",
|
||||
name = "You can move these elements with Toggle Anchors.\n",
|
||||
},
|
||||
hideResourceSegmentBar = {
|
||||
order = 3,
|
||||
type = "toggle",
|
||||
name = "Hide Resource Segment Bar",
|
||||
get = function() return CoA.db.profile.hideResourceSegmentBar end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hideResourceSegmentBar = value
|
||||
|
||||
if CoA.UpdateClassResourceVisibility then
|
||||
CoA:UpdateClassResourceVisibility()
|
||||
end
|
||||
end,
|
||||
},
|
||||
hideResourceOrb = {
|
||||
order = 4,
|
||||
type = "toggle",
|
||||
name = "Hide Resource Orb",
|
||||
get = function() return CoA.db.profile.hideResourceOrb end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hideResourceOrb = value
|
||||
|
||||
if CoA.UpdateClassResourceVisibility then
|
||||
CoA:UpdateClassResourceVisibility()
|
||||
end
|
||||
end,
|
||||
},
|
||||
hideResourceBar = {
|
||||
order = 5,
|
||||
type = "toggle",
|
||||
name = "Hide Resource Bar",
|
||||
get = function() return CoA.db.profile.hideResourceBar end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hideResourceBar = value
|
||||
|
||||
if CoA.UpdateClassResourceVisibility then
|
||||
CoA:UpdateClassResourceVisibility()
|
||||
end
|
||||
end,
|
||||
},
|
||||
hideMultiCastActionBar = {
|
||||
order = 6,
|
||||
type = "toggle",
|
||||
name = "Hide Multi Cast Action Bar",
|
||||
get = function() return CoA.db.profile.hideMultiCastActionBar end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hideMultiCastActionBar = value
|
||||
|
||||
if CoA.UpdateClassResourceVisibility then
|
||||
CoA:UpdateClassResourceVisibility()
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
extraActionButton = {
|
||||
order = 2,
|
||||
type = "group",
|
||||
name = "Extra Action Button",
|
||||
args = {
|
||||
header = {
|
||||
@@ -35,17 +130,22 @@ local function getOptions()
|
||||
type = "header",
|
||||
name = "Extra Action Button",
|
||||
},
|
||||
size = {
|
||||
desc = {
|
||||
order = 2,
|
||||
type = "description",
|
||||
name = "You can move this element with Toggle Anchors.\n",
|
||||
},
|
||||
size = {
|
||||
order = 3,
|
||||
type = "range",
|
||||
name = "Size",
|
||||
desc = "Adjust the width/height of the Extra Action Button, in pixels.",
|
||||
min = 30,
|
||||
max = 100,
|
||||
step = 1,
|
||||
get = function() return E.global.CoA.extraActionButtonSize end,
|
||||
get = function() return CoA.db.profile.extraActionButtonSize end,
|
||||
set = function(_, value)
|
||||
E.global.CoA.extraActionButtonSize = value
|
||||
CoA.db.profile.extraActionButtonSize = value
|
||||
|
||||
if CoA.UpdateExtraActionButtonSize then
|
||||
CoA:UpdateExtraActionButtonSize()
|
||||
@@ -55,7 +155,7 @@ local function getOptions()
|
||||
},
|
||||
},
|
||||
instanceSwap = {
|
||||
order = 2,
|
||||
order = 3,
|
||||
type = "group",
|
||||
name = "Instance Swap",
|
||||
args = {
|
||||
@@ -64,42 +164,132 @@ local function getOptions()
|
||||
type = "header",
|
||||
name = "Instance Swap",
|
||||
},
|
||||
font = ACH:SharedMediaFont("Font", nil, 2, nil,
|
||||
function() return E.global.CoA.instanceButtonFont end,
|
||||
function(_, value)
|
||||
E.global.CoA.instanceButtonFont = value
|
||||
|
||||
if CoA.UpdateInstanceButtonFont then
|
||||
CoA:UpdateInstanceButtonFont()
|
||||
end
|
||||
end),
|
||||
fontSize = {
|
||||
desc = {
|
||||
order = 2,
|
||||
type = "description",
|
||||
name = "You can move this element with Toggle Anchors.\n",
|
||||
},
|
||||
instanceFont = {
|
||||
order = 3,
|
||||
type = "range",
|
||||
name = "Font Size",
|
||||
min = 8,
|
||||
max = 32,
|
||||
step = 1,
|
||||
get = function() return E.global.CoA.instanceButtonFontSize end,
|
||||
set = function(_, value)
|
||||
E.global.CoA.instanceButtonFontSize = value
|
||||
type = "group",
|
||||
inline = true,
|
||||
name = "Instance Font",
|
||||
args = {
|
||||
font = ACH:SharedMediaFont("Font", nil, 1, nil,
|
||||
function() return CoA.db.profile.instanceButtonFont end,
|
||||
function(_, value)
|
||||
CoA.db.profile.instanceButtonFont = value
|
||||
|
||||
if CoA.UpdateInstanceButtonFont then
|
||||
CoA:UpdateInstanceButtonFont()
|
||||
if CoA.UpdateInstanceButtonFont then
|
||||
CoA:UpdateInstanceButtonFont()
|
||||
end
|
||||
end),
|
||||
fontSize = {
|
||||
order = 2,
|
||||
type = "range",
|
||||
name = "Font Size",
|
||||
min = 8,
|
||||
max = 32,
|
||||
step = 1,
|
||||
get = function() return CoA.db.profile.instanceButtonFontSize end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.instanceButtonFontSize = value
|
||||
|
||||
if CoA.UpdateInstanceButtonFont then
|
||||
CoA:UpdateInstanceButtonFont()
|
||||
end
|
||||
end,
|
||||
},
|
||||
fontOutline = ACH:FontFlags("Font Outline", nil, 3, nil,
|
||||
function() return CoA.db.profile.instanceButtonFontOutline end,
|
||||
function(_, value)
|
||||
CoA.db.profile.instanceButtonFontOutline = value
|
||||
|
||||
if CoA.UpdateInstanceButtonFont then
|
||||
CoA:UpdateInstanceButtonFont()
|
||||
end
|
||||
end),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
dispelHighlight = {
|
||||
order = 4,
|
||||
type = "group",
|
||||
name = "Debuff Highlighting",
|
||||
args = {
|
||||
header = {
|
||||
order = 1,
|
||||
type = "header",
|
||||
name = "Debuff Highlighting",
|
||||
},
|
||||
onlyMine = {
|
||||
order = 2,
|
||||
type = "toggle",
|
||||
name = "Only Highlight If Dispellable By Me",
|
||||
desc = "Suppress the debuff highlight on unitframes for debuff types your class cannot dispel.",
|
||||
get = function() return CoA.db.profile.dispelHighlightOnlyMine end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.dispelHighlightOnlyMine = value
|
||||
|
||||
if CoA.UpdateDispelHighlight then
|
||||
CoA:UpdateDispelHighlight()
|
||||
end
|
||||
end,
|
||||
},
|
||||
fontOutline = ACH:FontFlags("Font Outline", nil, 4, nil,
|
||||
function() return E.global.CoA.instanceButtonFontOutline end,
|
||||
function(_, value)
|
||||
E.global.CoA.instanceButtonFontOutline = value
|
||||
talents = {
|
||||
order = 3,
|
||||
type = "group",
|
||||
inline = true,
|
||||
name = "Talents",
|
||||
args = {
|
||||
hasBlightAntidote = {
|
||||
order = 1,
|
||||
type = "toggle",
|
||||
name = string.format("Blight Antidote (%s)", LOCALIZED_CLASS_NAMES_MALE.PROPHET),
|
||||
desc = "Grants Curse dispel.",
|
||||
get = function() return CoA.db.profile.hasBlightAntidote end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hasBlightAntidote = value
|
||||
|
||||
if CoA.UpdateInstanceButtonFont then
|
||||
CoA:UpdateInstanceButtonFont()
|
||||
end
|
||||
end),
|
||||
if CoA.UpdateDispelHighlight then
|
||||
CoA:UpdateDispelHighlight()
|
||||
end
|
||||
end,
|
||||
},
|
||||
hasDevourCurse = {
|
||||
order = 2,
|
||||
type = "toggle",
|
||||
name = string.format("Devour Curse (%s)", LOCALIZED_CLASS_NAMES_MALE.CULTIST),
|
||||
desc = "Grants Curse dispel.",
|
||||
get = function() return CoA.db.profile.hasDevourCurse end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hasDevourCurse = value
|
||||
|
||||
if CoA.UpdateDispelHighlight then
|
||||
CoA:UpdateDispelHighlight()
|
||||
end
|
||||
end,
|
||||
},
|
||||
hasBurnImpurities = {
|
||||
order = 3,
|
||||
type = "toggle",
|
||||
name = string.format("Burn Impurities (%s)", LOCALIZED_CLASS_NAMES_MALE.PYROMANCER),
|
||||
desc = "Grants Magic, Disease, and Bleed dispel.",
|
||||
get = function() return CoA.db.profile.hasBurnImpurities end,
|
||||
set = function(_, value)
|
||||
CoA.db.profile.hasBurnImpurities = value
|
||||
|
||||
if CoA.UpdateDispelHighlight then
|
||||
CoA:UpdateDispelHighlight()
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
profiles = profiles,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -116,6 +306,14 @@ function CoA:Initialize()
|
||||
if self.InitializeLayerPicker then
|
||||
self:InitializeLayerPicker()
|
||||
end
|
||||
|
||||
if self.InitializeDispelHighlight then
|
||||
self:InitializeDispelHighlight()
|
||||
end
|
||||
|
||||
if self.InitializeClassResources then
|
||||
self:InitializeClassResources()
|
||||
end
|
||||
end
|
||||
|
||||
local function InitializeCallback()
|
||||
|
||||
Reference in New Issue
Block a user