133 lines
4.1 KiB
Lua
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 |