Revision Difference
ui-events-and-input#562708
<cat>UI.Intro</cat>
<title>Events and Input</title>
## Panel Events & Input
# Events
Panels can listen for events, here's the current list:
| Event | Description |
|-------------------|-----|
| onclick | Called when left clicking on a panel |
| onmiddleclick | Called when middle clicking on a panel |
| onrightclick | Called when right clicking on a panel |
| onmousedown | Called when any mouse button is pressed this frame |
| onmouseup | Called when any mouse button is released this frame |
| ondoubleclick | Called when a panel is double clicked on |
| onmousemove | Called every frame where your mouse is moving inside of a panel |
| onmouseover | Called when your mouse enters the bounds of a panel |
| onmouseout | Called when your mouse exits the bounds of a panel |
| onfocus | Called when the panel comes into focus |
| onblur | Called when the panel loses focus |
| onback | Called when you click the Back button on your mouse |
| onforward | Called when you click the Forward button on your mouse |
| onescape | Called when the escape key is pressed, also Blur() if focused |
**Warning**: You may have to disable pointer events on overlapping transparent GUI elements for events to trigger!
**Bug**: There's no guarantee that onmouseover and onmouseout events will be triggered in the correct order; if that matters to you then you're better off not relying on it.
## Usage
```csharp
panel.AddEventListener( "onclick", e => Log.Info( "I clicked my panel!" ) );
```
⤶
Or you can use these events in .razor files⤶
⤶
```csharp⤶
<text @onclick=@OnClick>Click me!</text>⤶
```⤶
⤶
Assume in the above example that there is a function `OnClick` in the razor class. You can learn more about this usage here https://wiki.facepunch.com/sbox/ui-razor#events⤶
# Class Overrides
All panels have these available virtual methods for you to override, if you choose not to use events.
```csharp
protected virtual void OnClick( MousePanelEvent e )
protected virtual void OnMiddleClick( MousePanelEvent e )
protected virtual void OnRightClick( MousePanelEvent e )
protected virtual void OnMouseDown( MousePanelEvent e )
protected virtual void OnMouseUp( MousePanelEvent e )
protected virtual void OnMouseMove( MousePanelEvent e )
protected virtual void OnDoubleClick( MousePanelEvent e )
protected virtual void OnMouseOver( MousePanelEvent e )
protected virtual void OnMouseOut( MousePanelEvent e )
protected virtual void OnBack( PanelEvent e )
protected virtual void OnForward( PanelEvent e )
protected virtual void OnFocus( PanelEvent e )
protected virtual void OnBlur( PanelEvent e )
protected virtual void OnEscape( PanelEvent e )
```
## Adding a text entry
This is an example of the usage of the `Add.TextEntry(string name)`.
Source: base gamemode - /code/UI/Chat.cs
```cs
using Sandbox.UI.Construct;
using System;
namespace Sandbox.UI
{
public partial class ChatBox : Panel
{
static ChatBox Current;
public Panel Canvas { get; protected set; }
public TextEntry Input { get; protected set; }
public ChatBox()
{
Current = this;
StyleSheet.Load( "/ui/chat/ChatBox.scss" );
Canvas = Add.Panel( "chat_canvas" );
Input = Add.TextEntry( "" );
Input.AddEventListener( "onsubmit", () => Submit() );
Input.AddEventListener( "onblur", () => Close() );
Input.AcceptsFocus = true;
Input.AllowEmojiReplace = true;
}
void Open()
{
AddClass( "open" );
Input.Focus();
}
void Close()
{
RemoveClass( "open" );
Input.Blur();
}
}
}
```