Files
wnsrc/lua/vgui/dform.lua

315 lines
6.4 KiB
Lua
Raw Normal View History

2024-08-04 23:12:27 +03:00
--[[
| 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 PANEL = {}
DEFINE_BASECLASS( "DCollapsibleCategory" )
AccessorFunc( PANEL, "m_bSizeToContents", "AutoSize", FORCE_BOOL )
AccessorFunc( PANEL, "m_iSpacing", "Spacing" )
AccessorFunc( PANEL, "m_Padding", "Padding" )
function PANEL:Init()
self.Items = {}
self:SetSpacing( 4 )
self:SetPadding( 10 )
self:SetPaintBackground( true )
self:SetMouseInputEnabled( true )
self:SetKeyboardInputEnabled( true )
end
function PANEL:SetName( name )
self:SetLabel( name )
end
function PANEL:Clear()
for k, v in pairs( self.Items ) do
if ( IsValid( v ) ) then v:Remove() end
end
self.Items = {}
end
function PANEL:AddItem( left, right )
self:InvalidateLayout()
local Panel = vgui.Create( "DSizeToContents", self )
--Panel.Paint = function( panel, w, h ) derma.SkinHook( "Paint", "CategoryButton", panel, w, h ) end
Panel:SetSizeX( false )
Panel:Dock( TOP )
Panel:DockPadding( 10, 10, 10, 0 )
Panel:InvalidateLayout()
if ( IsValid( right ) ) then
left:SetParent( Panel )
left:Dock( LEFT )
left:InvalidateLayout( true )
left:SetSize( 100, 20 )
right:SetParent( Panel )
right:SetPos( 110, 0 )
right:InvalidateLayout( true )
elseif ( IsValid( left ) ) then
left:SetParent( Panel )
left:Dock( TOP )
end
table.insert( self.Items, Panel )
end
function PANEL:TextEntry( strLabel, strConVar )
local left = vgui.Create( "DLabel", self )
left:SetText( strLabel )
left:SetDark( true )
local right = vgui.Create( "DTextEntry", self )
right:SetConVar( strConVar )
right:Dock( TOP )
self:AddItem( left, right )
return right, left
end
function PANEL:PropSelect( label, convar, models, height )
local props = vgui.Create( "PropSelect", self )
props:SetConVar( convar or "" )
props.Label:SetText( label or "" )
props.Height = height or 2
local firstKey, firstVal = next( models )
if ( firstVal.model == nil ) then
-- Lowercase model names for sorting purposes
local models_lower = table.LowerKeyNames( models )
-- list.Get where key is the model and value is the cvars to set when that model is selected
for k, v in SortedPairs( models_lower ) do
props:AddModel( k, v )
end
else
local tmp = {} -- HACK: Order by skin too
for k, v in SortedPairsByMemberValue( models, "model" ) do
tmp[ k ] = v.model:lower() .. ( v.skin or 0 )
end
for k, v in SortedPairsByValue( tmp ) do
v = models[ k ]
local icon = props:AddModelEx( k, v.model, v.skin or 0 )
if ( v.tooltip ) then icon:SetTooltip( v.tooltip ) end
end
end
props:InvalidateLayout( true )
self:AddPanel( props )
return props
end
function PANEL:ComboBox( strLabel, strConVar )
local left = vgui.Create( "DLabel", self )
left:SetText( strLabel )
left:SetDark( true )
local right = vgui.Create( "DComboBox", self )
right:SetConVar( strConVar )
right:Dock( FILL )
function right:OnSelect( index, value, data )
if ( !self.m_strConVar ) then return end
RunConsoleCommand( self.m_strConVar, tostring( data or value ) )
end
self:AddItem( left, right )
return right, left
end
function PANEL:NumberWang( strLabel, strConVar, numMin, numMax, numDecimals )
local left = vgui.Create( "DLabel", self )
left:SetText( strLabel )
left:SetDark( true )
local right = vgui.Create( "DNumberWang", self )
right:SetMinMax( numMin, numMax )
if ( numDecimals != nil ) then right:SetDecimals( numDecimals ) end
right:SetConVar( strConVar )
right:SizeToContents()
self:AddItem( left, right )
return right, left
end
function PANEL:NumSlider( strLabel, strConVar, numMin, numMax, numDecimals )
local left = vgui.Create( "DNumSlider", self )
left:SetText( strLabel )
left:SetMinMax( numMin, numMax )
left:SetDark( true )
if ( numDecimals != nil ) then left:SetDecimals( numDecimals ) end
left:SetConVar( strConVar )
left:SizeToContents()
self:AddItem( left, nil )
return left
end
function PANEL:CheckBox( strLabel, strConVar )
local left = vgui.Create( "DCheckBoxLabel", self )
left:SetText( strLabel )
left:SetDark( true )
left:SetConVar( strConVar )
self:AddItem( left, nil )
return left
end
function PANEL:Help( strHelp )
local left = vgui.Create( "DLabel", self )
left:SetDark( true )
left:SetWrap( true )
left:SetTextInset( 0, 0 )
left:SetText( strHelp )
left:SetContentAlignment( 7 )
left:SetAutoStretchVertical( true )
left:DockMargin( 8, 0, 8, 8 )
self:AddItem( left, nil )
left:InvalidateLayout( true )
return left
end
function PANEL:ControlHelp( strHelp )
local Panel = vgui.Create( "DSizeToContents", self )
Panel:SetSizeX( false )
Panel:Dock( TOP )
Panel:InvalidateLayout()
local left = vgui.Create( "DLabel", Panel )
left:SetDark( true )
left:SetWrap( true )
left:SetTextInset( 0, 0 )
left:SetText( strHelp )
left:SetContentAlignment( 5 )
left:SetAutoStretchVertical( true )
left:DockMargin( 32, 0, 32, 8 )
left:Dock( TOP )
left:SetTextColor( self:GetSkin().Colours.Tree.Hover )
table.insert( self.Items, Panel )
return left
end
--[[---------------------------------------------------------
Note: If you're running a console command like "maxplayers 10" you
need to add the "10" to the arguments, like so
Button( "LabelName", "maxplayers", "10" )
-----------------------------------------------------------]]
function PANEL:Button( strName, strConCommand, ... --[[ console command args!! --]] )
local left = vgui.Create( "DButton", self )
if ( strConCommand ) then
left:SetConsoleCommand( strConCommand, ... )
end
left:SetText( strName )
self:AddItem( left, nil )
return left
end
function PANEL:PanelSelect()
local left = vgui.Create( "DPanelSelect", self )
self:AddItem( left, nil )
return left
end
function PANEL:ListBox( strLabel )
local left = nil
if ( strLabel ) then
left = vgui.Create( "DLabel", self )
left:SetText( strLabel )
self:AddItem( left )
left:SetDark( true )
end
local right = vgui.Create( "DListBox", self )
--right:SetConVar( strConVar )
right.Stretch = true
self:AddItem( right )
return right, left
end
function PANEL:Rebuild()
end
-- No example for this control
function PANEL:GenerateExample( class, tabs, w, h )
end
derma.DefineControl( "DForm", "A panel with quick methods to create basic user inputs.", PANEL, "DCollapsibleCategory" )