mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 13:23:46 +03:00
273 lines
5.8 KiB
Lua
273 lines
5.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/
|
|
--]]
|
|
|
|
|
|
--
|
|
-- The row - contained in a category.
|
|
--
|
|
local tblRow = vgui.RegisterTable( {
|
|
|
|
Init = function( self )
|
|
|
|
self:Dock( TOP )
|
|
|
|
self.Label = self:Add( "DLabel" )
|
|
self.Label:Dock( LEFT )
|
|
self.Label:DockMargin( 4, 2, 2, 2 )
|
|
|
|
self.Container = self:Add( "Panel" )
|
|
self.Container:Dock( FILL )
|
|
|
|
end,
|
|
|
|
PerformLayout = function( self )
|
|
|
|
self:SetTall( 20 )
|
|
self.Label:SetWide( self:GetWide() * 0.45 )
|
|
|
|
end,
|
|
|
|
Setup = function( self, rowType, vars )
|
|
|
|
self.Container:Clear()
|
|
|
|
local Name = "DProperty_" .. rowType
|
|
|
|
-- Nice shortcuts for Entity:NetworkVar()
|
|
if ( !vgui.GetControlTable( Name ) ) then
|
|
if ( rowType == "Bool" ) then rowType = "Boolean" end
|
|
if ( rowType == "Vector" ) then rowType = "Generic" end
|
|
if ( rowType == "Angle" ) then rowType = "Generic" end
|
|
if ( rowType == "String" ) then rowType = "Generic" end
|
|
|
|
Name = "DProperty_" .. rowType
|
|
end
|
|
|
|
if ( vgui.GetControlTable( Name ) ) then
|
|
self.Inner = self.Container:Add( Name )
|
|
else
|
|
print( "DProperties: Failed to create panel (" .. Name .. ")" )
|
|
end
|
|
if ( !IsValid( self.Inner ) ) then self.Inner = self.Container:Add( "DProperty_Generic" ) end
|
|
|
|
self.Inner:SetRow( self )
|
|
self.Inner:Dock( FILL )
|
|
self.Inner:Setup( vars )
|
|
|
|
-- First copy the value if it was somehow set before Setup() was
|
|
self.Inner:SetEnabled( self:IsEnabled() )
|
|
|
|
-- Then override our methods so they affect Inner element instead
|
|
self.IsEnabled = function( slf )
|
|
return slf.Inner:IsEnabled()
|
|
end
|
|
self.SetEnabled = function( slf, b )
|
|
slf.Inner:SetEnabled( b )
|
|
end
|
|
|
|
-- If the field is read only, disable it
|
|
if ( vars && vars.readonly ) then
|
|
self:SetEnabled( false )
|
|
end
|
|
|
|
end,
|
|
|
|
SetValue = function( self, val )
|
|
|
|
--
|
|
-- Don't update the value if our cache'd value is the same.
|
|
--
|
|
if ( self.CacheValue && self.CacheValue == val ) then return end
|
|
self.CacheValue = val
|
|
|
|
if ( IsValid( self.Inner ) ) then
|
|
self.Inner:SetValue( val )
|
|
end
|
|
|
|
end,
|
|
|
|
Paint = function( self, w, h )
|
|
|
|
if ( !IsValid( self.Inner ) ) then return end
|
|
|
|
local Skin = self:GetSkin()
|
|
local editing = self.Inner:IsEditing()
|
|
local disabled = !self.Inner:IsEnabled() || !self:IsEnabled()
|
|
|
|
if ( disabled ) then
|
|
surface.SetDrawColor( Skin.Colours.Properties.Column_Disabled )
|
|
surface.DrawRect( w * 0.45, 0, w, h )
|
|
elseif ( editing ) then
|
|
surface.SetDrawColor( Skin.Colours.Properties.Column_Selected )
|
|
surface.DrawRect( 0, 0, w * 0.45, h )
|
|
end
|
|
|
|
surface.SetDrawColor( Skin.Colours.Properties.Border )
|
|
surface.DrawRect( w - 1, 0, 1, h )
|
|
surface.DrawRect( w * 0.45, 0, 1, h )
|
|
surface.DrawRect( 0, h - 1, w, 1 )
|
|
|
|
if ( disabled ) then
|
|
self.Label:SetTextColor( Skin.Colours.Properties.Label_Disabled )
|
|
elseif ( editing ) then
|
|
self.Label:SetTextColor( Skin.Colours.Properties.Label_Selected )
|
|
else
|
|
self.Label:SetTextColor( Skin.Colours.Properties.Label_Normal )
|
|
end
|
|
|
|
end
|
|
|
|
}, "Panel" )
|
|
|
|
--
|
|
-- The category - contained in a dproperties
|
|
--
|
|
local tblCategory = vgui.RegisterTable( {
|
|
|
|
Init = function( self )
|
|
|
|
self:Dock( TOP )
|
|
self.Rows = {}
|
|
|
|
self.Header = self:Add( "Panel" )
|
|
|
|
self.Label = self.Header:Add( "DLabel" )
|
|
self.Label:Dock( FILL )
|
|
self.Label:SetContentAlignment( 4 )
|
|
|
|
self.Expand = self.Header:Add( "DExpandButton" )
|
|
self.Expand:Dock( LEFT )
|
|
self.Expand:SetSize( 16, 16 )
|
|
self.Expand:DockMargin( 0, 4, 0, 4 )
|
|
self.Expand:SetExpanded( true )
|
|
self.Expand.DoClick = function()
|
|
|
|
self.Container:SetVisible( !self.Container:IsVisible() )
|
|
self.Expand:SetExpanded( self.Container:IsVisible() )
|
|
self:InvalidateLayout()
|
|
|
|
end
|
|
|
|
self.Header:Dock( TOP )
|
|
|
|
self.Container = self:Add( "Panel" )
|
|
self.Container:Dock( TOP )
|
|
self.Container:DockMargin( 16, 0, 0, 0 )
|
|
self.Container.Paint = function( pnl, w, h )
|
|
surface.SetDrawColor( color_white )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
end
|
|
|
|
end,
|
|
|
|
PerformLayout = function( self )
|
|
|
|
self.Container:SizeToChildren( false, true )
|
|
self:SizeToChildren( false, true )
|
|
|
|
local Skin = self:GetSkin()
|
|
self.Label:SetTextColor( Skin.Colours.Properties.Title )
|
|
self.Label:DockMargin( 4, 0, 0, 0 )
|
|
|
|
end,
|
|
|
|
GetRow = function( self, name, bCreate )
|
|
|
|
if ( IsValid( self.Rows[ name ] ) ) then return self.Rows[ name ] end
|
|
if ( !bCreate ) then return end
|
|
|
|
local row = self.Container:Add( tblRow )
|
|
|
|
row.Label:SetText( name )
|
|
|
|
self.Rows[ name ] = row
|
|
|
|
return row
|
|
|
|
end,
|
|
|
|
Paint = function( self, w, h )
|
|
|
|
local Skin = self:GetSkin()
|
|
surface.SetDrawColor( Skin.Colours.Properties.Border )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
|
|
end
|
|
|
|
}, "Panel" )
|
|
|
|
--[[---------------------------------------------------------
|
|
DProperties
|
|
-----------------------------------------------------------]]
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
|
|
self.Categories = {}
|
|
|
|
end
|
|
|
|
--
|
|
-- Size to children vertically
|
|
--
|
|
function PANEL:PerformLayout()
|
|
|
|
self:SizeToChildren( false, true )
|
|
|
|
end
|
|
|
|
function PANEL:Clear()
|
|
self:GetCanvas():Clear()
|
|
end
|
|
|
|
function PANEL:GetCanvas()
|
|
|
|
if ( !IsValid( self.Canvas ) ) then
|
|
|
|
self.Canvas = self:Add( "DScrollPanel" )
|
|
self.Canvas:Dock( FILL )
|
|
|
|
end
|
|
|
|
return self.Canvas
|
|
|
|
end
|
|
|
|
--
|
|
-- Get or create a category
|
|
--
|
|
function PANEL:GetCategory( name, bCreate )
|
|
|
|
local cat = self.Categories[ name ]
|
|
if ( IsValid( cat ) ) then return cat end
|
|
|
|
if ( !bCreate ) then return end
|
|
|
|
cat = self:GetCanvas():Add( tblCategory )
|
|
cat.Label:SetText( name )
|
|
self.Categories[ name ] = cat
|
|
return cat
|
|
|
|
end
|
|
|
|
--
|
|
-- Creates a row under the specified category.
|
|
-- You should then call :Setup on the row.
|
|
--
|
|
function PANEL:CreateRow( category, name )
|
|
|
|
local cat = self:GetCategory( category, true )
|
|
return cat:GetRow( name, true )
|
|
|
|
end
|
|
|
|
derma.DefineControl( "DProperties", "", PANEL, "Panel" )
|