Files
2026-10-30 16:27:05 +00:00

175 lines
6.0 KiB
Lua

-- Buttons created by this are modified to not stretch at the corners, making for cleaner looking buttons.
PTGuiButton = PTGuiComponent:Extend("button")
PTGuiButton:Import(true, "SetText", "Enable", "Disable")
PTGuiButton:Import(false, "GetText", "IsEnabled")
local _G = getfenv(0)
function PTGuiButton:New()
local obj = setmetatable({}, self)
obj:SetHandle(CreateFrame("Button", self:GenerateName(), nil, "UIPanelButtonTemplate"))
obj:SetupTextures()
return obj
end
function PTGuiButton:OnAcquire()
self.super.OnAcquire(self)
self:SetClickSound(_G.PlaySound, "GAMESPELLBUTTONMOUSEDOWN")
end
function PTGuiButton:OnDispose()
self.super.OnDispose(self)
self:SetText("")
self:SetEnabled(true)
self:SetUseDefaultTextures(false)
-- TODO: Restore default textures to default state
end
function PTGuiButton:SetupTextures()
local button = self:GetHandle()
self.NormalTexture = button:GetNormalTexture()
self.NormalTexture:SetTexture(nil)
self.PushedTexture = button:GetPushedTexture()
self.PushedTexture:SetTexture(nil)
self.DisabledTexture = button:GetDisabledTexture()
self.DisabledTexture:SetTexture(nil)
self.HighlightTexture = button:GetHighlightTexture()
local topLeft = button:CreateTexture(button:GetName().."TopLeft", "BACKGROUND")
topLeft:SetWidth(7)
topLeft:SetHeight(7)
topLeft:SetPoint("TOPLEFT", button, "TOPLEFT")
topLeft:SetTexCoord(1 / 128, 8 / 128, 1 / 32, 8 / 32)
local topRight = button:CreateTexture(button:GetName().."TopRight", "BACKGROUND")
topRight:SetWidth(7)
topRight:SetHeight(7)
topRight:SetPoint("TOPRIGHT", button, "TOPRIGHT")
topRight:SetTexCoord(72 / 128, 79 / 128, 1 / 32, 8 / 32)
local topMid = button:CreateTexture(button:GetName().."TopMid", "BACKGROUND")
topMid:SetPoint("TOPLEFT", topLeft, "TOPRIGHT")
topMid:SetPoint("BOTTOMRIGHT", topRight, "BOTTOMLEFT")
topMid:SetTexCoord(9 / 128, 70 / 128, 1 / 32, 8 / 32)
local botLeft = button:CreateTexture(button:GetName().."BotLeft", "BACKGROUND")
botLeft:SetWidth(7)
botLeft:SetHeight(7)
botLeft:SetPoint("BOTTOMLEFT", button, "BOTTOMLEFT")
botLeft:SetTexCoord(1 / 128, 8 / 128, 15 / 32, 22 / 32)
local botRight = button:CreateTexture(button:GetName().."BotRight", "BACKGROUND")
botRight:SetWidth(7)
botRight:SetHeight(7)
botRight:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT")
botRight:SetTexCoord(72 / 128, 79 / 128, 15 / 32, 22 / 32)
local botMid = button:CreateTexture(button:GetName().."BotMid", "BACKGROUND")
botMid:SetPoint("TOPLEFT", botLeft, "TOPRIGHT")
botMid:SetPoint("BOTTOMRIGHT", botRight, "BOTTOMLEFT")
botMid:SetTexCoord(9 / 128, 70 / 128, 15 / 32, 22 / 32)
local midLeft = button:CreateTexture(button:GetName().."MidLeft", "BACKGROUND")
midLeft:SetPoint("TOPLEFT", topLeft, "BOTTOMLEFT")
midLeft:SetPoint("BOTTOMRIGHT", botLeft, "TOPRIGHT")
midLeft:SetTexCoord(1 / 128, 8 / 128, 9 / 32, 13 / 32)
local midRight = button:CreateTexture(button:GetName().."MidRight", "BACKGROUND")
midRight:SetPoint("TOPLEFT", topRight, "BOTTOMLEFT")
midRight:SetPoint("BOTTOMRIGHT", botRight, "TOPRIGHT")
midRight:SetTexCoord(72 / 128, 79 / 128, 9 / 32, 13 / 32)
local center = button:CreateTexture(button:GetName().."Center", "BACKGROUND")
center:SetPoint("TOPLEFT", topLeft, "BOTTOMRIGHT")
center:SetPoint("BOTTOMRIGHT", botRight, "TOPLEFT")
center:SetTexCoord(9 / 128, 70 / 128, 9 / 32, 13 / 32)
button.textures = {topLeft, topMid, topRight, botLeft, botMid, botRight, midLeft, center, midRight}
button:SetScript("OnMouseDown", function()
if button:IsEnabled() == 1 then
self:SetTexture("PUSHED")
end
end)
button:SetScript("OnMouseUp", function()
if button:IsEnabled() == 1 then
self:SetTexture("NORMAL")
end
end)
local realEnable = button.Enable
button.Enable = function(buttonSelf)
realEnable(buttonSelf)
self:SetTexture("NORMAL")
end
local realDisable = button.Disable
button.Disable = function(buttonSelf)
realDisable(buttonSelf)
self:SetTexture("DISABLED")
end
self:SetTexture("NORMAL")
end
local buttonTextures = {["NORMAL"] = "Interface\\Buttons\\UI-Panel-Button-Up",
["PUSHED"] = "Interface\\Buttons\\UI-Panel-Button-Down",
["DISABLED"] = "Interface\\Buttons\\UI-Panel-Button-Disabled"
}
function PTGuiButton:SetTexture(type) -- "NORMAL", "PUSHED", "DISABLED"
local texLoc = buttonTextures[type]
for _, tex in ipairs(self:GetHandle().textures) do
tex:SetTexture(texLoc)
end
end
function PTGuiButton:SetUseDefaultTextures(useDefault)
if not useDefault and self.UsingDefaultTextures then
local button = self:GetHandle()
for _, tex in ipairs(button.textures) do
tex:Show()
end
self.NormalTexture:SetTexture(nil)
self.PushedTexture:SetTexture(nil)
self.DisabledTexture:SetTexture(nil)
self.HighlightTexture:SetTexture("Interface\\Buttons\\UI-Panel-Button-Highlight")
self.UsingDefaultTextures = nil
elseif useDefault then
local button = self:GetHandle()
for _, tex in ipairs(button.textures) do
tex:Hide()
end
self.UsingDefaultTextures = true
end
return self
end
function PTGuiButton:SetEnabled(enabled)
(enabled and self.Enable or self.Disable)(self)
return self
end
function PTGuiButton:SetScript(scriptName, script, noSelf)
if scriptName ~= "OnClick" then
return self.super.SetScript(self, scriptName, script, noSelf)
end
self:GetHandle():SetScript(scriptName, function()
self:PlayClickSound()
if script then
script(self)
end
end)
return self
end
function PTGuiButton:PlayClickSound()
self.ClickSoundFunc(self.ClickSoundName)
end
function PTGuiButton:SetClickSound(soundFunc, soundName)
self.ClickSoundFunc = soundFunc
self.ClickSoundName = soundName
return self
end
PTGuiLib.RegisterComponent(PTGuiButton)