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.

135 lines
3.8 KiB

--[[
Copyright 2013-2022 João Cardoso
SecureTabs is distributed under the terms of the GNU General Public License (or the Lesser GPL).
This file is part of SecureTabs.
SecureTabs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SecureTabs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SecureTabs. If not, see <http://www.gnu.org/licenses/>.
--]]
local Lib, old = LibStub:NewLibrary('SecureTabs-2.0', 6)
if not Lib then
return
elseif not old then
hooksecurefunc('PanelTemplates_SetTab', function(panel, id)
Lib:Update(panel)
end)
end
Lib.tabs = Lib.tabs or {}
Lib.covers = Lib.covers or {}
Lib.template = PanelTabButtonMixin and 'PanelTabButtonTemplate' or 'CharacterFrameTabButtonTemplate'
--[[ Main API ]]--
function Lib:Add(panel, frame, label)
local secureTabs = self.tabs[panel] or {}
local id = #secureTabs
local anchor = id > 0 and 'SecureTab' .. (id-1) or 'Tab' .. panel.numTabs
local tab = CreateFrame('Button', '$parentSecureTab' .. id, panel, self.template)
tab:SetPoint('LEFT', panel:GetName() .. anchor, 'RIGHT', PanelTabButtonMixin and 3 or -16, 0)
tab:SetScript('OnClick', function(tab) self:Select(tab) end)
tab:SetText(label)
tab.frame = frame
tinsert(secureTabs, tab)
PanelTemplates_DeselectTab(tab)
local cover = self.covers[panel] or CreateFrame('Button', '$parentCoverTab', panel, self.template)
cover:SetScript('OnClick', function(tab) self:Uncover(panel) end)
PanelTemplates_DeselectTab(cover)
self.tabs[panel] = secureTabs
self.covers[panel] = cover
return tab
end
function Lib:Select(tab)
if tab.OnSelect then
tab:OnSelect()
end
PlaySound(SOUNDKIT.IG_CHARACTER_INFO_TAB)
self:Update(tab:GetParent(), tab)
end
--[[ Advanced Methods ]]--
function Lib:Uncover(panel)
PlaySound(SOUNDKIT.IG_CHARACTER_INFO_TAB)
self:Update(panel)
end
function Lib:Update(panel, selection)
local secureTabs = self.tabs[panel]
if not secureTabs then
return
end
for i, tab in ipairs(secureTabs) do
local selected = tab == selection
if selected then
PanelTemplates_SelectTab(tab)
else
PanelTemplates_DeselectTab(tab)
end
local frame = tab.frame
if frame then
frame:SetShown(selected)
if selected then
frame:SetParent(panel)
frame:EnableMouse(true)
frame:SetAllPoints(true)
frame:SetFrameLevel(panel:GetFrameLevel() + 20)
if frame.CloseButton then
frame.CloseButton:SetScript('OnClick', function()
local original = frame:GetParent() and frame:GetParent().CloseButton
if original then
original:GetScript('OnClick')(original) -- make sure any additional behaviour is replicated
end
panel:Hide() -- this could cause taint, how to solve?
end)
end
end
end
end
if panel.selectedTab then
local cover = self.covers[panel]
local tab = _G[panel:GetName() .. 'Tab'.. panel.selectedTab]
local name = tab:GetName()
local left = tab.LeftActive or _G[name..'LeftDisabled']
local middle = tab.MiddleActive or _G[name..'MiddleDisabled']
local right = tab.RightActive or _G[name..'RightDisabled']
cover:SetShown(selection)
left:SetShown(not selection)
middle:SetShown(not selection)
right:SetShown(not selection)
if selection then
cover:SetParent(tab)
cover:SetAllPoints(tab)
cover:SetText(tab:GetText())
PanelTemplates_TabResize(cover, 0, nil, 36, panel.maxTabWidth or 88)
end
end
end