mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
171 lines
3.8 KiB
Lua
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") |