mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
359
lua/vgui/spawnicon.lua
Normal file
359
lua/vgui/spawnicon.lua
Normal file
@@ -0,0 +1,359 @@
|
||||
--[[
|
||||
| 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 = {}
|
||||
|
||||
AccessorFunc( PANEL, "m_strModelName", "ModelName" )
|
||||
AccessorFunc( PANEL, "m_iSkin", "SkinID" )
|
||||
AccessorFunc( PANEL, "m_strBodyGroups", "BodyGroup" )
|
||||
AccessorFunc( PANEL, "m_strIconName", "IconName" )
|
||||
|
||||
function PANEL:Init()
|
||||
|
||||
self:SetDoubleClickingEnabled( false )
|
||||
self:SetText( "" )
|
||||
|
||||
self.Icon = vgui.Create( "ModelImage", self )
|
||||
self.Icon:SetMouseInputEnabled( false )
|
||||
self.Icon:SetKeyboardInputEnabled( false )
|
||||
|
||||
self:SetSize( 64, 64 )
|
||||
|
||||
self.m_strBodyGroups = "000000000"
|
||||
self.OverlayFade = 0
|
||||
|
||||
end
|
||||
|
||||
function PANEL:DoRightClick()
|
||||
|
||||
local pCanvas = self:GetSelectionCanvas()
|
||||
if ( IsValid( pCanvas ) && pCanvas:NumSelectedChildren() > 0 && self:IsSelected() ) then
|
||||
return hook.Run( "SpawnlistOpenGenericMenu", pCanvas )
|
||||
end
|
||||
|
||||
self:OpenMenu()
|
||||
end
|
||||
|
||||
function PANEL:DoClick()
|
||||
end
|
||||
|
||||
function PANEL:OpenMenu()
|
||||
end
|
||||
|
||||
function PANEL:Paint( w, h )
|
||||
-- Do not draw the default background
|
||||
end
|
||||
|
||||
function PANEL:Think()
|
||||
|
||||
self.OverlayFade = math.Clamp( self.OverlayFade - RealFrameTime() * 640 * 2, 0, 255 )
|
||||
|
||||
if ( dragndrop.IsDragging() or !self:IsHovered() ) then return end
|
||||
|
||||
self.OverlayFade = math.Clamp( self.OverlayFade + RealFrameTime() * 640 * 8, 0, 255 )
|
||||
|
||||
end
|
||||
|
||||
local border = 4
|
||||
local border_w = 5
|
||||
local matHover = Material( "gui/sm_hover.png", "nocull" )
|
||||
local boxHover = GWEN.CreateTextureBorder( border, border, 64 - border * 2, 64 - border * 2, border_w, border_w, border_w, border_w, matHover )
|
||||
|
||||
function PANEL:PaintOver( w, h )
|
||||
|
||||
if ( self.OverlayFade > 0 ) then
|
||||
boxHover( 0, 0, w, h, Color( 255, 255, 255, self.OverlayFade ) )
|
||||
end
|
||||
|
||||
self:DrawSelections()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:PerformLayout()
|
||||
|
||||
if ( self:IsDown() && !self.Dragging ) then
|
||||
self.Icon:StretchToParent( 6, 6, 6, 6 )
|
||||
else
|
||||
self.Icon:StretchToParent( 0, 0, 0, 0 )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnSizeChanged( newW, newH )
|
||||
self.Icon:SetSize( newW, newH )
|
||||
end
|
||||
|
||||
function PANEL:SetSpawnIcon( name )
|
||||
self.m_strIconName = name
|
||||
self.Icon:SetSpawnIcon( name )
|
||||
end
|
||||
|
||||
function PANEL:SetBodyGroup( k, v )
|
||||
|
||||
if ( k < 0 ) then return end
|
||||
if ( k > 9 ) then return end
|
||||
if ( v < 0 ) then return end
|
||||
if ( v > 9 ) then return end
|
||||
|
||||
self.m_strBodyGroups = self.m_strBodyGroups:SetChar( k + 1, v )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:SetModel( mdl, iSkin, BodyGroups )
|
||||
|
||||
if ( !mdl ) then debug.Trace() return end
|
||||
|
||||
self:SetModelName( mdl )
|
||||
self:SetSkinID( iSkin or 0 )
|
||||
|
||||
if ( tostring( BodyGroups ):len() != 9 ) then
|
||||
BodyGroups = "000000000"
|
||||
end
|
||||
|
||||
self.m_strBodyGroups = BodyGroups
|
||||
|
||||
self.Icon:SetModel( mdl, iSkin, BodyGroups )
|
||||
|
||||
if ( iSkin && iSkin > 0 ) then
|
||||
self:SetTooltip( Format( "%s (Skin %i)", mdl, iSkin + 1 ) )
|
||||
else
|
||||
self:SetTooltip( Format( "%s", mdl ) )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:RebuildSpawnIcon()
|
||||
|
||||
self.Icon:RebuildSpawnIcon()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:RebuildSpawnIconEx( t )
|
||||
|
||||
self.Icon:RebuildSpawnIconEx( t )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:ToTable( bigtable )
|
||||
|
||||
local tab = {}
|
||||
|
||||
tab.type = "model"
|
||||
tab.model = self:GetModelName()
|
||||
|
||||
if ( self:GetSkinID() != 0 ) then
|
||||
tab.skin = self:GetSkinID()
|
||||
end
|
||||
|
||||
if ( self:GetBodyGroup() != "000000000" ) then
|
||||
tab.body = "B" .. self:GetBodyGroup()
|
||||
end
|
||||
|
||||
if ( self:GetWide() != 64 ) then
|
||||
tab.wide = self:GetWide()
|
||||
end
|
||||
|
||||
if ( self:GetTall() != 64 ) then
|
||||
tab.tall = self:GetTall()
|
||||
end
|
||||
|
||||
table.insert( bigtable, tab )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Copy()
|
||||
|
||||
local copy = vgui.Create( "SpawnIcon", self:GetParent() )
|
||||
copy:SetModel( self:GetModelName(), self:GetSkinID() )
|
||||
copy:CopyBase( self )
|
||||
copy.DoClick = self.DoClick
|
||||
copy.OpenMenu = self.OpenMenu
|
||||
|
||||
return copy
|
||||
|
||||
end
|
||||
|
||||
-- Icon has been editied, they changed the skin
|
||||
-- what should we do?
|
||||
function PANEL:SkinChanged( i )
|
||||
|
||||
-- This is called from Icon Editor. Mark the spawnlist as changed. Ideally this would check for GetTriggerSpawnlistChange on the parent
|
||||
hook.Run( "SpawnlistContentChanged" )
|
||||
|
||||
-- Change the skin, and change the model
|
||||
-- this way we can edit the spawnmenu....
|
||||
self:SetSkinID( i )
|
||||
self:SetModel( self:GetModelName(), self:GetSkinID(), self:GetBodyGroup() )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:BodyGroupChanged( k, v )
|
||||
|
||||
-- This is called from Icon Editor. Mark the spawnlist as changed. Ideally this would check for GetTriggerSpawnlistChange on the parent
|
||||
hook.Run( "SpawnlistContentChanged" )
|
||||
|
||||
self:SetBodyGroup( k, v )
|
||||
self:SetModel( self:GetModelName(), self:GetSkinID(), self:GetBodyGroup() )
|
||||
|
||||
end
|
||||
|
||||
-- A little hack to prevent code duplication
|
||||
function PANEL:InternalAddResizeMenu( menu, callback, label )
|
||||
|
||||
local submenu_r, submenu_r_option = menu:AddSubMenu( label or "#spawnmenu.menu.resize", function() end )
|
||||
submenu_r_option:SetIcon( "icon16/arrow_out.png" )
|
||||
|
||||
-- Generate the sizes
|
||||
local function AddSizeOption( submenu, w, h, curW, curH )
|
||||
|
||||
local p = submenu:AddOption( w .. " x " .. h, function() callback( w, h ) end )
|
||||
if ( w == ( curW or 64 ) && h == ( curH or 64 ) ) then p:SetIcon( "icon16/accept.png" ) end
|
||||
|
||||
end
|
||||
|
||||
local sizes = { 64, 128, 256, 512 }
|
||||
for id, size in pairs( sizes ) do
|
||||
|
||||
for _, size2 in pairs( sizes ) do
|
||||
AddSizeOption( submenu_r, size, size2, self:GetWide(), self:GetTall() )
|
||||
end
|
||||
|
||||
if ( id <= #sizes - 1 ) then
|
||||
submenu_r:AddSpacer()
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
vgui.Register( "SpawnIcon", PANEL, "DButton" )
|
||||
|
||||
--
|
||||
-- Action on creating a model from the spawnlist
|
||||
--
|
||||
|
||||
spawnmenu.AddContentType( "model", function( container, obj )
|
||||
|
||||
local icon = vgui.Create( "SpawnIcon", container )
|
||||
|
||||
if ( obj.body ) then
|
||||
obj.body = string.Trim( tostring( obj.body ), "B" )
|
||||
end
|
||||
|
||||
if ( obj.wide ) then
|
||||
icon:SetWide( obj.wide )
|
||||
end
|
||||
|
||||
if ( obj.tall ) then
|
||||
icon:SetTall( obj.tall )
|
||||
end
|
||||
|
||||
icon:InvalidateLayout( true )
|
||||
|
||||
icon:SetModel( obj.model, obj.skin or 0, obj.body )
|
||||
|
||||
icon:SetTooltip( string.Replace( string.GetFileFromFilename( obj.model ), ".mdl", "" ) )
|
||||
|
||||
icon.DoClick = function( s )
|
||||
surface.PlaySound( "ui/buttonclickrelease.wav" )
|
||||
RunConsoleCommand( "gm_spawn", s:GetModelName(), s:GetSkinID() or 0, s:GetBodyGroup() or "" )
|
||||
end
|
||||
icon.OpenMenu = function( pnl )
|
||||
|
||||
-- Use the containter that we are dragged onto, not the one we were created on
|
||||
if ( pnl:GetParent() && pnl:GetParent().ContentContainer ) then
|
||||
container = pnl:GetParent().ContentContainer
|
||||
end
|
||||
|
||||
local menu = DermaMenu()
|
||||
menu:AddOption( "#spawnmenu.menu.copy", function() SetClipboardText( string.gsub( obj.model, "\\", "/" ) ) end ):SetIcon( "icon16/page_copy.png" )
|
||||
|
||||
menu:AddOption( "#spawnmenu.menu.spawn_with_toolgun", function()
|
||||
RunConsoleCommand( "gmod_tool", "creator" )
|
||||
RunConsoleCommand( "creator_type", "4" )
|
||||
RunConsoleCommand( "creator_name", obj.model )
|
||||
end ):SetIcon( "icon16/brick_add.png" )
|
||||
|
||||
local submenu, submenu_opt = menu:AddSubMenu( "#spawnmenu.menu.rerender", function()
|
||||
if ( IsValid( pnl ) ) then pnl:RebuildSpawnIcon() end
|
||||
end )
|
||||
submenu_opt:SetIcon( "icon16/picture_save.png" )
|
||||
|
||||
submenu:AddOption( "#spawnmenu.menu.rerender_this", function()
|
||||
if ( IsValid( pnl ) ) then pnl:RebuildSpawnIcon() end
|
||||
end ):SetIcon( "icon16/picture.png" )
|
||||
submenu:AddOption( "#spawnmenu.menu.rerender_all", function()
|
||||
if ( IsValid( container ) ) then container:RebuildAll() end
|
||||
end ):SetIcon( "icon16/pictures.png" )
|
||||
|
||||
menu:AddOption( "#spawnmenu.menu.edit_icon", function()
|
||||
|
||||
if ( !IsValid( pnl ) ) then return end
|
||||
|
||||
local editor = vgui.Create( "IconEditor" )
|
||||
editor:SetIcon( pnl )
|
||||
editor:Refresh()
|
||||
editor:MakePopup()
|
||||
editor:Center()
|
||||
|
||||
end ):SetIcon( "icon16/pencil.png" )
|
||||
|
||||
-- Do not allow removal/size changes from read only panels
|
||||
if ( IsValid( pnl:GetParent() ) && pnl:GetParent().GetReadOnly && pnl:GetParent():GetReadOnly() ) then menu:Open() return end
|
||||
|
||||
pnl:InternalAddResizeMenu( menu, function( w, h )
|
||||
|
||||
if ( !IsValid( pnl ) ) then return end
|
||||
|
||||
pnl:SetSize( w, h )
|
||||
pnl:InvalidateLayout( true )
|
||||
container:OnModified()
|
||||
container:Layout()
|
||||
pnl:SetModel( obj.model, obj.skin or 0, obj.body )
|
||||
|
||||
end )
|
||||
|
||||
menu:AddSpacer()
|
||||
menu:AddOption( "#spawnmenu.menu.delete", function()
|
||||
|
||||
if ( !IsValid( pnl ) ) then return end
|
||||
|
||||
pnl:Remove()
|
||||
hook.Run( "SpawnlistContentChanged" )
|
||||
|
||||
end ):SetIcon( "icon16/bin_closed.png" )
|
||||
|
||||
menu:Open()
|
||||
|
||||
end
|
||||
|
||||
icon:InvalidateLayout( true )
|
||||
|
||||
if ( IsValid( container ) ) then
|
||||
container:Add( icon )
|
||||
end
|
||||
|
||||
--[[
|
||||
if ( iSkin != 0 ) then return end
|
||||
|
||||
local iSkinCount = NumModelSkins( strModel )
|
||||
if ( iSkinCount <= 1 ) then return end
|
||||
|
||||
for i=1, iSkinCount-1, 1 do
|
||||
|
||||
self:AddModel( strModel, i )
|
||||
|
||||
end
|
||||
]]
|
||||
|
||||
return icon
|
||||
|
||||
end )
|
||||
Reference in New Issue
Block a user