Flatten repo layout, drop nested HideCoAUI subfolder

The addon folder is now the repo root, so installers rename the
extracted archive to HideCoAUI instead of finding a subfolder already
named that.
This commit is contained in:
2026-07-13 20:45:22 +02:00
parent 894b208fb0
commit 3547c3a356
6 changed files with 7 additions and 2 deletions
+422
View File
@@ -0,0 +1,422 @@
HideCoAUI = {}
local f = CreateFrame("Frame")
HideCoAUI.CUSTOM_CLASSES = {
"NECROMANCER",
"PYROMANCER",
"CULTIST",
"STARCALLER",
"SUNCLERIC",
"TINKER",
"SPIRITMAGE",
"WILDWALKER",
"REAPER",
"PROPHET",
"CHRONOMANCER",
"SONOFARUGAL",
"GUARDIAN",
"STORMBRINGER",
"DEMONHUNTER",
"BARBARIAN",
"WITCHDOCTOR",
"WITCHHUNTER",
"FLESHWARDEN",
"MONK",
"RANGER",
}
HideCoAUI.FRAMES = {
"CoAResourceSegmentBar",
"CoAResourceOrb",
"CoAResourceBar",
"CoAMultiCastActionBarFrame",
-- "CoASpellActivationOverlay", -- found via full frame scan, deliberately left without a checkbox
-- "ExtraActionBar",
}
HideCoAUI.FRAME_DISPLAY_NAMES = {
PYROMANCER = {
CoAResourceSegmentBar = "Ember Gauge",
CoAResourceBar = "Heat Gauge",
},
CULTIST = {
CoAResourceOrb = "Insanity",
},
PROPHET = {
CoAResourceSegmentBar = "Brood Marks",
},
STARCALLER = {
CoAResourceOrb = "Lunar Phase",
},
SUNCLERIC = {
CoAResourceOrb = "Solar Power",
},
}
local function GetFrameDisplayName(class, frameName)
local classNames = HideCoAUI.FRAME_DISPLAY_NAMES[class]
return classNames and classNames[frameName]
end
HideCoAUI.GetFrameDisplayName = GetFrameDisplayName
local function CreateDefaultClassSettings()
local classSettings = {}
for _, class in ipairs(HideCoAUI.CUSTOM_CLASSES) do
classSettings[class] = {}
for _, frameName in ipairs(HideCoAUI.FRAMES) do
classSettings[class][frameName] = false
end
end
return classSettings
end
local function EnsureClassSettingsComplete(classSettings)
for _, class in ipairs(HideCoAUI.CUSTOM_CLASSES) do
if type(classSettings[class]) ~= "table" then
classSettings[class] = {}
end
for _, frameName in ipairs(HideCoAUI.FRAMES) do
if classSettings[class][frameName] == nil then
classSettings[class][frameName] = false
end
end
end
end
local function GetCharacterKey()
local _, classToken = UnitClass("player")
local className = (LOCALIZED_CLASS_NAMES_MALE and LOCALIZED_CLASS_NAMES_MALE[classToken]) or classToken
return UnitName("player") .. " - " .. className .. " - " .. GetRealmName()
end
HideCoAUI.GetCharacterKey = GetCharacterKey
local function GetActiveProfileName()
local charKey = GetCharacterKey()
local assigned = HideCoADB.charProfile and HideCoADB.charProfile[charKey]
if assigned and HideCoADB.profiles[assigned] then
return assigned
end
return charKey
end
HideCoAUI.GetActiveProfileName = GetActiveProfileName
local function SetActiveProfileName(name)
HideCoADB.charProfile[GetCharacterKey()] = name
end
HideCoAUI.SetActiveProfileName = SetActiveProfileName
local function GetClassSettings()
if not HideCoADB.classSettings then
HideCoADB.classSettings = CreateDefaultClassSettings()
end
return HideCoADB.classSettings
end
HideCoAUI.GetClassSettings = GetClassSettings
local function DeleteProfile(name)
HideCoADB.profiles[name] = nil
for charKey, assigned in pairs(HideCoADB.charProfile) do
if assigned == name then
-- Unassigning falls back to the character's own auto-created
-- profile (see GetActiveProfileName/GetProfileOverride),
-- which gets recreated on demand if it doesn't exist.
HideCoADB.charProfile[charKey] = nil
end
end
end
HideCoAUI.DeleteProfile = DeleteProfile
local function EnsureProfileOverride(name)
local profile = HideCoADB.profiles[name]
if not profile then
profile = {}
HideCoADB.profiles[name] = profile
end
if not profile.override then
profile.override = { enabled = false, frameSettings = {} }
end
for _, frameName in ipairs(HideCoAUI.FRAMES) do
if profile.override.frameSettings[frameName] == nil then
profile.override.frameSettings[frameName] = false
end
end
return profile.override
end
local function GetProfileOverride(name)
return EnsureProfileOverride(name)
end
HideCoAUI.GetProfileOverride = GetProfileOverride
local function SetProfileOverrideEnabled(name, enabled)
GetProfileOverride(name).enabled = enabled
HideCoAUI.ApplySetting()
end
HideCoAUI.SetProfileOverrideEnabled = SetProfileOverrideEnabled
local function SetProfileOverrideFrameHidden(name, frameName, hide)
GetProfileOverride(name).frameSettings[frameName] = hide
HideCoAUI.ApplySetting()
end
HideCoAUI.SetProfileOverrideFrameHidden = SetProfileOverrideFrameHidden
local function GetProfileNames()
local names = {}
for name in pairs(HideCoADB.profiles) do
table.insert(names, name)
end
table.sort(names)
return names
end
HideCoAUI.GetProfileNames = GetProfileNames
local function SetAllClassesHidden(hide)
local classSettings = GetClassSettings()
for _, class in ipairs(HideCoAUI.CUSTOM_CLASSES) do
for _, frameName in ipairs(HideCoAUI.FRAMES) do
classSettings[class][frameName] = hide
end
end
end
local function HideAllFrames()
SetAllClassesHidden(true)
HideCoAUI.ApplySetting()
end
HideCoAUI.HideAllFrames = HideAllFrames
local function ShowAllFrames()
SetAllClassesHidden(false)
HideCoAUI.ApplySetting()
end
HideCoAUI.ShowAllFrames = ShowAllFrames
local function ShouldHideForClass(playerClass, frameName)
local classSettings = GetClassSettings()[playerClass]
if not classSettings or classSettings[frameName] == nil then
return false
end
return classSettings[frameName]
end
local function ShouldHideFrame(frameName)
local override = GetProfileOverride(GetActiveProfileName())
if override.enabled then
return override.frameSettings[frameName]
end
local _, playerClass = UnitClass("player")
return ShouldHideForClass(playerClass, frameName)
end
local hookedFrames = {}
local seenNaturalShow = {}
local function ApplySetting()
for _, frameName in ipairs(HideCoAUI.FRAMES) do
local frame = _G[frameName]
if frame then
if not hookedFrames[frameName] then
frame:HookScript("OnShow", function(self)
seenNaturalShow[frameName] = true
if ShouldHideFrame(frameName) then
self:Hide()
end
end)
hookedFrames[frameName] = true
end
local hide = ShouldHideFrame(frameName)
if hide then
frame:Hide()
elseif seenNaturalShow[frameName] then
-- The server never Show()s a frame the current class doesn't use,
-- so its data (powerType, maxValue, ...) is never populated. Forcing
-- Show() on it exposes that uninitialized state and crashes the
-- server's own OnUpdate handler. Only force-show a frame we've
-- already seen the game display naturally at least once.
frame:Show()
end
if frame.EnableMouse then
frame:EnableMouse(not hide)
end
end
end
end
HideCoAUI.ApplySetting = ApplySetting
f:RegisterEvent("ADDON_LOADED")
f:RegisterEvent("PLAYER_LOGIN")
f:SetScript("OnEvent", function(self, event, arg1)
if event == "ADDON_LOADED" and arg1 == "HideCoAUI" then
if not HideCoADB then
HideCoADB = {}
end
if not HideCoADB.profiles then
HideCoADB.profiles = {}
end
if not HideCoADB.charProfile then
HideCoADB.charProfile = {}
end
-- An older saved-variable format duplicated classSettings per profile
-- instead of sharing one account-wide table. Pull whichever profile
-- still has one as the seed so existing hide/show choices survive
-- the upgrade to a single global classSettings.
if not HideCoADB.classSettings then
for _, profile in pairs(HideCoADB.profiles) do
if profile.classSettings then
HideCoADB.classSettings = profile.classSettings
break
end
end
end
if not HideCoADB.classSettings then
HideCoADB.classSettings = CreateDefaultClassSettings()
end
EnsureClassSettingsComplete(HideCoADB.classSettings)
local charKey = GetCharacterKey()
-- The profile-name syntax used to be "realm - character"; rename any
-- existing profile created under that scheme to the new ordering
-- instead of leaving it orphaned in the list.
local ancientCharKey = GetRealmName() .. " - " .. UnitName("player")
if HideCoADB.profiles[ancientCharKey] and not HideCoADB.profiles[charKey] then
HideCoADB.profiles[charKey] = HideCoADB.profiles[ancientCharKey]
HideCoADB.profiles[ancientCharKey] = nil
end
-- The syntax was later "character - realm", without the class; rename
-- any existing profile/assignment created under that scheme too.
local legacyCharKey = UnitName("player") .. " - " .. GetRealmName()
if HideCoADB.profiles[legacyCharKey] and not HideCoADB.profiles[charKey] then
HideCoADB.profiles[charKey] = HideCoADB.profiles[legacyCharKey]
HideCoADB.profiles[legacyCharKey] = nil
end
if HideCoADB.charProfile[legacyCharKey] then
local assigned = HideCoADB.charProfile[legacyCharKey]
HideCoADB.charProfile[charKey] = (assigned == legacyCharKey) and charKey or assigned
HideCoADB.charProfile[legacyCharKey] = nil
end
if HideCoADB.characterOverrides and HideCoADB.characterOverrides[legacyCharKey] and not HideCoADB.characterOverrides[charKey] then
HideCoADB.characterOverrides[charKey] = HideCoADB.characterOverrides[legacyCharKey]
HideCoADB.characterOverrides[legacyCharKey] = nil
end
if not HideCoADB.profiles[charKey] then
HideCoADB.profiles[charKey] = {}
end
for name, profile in pairs(HideCoADB.profiles) do
profile.classSettings = nil
EnsureProfileOverride(name)
end
if not HideCoADB.charProfile[charKey] then
HideCoADB.charProfile[charKey] = charKey
end
-- The override toggle used to live per-character; fold any existing
-- per-character override into whichever profile is currently active
-- for this character so nobody's existing choice silently vanishes.
if HideCoADB.characterOverrides and HideCoADB.characterOverrides[charKey] then
local activeName = GetActiveProfileName()
local activeProfile = HideCoADB.profiles[activeName]
if activeProfile and not activeProfile.override then
activeProfile.override = HideCoADB.characterOverrides[charKey]
EnsureProfileOverride(activeName)
end
HideCoADB.characterOverrides[charKey] = nil
end
HideCoADB.selectedProfile = nil
elseif event == "PLAYER_LOGIN" then
ApplySetting()
end
end)