swb_hud/KeyDisplay.cs

HUD panel that shows keybind icons and labels for customization and third-person toggles. It creates UI elements with glyph textures based on current input device and hides itself when there is no active weapon or customization is disabled.

Native Interop
using Sandbox.UI;
using Sandbox.UI.Construct;
using SWB.Base;
using SWB.Player;
using SWB.Shared;
using System.Collections.Generic;

namespace SWB.HUD;

struct KeyBind
{
	public string Key { get; set; }
	public string Label { get; set; }

	public KeyBind( string key, string label )
	{
		Key = key;
		Label = label;
	}
}

public class KeyDisplay : Panel
{
	PlayerBase player;
	bool usingController;

	List<KeyBind> keys = new()
	{
		new(InputButtonHelper.Menu, "Customization"),
		new(InputButtonHelper.View, "Thirdperson"),
	};

	public KeyDisplay( PlayerBase player )
	{
		this.player = player;
		StyleSheet.Load( "/swb_hud/KeyDisplay.cs.scss" );

		CreateKeys();
	}

	void CreateKeys()
	{
		usingController = Input.UsingController;
		DeleteChildren();

		keys.ForEach( keyBind =>
		{
			var wrapper = Add.Panel( "wrapper" );
			var keyIcon = wrapper.Add.Image( "", "keyIcon" );
			var buttonTexture = Input.GetGlyph( keyBind.Key, style: GlyphStyle.Dark );
			keyIcon.Texture = buttonTexture;

			wrapper.Add.Label( keyBind.Label, "label" );
		} );
	}

	public override void Tick()
	{
		var activeGO = player.Inventory.Active;

		if ( activeGO is null )
		{
			SetClass( "hide", true );
			return;
		}

		// Update glyphs when switching input device
		if ( usingController != Input.UsingController )
			CreateKeys();

		var activeWeapon = activeGO.Components.Get<Weapon>();
		var isValidWeapon = activeWeapon is not null;
		SetClass( "hide", !isValidWeapon );
		if ( !isValidWeapon ) return;

		var hideKey = activeWeapon.Attachments.Count == 0 || activeWeapon.IsCustomizing || !WeaponSettings.Instance.Customization;
		SetClass( "hide", hideKey );
	}
}