You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.8 KiB

local _, T = ...
local XU = T.exUI
local assert, getWidgetData, _newWidgetData, setWidgetData = XU:GetImpl()
local edgeSlices = {
{"TOPLEFT", 0, -1, "BOTTOMRIGHT", "BOTTOMLEFT", 1, 1}, -- L
{"TOPRIGHT", 0, -1, "BOTTOMLEFT", "BOTTOMRIGHT", -1, 1}, -- R
{"TOPLEFT", 1, 0, "BOTTOMRIGHT", "TOPRIGHT", -1, -1, ccw=true}, -- T
{"BOTTOMLEFT", 1, 0, "TOPRIGHT", "BOTTOMRIGHT", -1, 1, ccw=true}, -- B
{"TOPLEFT", 0, 0, "BOTTOMRIGHT", "TOPLEFT", 1, -1},
{"TOPRIGHT", 0, 0, "BOTTOMLEFT", "TOPRIGHT", -1, -1},
{"BOTTOMLEFT", 0, 0, "TOPRIGHT", "BOTTOMLEFT", 1, 1},
{"BOTTOMRIGHT", 0, 0, "TOPLEFT", "BOTTOMRIGHT", -1, 1}
}
local function unpackColor(c)
local c0, c1, c2 = c % 2^8, c % 2^16, c % 2^24
return (c2 - c1) / (2^16 * 255), (c1 - c0) / (2^8 * 255), c0 / 255, c > c2 and (c - c2) / (2^24 * 255) or 1
end
local Backdrop, BackdropData = {}, {}
function Backdrop:SetBackdrop(info)
local d = assert(getWidgetData(self, BackdropData), "Invalid object type")
assert(type(info) == "table", 'Syntax: Backdrop:SetBackdrop(props)')
if info.bgFile then
local bg, insets = d.bg or d.host:CreateTexture(), info.insets
local tileH, tileV = not not (info.tileH == nil and info.tile or info.tileH), not not (info.tileV == nil and info.tile or info.tileV)
bg:SetDrawLayer("BACKGROUND", info.bgSubLevel or info.subLevel or -7)
bg:SetTexture(info.bgFile, tileH, tileV)
bg:SetHorizTile(tileH)
bg:SetVertTile(tileV)
bg:SetPoint("TOPLEFT", (insets and insets.left or 0), -(insets and insets.top or 0))
bg:SetPoint("BOTTOMRIGHT", -(insets and insets.right or 0), (insets and insets.bottom or 0))
bg:SetVertexColor(unpackColor(info.bgColor or 0xffffff))
bg:Show()
d.bg = bg
elseif d.bg then
d.bg:Hide()
end
if info.edgeFile then
local ed, esz = d.edge, info.edgeSize or 39
for i=1,#edgeSlices do
local t, s = ed[i] or d.host:CreateTexture(), edgeSlices[i]
ed[i] = t
t:SetDrawLayer("BORDER", info.edgeSubLevel or info.subLevel or -7)
t:SetTexture(info.edgeFile)
t:SetPoint(s[1], s[2]*esz, s[3]*esz)
t:SetPoint(s[4], d.host, s[5], s[6]*esz, s[7]*esz)
local x1, x2, y1, y2 = 1/128+(i-1)/8, i/8-1/128, 0.0625, 1-0.0625
if s.ccw then
t:SetTexCoord(x1,y2, x2,y2, x1,y1, x2,y1)
else
t:SetTexCoord(x1, x2, y1, y2)
end
end
ed:SetVertexColor(unpackColor(info.edgeColor or 0xffffff))
elseif d.edge[1] then
d.edge:Hide()
end
end
local backdrop_mt = {__index=Backdrop}
local function CreateBackdrop(f, info)
assert(type(f) == "table" and type(f.IsObjectType) == "function" and f:IsObjectType("Frame")
and (info == nil or type(info) == "table"), 'Syntax: Create("Backdrop", parent[, props])')
local r = setmetatable({[0]=newproxy()}, backdrop_mt)
setWidgetData(r, BackdropData, {self=r, host=f, edge=XU:Create("ObjectGroup")})
if info then r:SetBackdrop(info) end
return r
end
XU:RegisterFactory("Backdrop", CreateBackdrop)