mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
199
lua/vgui/propselect.lua
Normal file
199
lua/vgui/propselect.lua
Normal file
@@ -0,0 +1,199 @@
|
||||
--[[
|
||||
| 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 = {}
|
||||
|
||||
local border = 0
|
||||
local border_w = 8
|
||||
local matHover = Material( "gui/ps_hover.png", "nocull" )
|
||||
local boxHover = GWEN.CreateTextureBorder( border, border, 64 - border * 2, 64 - border * 2, border_w, border_w, border_w, border_w, matHover )
|
||||
|
||||
-- This function is used as the paint function for selected buttons.
|
||||
local function HighlightedButtonPaint( self, w, h )
|
||||
|
||||
boxHover( 0, 0, w, h, color_white )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Init()
|
||||
|
||||
-- A panellist is a panel that you shove other panels
|
||||
-- into and it makes a nice organised frame.
|
||||
self.List = vgui.Create( "DPanelList", self )
|
||||
self.List:EnableHorizontal( true )
|
||||
self.List:EnableVerticalScrollbar()
|
||||
self.List:SetSpacing( 1 )
|
||||
self.List:SetPadding( 3 )
|
||||
|
||||
Derma_Hook( self.List, "Paint", "Paint", "Panel" )
|
||||
|
||||
self.Controls = {}
|
||||
self.Height = 2
|
||||
|
||||
end
|
||||
|
||||
function PANEL:AddModel( model, ConVars )
|
||||
|
||||
if ( ConVars && !istable( ConVars ) ) then
|
||||
ErrorNoHaltWithStack( "bad argument #2 to 'PropSelect.AddModel' (table expected, got " .. type( ConVars ) .. ")" )
|
||||
ConVars = nil
|
||||
end
|
||||
|
||||
-- Creeate a spawnicon and set the model
|
||||
local Icon = vgui.Create( "SpawnIcon", self )
|
||||
Icon:SetModel( model )
|
||||
Icon:SetTooltip( model )
|
||||
Icon.Model = model
|
||||
Icon.ConVars = ConVars || {}
|
||||
|
||||
local ConVarName = self:ConVar()
|
||||
|
||||
-- Run a console command when the Icon is clicked
|
||||
Icon.DoClick = function ( pnl )
|
||||
|
||||
for k, v in pairs( pnl.ConVars ) do
|
||||
LocalPlayer():ConCommand( Format( "%s \"%s\"\n", k, v ) )
|
||||
end
|
||||
|
||||
-- Note: We run this command after all the optional stuff
|
||||
LocalPlayer():ConCommand( Format( "%s \"%s\"\n", ConVarName, model ) )
|
||||
|
||||
end
|
||||
Icon.OpenMenu = function( button )
|
||||
local menu = DermaMenu()
|
||||
menu:AddOption( "#spawnmenu.menu.copy", function() SetClipboardText( model ) end ):SetIcon( "icon16/page_copy.png" )
|
||||
menu:Open()
|
||||
end
|
||||
|
||||
-- Add the Icon us
|
||||
self.List:AddItem( Icon )
|
||||
table.insert( self.Controls, Icon )
|
||||
|
||||
return Icon
|
||||
end
|
||||
|
||||
function PANEL:AddModelEx( name, model, skin )
|
||||
|
||||
-- Creeate a spawnicon and set the model
|
||||
local Icon = vgui.Create( "SpawnIcon", self )
|
||||
Icon:SetModel( model, skin )
|
||||
Icon:SetTooltip( model )
|
||||
Icon.Model = model
|
||||
Icon.Value = name
|
||||
Icon.ConVars = {}
|
||||
|
||||
local ConVarName = self:ConVar()
|
||||
|
||||
-- Run a console command when the Icon is clicked
|
||||
Icon.DoClick = function ( pnl ) LocalPlayer():ConCommand( Format( "%s \"%s\"\n", ConVarName, Icon.Value ) ) end
|
||||
Icon.OpenMenu = function( button )
|
||||
local menu = DermaMenu()
|
||||
menu:AddOption( "Copy to Clipboard", function() SetClipboardText( model ) end ):SetIcon( "icon16/page_copy.png" )
|
||||
menu:Open()
|
||||
end
|
||||
|
||||
-- Add the Icon us
|
||||
self.List:AddItem( Icon )
|
||||
table.insert( self.Controls, Icon )
|
||||
|
||||
return Icon
|
||||
end
|
||||
|
||||
function PANEL:ControlValues( kv )
|
||||
|
||||
self.BaseClass.ControlValues( self, kv )
|
||||
|
||||
self.Height = kv.height || 2
|
||||
|
||||
-- Load the list of models from our keyvalues file
|
||||
-- This is the old way
|
||||
|
||||
if ( kv.models ) then
|
||||
for k, v in SortedPairs( kv.models ) do
|
||||
self:AddModel( k, v )
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- Passing in modelstable is the new way
|
||||
--
|
||||
if ( kv.modelstable ) then
|
||||
local tmp = {} -- HACK: Order by skin too.
|
||||
for k, v in SortedPairsByMemberValue( kv.modelstable, "model" ) do
|
||||
tmp[ k ] = v.model:lower() .. ( v.skin || 0 )
|
||||
end
|
||||
|
||||
for k, v in SortedPairsByValue( tmp ) do
|
||||
v = kv.modelstable[ k ]
|
||||
self:AddModelEx( k, v.model, v.skin || 0 )
|
||||
end
|
||||
end
|
||||
|
||||
self:InvalidateLayout( true )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:PerformLayout( w, h )
|
||||
|
||||
local y = self.BaseClass.PerformLayout( self, w, h )
|
||||
|
||||
if ( self.Height >= 1 ) then
|
||||
local Height = ( 64 + self.List:GetSpacing() ) * math.max( self.Height, 1 ) + self.List:GetPadding() * 2 - self.List:GetSpacing()
|
||||
|
||||
self.List:SetPos( 0, y )
|
||||
self.List:SetSize( self:GetWide(), Height )
|
||||
|
||||
y = y + Height
|
||||
|
||||
self:SetTall( y + 5 )
|
||||
else -- Height is set to 0 or less, auto stretch
|
||||
self.List:SetWide( self:GetWide() )
|
||||
self.List:SizeToChildren( false, true )
|
||||
self:SetTall( self.List:GetTall() + 5 )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:FindAndSelectButton( Value )
|
||||
|
||||
self.CurrentValue = Value
|
||||
|
||||
for k, Icon in pairs( self.Controls ) do
|
||||
|
||||
if ( Icon.Model == Value || Icon.Value == Value ) then
|
||||
|
||||
-- Remove the old overlay
|
||||
if ( self.SelectedIcon ) then
|
||||
self.SelectedIcon.PaintOver = self.OldSelectedPaintOver
|
||||
end
|
||||
|
||||
-- Add the overlay to this button
|
||||
self.OldSelectedPaintOver = Icon.PaintOver
|
||||
Icon.PaintOver = HighlightedButtonPaint
|
||||
self.SelectedIcon = Icon
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:TestForChanges()
|
||||
|
||||
local Value = GetConVarString( self:ConVar() )
|
||||
|
||||
if ( Value == self.CurrentValue ) then return end
|
||||
|
||||
self:FindAndSelectButton( Value )
|
||||
|
||||
end
|
||||
|
||||
vgui.Register( "PropSelect", PANEL, "ContextBase" )
|
||||
Reference in New Issue
Block a user