Files
coa-leatrix-plus/libs/LibCompat-1.0/Backdrop/Backdrop.lua
T
Sattva 31f668fd89 Revert "Revert "first attempt""
This reverts commit ae60d63204.
2023-05-20 17:10:29 +03:00

524 lines
14 KiB
Lua

BACKDROP_TOOLTIP_8_8_1111 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 8,
edgeSize = 8,
insets = {left = 1, right = 1, top = 1, bottom = 1}
}
BACKDROP_TOOLTIP_8_12_1111 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 8,
edgeSize = 12,
insets = {left = 1, right = 1, top = 1, bottom = 1}
}
BACKDROP_TOOLTIP_16_16_5555 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 16,
edgeSize = 16,
insets = {left = 5, right = 5, top = 5, bottom = 5}
}
BACKDROP_TOOLTIP_12_12_4444 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 12,
edgeSize = 12,
insets = {left = 4, right = 4, top = 4, bottom = 4}
}
BACKDROP_TOOLTIP_0_16 = {
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 16,
tileEdge = true
}
BACKDROP_TOOLTIP_0_12_0055 = {
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 12,
tileEdge = true,
insets = {left = 0, right = 0, top = 5, bottom = 5}
}
BACKDROP_TOOLTIP_0_16_5555 = {
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 16,
tileEdge = true,
insets = {left = 5, right = 5, top = 5, bottom = 5}
}
BACKDROP_ACHIEVEMENTS_0_64 = {
edgeFile = "Interface\\AchievementFrame\\UI-Achievement-WoodBorder",
edgeSize = 64,
tileEdge = true
}
BACKDROP_ARENA_32_32 = {
bgFile = "Interface\\CharacterFrame\\UI-Party-Background",
edgeFile = "Interface\\ArenaEnemyFrame\\UI-Arena-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 32, right = 32, top = 32, bottom = 32}
}
BACKDROP_DIALOG_32_32 = {
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 11, right = 12, top = 12, bottom = 11}
}
BACKDROP_GOLD_DIALOG_32_32 = {
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 11, right = 12, top = 12, bottom = 11}
}
BACKDROP_WATERMARK_DIALOG_0_16 = {
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-TestWatermark-Border",
tileEdge = true,
edgeSize = 16
}
BACKDROP_SLIDER_8_8 = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
tile = true,
tileEdge = true,
tileSize = 8,
edgeSize = 8,
insets = {left = 3, right = 3, top = 6, bottom = 6}
}
BACKDROP_PARTY_32_32 = {
bgFile = "Interface\\CharacterFrame\\UI-Party-Background",
edgeFile = "Interface\\CharacterFrame\\UI-Party-Border",
tile = true,
tileEdge = true,
tileSize = 32,
edgeSize = 32,
insets = {left = 32, right = 32, top = 32, bottom = 32}
}
BACKDROP_TOAST_12_12 = {
bgFile = "Interface\\FriendsFrame\\UI-Toast-Background",
edgeFile = "Interface\\FriendsFrame\\UI-Toast-Border",
tile = true,
tileEdge = true,
tileSize = 12,
edgeSize = 12,
insets = {left = 5, right = 5, top = 5, bottom = 5}
}
BACKDROP_CALLOUT_GLOW_0_16 = {
edgeFile = "Interface\\TutorialFrame\\UI-TutorialFrame-CalloutGlow",
edgeSize = 16,
tileEdge = true
}
BACKDROP_CALLOUT_GLOW_0_20 = {
edgeFile = "Interface\\TutorialFrame\\UI-TutorialFrame-CalloutGlow",
edgeSize = 20,
tileEdge = true
}
BACKDROP_GLUE_TOOLTIP_16_16 = {
bgFile = "Interface\\Glues\\Common\\Glue-Tooltip-Background",
edgeFile = "Interface\\Glues\\Common\\Glue-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 16,
edgeSize = 16,
insets = {left = 10, right = 5, top = 4, bottom = 9}
}
BACKDROP_GLUE_TOOLTIP_0_16 = {
edgeFile = "Interface\\Glues\\Common\\Glue-Tooltip-Border",
tileEdge = true,
edgeSize = 16
}
BACKDROP_MIXED_TOOLTIP_16_16 = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Glues\\Common\\Glue-Tooltip-Border",
tile = true,
tileEdge = true,
tileSize = 16,
edgeSize = 16,
insets = {left = 10, right = 5, top = 4, bottom = 9}
}
BACKDROP_TEXT_PANEL_0_16 = {
edgeFile = "Interface\\Glues\\Common\\TextPanel-Border",
tileEdge = true,
edgeSize = 16
}
BackdropTemplateMixin = {}
local coordStart = 0.0625
local coordEnd = 1 - coordStart
local textureUVs = {
-- keys have to match pieceNames in nineSliceSetup table
TopLeftCorner = {
setWidth = true,
setHeight = true,
ULx = 0.5078125,
ULy = coordStart,
LLx = 0.5078125,
LLy = coordEnd,
URx = 0.6171875,
URy = coordStart,
LRx = 0.6171875,
LRy = coordEnd
},
TopRightCorner = {
setWidth = true,
setHeight = true,
ULx = 0.6328125,
ULy = coordStart,
LLx = 0.6328125,
LLy = coordEnd,
URx = 0.7421875,
URy = coordStart,
LRx = 0.7421875,
LRy = coordEnd
},
BottomLeftCorner = {
setWidth = true,
setHeight = true,
ULx = 0.7578125,
ULy = coordStart,
LLx = 0.7578125,
LLy = coordEnd,
URx = 0.8671875,
URy = coordStart,
LRx = 0.8671875,
LRy = coordEnd
},
BottomRightCorner = {
setWidth = true,
setHeight = true,
ULx = 0.8828125,
ULy = coordStart,
LLx = 0.8828125,
LLy = coordEnd,
URx = 0.9921875,
URy = coordStart,
LRx = 0.9921875,
LRy = coordEnd
},
TopEdge = {
setHeight = true,
ULx = 0.2578125,
ULy = "repeatX",
LLx = 0.3671875,
LLy = "repeatX",
URx = 0.2578125,
URy = coordStart,
LRx = 0.3671875,
LRy = coordStart
},
BottomEdge = {
setHeight = true,
ULx = 0.3828125,
ULy = "repeatX",
LLx = 0.4921875,
LLy = "repeatX",
URx = 0.3828125,
URy = coordStart,
LRx = 0.4921875,
LRy = coordStart
},
LeftEdge = {
setWidth = true,
ULx = 0.0078125,
ULy = coordStart,
LLx = 0.0078125,
LLy = "repeatY",
URx = 0.1171875,
URy = coordStart,
LRx = 0.1171875,
LRy = "repeatY"
},
RightEdge = {
setWidth = true,
ULx = 0.1328125,
ULy = coordStart,
LLx = 0.1328125,
LLy = "repeatY",
URx = 0.2421875,
URy = coordStart,
LRx = 0.2421875,
LRy = "repeatY"
},
Center = {ULx = 0, ULy = 0, LLx = 0, LLy = "repeatY", URx = "repeatX", URy = 0, LRx = "repeatX", LRy = "repeatY"}
}
local defaultEdgeSize = 39 -- the old default
function BackdropTemplateMixin:OnBackdropLoaded()
if self.backdropInfo then
-- check for invalid info
if not self.backdropInfo.edgeFile and not self.backdropInfo.bgFile then
self.backdropInfo = nil
return
end
self:ApplyBackdrop()
do
local r, g, b = 1, 1, 1
if self.backdropColor then
r, g, b = self.backdropColor:GetRGB()
end
local a = self.backdropColorAlpha or 1
self:SetBackdropColor(r, g, b, a)
end
do
local r, g, b = 1, 1, 1
if self.backdropBorderColor then
r, g, b = self.backdropBorderColor:GetRGB()
end
local a = self.backdropBorderColorAlpha or 1
self:SetBackdropBorderColor(r, g, b, a)
end
if self.backdropBorderBlendMode then
self:SetBorderBlendMode(self.backdropBorderBlendMode)
end
end
end
function BackdropTemplateMixin:OnBackdropSizeChanged()
if self.backdropInfo then
self:SetupTextureCoordinates()
end
end
function BackdropTemplateMixin:GetEdgeSize()
if self.backdropInfo.edgeSize and self.backdropInfo.edgeSize > 0 then
return self.backdropInfo.edgeSize
else
return defaultEdgeSize
end
end
local function GetBackdropCoordValue(coord, pieceSetup, repeatX, repeatY)
local value = pieceSetup[coord]
if value == "repeatX" then
return repeatX
elseif value == "repeatY" then
return repeatY
else
return value
end
end
local function SetupBackdropTextureCoordinates(region, pieceSetup, repeatX, repeatY)
region:SetTexCoord(
GetBackdropCoordValue("ULx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("ULy", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LLx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LLy", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("URx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("URy", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LRx", pieceSetup, repeatX, repeatY),
GetBackdropCoordValue("LRy", pieceSetup, repeatX, repeatY)
)
end
function BackdropTemplateMixin:SetupTextureCoordinates()
local width = self:GetWidth()
local height = self:GetHeight()
local effectiveScale = self:GetEffectiveScale()
local edgeSize = self:GetEdgeSize()
local edgeRepeatX = max(0, (width / edgeSize) * effectiveScale - 2 - coordStart)
local edgeRepeatY = max(0, (height / edgeSize) * effectiveScale - 2 - coordStart)
for pieceName, pieceSetup in pairs(textureUVs) do
local region = self[pieceName]
if region then
if pieceName == "Center" then
local repeatX = 1
local repeatY = 1
if self.backdropInfo.tile then
local divisor = self.backdropInfo.tileSize
if not divisor or divisor == 0 then
divisor = edgeSize
end
if divisor ~= 0 then
repeatX = (width / divisor) * effectiveScale
repeatY = (height / divisor) * effectiveScale
end
end
SetupBackdropTextureCoordinates(region, pieceSetup, repeatX, repeatY)
else
SetupBackdropTextureCoordinates(region, pieceSetup, edgeRepeatX, edgeRepeatY)
end
end
end
end
function BackdropTemplateMixin:SetupPieceVisuals(piece, setupInfo, pieceLayout)
local textureInfo = textureUVs[setupInfo.pieceName]
local tileVerts = false
local file
if setupInfo.pieceName == "Center" then
file = self.backdropInfo.bgFile
tileVerts = self.backdropInfo.tile
else
if self.backdropInfo.tileEdge ~= false then
tileVerts = true
end
file = self.backdropInfo.edgeFile
end
piece:SetTexture(file, tileVerts, tileVerts)
local cornerWidth = textureInfo.setWidth and self:GetEdgeSize() or 0
local cornerHeight = textureInfo.setHeight and self:GetEdgeSize() or 0
piece:SetSize(cornerWidth, cornerHeight)
end
function BackdropTemplateMixin:SetBorderBlendMode(blendMode)
if not self.backdropInfo then
return
end
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region and pieceName ~= "Center" then
region:SetBlendMode(blendMode)
end
end
end
function BackdropTemplateMixin:HasBackdropInfo(backdropInfo)
return self.backdropInfo == backdropInfo
end
function BackdropTemplateMixin:ClearBackdrop()
if self.backdropInfo then
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region then
region:SetTexture(nil)
end
end
self.backdropInfo = nil
end
end
function BackdropTemplateMixin:ApplyBackdrop()
local x, y, x1, y1 = 0, 0, 0, 0
if self.backdropInfo.bgFile then
local edgeSize = self:GetEdgeSize()
x = -edgeSize
y = edgeSize
x1 = edgeSize
y1 = -edgeSize
local insets = self.backdropInfo.insets
if insets then
x = x + (insets.left or 0)
y = y - (insets.top or 0)
x1 = x1 - (insets.right or 0)
y1 = y1 + (insets.bottom or 0)
end
end
local layout = {
TopLeftCorner = {},
TopRightCorner = {},
BottomLeftCorner = {},
BottomRightCorner = {},
TopEdge = {},
BottomEdge = {},
LeftEdge = {},
RightEdge = {},
Center = {layer = "BACKGROUND", x = x, y = y, x1 = x1, y1 = y1},
setupPieceVisualsFunction = BackdropTemplateMixin.SetupPieceVisuals
}
NineSliceUtil.ApplyLayout(self, layout)
self:SetBackdropColor(1, 1, 1, 1)
self:SetBackdropBorderColor(1, 1, 1, 1)
self:SetupTextureCoordinates()
end
-- backwards compatibility API starts here
function BackdropTemplateMixin:SetBackdrop(backdropInfo)
if backdropInfo then
if self:HasBackdropInfo(backdropInfo) then
return
end
if not backdropInfo.edgeFile and not backdropInfo.bgFile then
self:ClearBackdrop()
return
end
self.backdropInfo = backdropInfo
self:ApplyBackdrop()
else
self:ClearBackdrop()
end
end
function BackdropTemplateMixin:GetBackdrop()
if self.backdropInfo then
-- make a copy because it will be altered to match old API output
local backdropInfo = CopyTable(self.backdropInfo)
-- fill in defaults
if not backdropInfo.bgFile then
backdropInfo.bgFile = ""
end
if not backdropInfo.edgeFile then
backdropInfo.edgeFile = ""
end
if backdropInfo.tile == nil then
backdropInfo.tile = false
end
if backdropInfo.tileSize == nil then
backdropInfo.tileSize = 0
end
if backdropInfo.tileEdge == nil then
backdropInfo.tileEdge = true
end
if not backdropInfo.edgeSize then
backdropInfo.edgeSize = self:GetEdgeSize()
end
if not backdropInfo.insets then
backdropInfo.insets = {}
end
if not backdropInfo.insets.left then
backdropInfo.insets.left = 0
end
if not backdropInfo.insets.right then
backdropInfo.insets.right = 0
end
if not backdropInfo.insets.top then
backdropInfo.insets.top = 0
end
if not backdropInfo.insets.bottom then
backdropInfo.insets.bottom = 0
end
return backdropInfo
end
return nil
end
function BackdropTemplateMixin:GetBackdropColor()
if not self.backdropInfo then
return
end
if self.Center then
return self.Center:GetVertexColor()
end
end
function BackdropTemplateMixin:SetBackdropColor(r, g, b, a)
if not self.backdropInfo then
-- Ideally this would throw an error here but the old API just failed silently
return
end
if self.Center then
self.Center:SetVertexColor(r, g, b, a or 1)
end
end
function BackdropTemplateMixin:GetBackdropBorderColor()
if not self.backdropInfo then
return
end
-- return the vertex color of any valid region
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region and pieceName ~= "Center" then
return region:GetVertexColor()
end
end
end
function BackdropTemplateMixin:SetBackdropBorderColor(r, g, b, a)
if not self.backdropInfo then
-- Ideally this would throw an error here but the old API just failed silently
return
end
for pieceName in pairs(textureUVs) do
local region = self[pieceName]
if region and pieceName ~= "Center" then
region:SetVertexColor(r, g, b, a or 1)
end
end
end