Puppeteer/ProfileManager.lua
2025-09-05 16:21:39 -07:00

420 lines
14 KiB
Lua

PTProfileManager = {}
PTUtil.SetEnvironment(PTProfileManager)
local _G = getfenv(0)
local util = PTUtil
-- Profiles that have not had style overrides applied
DefaultProfiles = {}
-- Profiles that have had style overrides applied
Profiles = {}
DefaultProfileOrder = {
"Default", "Default (Short Bar)", "Small", "Very Small", "Very Small (Horizontal)", "Long", "Long (Small)",
"Long (Integrated)", "Legacy"
}
DefaultProfileOrder = util.ToSet(DefaultProfileOrder, true)
function GetProfile(name)
return Profiles[name] or DefaultProfiles[name]
end
function GetDefaultProfile(name)
return DefaultProfiles[name]
end
function GetProfileNames()
local names = util.ToArray(DefaultProfiles)
util.RemoveElement(names, "Base")
table.sort(names, function(a, b)
return (DefaultProfileOrder[a] or 1000) < (DefaultProfileOrder[b] or 1000)
end)
return names
end
function CreateProfile(name, baseName, useDefault)
local profileGetter = (useDefault or useDefault == nil) and GetDefaultProfile or GetProfile
DefaultProfiles[name] = PTUIProfile:New(profileGetter(baseName or "Default"))
return DefaultProfiles[name]
end
function ApplyOverrides(profileName)
local overrides = PTOptions.StyleOverrides[profileName]
local profile = GetDefaultProfile(profileName)
if overrides and profile then
profile = PTUIProfile:New(profile)
Profiles[profileName] = profile
for attribute, value in pairs(overrides) do
if type(value) ~= "table" then
profile[attribute] = value
else
for k, v in pairs(value) do
profile[attribute][k] = v
end
end
end
end
end
function InitializeDefaultProfiles()
PTUIProfile.SetDefaults()
-- Master base profile
DefaultProfiles["Base"] = PTUIProfile:New()
do
local profile = CreateProfile("Long", "Base")
profile.RaidMarkIcon.AlignmentH = "CENTER"
profile.RaidMarkIcon.PaddingV = 0
profile.RaidMarkIcon.OffsetY = 5
profile.RaidMarkIcon.Width = 14
profile.RaidMarkIcon.Height = 14
profile.RoleIcon.AlignmentH = "LEFT"
profile.RoleIcon.PaddingV = 0
profile.RoleIcon.OffsetY = 5
profile.RoleIcon.OffsetX = -5
profile.PVPIcon.OffsetY = -5
end
do
local profile = CreateProfile("Long (Small)", "Base")
profile.Width = 120
profile.HealthBarHeight = 16
profile.PowerBarHeight = 8
profile.PaddingBottom = 16
profile.AuraTracker.Height = 16
profile.NameText.FontSize = 10
profile.NameText.MaxWidth = 80
local healthTexts = profile.HealthTexts
healthTexts.Normal.FontSize = 10
healthTexts.WithMissing.FontSize = 8
healthTexts.Missing.FontSize = 9
profile.PowerText.FontSize = 8
profile.RaidMarkIcon.Width = 12
profile.RaidMarkIcon.Height = 12
profile.RaidMarkIcon.AlignmentH = "CENTER"
profile.RaidMarkIcon.PaddingV = 0
profile.RaidMarkIcon.OffsetY = 5
profile.RoleIcon.Width = 12
profile.RoleIcon.Height = 12
profile.RoleIcon.AlignmentH = "LEFT"
profile.RoleIcon.PaddingV = 0
profile.RoleIcon.OffsetY = 5
profile.RoleIcon.OffsetX = -4
profile.PVPIcon.OffsetY = -5
end
do
local profile = CreateProfile("Long (Integrated)", "Base")
profile.HealthBarHeight = 35
profile.PaddingBottom = 0
profile.AuraTracker.Height = 17
profile.AuraTracker.Width = 105
profile.AuraTracker.Anchor = "Health Bar"
profile.AuraTracker.AlignmentH = "LEFT"
profile.TrackedAurasAlignment = "BOTTOM"
profile.NameText.AlignmentV = "TOP"
local healthTexts = profile.HealthTexts
healthTexts.Normal.AlignmentV = "TOP"
healthTexts.WithMissing = util.CloneTable(healthTexts.Normal, true)
healthTexts.Missing.PaddingV = 4
profile.RaidMarkIcon.AlignmentH = "CENTER"
profile.RaidMarkIcon.PaddingV = 0
profile.RaidMarkIcon.OffsetY = 5
profile.RaidMarkIcon.Width = 14
profile.RaidMarkIcon.Height = 14
profile.RoleIcon.AlignmentH = "LEFT"
profile.RoleIcon.PaddingV = 0
profile.RoleIcon.OffsetY = 6
profile.RoleIcon.OffsetX = -5
profile.PVPIcon.OffsetY = -5
end
do
local profile = CreateProfile("Small", "Base")
profile.Width = 67
profile.HealthBarHeight = 36
profile.NameText.FontSize = 11
profile.NameText.AlignmentH = "CENTER"
profile.NameText.AlignmentV = "TOP"
profile.NameText.PaddingV = 1
profile.NameText.MaxWidth = 47
profile.PowerBarHeight = 6
profile.PaddingBottom = 0
profile.AuraTracker.Height = 12
profile.AuraTracker.Anchor = "Health Bar"
profile.AuraTracker.AlignmentH = "LEFT"
profile.TrackedAurasAlignment = "BOTTOM"
profile.TrackedAurasSpacing = 1
local healthTexts = profile.HealthTexts
healthTexts.Normal.FontSize = 9
healthTexts.Normal.AlignmentH = "CENTER"
healthTexts.Normal.AlignmentV = "CENTER"
healthTexts.Normal.OffsetY = 2
healthTexts.WithMissing.FontSize = 9
healthTexts.WithMissing.AlignmentH = "LEFT"
healthTexts.WithMissing.AlignmentV = "CENTER"
healthTexts.WithMissing.OffsetY = 2
healthTexts.Missing.FontSize = 9
healthTexts.Missing.AlignmentH = "RIGHT"
healthTexts.Missing.AlignmentV = "CENTER"
healthTexts.Missing.OffsetY = 2
profile.IncomingHealDisplay = "Overheal"
profile.IncomingHealText.AlignmentH = "RIGHT"
profile.IncomingHealText.AlignmentV = "CENTER"
profile.IncomingHealText.OffsetY = -6
profile.IncomingHealText.PaddingH = 2
profile.IncomingHealText.FontSize = 7
profile.RangeText.AlignmentV = "CENTER"
profile.RangeText.OffsetY = -6
profile.RangeText.FontSize = 8
profile.LineOfSightIcon.Width = 20
profile.LineOfSightIcon.Height = 20
profile.LineOfSightIcon.Anchor = "Health Bar"
profile.LineOfSightIcon.Opacity = 70
profile.RoleIcon.Width = 12
profile.RoleIcon.Height = 12
profile.RaidMarkIcon.Width = 12
profile.RaidMarkIcon.Height = 12
profile.RaidMarkIcon.PaddingV = 0
profile.HealthDisplay = "Health"
profile.MissingHealthDisplay = "-Health"
profile.PowerDisplay = "Hidden"
profile.PowerText.FontSize = 8
end
do
local profile = CreateProfile("Very Small", "Base")
profile.Width = 50
profile.HealthBarHeight = 29
profile.NameText.FontSize = 9
profile.NameText.AlignmentH = "LEFT"
profile.NameText.AlignmentV = "TOP"
profile.NameText.PaddingV = 1
profile.NameText.OffsetX = 6
profile.NameText.MaxWidth = 34
profile.NameText.Color = "Class"
profile.PowerBarHeight = 5
profile.PaddingBottom = 0
profile.AuraTracker.Height = 11
profile.AuraTracker.Anchor = "Health Bar"
profile.AuraTracker.AlignmentH = "LEFT"
profile.TrackedAurasAlignment = "BOTTOM"
profile.TrackedAurasSpacing = 1
local healthTexts = profile.HealthTexts
healthTexts.Normal.FontSize = 8
healthTexts.Normal.AlignmentH = "CENTER"
healthTexts.Normal.AlignmentV = "CENTER"
healthTexts.Normal.OffsetY = 1
profile.IncomingHealDisplay = "Hidden"
profile.IncomingHealText.AlignmentH = "RIGHT"
profile.IncomingHealText.AlignmentV = "CENTER"
profile.IncomingHealText.OffsetY = -6
profile.IncomingHealText.PaddingH = 2
profile.IncomingHealText.FontSize = 7
profile.RangeText.AlignmentV = "CENTER"
profile.RangeText.OffsetY = -6
profile.RangeText.FontSize = 7
profile.LineOfSightIcon.Width = 16
profile.LineOfSightIcon.Height = 16
profile.LineOfSightIcon.Anchor = "Health Bar"
profile.LineOfSightIcon.Opacity = 70
profile.RoleIcon.Width = 10
profile.RoleIcon.Height = 10
profile.RaidMarkIcon.AlignmentH = "CENTER"
profile.RaidMarkIcon.PaddingV = 0
profile.RaidMarkIcon.OffsetY = 4
profile.RaidMarkIcon.Width = 10
profile.RaidMarkIcon.Height = 10
profile.HealthDisplay = "Health"
profile.MissingHealthDisplay = "Hidden"
profile.PowerDisplay = "Hidden"
profile.PowerText.FontSize = 8
profile.Orientation = "Vertical"
profile.PVPIcon.Width = 12
profile.PVPIcon.Height = 12
end
do
local profile = CreateProfile("Very Small (Horizontal)", "Very Small")
profile.Orientation = "Horizontal"
end
do
local profile = CreateProfile("Default", "Base")
profile.Width = 100
profile.HealthBarHeight = 36
profile.PowerBarHeight = 9
profile.NameText.FontSize = 11
profile.NameText.AlignmentH = "CENTER"
profile.NameText.AlignmentV = "TOP"
profile.NameText.PaddingV = 1
profile.NameText.MaxWidth = 80
profile.PaddingBottom = 0
profile.AuraTracker.Height = 14
profile.AuraTracker.Anchor = "Health Bar"
profile.AuraTracker.AlignmentH = "LEFT"
profile.TrackedAurasAlignment = "BOTTOM"
profile.TrackedAurasSpacing = 1
local healthTexts = profile.HealthTexts
healthTexts.Normal.FontSize = 11
healthTexts.Normal.AlignmentH = "CENTER"
healthTexts.Normal.AlignmentV = "CENTER"
healthTexts.Normal.OffsetY = 2
healthTexts.WithMissing.FontSize = 11
healthTexts.WithMissing.AlignmentH = "CENTER"
healthTexts.WithMissing.AlignmentV = "CENTER"
healthTexts.WithMissing.OffsetY = 2
healthTexts.WithMissing.PaddingH = 8
healthTexts.Missing.FontSize = 11
healthTexts.Missing.AlignmentH = "RIGHT"
healthTexts.Missing.AlignmentV = "CENTER"
healthTexts.Missing.OffsetY = 2
healthTexts.Missing.PaddingH = 2
profile.IncomingHealDisplay = "Overheal"
profile.IncomingHealText.AlignmentH = "LEFT"
profile.IncomingHealText.AlignmentV = "CENTER"
profile.IncomingHealText.OffsetY = 2
profile.IncomingHealText.PaddingH = 2
profile.RangeText.AlignmentV = "CENTER"
profile.RangeText.OffsetY = -7
profile.RangeText.FontSize = 9
profile.LineOfSightIcon.Width = 20
profile.LineOfSightIcon.Height = 20
profile.LineOfSightIcon.Anchor = "Health Bar"
profile.LineOfSightIcon.Opacity = 80
profile.HealthDisplay = "Health"
profile.MissingHealthDisplay = "-Health"
profile.PowerText.FontSize = 8
profile.PowerText.AlignmentH = "CENTER"
end
do
local profile = CreateProfile("Default (Short Bar)", "Base")
profile.Width = 100
profile.HealthBarHeight = 24
profile.PowerBarHeight = 9
profile.NameText.FontSize = 11
profile.NameText.AlignmentH = "CENTER"
profile.NameText.AlignmentV = "TOP"
profile.NameText.PaddingV = 0
profile.NameText.MaxWidth = 80
profile.NameText.Anchor = "Container"
profile.PaddingTop = 12
profile.PaddingBottom = 0
profile.AuraTracker.Height = 13
profile.AuraTracker.Anchor = "Health Bar"
profile.AuraTracker.AlignmentH = "LEFT"
profile.TrackedAurasAlignment = "BOTTOM"
profile.TrackedAurasSpacing = 1
local healthTexts = profile.HealthTexts
healthTexts.Normal.FontSize = 11
healthTexts.Normal.AlignmentH = "CENTER"
healthTexts.Normal.AlignmentV = "TOP"
healthTexts.Normal.OffsetY = 0
healthTexts.Normal.PaddingV = 0
healthTexts.WithMissing.FontSize = 11
healthTexts.WithMissing.AlignmentH = "CENTER"
healthTexts.WithMissing.AlignmentV = "TOP"
healthTexts.WithMissing.OffsetY = 0
healthTexts.WithMissing.PaddingH = 8
healthTexts.Missing.FontSize = 11
healthTexts.Missing.AlignmentH = "RIGHT"
healthTexts.Missing.AlignmentV = "TOP"
healthTexts.Missing.OffsetY = 0
healthTexts.Missing.PaddingH = 2
profile.IncomingHealDisplay = "Overheal"
profile.IncomingHealText.AlignmentH = "LEFT"
profile.IncomingHealText.AlignmentV = "TOP"
profile.IncomingHealText.OffsetY = 0
profile.IncomingHealText.PaddingH = 2
profile.IncomingHealText.PaddingV = 2
profile.RangeText.AlignmentV = "CENTER"
profile.RangeText.OffsetY = -4
profile.RangeText.FontSize = 9
profile.LineOfSightIcon.Width = 20
profile.LineOfSightIcon.Height = 20
profile.LineOfSightIcon.Anchor = "Health Bar"
profile.LineOfSightIcon.Opacity = 80
profile.HealthDisplay = "Health"
profile.MissingHealthDisplay = "-Health"
profile.PowerText.FontSize = 8
profile.PowerText.AlignmentH = "CENTER"
end
-- Legacy profile - Meant to look as close as possible to HealersMate 1.3.0
do
local profile = CreateProfile("Legacy", "Base")
profile.Width = 200
profile.PaddingTop = 20
profile.MissingHealthInline = true
profile.HealthBarHeight = 25
profile.HealthBarStyle = "Blizzard"
profile.PowerBarHeight = 5
profile.PowerBarStyle = "Blizzard"
profile.NameText.AlignmentH = "LEFT"
profile.NameText.AlignmentV = "TOP"
profile.NameText.Anchor = "Container"
profile.NameText.MaxWidth = 200
local healthTexts = profile.HealthTexts
healthTexts.Normal.AlignmentH = "CENTER"
profile.HealthDisplay = "Health/Max Health"
profile.PowerDisplay = "Hidden"
profile.IncomingHealDisplay = "Overheal"
profile.IncomingHealText.AlignmentH = "LEFT"
profile.IncomingHealText.AlignmentV = "CENTER"
profile.RoleIcon.AlignmentH = "RIGHT"
profile.RoleIcon.Width = 16
profile.RoleIcon.Height = 16
profile.RaidMarkIcon.AlignmentH = "RIGHT"
profile.RaidMarkIcon.OffsetX = -18
profile.RaidMarkIcon.Width = 16
profile.RaidMarkIcon.Height = 16
profile.PVPIcon.OffsetY = -4
profile.BorderStyle = "Hidden"
end
for profileName, overrides in pairs(PTOptions.StyleOverrides) do
ApplyOverrides(profileName)
end
end