swb_base/Weapon.UI.cs
using Sandbox.UI;
using SWB.Base.UI;

namespace SWB.Base;

public partial class Weapon
{
	public ScreenPanel ScreenPanel { get; set; }
	public PanelComponent RootPanel { get; set; }

	private CustomizationMenu customizationMenu;

	/// <summary>Override this if you want custom UI elements</summary>
	public virtual void CreateUI()
	{
		ScreenPanel = Components.Create<ScreenPanel>();
		ScreenPanel.Opacity = 1;
		ScreenPanel.ZIndex = 1;

		var rootPanel = Components.Create<RootWeaponDisplay>();
		rootPanel.Weapon = this;
		RootPanel = rootPanel;

		// Attachments (HUD)
		RootPanel.OnComponentStart += () =>
		{
			Attachments.ForEach( ( att ) =>
			{
				if ( att.Equipped && !att.CreatedUI )
					att.CreateHudElements();
			} );
		};
	}

	public virtual void DestroyUI()
	{
		ScreenPanel?.Destroy();
		RootPanel?.Destroy();
	}

	void BroadcastUIEvent( string name, object value )
	{
		if ( RootPanel?.Panel?.Children is null ) return;

		foreach ( var panel in RootPanel.Panel.Children )
		{
			panel.CreateEvent( name, value );
		}
	}

	void OpenCustomizationMenu()
	{
		customizationMenu = new CustomizationMenu( this );
		RootPanel.Panel.AddChild( customizationMenu );
	}

	void CloseCustomizationMenu()
	{
		customizationMenu?.Delete( true );
	}

	/// <summary>Override to use a custom crosshair</summary>
	public virtual Panel CreateCrosshair( Panel parent )
	{
		return parent.AddChild( new Crosshair( this ) );
	}
}