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