forked from Bastion/Bastion
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.
223 lines
5.2 KiB
223 lines
5.2 KiB
2 years ago
|
--- @type StdUi
|
||
|
local StdUi = LibStub and LibStub('StdUi', true);
|
||
|
if not StdUi then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local module, version = 'Tab', 4;
|
||
|
if not StdUi:UpgradeNeeded(module, version) then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
----------------------------------------------------
|
||
|
--- TabPanel
|
||
|
----------------------------------------------------
|
||
|
|
||
|
local TabPanelMethods = {
|
||
|
--- Runs callback thru all tabs, if callback returns truthy value, enumeration stops and function returns result
|
||
|
EnumerateTabs = function(self, callback, ...)
|
||
|
local result;
|
||
|
|
||
|
for i = 1, #self.tabs do
|
||
|
local tab = self.tabs[i];
|
||
|
result = callback(tab, self, i, ...);
|
||
|
if result then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return result;
|
||
|
end,
|
||
|
|
||
|
HideAllFrames = function(self)
|
||
|
for _, tab in pairs(self.tabs) do
|
||
|
if tab.frame then
|
||
|
tab.frame:Hide();
|
||
|
end
|
||
|
end
|
||
|
end,
|
||
|
|
||
|
DrawButtons = function(self)
|
||
|
local prevBtn;
|
||
|
for _, tab in pairs(self.tabs) do
|
||
|
if tab.button then
|
||
|
tab.button:Hide();
|
||
|
end
|
||
|
|
||
|
local btn = tab.button;
|
||
|
local btnContainer = self.buttonContainer;
|
||
|
|
||
|
if not btn then
|
||
|
btn = self.stdUi:Button(btnContainer, nil, self.buttonHeight);
|
||
|
tab.button = btn;
|
||
|
btn.tabFrame = self;
|
||
|
|
||
|
btn:SetScript('OnClick', function(bt)
|
||
|
bt.tabFrame:SelectTab(bt.tab.name);
|
||
|
end);
|
||
|
end
|
||
|
|
||
|
btn.tab = tab;
|
||
|
btn:SetText(tab.title);
|
||
|
btn:ClearAllPoints();
|
||
|
|
||
|
if self.vertical then
|
||
|
btn:SetWidth(self.buttonWidth);
|
||
|
else
|
||
|
self.stdUi:ButtonAutoWidth(btn);
|
||
|
end
|
||
|
|
||
|
if self.vertical then
|
||
|
if not prevBtn then
|
||
|
self.stdUi:GlueTop(btn, btnContainer, 0, 0, 'CENTER');
|
||
|
else
|
||
|
self.stdUi:GlueBelow(btn, prevBtn, 0, -1);
|
||
|
end
|
||
|
else
|
||
|
if not prevBtn then
|
||
|
self.stdUi:GlueTop(btn, btnContainer, 0, 0, 'LEFT');
|
||
|
else
|
||
|
self.stdUi:GlueRight(btn, prevBtn, 5, 0);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
btn:Show();
|
||
|
prevBtn = btn;
|
||
|
end
|
||
|
end,
|
||
|
|
||
|
DrawFrames = function(self)
|
||
|
for _, tab in pairs(self.tabs) do
|
||
|
if not tab.frame then
|
||
|
tab.frame = self.stdUi:Frame(self.container);
|
||
|
end
|
||
|
|
||
|
tab.frame:ClearAllPoints();
|
||
|
tab.frame:SetAllPoints();
|
||
|
|
||
|
if tab.layout then
|
||
|
self.stdUi:BuildWindow(tab.frame, tab.layout);
|
||
|
self.stdUi:EasyLayout(tab.frame, { padding = { top = 10 } });
|
||
|
|
||
|
tab.frame:SetScript('OnShow', function(of)
|
||
|
of:DoLayout();
|
||
|
end);
|
||
|
end
|
||
|
|
||
|
if tab.onHide then
|
||
|
tab.frame:SetScript('OnHide', tab.onHide);
|
||
|
end
|
||
|
end
|
||
|
end,
|
||
|
|
||
|
Update = function(self, newTabs)
|
||
|
if newTabs then
|
||
|
self.tabs = newTabs;
|
||
|
end
|
||
|
self:DrawButtons();
|
||
|
self:DrawFrames();
|
||
|
end,
|
||
|
|
||
|
GetTabByName = function(self, name)
|
||
|
for _, tab in pairs(self.tabs) do
|
||
|
if tab.name == name then
|
||
|
return tab;
|
||
|
end
|
||
|
end
|
||
|
end,
|
||
|
|
||
|
SelectTab = function(self, name)
|
||
|
self.selected = name;
|
||
|
if self.selectedTab then
|
||
|
self.selectedTab.button:Enable();
|
||
|
end
|
||
|
|
||
|
self:HideAllFrames();
|
||
|
local foundTab = self:GetTabByName(name);
|
||
|
|
||
|
if foundTab.name == name and foundTab.frame then
|
||
|
foundTab.button:Disable();
|
||
|
foundTab.frame:Show();
|
||
|
self.selectedTab = foundTab;
|
||
|
return true;
|
||
|
end
|
||
|
end,
|
||
|
|
||
|
GetSelectedTab = function(self)
|
||
|
return self.selectedTab;
|
||
|
end,
|
||
|
|
||
|
DoLayout = function(self)
|
||
|
-- redoing layout as container
|
||
|
local tab = self:GetSelectedTab();
|
||
|
if tab then
|
||
|
if tab.frame and tab.frame.DoLayout then
|
||
|
tab.frame:DoLayout();
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
};
|
||
|
|
||
|
---
|
||
|
---local t = {
|
||
|
--- {
|
||
|
--- name = 'firstTab',
|
||
|
--- title = 'First',
|
||
|
--- },
|
||
|
--- {
|
||
|
--- name = 'secondTab',
|
||
|
--- title = 'Second',
|
||
|
--- },
|
||
|
--- {
|
||
|
--- name = 'thirdTab',
|
||
|
--- title = 'Third'
|
||
|
--- }
|
||
|
---}
|
||
|
function StdUi:TabPanel(parent, width, height, tabs, vertical, buttonWidth, buttonHeight)
|
||
|
vertical = vertical or false;
|
||
|
buttonWidth = buttonWidth or 160;
|
||
|
buttonHeight = buttonHeight or 20;
|
||
|
|
||
|
local tabFrame = self:Frame(parent, width, height);
|
||
|
tabFrame.stdUi = self;
|
||
|
tabFrame.tabs = tabs;
|
||
|
tabFrame.vertical = vertical;
|
||
|
tabFrame.buttonWidth = buttonWidth;
|
||
|
tabFrame.buttonHeight = buttonHeight;
|
||
|
|
||
|
tabFrame.buttonContainer = self:Frame(tabFrame);
|
||
|
tabFrame.container = self:Panel(tabFrame);
|
||
|
|
||
|
if vertical then
|
||
|
tabFrame.buttonContainer:SetPoint('TOPLEFT', tabFrame, 'TOPLEFT', 0, 0);
|
||
|
tabFrame.buttonContainer:SetPoint('BOTTOMLEFT', tabFrame, 'BOTTOMLEFT', 0, 0);
|
||
|
tabFrame.buttonContainer:SetWidth(buttonWidth);
|
||
|
|
||
|
tabFrame.container:SetPoint('TOPLEFT', tabFrame.buttonContainer, 'TOPRIGHT', 5, 0);
|
||
|
tabFrame.container:SetPoint('BOTTOMLEFT', tabFrame.buttonContainer, 'BOTTOMRIGHT', 5, 0);
|
||
|
tabFrame.container:SetPoint('TOPRIGHT', tabFrame, 'TOPRIGHT', 0, 0);
|
||
|
tabFrame.container:SetPoint('BOTTOMRIGHT', tabFrame, 'BOTTOMRIGHT', 0, 0);
|
||
|
else
|
||
|
tabFrame.buttonContainer:SetPoint('TOPLEFT', tabFrame, 'TOPLEFT', 0, 0);
|
||
|
tabFrame.buttonContainer:SetPoint('TOPRIGHT', tabFrame, 'TOPRIGHT', 0, 0);
|
||
|
tabFrame.buttonContainer:SetHeight(buttonHeight);
|
||
|
|
||
|
tabFrame.container:SetPoint('TOPLEFT', tabFrame.buttonContainer, 'BOTTOMLEFT', 0, -5);
|
||
|
tabFrame.container:SetPoint('TOPRIGHT', tabFrame.buttonContainer, 'BOTTOMRIGHT', 0, -5);
|
||
|
tabFrame.container:SetPoint('BOTTOMLEFT', tabFrame, 'BOTTOMLEFT', 0, 0);
|
||
|
tabFrame.container:SetPoint('BOTTOMRIGHT', tabFrame, 'BOTTOMRIGHT', 0, 0);
|
||
|
end
|
||
|
|
||
|
for k, v in pairs(TabPanelMethods) do
|
||
|
tabFrame[k] = v;
|
||
|
end
|
||
|
|
||
|
tabFrame:Update();
|
||
|
if #tabFrame.tabs > 0 then
|
||
|
tabFrame:SelectTab(tabFrame.tabs[1].name);
|
||
|
end
|
||
|
|
||
|
return tabFrame;
|
||
|
end
|
||
|
|
||
|
StdUi:RegisterModule(module, version);
|