A UI panel representing a handle icon for a Component in the world. It tracks the component world position, converts it to screen coordinates each tick, displays an icon from the component type, and selects the component's GameObject in the Inspector when clicked.
using Sandbox.UI;
namespace Sandbox;
/// <summary>
/// This component has a kill icon that can be used in the killfeed, or somewhere else.
/// </summary>
public class ComponentHandle : Panel
{
readonly Inspector _inspector;
readonly Component _component;
readonly Label _icon;
Vector3 worldpos;
public ComponentHandle( Panel parent, Component c, Inspector i ) : base( parent )
{
_component = c;
_inspector = i;
worldpos = _component.WorldPosition;
_icon = AddChild<Label>( "icon" );
var typeInfo = TypeLibrary.GetType( c.GetType() );
_icon.Text = typeInfo.Icon ?? "ℹ️";
}
public override void Tick()
{
base.Tick();
if ( _component.IsValid() )
{
worldpos = _component.WorldPosition;
}
{
var screenPos = Scene.Camera.PointToScreenPixels( worldpos, out bool behind );
Style.Left = screenPos.x * ScaleFromScreen;
Style.Top = screenPos.y * ScaleFromScreen;
SetClass( "behind", behind );
//SetClass( "active", _inspector?.Selected == _component?.GameObject );
}
if ( ShouldDelete() )
{
Delete();
}
}
bool ShouldDelete()
{
if ( !_component.IsValid() ) return true;
return false;
}
protected override void OnMouseDown( MousePanelEvent e )
{
e.StopPropagation();
_inspector.SelectObject( _component.GameObject );
}
}