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

171 lines
3.8 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 draw = draw
local surface = surface
local vgui = vgui
local TYPE_MATERIAL = TYPE_MATERIAL
local RealFrameTime = RealFrameTime
local IsValid = IsValid
local Lerp = Lerp
local pairs = pairs
local TypeID = TypeID
local TDLib_Classes = sui.TDLib.LibClasses
local TextColor = TDLib_Classes.TextColor
local SUI, NAME = CURRENT_SUI, CURRENT_SUI.name
local PROPERTY_SHEET_FONT = SUI.CreateFont("PropertySheet", "Roboto Regular", 18)
local PANEL = {}
AccessorFunc(PANEL, "m_FontName", "Font", FORCE_STRING)
function PANEL:Init()
self.tabs = {}
self:SetFont(PROPERTY_SHEET_FONT)
local tab_scroller = self:Add("DHorizontalScroller")
tab_scroller:Dock(TOP)
self.tabs_tall = 26
self.tab_scroller = tab_scroller
self:ScaleChanged()
SUI.OnScaleChanged(self, self.ScaleChanged)
end
function PANEL:ScaleChanged()
self.tab_scroller:SetTall(SUI.Scale(self.tabs_tall))
for k, v in pairs(self.tab_scroller.Panels) do
if v:IsValid() then
if v.Material then
v:SetWide(self.tab_scroller:GetTall())
else
v:SizeToContentsX()
end
end
end
self:InvalidateLayout(true)
end
function PANEL:Paint(w, h)
self:RoundedBox("Background", 1, 0, 0, w, self.tab_scroller:GetTall(), SUI.GetColor("property_sheet_bg"))
end
function PANEL:PaintOver(w, h)
local active_tab = self:GetActiveTab()
if not IsValid(active_tab) then return end
local tab_scroller = self.tab_scroller
local offset = tab_scroller:GetTall() - SUI.Scale(1)
local x = active_tab:LocalToScreen(0) - self:LocalToScreen(0)
if not self.activeTabX then
self.activeTabX = x
self.activeTabW = active_tab:GetWide()
end
local delta = RealFrameTime() * 6
if delta then
self.activeTabX = Lerp(delta, self.activeTabX, x)
self.activeTabW = Lerp(delta, self.activeTabW, active_tab:GetWide())
end
self:RoundedBox("Background2", 1, self.activeTabX, tab_scroller.y + offset, self.activeTabW, SUI.Scale(1), SUI.GetColor("property_sheet_tab_active"))
end
local tab_Paint = function(s, w, h)
s.circle_click_color = SUI.GetColor("property_sheet_tab_click")
if s.property_sheet:GetActiveTab() == s then
TextColor(s, SUI.GetColor("property_sheet_tab_active"))
else
TextColor(s, SUI.GetColor("property_sheet_tab"))
end
end
local tab_DoClick = function(s)
s.parent:SetActiveTab(s)
end
local image_paint = function(s, w, h)
surface.SetDrawColor(color_white)
surface.SetMaterial(s.Material)
surface.DrawTexturedRectRotated(w * 0.5, h * 0.5, w - 10, h - 10, 0)
end
function PANEL:AddSheet(name, load_func)
local tab = vgui.Create("DButton")
if TypeID(name) == TYPE_MATERIAL then
tab:SetText("")
tab.Material = name
tab.Paint = image_paint
tab:SetWide(self.tab_scroller:GetTall())
else
tab:SetFont(self:GetFont())
tab:SetText(name)
tab:SetTextInset(10, 0)
tab:SizeToContentsX()
tab.Paint = tab_Paint
end
tab.parent = self
tab.DoClick = tab_DoClick
tab.load_func = load_func
tab.property_sheet = self
tab.On = TDLib_Classes.On
TDLib_Classes.CircleClick(tab)
self.tab_scroller:AddPanel(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 IsValid(new_tab) and not IsValid(new_tab.panel) then
local panel = new_tab.load_func(self)
panel:SetParent(self)
panel:SetVisible(false)
panel.tab = new_tab
new_tab.panel = panel
end
if self.active_tab and IsValid(self.active_tab.panel) then
self.active_tab.panel:SetVisible(false)
end
if IsValid(new_tab) then
new_tab.panel:SetVisible(true)
end
self.active_tab = new_tab
end
sui.register("PropertySheet", PANEL, "EditablePanel")