mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
171
lua/sui/vgui/sui_property_sheet.lua
Normal file
171
lua/sui/vgui/sui_property_sheet.lua
Normal file
@@ -0,0 +1,171 @@
|
||||
--[[
|
||||
| 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")
|
||||
Reference in New Issue
Block a user