This commit is contained in:
lifestorm
2024-08-04 22:55:00 +03:00
parent 0e770b2b49
commit 94063e4369
7342 changed files with 1718932 additions and 14 deletions

View File

@@ -0,0 +1,268 @@
--[[
| 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/
--]]
include( "controlpanel.lua" )
local PANEL = {}
AccessorFunc( PANEL, "m_TabID", "TabID" )
function PANEL:Init()
self.HorizontalDivider = vgui.Create( "DHorizontalDivider", self )
self.HorizontalDivider:Dock( FILL )
self.HorizontalDivider:SetLeftWidth( 130 )
self.HorizontalDivider:SetLeftMin( 130 )
self.HorizontalDivider:SetRightMin( 200 )
if ( ScrW() >= 1024 ) then self.HorizontalDivider:SetRightMin( 256 ) end
self.HorizontalDivider:SetDividerWidth( 6 )
self.HorizontalDivider:SetCookieName( "SpawnMenuToolMenuDiv" )
local leftContainer = vgui.Create( "Panel", self.HorizontalDivider )
self.SearchBar = vgui.Create( "DTextEntry", leftContainer )
self.SearchBar:SetWidth( 130 )
self.SearchBar:SetPlaceholderText( "#spawnmenu.quick_filter" )
self.SearchBar:DockMargin( 0, 0, 0, 5 )
self.SearchBar:Dock( TOP )
self.SearchBar:SetUpdateOnType( true )
self.SearchBar.OnValueChange = function( s, text )
self:PerformToolFiltering( text:Trim():lower() )
end
self.List = vgui.Create( "DCategoryList", leftContainer )
self.List:SetWidth( 130 )
self.List:Dock( FILL )
self.HorizontalDivider:SetLeft( leftContainer )
self.Content = vgui.Create( "DCategoryList", self.HorizontalDivider )
self.HorizontalDivider:SetRight( self.Content )
self.LastUpdate = 0
self.IsToolTab = false
local label = vgui.Create( "Panel", self )
label:Dock( BOTTOM )
label:SetVisible( false )
label:SetTall( 72 )
label.Text = ""
label.Paint = function( s, w, h )
local parsed = markup.Parse( "<font=DermaLarge>" .. s.Text .. "</font>", w )
parsed:Draw( w / 2, h / 2, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 255, TEXT_ALIGN_CENTER )
end
self.WarningLabel = label
end
function PANEL:Think()
if ( self.LastUpdate + 0.5 < SysTime() ) then
self.LastUpdate = SysTime()
self:UpdateToolDisabledStatus()
if ( !self.IsToolTab ) then return end
local disabled = false
local noToolgun = IsValid( LocalPlayer() ) && !LocalPlayer():HasWeapon( "gmod_tool" )
if ( self.ActiveCPName ) then
local cvar = GetConVar( "toolmode_allow_" .. self.ActiveCPName )
if ( cvar ) then disabled = !cvar:GetBool() end
end
self.WarningLabel.Text = noToolgun and "You do not have the Tool Gun to use tools!" or "Currently selected tool is disabled by the server!"
if ( ( disabled or noToolgun ) != self.WarningLabel:IsVisible() ) then
self.WarningLabel:SetVisible( disabled or noToolgun )
self:InvalidateLayout()
end
end
end
function PANEL:PerformToolFiltering( text )
for cid, category in ipairs( self.List.pnlCanvas:GetChildren() ) do
local count = 0
local category_matched = false
if ( string.find( category.Header:GetText():lower(), text, nil, true ) ) then
category_matched = true
end
for id, item in ipairs( category:GetChildren() ) do
if ( item == category.Header ) then continue end
local str = item.Text
if ( str:StartsWith( "#" ) ) then str = str:sub( 2 ) end
str = language.GetPhrase( str )
if ( !category_matched && !string.find( str:lower(), text, nil, true ) ) then
item:SetVisible( false )
else
item:SetVisible( true )
count = count + 1
end
item:InvalidateLayout()
end
if ( count < 1 && !category_matched ) then
category:SetVisible( false )
else
category:SetVisible( true )
-- Make sure the category is expanded, but restore the state when we quit searching
if ( text == "" ) then
if ( category._preSearchState != nil ) then
category:SetExpanded( category._preSearchState )
category._preSearchState = nil
end
else
if ( category._preSearchState == nil ) then category._preSearchState = category:GetExpanded() end
category:SetExpanded( true )
end
end
category:InvalidateLayout()
end
self.List.pnlCanvas:InvalidateLayout()
self.List:InvalidateLayout()
end
function PANEL:UpdateToolDisabledStatus()
for cid, category in ipairs( self.List.pnlCanvas:GetChildren() ) do
for id, item in ipairs( category:GetChildren() ) do
if ( item == category.Header ) then continue end
local cvar = GetConVar( "toolmode_allow_" .. item.Name )
if ( !cvar ) then continue end
local enabled = cvar:GetBool()
if ( enabled == item:IsEnabled() ) then continue end
item:SetEnabled( enabled )
if ( enabled ) then
item:SetTooltip()
else
item:SetTooltip( "This tool is disabled by the server!" )
end
end
end
end
function PANEL:LoadToolsFromTable( inTable )
for k, v in pairs( table.Copy( inTable ) ) do
if ( istable( v ) ) then
-- Remove these from the table so we can
-- send the rest of the table to the other
-- function
local Name = v.ItemName
local Label = v.Text
v.ItemName = nil
v.Text = nil
if ( v[ 1 ] && v[ 1 ].Command and v[ 1 ].Command:StartsWith( "gmod_tool " ) ) then
self.IsToolTab = true
end
self:AddCategory( Name, Label, v )
end
end
end
function PANEL:AddCategory( name, catName, tItems )
local Category = self.List:Add( catName )
Category:SetCookieName( "ToolMenu." .. tostring( self:GetTabID() ) .. "." .. tostring( name ) )
local tools = {}
for k, v in pairs( tItems ) do
local name = v.Text or v.ItemName or v.Controls or v.Command or tostring( k )
tools[ language.GetPhrase( name ) ] = v
end
local currentMode = GetConVar( "gmod_toolmode" ):GetString()
for k, v in SortedPairs( tools ) do
local item = Category:Add( v.Text or k )
item.DoClick = function( button )
spawnmenu.ActivateTool( button.Name )
end
item.ControlPanelBuildFunction = v.CPanelFunction
item.Command = v.Command
item.Name = v.ItemName
item.Controls = v.Controls
item.Text = v.Text
-- Mark this button as the one to select on first spawnmenu open
if ( currentMode == v.ItemName ) then
timer.Simple( 0, function() -- Have to wait a frame to get the g_SpawnMenu global, ew
g_SpawnMenu.StartupTool = item
end )
end
end
self:InvalidateLayout()
end
-- Internal, makes the given tool highlighted in its DCategoryList
function PANEL:SetActiveToolText( str )
for cid, category in ipairs( self.List.pnlCanvas:GetChildren() ) do
for id, item in ipairs( category:GetChildren() ) do
if ( item == category.Header ) then continue end
if ( item.Name == str ) then
self.List:UnselectAll()
item:SetSelected( true )
return
end
end
end
end
function PANEL:SetActive( cp )
local kids = self.Content:GetCanvas():GetChildren()
for k, v in pairs( kids ) do
v:SetVisible( false )
end
self.Content:AddItem( cp )
self.ActiveCPName = cp.Name
cp:SetVisible( true )
cp:Dock( TOP )
end
vgui.Register( "ToolPanel", PANEL, "Panel" )