@using Sandbox @using Sandbox.UI @inherits Panel @namespace MenuProject.Settings @{ var str = MenuUtility.Input.GetBind( BindGroup, Action.Name, Slot, out var isDefault ); // First slot should always be assigned if ( str == null && Slot == 0 ) { str = Action.KeyboardCode; isDefault = true; } } @if ( !string.IsNullOrEmpty( str ) ) { var keys = GetGlyphKeys( str ).ToList(); @for ( int i = 0; i < keys.Count; i++ ) { @if ( i < keys.Count - 1 ) { } } } else { } @code { [Parameter] public InputAction Action { get; set; } [Parameter] public string BindGroup { get; set; } [Parameter] public int Slot { get; set; } private bool Rebinding { get; set; } private string TargetKey { get; set; } /// Utility method to split the A + X + F string into a container public IEnumerable GetGlyphKeys( string input ) { if ( string.IsNullOrEmpty( input ) ) yield break; var keys = input.Split( new[] { " + " }, StringSplitOptions.RemoveEmptyEntries ); foreach ( var key in keys ) { yield return key.Trim(); } } protected override int BuildHash() { return HashCode.Combine( TargetKey ); } protected override void OnMouseUp( MousePanelEvent e ) { if ( e.MouseButton == MouseButtons.Left ) { Rebinding = true; TargetKey = null; StateHasChanged(); MenuUtility.Input.TrapButtons( (buttons) => { if ( buttons.Contains( "escape", StringComparer.OrdinalIgnoreCase ) ) { Cancel(); return; } TargetKey = string.Join( " + ", buttons.OrderBy( x => x ) ); Apply(); }); } if ( e.MouseButton == MouseButtons.Right ) { MenuUtility.Input.SetBind( BindGroup, Action.Name, null, Slot ); TargetKey = null; CreateEvent( "onchange" ); StateHasChanged(); } } public void Apply() { if ( string.IsNullOrEmpty( TargetKey ) ) return; MenuUtility.Input.SetBind( BindGroup, Action.Name, TargetKey, Slot ); TargetKey = null; Rebinding = false; CreateEvent( "onchange" ); StateHasChanged(); } public void Cancel() { Rebinding = false; TargetKey = null; CreateEvent( "onchange" ); StateHasChanged(); } }