Files
Puppeteer/libs/gui/abstract/TabComponent.lua
T
2026-10-30 16:27:05 +00:00

133 lines
4.1 KiB
Lua

PTGuiTabComponent = PTGuiComponent:Extend("tab_component")
PTGuiTabComponent.TabPosition = "TOP" -- "TOP", "BOTTOM"
PTGuiTabComponent.TabOffsetX = 0
PTGuiTabComponent.TabOffsetY = 0
function PTGuiTabComponent:New()
local obj = setmetatable({}, self)
local frame = CreateFrame("Frame", self:GenerateName())
obj:SetHandle(frame)
obj.Tabs = {}
obj:RegisterSizeListener()
return obj
end
function PTGuiTabComponent:RegisterSizeListener()
self:SetScript("OnSizeChanged", function()
self:PositionTabs()
end, true)
end
function PTGuiTabComponent:CreateTab(name, useScrollFrame)
local tabIndex = self:GetTabCount() + 1
local tabLabel = "Tab"..tabIndex
local container
local scrollFrame
if not useScrollFrame then
container = PTGuiContainer:New("$parent"..tabLabel.."Container", self:GetHandle())
container:SetAllPoints(self:GetHandle())
container:Hide()
else
scrollFrame = PTGuiLib.Get("scroll_frame", self:GetHandle())
scrollFrame:SetAllPoints(self:GetHandle())
scrollFrame:Hide()
container = scrollFrame:GetComponent("content")
end
self:AddComponent(tabLabel, container)
self:SetPrimary()
local tab = CreateFrame("Button", "$parent"..tabLabel, self:GetHandle(), self.TabPosition == "TOP" and "TabButtonTemplate" or "CharacterFrameTabButtonTemplate")
if self.TabPosition == "TOP" then
tab:SetHeight(22)
end
tab:SetText(name)
tab:RegisterForClicks("LeftButtonUp")
tab:SetScript("OnClick", function()
self:SetSelectedTab(tabIndex)
self:PlayTabSound()
end)
local tabInfo = {tab = tab, container = container, scrollFrame = scrollFrame, root = scrollFrame or container, name = name}
table.insert(self.Tabs, tabInfo)
self:UpdateTabCount()
PanelTemplates_TabResize(0, tab)
self:PositionTabs()
return container, scrollFrame
end
function PTGuiTabComponent:GetTabCount()
return table.getn(self.Tabs)
end
function PTGuiTabComponent:GetTab(indexOrName)
if type(indexOrName) == "string" then
for _, tab in ipairs(self.Tabs) do
if tab.name == indexOrName then
return tab
end
end
end
return self.Tabs[indexOrName]
end
-- Returns the GUI instance of the tab container
function PTGuiTabComponent:GetTabContainer(indexOrName)
return self:GetTab(indexOrName).container
end
-- Returns the Blizzard frame instance of the tab container
function PTGuiTabComponent:GetTabFrame(indexOrName)
return self:GetTab(indexOrName).container:GetHandle()
end
function PTGuiTabComponent:GetSelectedTab()
return self:GetTabContainer(PanelTemplates_GetSelectedTab(self:GetHandle()))
end
function PTGuiTabComponent:UpdateTabCount()
PanelTemplates_SetNumTabs(self:GetHandle(), self:GetTabCount())
self:SetSelectedTab(1)
end
function PTGuiTabComponent:SetSelectedTab(index)
PanelTemplates_SetTab(self:GetHandle(), index)
for i, tab in ipairs(self.Tabs) do
if i == index then
tab.root:Show()
else
tab.root:Hide()
end
end
end
function PTGuiTabComponent:PlayTabSound()
PlaySoundFile("Sound\\Interface\\uCharacterSheetTab.wav")
end
function PTGuiTabComponent:PositionTabs()
local space = self:GetWidth() - self.TabOffsetX
local usedSpace = 0
local row = 0
for i, tab in ipairs(self.Tabs) do
tab = tab.tab
tab:ClearAllPoints()
usedSpace = usedSpace + tab:GetWidth()
if usedSpace < space and row > 0 then
tab:SetPoint("LEFT", self:GetTab(i - 1).tab, "RIGHT")
else
if self.TabPosition == "TOP" then
tab:SetPoint("TOPLEFT", self:GetHandle(), "TOPLEFT", self.TabOffsetX, self.TabOffsetY + (tab:GetHeight() * (row + 1)))
else
tab:SetPoint("TOPLEFT", self:GetHandle(), "BOTTOMLEFT", self.TabOffsetX, self.TabOffsetY - (tab:GetHeight() * row))
end
row = row + 1
usedSpace = tab:GetWidth()
end
end
end
function PTGuiTabComponent:SetTabPosition(pos, xOffset, yOffset)
self.TabPosition = pos
self.TabOffsetX = xOffset
self.TabOffsetY = yOffset
end