using NativeEngine; namespace Sandbox.UI; /// /// Queue input events on here to be processed by the UISystem. /// class InputEventQueue { Queue PanelEvents = new(); Queue ButtonEvents = new(); Queue DoubleClicks = new(); Queue ButtonTyped = new(); Queue KeyTyped = new(); Vector2 MouseMovement; internal static string NormalizeButtonName( string button ) { button = button.ToLowerInvariant(); if ( button.StartsWith( "key_" ) ) button = button[4..]; return button; } internal void TickFocused( Panel focused ) { if ( !focused.IsValid() ) { ButtonEvents.Clear(); KeyTyped.Clear(); ButtonTyped.Clear(); PanelEvents.Clear(); return; } while ( ButtonEvents.TryDequeue( out var e ) ) { focused.OnButtonEvent( e ); } while ( KeyTyped.TryDequeue( out var e ) ) { focused?.OnKeyTyped( e ); } while ( ButtonTyped.TryDequeue( out var e ) ) { focused?.OnButtonTyped( e ); } while ( PanelEvents.TryDequeue( out var e ) ) { e.Target = focused; focused.CreateEvent( e ); } } internal void Tick( Panel hovered, Panel active ) { if ( MouseMovement != 0 ) { // If we're pressing down on a panel we send all the mouse move events to that var moveRecv = hovered; if ( active != null ) moveRecv = active; moveRecv?.CreateEvent( new MousePanelEvent( "onmousemove", moveRecv, "none" ) ); MouseMovement = 0; } var listSize = DoubleClicks.Count; for ( int i = 0; i < listSize; i++ ) if ( DoubleClicks.TryDequeue( out var e ) ) { hovered?.CreateEvent( new MousePanelEvent( "ondoubleclick", hovered, e ) ); } } internal void AddDoubleClick( string button ) { button = NormalizeButtonName( button ); DoubleClicks.Enqueue( button ); } internal void QueueInputEvent( PanelEvent e ) { PanelEvents.Enqueue( e ); } internal void AddButtonEvent( ButtonCode button, bool down, KeyboardModifiers modifiers ) { var e = new ButtonEvent( button, down, modifiers ); ButtonEvents.Enqueue( e ); } internal void AddKeyTyped( char c ) { KeyTyped.Enqueue( c ); } internal void AddButtonTyped( ButtonCode button, KeyboardModifiers modifiers ) { var e = new ButtonEvent( button, true, modifiers ); ButtonTyped.Enqueue( e ); } internal void MouseMoved( Vector2 delta ) { MouseMovement += delta; } }