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.

401 lines
13 KiB

local NineSliceUtil = {};
NarciAPI.NineSliceUtil = NineSliceUtil;
local AddPixelPerfectTexture = NarciAPI.AddPixelPerfectTexture; --(frame, texture, pixelWidth, pixelHeight)
--Texture order ↓
-- 1 | 2 | 3
-- 4 | 5 | 6
-- 7 | 8 | 9
local ORDER = {1, 3, 7, 9, 2, 4, 6, 8, 5};
local PATH_PREFIX = "Interface\\AddOns\\Narcissus\\Art\\";
local TextureData = {
rectR6 = {
file = "Frames\\NineSliceRectR6",
cornerSize = 4,
cornerCoord = 0.25,
},
shadowR6 = {
file = "Frames\\NineSliceShadowR6",
cornerSize = 8,
cornerCoord = 0.375,
offsetRatio = 0.6667,
},
shadowR12 = {
file = "Frames\\NineSliceShadowR6",
cornerSize = 16,
cornerCoord = 0.375,
offsetRatio = 0.6667,
},
shadowR0 = {
file = "Frames\\NineSliceShadowR0",
cornerSize = 8,
cornerCoord = 0.375,
offsetRatio = 0.6667,
},
shadowLargeR0 = {
file = "Frames\\NineSliceShadowR0",
cornerSize = 16,
cornerCoord = 0.375,
offsetRatio = 0.6667,
},
shadowHugeR0 = {
file = "Frames\\NineSliceShadowR0",
cornerSize = 20,
cornerCoord = 0.375,
offsetRatio = 0.6667,
},
phantom = {
file = "Frames\\NineSlicePhantom",
cornerSize = 24,
cornerCoord = 0.25,
},
photoModePopup = {
file = "Frames\\NineSlicePhotoModePopup",
cornerSize = 16,
cornerCoord = 0.25,
},
chatBubbleBlack = {
file = "Frames\\NineSliceChatBubbleBlack",
cornerSize = 16,
cornerCoord = 0.25,
},
chatBubbleWhite = {
file = "Frames\\NineSliceChatBubbleWhite",
cornerSize = 12,
cornerCoord = 0.25,
},
settingsBackground = {
file = "SettingsFrame\\FrameBackground",
cornerSize = 32,
cornerCoord = 0.25,
pixelPerfect = true,
useCenterForAlignment = true,
},
settingsBorder = {
file = "SettingsFrame\\FrameBorder",
cornerSize = 32,
cornerCoord = 0.25,
pixelPerfect = true,
useCenterForAlignment = true,
},
blackChamfer8 = {
file = "Frames\\NineSliceChamfer8",
cornerSize = 32,
cornerCoord = 0.25,
pixelPerfect = true,
useCenterForAlignment = true,
},
classTalentTrait = {
file = "Modules\\TalentTree\\TraitTooltipNineSlice",
cornerSize = 32,
cornerCoord = 0.25,
pixelPerfect = true,
useCenterForAlignment = true,
},
classTalentTraitTransparent = {
file = "Modules\\TalentTree\\TraitTooltipStrokeOnlyNineSlice",
cornerSize = 32,
cornerCoord = 0.25,
pixelPerfect = true,
useCenterForAlignment = true,
},
brownBorder = {
file = "Modules\\BagItemSearchSuggest\\BorderNineSlice",
cornerSize = 24,
cornerCoord = 0.25,
},
whiteBorder = {
file = "Modules\\BagItemSearchSuggest\\BorderNineSlice",
cornerSize = 24,
cornerCoord = 0.25,
},
};
function NineSliceUtil.SetUp(frame, textureKey, layer, shrink, customLayerSubLevel)
shrink = shrink or 0;
local group, subLevel;
if layer == "backdrop" then
if not frame.backdropTextures then
frame.backdropTextures = {};
end
group = frame.backdropTextures;
subLevel = 0;
elseif layer == "border" then
if not frame.borderTextures then
frame.borderTextures = {};
end
group = frame.borderTextures;
subLevel = -1;
else
return
end
if customLayerSubLevel then
subLevel = customLayerSubLevel;
end
local data = TextureData[textureKey];
local file = PATH_PREFIX .. data.file;
local size = data.cornerSize;
local coord = data.cornerCoord;
local pixelMode = data.pixelPerfect;
local useCenterForAlignment = data.useCenterForAlignment;
local offset = size * (data.offsetRatio or 0);
local ORDER = {1, 3, 7, 9, 2, 4, 6, 8, 5};
local tex, key;
local isNewTexture;
for i = 1, 9 do
key = ORDER[i];
if not group[key] then
group[key] = frame:CreateTexture(nil, "BACKGROUND", nil, subLevel);
isNewTexture = true;
else
isNewTexture = false;
end
tex = group[key];
tex:SetTexture(file, nil, nil, "LINEAR"); --NEAREST LINEAR
if key == 2 or key == 8 then
--tex:SetHeight(size);
if key == 2 then
tex:SetPoint("TOPLEFT", group[1], "TOPRIGHT", 0, 0);
tex:SetPoint("BOTTOMRIGHT", group[3], "BOTTOMLEFT", 0, 0);
tex:SetTexCoord(coord, 1-coord, 0, coord);
else
tex:SetPoint("TOPLEFT", group[7], "TOPRIGHT", 0, 0);
tex:SetPoint("BOTTOMRIGHT", group[9], "BOTTOMLEFT", 0, 0);
tex:SetTexCoord(coord, 1-coord, 1-coord, 1);
end
elseif key == 4 or key == 6 then
--tex:SetWidth(size);
if key == 4 then
tex:SetPoint("TOPLEFT", group[1], "BOTTOMLEFT", 0, 0);
tex:SetPoint("BOTTOMRIGHT", group[7], "TOPRIGHT", 0, 0);
tex:SetTexCoord(0, coord, coord, 1-coord);
else
tex:SetPoint("TOPLEFT", group[3], "BOTTOMLEFT", 0, 0);
tex:SetPoint("BOTTOMRIGHT", group[9], "TOPRIGHT", 0, 0);
tex:SetTexCoord(1-coord, 1, coord, 1-coord);
end
elseif key == 5 then
tex:SetPoint("TOPLEFT", group[1], "BOTTOMRIGHT", 0, 0);
tex:SetPoint("BOTTOMRIGHT", group[9], "TOPLEFT", 0, 0);
tex:SetTexCoord(coord, 1-coord, coord, 1-coord);
else
tex:SetSize(size, size);
if useCenterForAlignment then
if key == 1 then
tex:SetPoint("CENTER", frame, "TOPLEFT", shrink, -shrink);
tex:SetTexCoord(0, coord, 0, coord);
elseif key == 3 then
tex:SetPoint("CENTER", frame, "TOPRIGHT", -shrink, -shrink);
tex:SetTexCoord(1-coord, 1, 0, coord);
elseif key == 7 then
tex:SetPoint("CENTER", frame, "BOTTOMLEFT", shrink, shrink);
tex:SetTexCoord(0, coord, 1-coord, 1);
elseif key == 9 then
tex:SetPoint("CENTER", frame, "BOTTOMRIGHT", -shrink, shrink);
tex:SetTexCoord(1-coord, 1, 1-coord, 1);
end
else
if key == 1 then
tex:SetPoint("TOPLEFT", frame, "TOPLEFT", -offset + shrink, offset - shrink);
tex:SetTexCoord(0, coord, 0, coord);
elseif key == 3 then
tex:SetPoint("TOPRIGHT", frame, "TOPRIGHT", offset - shrink, offset - shrink);
tex:SetTexCoord(1-coord, 1, 0, coord);
elseif key == 7 then
tex:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", -offset + shrink, -offset + shrink);
tex:SetTexCoord(0, coord, 1-coord, 1);
elseif key == 9 then
tex:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", offset - shrink, -offset + shrink);
tex:SetTexCoord(1-coord, 1, 1-coord, 1);
end
end
if pixelMode and isNewTexture then
AddPixelPerfectTexture(frame, tex, size, size);
end
end
end
if frame.pixelDriver then
frame.pixelDriver.scale = 0; --reset scale so it can update on next OnShow
end
end
function NineSliceUtil.SetBackdropColor(frame, r, g, b)
if frame.backdropTextures then
for i = 1, 9 do
frame.backdropTextures[i]:SetVertexColor(r, g, b);
end
end
end
function NineSliceUtil.SetBorderColor(frame, r, g, b)
if frame.borderTextures then
for i = 1, 9 do
frame.borderTextures[i]:SetVertexColor(r, g, b);
end
end
end
function NineSliceUtil.SetUpBackdrop(frame, textureKey, shrink, r, g, b, customLayerSubLevel)
NineSliceUtil.SetUp(frame, textureKey, "backdrop", shrink, customLayerSubLevel);
if r and g and b then
NineSliceUtil.SetBackdropColor(frame, r, g, b);
end
end
function NineSliceUtil.SetUpBorder(frame, textureKey, shrink, r, g, b, customLayerSubLevel)
NineSliceUtil.SetUp(frame, textureKey, "border", shrink, customLayerSubLevel);
if r and g and b then
NineSliceUtil.SetBorderColor(frame, r, g, b);
end
end
----Border Tile----
local TileData = {
leather = {
file = "Tiles\\Leather",
pixel = 64,
padding = 16,
minPixel = 32,
},
};
local function AjustPixel_OnShow(self)
local scale = self:GetEffectiveScale();
if scale ~= self.tileScale then
self.tileScale = scale;
local px = NarciAPI.GetPixelForWidget(self);
self.pixelSize = px;
local size = self.tiles.size * px;
for i = 1, 4 do
self.tiles[i]:SetSize(size, size);
end
if self.SetPadding then
local p = self.tiles.padding * px;
self:SetPadding(p, p, p, p);
end
if self.tiles.minPixel then
local a = self.tiles.minPixel / px;
self:SetMinResize(a, a);
self.minSize = a;
end
if self.OnPixelChanged then
self:OnPixelChanged(px);
end
end
end
local function AjustTitleVisibility_OnSizeChanged(self, w, h)
self.tiles[5]:SetShown(h > self.minSize);
self.tiles[6]:SetShown(h > self.minSize);
self.tiles[7]:SetShown(w > self.minSize);
self.tiles[8]:SetShown(w > self.minSize);
end
function NineSliceUtil.TileFrame(frame, tileName)
local data = TileData[tileName];
if not data then return end
local hookscript = false;
if not frame.tiles then
frame.tiles = {};
hookscript = true;
end
local tiles = frame.tiles;
tiles.size = data.pixel;
tiles.padding = data.padding;
tiles.minPixel = data.minPixel;
local file = PATH_PREFIX.. data.file;
local t;
for i = 1, 8 do
if not tiles[i] then
tiles[i] = frame:CreateTexture(nil, "BORDER");
end
t = tiles[i];
t:SetTexture(file);
if i <= 4 then
if i == 1 then --topleft
t:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, 0);
t:SetTexCoord(0, 0.5, 0, 0.5);
elseif i == 2 then --topright
t:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, 0);
t:SetTexCoord(0.5, 0, 0, 0.5);
elseif i == 3 then --bottomleft
t:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 0, 0);
t:SetTexCoord(0, 0.5, 0.5, 0);
elseif i == 4 then --bottomright
t:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, 0);
t:SetTexCoord(0.5, 0, 0.5, 0);
end
else
if i == 5 then --left
t:SetPoint("TOPLEFT", tiles[1], "BOTTOMLEFT", 0, 0);
t:SetPoint("BOTTOMRIGHT", tiles[3], "TOPRIGHT", 0, 0);
t:SetTexCoord(0, 0.5, 0.5, 1);
elseif i == 6 then --right
t:SetPoint("TOPLEFT", tiles[2], "BOTTOMLEFT", 0, 0);
t:SetPoint("BOTTOMRIGHT", tiles[4], "TOPRIGHT", 0, 0);
t:SetTexCoord(0.5, 0, 0.5, 1);
elseif i == 7 then --top
t:SetPoint("TOPLEFT", tiles[1], "TOPRIGHT", 0, 0);
t:SetPoint("BOTTOMRIGHT", tiles[2], "BOTTOMLEFT", 0, 0);
t:SetTexCoord(0.5, 1, 0, 0.5);
elseif i == 8 then --bottom
t:SetPoint("TOPLEFT", tiles[3], "TOPRIGHT", 0, 0);
t:SetPoint("BOTTOMRIGHT", tiles[4], "BOTTOMLEFT", 0, 0);
t:SetTexCoord(0.5, 1, 0.5, 0);
end
end
end
AjustPixel_OnShow(frame);
if hookscript then
if frame:GetScript("OnShow") then
frame:HookScript("OnShow", function(f)
AjustPixel_OnShow(f);
end);
else
frame:SetScript("OnShow", AjustPixel_OnShow);
end
if data.minPixel then
frame:HookScript("OnSizeChanged", function(f, w, h)
AjustTitleVisibility_OnSizeChanged(f, w, h);
end);
end
end
end