mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
443
gamemodes/sandbox/gamemode/spawnmenu/controlpanel.lua
Normal file
443
gamemodes/sandbox/gamemode/spawnmenu/controlpanel.lua
Normal file
@@ -0,0 +1,443 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
--
|
||||
-- Note: This is only really here as a layer between the spawnmenu
|
||||
-- and the DForm Derma control. You shouldn't ever really be
|
||||
-- calling AddControl. If you're writing new code - don't call
|
||||
-- AddControl!! Add stuff directly using the DForm member functions!
|
||||
--
|
||||
|
||||
include( "controls/manifest.lua" )
|
||||
|
||||
local PANEL = {}
|
||||
|
||||
AccessorFunc( PANEL, "m_bInitialized", "Initialized" )
|
||||
|
||||
function PANEL:Init()
|
||||
self:SetInitialized( false )
|
||||
end
|
||||
|
||||
function PANEL:ClearControls()
|
||||
self:Clear()
|
||||
end
|
||||
|
||||
function PANEL:GetEmbeddedPanel()
|
||||
|
||||
return self
|
||||
|
||||
end
|
||||
|
||||
function PANEL:AddPanel( pnl )
|
||||
|
||||
self:AddItem( pnl, nil )
|
||||
self:InvalidateLayout()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:MatSelect( strConVar, tblOptions, bAutoStretch, iWidth, iHeight )
|
||||
|
||||
local MatSelect = vgui.Create( "MatSelect", self )
|
||||
Derma_Hook( MatSelect.List, "Paint", "Paint", "Panel" )
|
||||
|
||||
MatSelect:SetConVar( strConVar )
|
||||
|
||||
if ( bAutoStretch != nil ) then MatSelect:SetAutoHeight( bAutoStretch ) end
|
||||
if ( iWidth != nil ) then MatSelect:SetItemWidth( iWidth ) end
|
||||
if ( iHeight != nil ) then MatSelect:SetItemHeight( iHeight ) end
|
||||
|
||||
if ( tblOptions != nil ) then
|
||||
for k, v in pairs( tblOptions ) do
|
||||
local nam = isnumber( k ) and v or k
|
||||
MatSelect:AddMaterial( nam, v )
|
||||
end
|
||||
end
|
||||
|
||||
self:AddPanel( MatSelect )
|
||||
return MatSelect
|
||||
|
||||
end
|
||||
|
||||
function PANEL:ToolPresets( group, cvarlist )
|
||||
|
||||
local preset = vgui.Create( "ControlPresets", self )
|
||||
|
||||
preset:SetPreset( group )
|
||||
preset:AddOption( "#preset.default", cvarlist )
|
||||
|
||||
for k, v in pairs( cvarlist ) do
|
||||
preset:AddConVar( k )
|
||||
end
|
||||
|
||||
self:AddItem( preset )
|
||||
|
||||
return preset
|
||||
|
||||
end
|
||||
|
||||
function PANEL:KeyBinder( label1, convar1, label2, convar2 )
|
||||
|
||||
local binder = vgui.Create( "CtrlNumPad", self )
|
||||
|
||||
binder:SetLabel1( label1 )
|
||||
binder:SetConVar1( convar1 )
|
||||
|
||||
if ( label2 != nil and convar2 != nil ) then
|
||||
binder:SetLabel2( label2 )
|
||||
binder:SetConVar2( convar2 )
|
||||
end
|
||||
|
||||
self:AddPanel( binder )
|
||||
|
||||
return binder
|
||||
|
||||
end
|
||||
|
||||
function PANEL:ColorPicker( label, convarR, convarG, convarB, convarA )
|
||||
|
||||
local color = vgui.Create( "CtrlColor", self )
|
||||
|
||||
color:Dock( TOP )
|
||||
color:SetLabel( label )
|
||||
|
||||
color:SetConVarR( convarR )
|
||||
color:SetConVarG( convarG )
|
||||
color:SetConVarB( convarB )
|
||||
|
||||
if ( convarA != nil ) then
|
||||
color:SetConVarA( convarA )
|
||||
end
|
||||
|
||||
self:AddPanel( color )
|
||||
|
||||
return color
|
||||
|
||||
end
|
||||
|
||||
function PANEL:FillViaTable( Table )
|
||||
|
||||
self:SetInitialized( true )
|
||||
|
||||
self:SetName( Table.Text )
|
||||
|
||||
--
|
||||
-- If we have a function to create the control panel, use that
|
||||
--
|
||||
if ( Table.ControlPanelBuildFunction ) then
|
||||
|
||||
Table.ControlPanelBuildFunction( self )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:FillViaFunction( func )
|
||||
|
||||
func( self )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:ControlValues( data )
|
||||
if ( data.label) then
|
||||
self:SetLabel( data.label )
|
||||
end
|
||||
if ( data.closed ) then
|
||||
self:SetExpanded( false )
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function PANEL:AddControl( control, data )
|
||||
|
||||
local data = table.LowerKeyNames( data )
|
||||
local original = control
|
||||
control = string.lower( control )
|
||||
|
||||
-- Retired
|
||||
if ( control == "header" ) then
|
||||
|
||||
if ( data.description ) then
|
||||
local ctrl = self:Help( data.description )
|
||||
return ctrl
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if ( control == "textbox" ) then
|
||||
|
||||
local ctrl = self:TextEntry( data.label or "Untitled", data.command )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "label" ) then
|
||||
|
||||
local ctrl = self:Help( data.text )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "checkbox" or control == "toggle" ) then
|
||||
|
||||
local ctrl = self:CheckBox( data.label or "Untitled", data.command )
|
||||
|
||||
if ( data.help ) then
|
||||
self:ControlHelp( data.label .. ".help" )
|
||||
end
|
||||
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "slider" ) then
|
||||
|
||||
local Decimals = 0
|
||||
if ( data.type && string.lower(data.type) == "float" ) then Decimals = 2 end
|
||||
|
||||
local ctrl = self:NumSlider( data.label or "Untitled", data.command, data.min or 0, data.max or 100, Decimals )
|
||||
|
||||
if ( data.help ) then
|
||||
self:ControlHelp( data.label .. ".help" )
|
||||
end
|
||||
|
||||
if ( data.default ) then
|
||||
ctrl:SetDefaultValue( data.default )
|
||||
elseif ( data.command ) then
|
||||
local cvar = GetConVar( data.command )
|
||||
if ( cvar ) then
|
||||
ctrl:SetDefaultValue( cvar:GetDefault() )
|
||||
end
|
||||
end
|
||||
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "propselect" ) then
|
||||
|
||||
local ctrl = vgui.Create( "PropSelect", self )
|
||||
ctrl:ControlValues( data ) -- Yack.
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "matselect" ) then
|
||||
|
||||
local ctrl = vgui.Create( "MatSelect", self )
|
||||
ctrl:ControlValues( data ) -- Yack.
|
||||
self:AddPanel( ctrl )
|
||||
|
||||
Derma_Hook( ctrl.List, "Paint", "Paint", "Panel" )
|
||||
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "ropematerial" ) then
|
||||
|
||||
local ctrl = vgui.Create( "RopeMaterial", self )
|
||||
ctrl:SetConVar( data.convar )
|
||||
self:AddPanel( ctrl )
|
||||
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "button" ) then
|
||||
|
||||
local ctrl = vgui.Create( "DButton", self )
|
||||
|
||||
-- Note: Buttons created this way use the old method of calling commands,
|
||||
-- via LocalPlayer:ConCommand. This way is flawed. This way is legacy.
|
||||
-- The new way is to make buttons via controlpanel:Button( name, command, commandarg1, commandarg2 ) etc
|
||||
if ( data.command ) then
|
||||
function ctrl:DoClick() LocalPlayer():ConCommand( data.command ) end
|
||||
end
|
||||
|
||||
ctrl:SetText( data.label or data.text or "No Label" )
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "numpad" ) then
|
||||
|
||||
local ctrl = vgui.Create( "CtrlNumPad", self )
|
||||
ctrl:SetConVar1( data.command )
|
||||
ctrl:SetConVar2( data.command2 )
|
||||
ctrl:SetLabel1( data.label )
|
||||
ctrl:SetLabel2( data.label2 )
|
||||
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
if ( control == "color" ) then
|
||||
|
||||
local ctrl = vgui.Create( "CtrlColor", self )
|
||||
ctrl:SetLabel( data.label )
|
||||
ctrl:SetConVarR( data.red )
|
||||
ctrl:SetConVarG( data.green )
|
||||
ctrl:SetConVarB( data.blue )
|
||||
ctrl:SetConVarA( data.alpha )
|
||||
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
|
||||
if ( control == "combobox" ) then
|
||||
|
||||
if ( tostring( data.menubutton ) == "1" ) then
|
||||
|
||||
local ctrl = vgui.Create( "ControlPresets", self )
|
||||
ctrl:SetPreset( data.folder )
|
||||
if ( data.options ) then
|
||||
for k, v in pairs( data.options ) do
|
||||
ctrl:AddOption( k, v )
|
||||
end
|
||||
end
|
||||
|
||||
if ( data.cvars ) then
|
||||
for k, v in pairs( data.cvars ) do
|
||||
ctrl:AddConVar( v )
|
||||
end
|
||||
end
|
||||
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
control = "listbox"
|
||||
|
||||
end
|
||||
|
||||
if ( control == "listbox" ) then
|
||||
|
||||
if ( data.height ) then
|
||||
|
||||
local ctrl = vgui.Create( "DListView" )
|
||||
ctrl:SetMultiSelect( false )
|
||||
ctrl:AddColumn( data.label or "unknown" )
|
||||
|
||||
if ( data.options ) then
|
||||
|
||||
for k, v in pairs( data.options ) do
|
||||
|
||||
local line = ctrl:AddLine( k )
|
||||
line.data = v
|
||||
|
||||
-- This is kind of broken because it only checks one convar
|
||||
-- instead of all of them. But this is legacy. It will do for now.
|
||||
for k, v in pairs( line.data ) do
|
||||
if ( GetConVarString( k ) == tostring( v ) ) then
|
||||
line:SetSelected( true )
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
ctrl:SetTall( data.height )
|
||||
ctrl:SortByColumn( 1, false )
|
||||
|
||||
function ctrl:OnRowSelected( LineID, Line )
|
||||
for k, v in pairs( Line.data ) do
|
||||
RunConsoleCommand( k, v )
|
||||
end
|
||||
end
|
||||
|
||||
self:AddItem( ctrl )
|
||||
|
||||
return ctrl
|
||||
|
||||
else
|
||||
|
||||
local ctrl = vgui.Create( "CtrlListBox", self )
|
||||
|
||||
if ( data.options ) then
|
||||
for k, v in pairs( data.options ) do
|
||||
ctrl:AddOption( k, v )
|
||||
end
|
||||
end
|
||||
|
||||
local left = vgui.Create( "DLabel", self )
|
||||
left:SetText( data.label )
|
||||
left:SetDark( true )
|
||||
ctrl:SetHeight( 25 )
|
||||
ctrl:Dock( TOP )
|
||||
|
||||
self:AddItem( left, ctrl )
|
||||
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if ( control == "materialgallery" ) then
|
||||
|
||||
local ctrl = vgui.Create( "MatSelect", self )
|
||||
--ctrl:ControlValues( data ) -- Yack.
|
||||
|
||||
ctrl:SetItemWidth( data.width or 32 )
|
||||
ctrl:SetItemHeight( data.height or 32 )
|
||||
ctrl:SetNumRows( data.rows or 4 )
|
||||
ctrl:SetConVar( data.convar or nil )
|
||||
|
||||
Derma_Hook( ctrl.List, "Paint", "Paint", "Panel" )
|
||||
|
||||
for name, tab in pairs( data.options ) do
|
||||
|
||||
local mat = tab.material
|
||||
local value = tab.value
|
||||
|
||||
tab.material = nil
|
||||
tab.value = nil
|
||||
|
||||
ctrl:AddMaterialEx( name, mat, value, tab )
|
||||
|
||||
end
|
||||
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
local ctrl = vgui.Create( original, self )
|
||||
-- Fallback for scripts that relied on the old behaviour
|
||||
if ( !ctrl ) then
|
||||
ctrl = vgui.Create( control, self )
|
||||
end
|
||||
if ( ctrl ) then
|
||||
|
||||
if ( ctrl.ControlValues ) then
|
||||
ctrl:ControlValues( data )
|
||||
end
|
||||
|
||||
self:AddPanel( ctrl )
|
||||
return ctrl
|
||||
|
||||
end
|
||||
|
||||
MsgN( "UNHANDLED CONTROL: ", control )
|
||||
PrintTable( data )
|
||||
MsgN( "\n\n" )
|
||||
|
||||
end
|
||||
|
||||
vgui.Register( "ControlPanel", PANEL, "DForm" )
|
||||
Reference in New Issue
Block a user