Files
coa-chatter/Chatter/Modules/ChatFrameBorders.lua
T
florian.berthold 5eaec81f02 chore: move addon into Chatter/ + add standard .gitignore
Matches the Exiles fork-layout convention (each addon in its own folder).
2026-05-25 10:59:27 +02:00

278 lines
7.5 KiB
Lua

local mod = Chatter:NewModule("Borders/Background")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Borders/Background"]
local Media = LibStub("LibSharedMedia-3.0")
local CreateFrame = _G.CreateFrame
local pairs = _G.pairs
local tinsert = _G.tinsert
local type = _G.type
local options = {
}
local defaults = {
profile = {
frames = {}
}
}
local frame_defaults = {
enable = true,
combatLogFix = false,
background = "Blizzard Tooltip",
border = "Blizzard Tooltip",
inset = 3,
edgeSize = 12,
backgroundColor = { r = 0, g = 0, b = 0, a = 1 },
borderColor = { r = 1, g = 1, b = 1, a = 1 },
}
local function deepcopy(tbl)
local new = {}
for key,value in pairs(tbl) do
new[key] = type(value) == "table" and deepcopy(value) or value -- if it's a table, run deepCopy on it too, so we get a copy and not the original
end
return new
end
local frames = {}
function mod:OnInitialize()
for i = 1, NUM_CHAT_WINDOWS do
defaults.profile.frames["FRAME_" .. i] = deepcopy(frame_defaults)
if _G["ChatFrame" .. i] == COMBATLOG then
defaults.profile.frames["FRAME_" .. i].enable = false
end
end
defaults.profile.frames.FRAME_2.combatLogFix = true
self.db = Chatter.db:RegisterNamespace("ChatFrameBorders", defaults)
Media.RegisterCallback(mod, "LibSharedMedia_Registered")
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
local frame = CreateFrame("Frame", nil, cf, "ChatFrameBorderTemplate")
frame:EnableMouse(false)
cf:SetFrameStrata("LOW")
frame:SetFrameStrata("BACKGROUND")
frame:SetFrameLevel(1)
frame:Hide()
frame.id = "FRAME_" .. i
tinsert(frames, frame)
local t = {
type = "group",
name = L["Chat Frame "] .. i,
desc = L["Chat Frame "] .. i,
args = {
enable = {
type = "toggle",
name = L["Enable"],
desc = L["Enable borders on this frame"],
order = 1,
get = function()
return mod.db.profile.frames[frame.id].enable
end,
set = function(info, v)
mod.db.profile.frames[frame.id].enable = v
if v then
frame:Show()
else
frame:Hide()
end
end
},
combatLogFix = {
type = "toggle",
name = L["Combat Log Fix"],
desc = L["Resize this border to fit the new combat log"],
get = function() return mod.db.profile.frames[frame.id].combatLogFix end,
set = function(info, v)
mod.db.profile.frames[frame.id].combatLogFix = v
mod:SetAnchors(frame, v)
end
},
background = {
type = "select",
name = L["Background texture"],
desc = L["Background texture"],
dialogControl = "LSM30_Background",
values = Media:HashTable("background"),
get = function() return mod.db.profile.frames[frame.id].background end,
set = function(info, v)
mod.db.profile.frames[frame.id].background = v
mod:SetBackdrop(frame)
end
},
border = {
type = "select",
name = L["Border texture"],
desc = L["Border texture"],
dialogControl = "LSM30_Border",
values = Media:HashTable("border"),
get = function() return mod.db.profile.frames[frame.id].border end,
set = function(info, v)
mod.db.profile.frames[frame.id].border = v
mod:SetBackdrop(frame)
end
},
backgroundColor = {
type = "color",
name = L["Background color"],
desc = L["Background color"],
hasAlpha = true,
get = function()
local c = mod.db.profile.frames[frame.id].backgroundColor
return c.r, c.g, c.b, c.a
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.frames[frame.id].backgroundColor
c.r, c.g, c.b, c.a = r, g, b, a
mod:SetBackdrop(frame)
end
},
borderColor = {
type = "color",
name = L["Border color"],
desc = L["Border color"],
hasAlpha = true,
get = function()
local c = mod.db.profile.frames[frame.id].borderColor
return c.r, c.g, c.b, c.a
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.frames[frame.id].borderColor
c.r, c.g, c.b, c.a = r, g, b, a
mod:SetBackdrop(frame)
end
},
inset = {
type = "range",
name = L["Background Inset"],
desc = L["Background Inset"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames[frame.id].inset end,
set = function(info, v)
mod.db.profile.frames[frame.id].inset = v
mod:SetBackdrop(frame)
end
},
tileSize = {
type = "range",
name = L["Tile Size"],
desc = L["Tile Size"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames[frame.id].tileSize end,
set = function(info, v)
mod.db.profile.frames[frame.id].tileSize = v
mod:SetBackdrop(frame)
end
},
edgeSize = {
type = "range",
name = L["Edge Size"],
desc = L["Edge Size"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames[frame.id].edgeSize end,
set = function(info, v)
mod.db.profile.frames[frame.id].edgeSize = v
mod:SetBackdrop(frame)
end
}
}
}
options[frame.id] = t
end
end
function mod:LibSharedMedia_Registered()
mod:SetBackdrops()
end
function mod:Decorate(cf)
local frame = CreateFrame("Frame", nil, cf, "ChatFrameBorderTemplate")
frame:EnableMouse(false)
cf:SetFrameStrata("LOW")
frame:SetFrameStrata("BACKGROUND")
frame:SetFrameLevel(1)
frame:Hide()
frame.id = "FRAME_1"
tinsert(frames, frame)
self:SetBackdrops()
frame:Show()
mod:SetAnchors(frame, self.db.profile.frames["FRAME_1"].combatLogFix)
end
function mod:OnEnable()
self:LibSharedMedia_Registered()
self:SetBackdrops()
for i = 1, #frames do
frames[i]:Show()
mod:SetAnchors(frames[i], self.db.profile.frames["FRAME_" .. i].combatLogFix)
end
Media.RegisterCallback(mod, "LibSharedMedia_Registered")
end
function mod:OnDisable()
for i = 1, #frames do
frames[i]:Hide()
end
end
function mod:SetBackdrops()
for i = 1, #frames do
self:SetBackdrop(frames[i])
end
end
do
function mod:SetBackdrop(frame)
local profile = self.db.profile.frames[frame.id]
frame:SetBackdrop({
bgFile = Media:Fetch("background", profile.background),
edgeFile = Media:Fetch("border", profile.border),
tile = true,
tileSize = profile.tileSize,
edgeSize = profile.edgeSize,
insets = {left = profile.inset, right = profile.inset, top = profile.inset, bottom = profile.inset}
})
local c = profile.backgroundColor
frame:SetBackdropColor(c.r, c.g, c.b, c.a)
local c = profile.borderColor
frame:SetBackdropBorderColor(c.r, c.g, c.b, c.a)
end
end
function mod:GetOptions()
return options
end
function mod:SetAnchors(frame, fix)
local p = frame:GetParent()
frame:ClearAllPoints()
if fix then
frame:SetPoint("TOPLEFT", p, "TOPLEFT", -5, 30)
frame:SetPoint("TOPRIGHT", p, "TOPRIGHT", 5, 30)
frame:SetPoint("BOTTOMLEFT", p, "BOTTOMLEFT", -5, -10)
frame:SetPoint("BOTTOMRIGHT", p, "BOTTOMRIGHT", 5, -10)
else
frame:SetPoint("TOPLEFT", p, "TOPLEFT", -5, 5)
frame:SetPoint("TOPRIGHT", p, "TOPRIGHT", 5, 5)
frame:SetPoint("BOTTOMLEFT", p, "BOTTOMLEFT", -5, -10)
frame:SetPoint("BOTTOMRIGHT", p, "BOTTOMRIGHT", 5, -10)
end
end
function mod:Info()
return L["Gives you finer control over the chat frame's background and border colors"]
end