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.
214 lines
7.7 KiB
214 lines
7.7 KiB
local _, addon = ...
|
|
local TalentTreeOnEnterDelay = addon.TalentTreeOnEnterDelay;
|
|
|
|
|
|
local TextButtonUtil = {};
|
|
addon.TalentTreeTextButtonUtil = TextButtonUtil;
|
|
|
|
|
|
local function TextButton_SetGrayscale(f, grey)
|
|
f.ButtonText:SetTextColor(grey, grey, grey); --0.67, 0.5
|
|
f.Icon:SetVertexColor(grey, grey, grey)
|
|
end
|
|
|
|
local function TextButton_OnEnter(f)
|
|
TextButton_SetGrayscale(f, f.c1); --1, 0.92
|
|
end
|
|
|
|
local function TextButton_OnLeave(f)
|
|
TextButton_SetGrayscale(f, f.c0); --0.67, 0.5
|
|
TalentTreeOnEnterDelay:ClearWatch();
|
|
end
|
|
|
|
|
|
local function TextButton_OnMouseDown(f)
|
|
if f:IsEnabled() then
|
|
if f.pushDirection == "vertical" then
|
|
f.Reference:SetPoint("CENTER", 0, -TextButtonUtil.pixel or -0.8);
|
|
else
|
|
f.Reference:SetPoint("CENTER", TextButtonUtil.pixel or 0.8, 0);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function TextButton_OnMouseUp(f)
|
|
f.Reference:SetPoint("CENTER", 0, 0);
|
|
end
|
|
|
|
function TextButtonUtil:CreateButton(container, iconPosition, textAlignment, pushDirection, customButtonWidth, iconKey)
|
|
if not self.buttons then
|
|
self.buttons = {};
|
|
end
|
|
|
|
local button = CreateFrame("Button", nil, container, "NarciTalentTreeTextButtonTemplate");
|
|
table.insert(self.buttons, button);
|
|
button.c1 = 0.92;
|
|
button.c0 = 0.5;
|
|
button:SetScript("OnEnter", TextButton_OnEnter);
|
|
button:SetScript("OnLeave", TextButton_OnLeave);
|
|
button:SetScript("OnMouseDown", TextButton_OnMouseDown);
|
|
button:SetScript("OnMouseUp", TextButton_OnMouseUp);
|
|
button.iconPosition = iconPosition;
|
|
button.textAlignment = textAlignment;
|
|
button.pushDirection = pushDirection;
|
|
button.iconHeight = 16;
|
|
|
|
if textAlignment == "left" then
|
|
button.ButtonText:SetJustifyH("LEFT");
|
|
if iconPosition == "left" then
|
|
button.Icon:ClearAllPoints();
|
|
button.ButtonText:ClearAllPoints();
|
|
button.Icon:SetPoint("LEFT", button.Reference, "LEFT", 0, 0);
|
|
button.ButtonText:SetPoint("LEFT", button.Icon, "RIGHT", 4, 0);
|
|
else
|
|
button.Icon:ClearAllPoints();
|
|
button.ButtonText:ClearAllPoints();
|
|
button.ButtonText:SetPoint("LEFT", button.Reference, "LEFT", 0, 0);
|
|
button.Icon:SetPoint("LEFT", button.ButtonText, "RIGHT", 4, 0);
|
|
end
|
|
elseif textAlignment == "right" then
|
|
button.ButtonText:SetJustifyH("RIGHT");
|
|
if iconPosition == "left" then
|
|
button.Icon:ClearAllPoints();
|
|
button.ButtonText:ClearAllPoints();
|
|
button.ButtonText:SetPoint("RIGHT", button.Reference, "RIGHT", 0, 0);
|
|
button.Icon:SetPoint("RIGHT", button.ButtonText, "LEFT", -4, 0);
|
|
else
|
|
button.Icon:ClearAllPoints();
|
|
button.ButtonText:ClearAllPoints();
|
|
button.Icon:SetPoint("RIGHT", button.Reference, "RIGHT", 0, 0);
|
|
button.ButtonText:SetPoint("RIGHT", button.Icon, "LEFT", -4, 0);
|
|
end
|
|
else
|
|
button.ButtonText:SetJustifyH("CENTER");
|
|
if iconPosition == "left" then
|
|
button.Icon:ClearAllPoints();
|
|
button.ButtonText:ClearAllPoints();
|
|
button.ButtonText:SetPoint("CENTER", button.Reference, "CENTER", 0, 0);
|
|
button.Icon:SetPoint("RIGHT", button.ButtonText, "LEFT", -4, 0);
|
|
else
|
|
button.Icon:ClearAllPoints();
|
|
button.ButtonText:ClearAllPoints();
|
|
button.ButtonText:SetPoint("CENTER", button.Reference, "CENTER", 0, 0);
|
|
button.Icon:SetPoint("LEFT", button.ButtonText, "RIGHT", 4, 0);
|
|
end
|
|
end
|
|
|
|
|
|
TextButton_SetGrayscale(button, button.c0);
|
|
|
|
if customButtonWidth then
|
|
button:SetWidth(customButtonWidth);
|
|
end
|
|
|
|
if iconKey then
|
|
self:SetButtonIcon(button, iconKey);
|
|
end
|
|
|
|
return button
|
|
end
|
|
|
|
function TextButtonUtil:SetButtonNormalAndHiglightColor(button, normalBrightness, highlightBrightness)
|
|
button.c0 = normalBrightness;
|
|
button.c1 = highlightBrightness;
|
|
TextButton_SetGrayscale(button, normalBrightness);
|
|
end
|
|
|
|
function TextButtonUtil:UpdatePixel(px, fontPixelSize)
|
|
if not self.buttons then return end;
|
|
|
|
self.pixel = px;
|
|
|
|
local fontSize = fontPixelSize * px;
|
|
|
|
local effectiveHitHeight = 24;
|
|
|
|
local verticalCompensation = (fontSize - effectiveHitHeight)/2;
|
|
if verticalCompensation > 0 then
|
|
verticalCompensation = 0;
|
|
end
|
|
|
|
local font = self.buttons[1].ButtonText:GetFont();
|
|
local buttonWidth;
|
|
|
|
local leftSideCompensation, rightCompensation;
|
|
|
|
for i, b in ipairs(self.buttons) do
|
|
b.ButtonText:SetFont(font, fontSize, "");
|
|
b:SetHeight(fontSize);
|
|
buttonWidth = b:GetWidth();
|
|
b.Reference:SetSize(buttonWidth, fontSize);
|
|
|
|
if b.iconWidth and b.iconHeight then
|
|
b.Icon:SetSize(b.iconWidth * px, b.iconHeight * px);
|
|
end
|
|
|
|
b.Icon:ClearAllPoints();
|
|
b.ButtonText:ClearAllPoints();
|
|
|
|
if b.textAlignment == "left" then
|
|
leftSideCompensation = -8;
|
|
rightCompensation = 0;
|
|
if b.iconPosition == "left" then
|
|
b.Icon:SetPoint("LEFT", b.Reference, "LEFT", 0, 0);
|
|
b.ButtonText:SetPoint("LEFT", b.Icon, "RIGHT", 4*px, 0);
|
|
else
|
|
b.ButtonText:SetPoint("LEFT", b.Reference, "LEFT", 0, 0);
|
|
b.Icon:SetPoint("LEFT", b.ButtonText, "RIGHT", 4*px, 0);
|
|
end
|
|
elseif b.textAlignment == "right" then
|
|
leftSideCompensation = 0;
|
|
rightCompensation = -8;
|
|
if b.iconPosition == "left" then
|
|
b.ButtonText:SetPoint("RIGHT", b.Reference, "RIGHT", 0, 0);
|
|
b.Icon:SetPoint("RIGHT", b.ButtonText, "LEFT", -4*px, 0);
|
|
else
|
|
b.Icon:SetPoint("RIGHT", b.Reference, "RIGHT", 0, 0);
|
|
b.ButtonText:SetPoint("RIGHT", b.Icon, "LEFT", -4*px, 0);
|
|
end
|
|
else
|
|
leftSideCompensation = 0;
|
|
rightCompensation = 0;
|
|
if b.iconPosition == "left" then
|
|
b.ButtonText:SetPoint("CENTER", b.Reference, "CENTER", (b.iconWidth or 16)*px*0.5, 0);
|
|
b.Icon:SetPoint("RIGHT", b.ButtonText, "LEFT", -4*px, 0);
|
|
else
|
|
b.ButtonText:SetPoint("CENTER", b.Reference, "CENTER", -(b.iconWidth or 16)*px*0.5, 0);
|
|
b.Icon:SetPoint("LEFT", b.ButtonText, "RIGHT", 4*px, 0);
|
|
end
|
|
end
|
|
|
|
b:SetHitRectInsets(leftSideCompensation, rightCompensation, verticalCompensation, verticalCompensation);
|
|
end
|
|
end
|
|
|
|
|
|
local ICON_INFO = {
|
|
--[iconKey] = {halfWidth, texCoords...}
|
|
arrowRight = {true, 0, 0.125, 0, 0.25},
|
|
arrowLeft = {true, 0.125, 0.25, 0, 0.25},
|
|
arrowDown = {false, 0.25, 0.5, 0, 0.25},
|
|
cog = {false, 0.5, 0.75, 0, 0.25},
|
|
share = {false, 0.75, 1, 0, 0.25},
|
|
inspectNode = {false, 0, 0.25, 0.75, 1},
|
|
diffNode = {false, 0.25, 0.5, 0.75, 1},
|
|
plus = {false, 0, 0.25, 0.25, 0.5},
|
|
check = {false, 0.25, 0.5, 0.25, 0.5},
|
|
cross = {false, 0.5, 0.75, 0.25, 0.5},
|
|
};
|
|
|
|
function TextButtonUtil:SetButtonIcon(textButton, icon)
|
|
if ICON_INFO[icon] then
|
|
local halfWidth, l, r, t, b = unpack(ICON_INFO[icon]);
|
|
textButton.Icon:SetTexCoord(l, r, t, b);
|
|
textButton.iconWidth = (halfWidth and 8) or 16;
|
|
if self.pixel then
|
|
textButton.Icon:SetSize((halfWidth and 8*self.pixel) or (16*self.pixel), 16*self.pixel);
|
|
end
|
|
end
|
|
end
|
|
|
|
function TextButtonUtil:SetButtonColor(textButton, r, g, b)
|
|
textButton.ButtonText:SetTextColor(r, g, b); --0.67, 0.5
|
|
textButton.Icon:SetVertexColor(r, g, b)
|
|
end
|