278 lines
7.5 KiB
Lua
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
|