Files
wnsrc/lua/sui/vgui/sui_zcolumn_sheet.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

142 lines
2.9 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local IsValid = IsValid
local TDLib_Classes = sui.TDLib.LibClasses
local SUI, NAME = CURRENT_SUI, CURRENT_SUI.name
local GetColor = SUI.GetColor
local Panel = {}
function Panel:Init()
self.tabs = {}
local tab_scroller = self:Add(NAME .. ".ScrollPanel")
tab_scroller:Dock(LEFT)
function tab_scroller:Paint(w, h)
self:RoundedBox("Background", 1, 0, 0, w, h, GetColor("column_sheet_bar"))
end
self.tabs_wide = 48
self.tab_scroller = tab_scroller
self:ScaleChanged()
SUI.OnScaleChanged(self, self.ScaleChanged)
end
function Panel:ScaleChanged()
local tabs_wide = SUI.Scale(self.tabs_wide)
self.tab_scroller:SetWide(tabs_wide)
self:InvalidateLayout(true)
local tabs = self.tabs
for i = 1, #self.tabs do
tabs[i].img:SetMinus(SUI.Scale(20))
end
end
function Panel:Paint(w, h)
self:RoundedBox("Background", 1, 0, 0, w, h, GetColor("column_sheet"))
end
local tab_DoClick = function(s)
s.parent:SetActiveTab(s)
end
local tab_Paint = function(s, w, h)
local cur_col
if s.active then
cur_col = GetColor("column_sheet_tab_active")
elseif s.Hovered then
cur_col = GetColor("column_sheet_tab_hover")
else
cur_col = GetColor("column_sheet_tab")
end
s:RoundedBox("Backgrounds", 0, 0, 0, w, h, cur_col)
end
local tab_OnRemove = function(s)
table.RemoveByValue(s.parent.tabs, s)
end
function Panel:AddSheet(mat, load_func)
local tab = self.tab_scroller:Add(NAME .. ".Button")
tab:Dock(TOP)
tab:SetText("")
tab:SetTall(self.tabs_wide)
tab.On = TDLib_Classes.On
tab.DoClick = tab_DoClick
tab.Paint = tab_Paint
tab:On("OnRemove", tab_OnRemove)
tab.parent = self
tab.load_func = load_func
local img = tab:Add(NAME .. ".Image")
img:Dock(FILL)
img:SetImage(mat)
img:SetMinus(SUI.Scale(20))
tab.img = img
self.tab_scroller:AddItem(tab)
if not self:GetActiveTab() then
self:SetActiveTab(tab)
end
table.insert(self.tabs, tab)
return tab
end
function Panel:GetActiveTab()
return self.active_tab
end
function Panel:SetActiveTab(new_tab)
if new_tab == self.active_tab then return end
if not IsValid(new_tab.panel) then
local panel = new_tab.load_func(self)
panel:SetParent(self)
panel:SetVisible(false)
panel:SetAlpha(0)
panel.tab = new_tab
new_tab.panel = panel
end
local old_active_tab = self.active_tab
local delay = 0
if old_active_tab and IsValid(old_active_tab.panel) then
old_active_tab.active = false
delay = 0.2
old_active_tab.panel:AlphaTo(0, delay, 0, function(_, p)
if p:IsValid() then
p:SetVisible(false)
end
end)
end
new_tab.active = true
new_tab.panel:SetVisible(true)
new_tab.panel:AlphaTo(255, 0.2, delay)
self.active_tab = new_tab
end
sui.register("ColumnSheet", Panel, "EditablePanel")