Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaClient/ClientSource/EventInput/KeyboardDispatcher.cs
2022-12-05 19:55:31 +02:00

78 lines
2.2 KiB
C#

using Barotrauma;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
namespace EventInput
{
public interface IKeyboardSubscriber
{
void ReceiveTextInput(char inputChar);
void ReceiveTextInput(string text);
void ReceiveCommandInput(char command);
void ReceiveSpecialInput(Keys key);
void ReceiveEditingInput(string text, int start, int length);
bool Selected { get; set; } //or Focused
}
public class KeyboardDispatcher
{
public KeyboardDispatcher(GameWindow window)
{
EventInput.Initialize(window);
EventInput.CharEntered += EventInput_CharEntered;
EventInput.KeyDown += EventInput_KeyDown;
EventInput.EditingText += EventInput_TextEditing;
GameMain.ResetIMEWorkaround();
}
public void EventInput_TextEditing(object sender, TextEditingEventArgs e)
{
_subscriber?.ReceiveEditingInput(e.Text, e.Start, e.Length);
}
public void EventInput_KeyDown(object sender, KeyEventArgs e)
{
_subscriber?.ReceiveSpecialInput(e.KeyCode);
if (char.IsControl(e.Character))
{
_subscriber?.ReceiveCommandInput(e.Character);
}
}
void EventInput_CharEntered(object sender, CharacterEventArgs e)
{
_subscriber?.ReceiveTextInput(e.Character);
}
IKeyboardSubscriber _subscriber;
public IKeyboardSubscriber Subscriber
{
get { return _subscriber; }
set
{
if (_subscriber == value) { return; }
if (_subscriber is GUITextBox)
{
TextInput.StopTextInput();
_subscriber.Selected = false;
}
if (value is GUITextBox box)
{
TextInput.SetTextInputRect(box.MouseRect);
TextInput.StartTextInput();
TextInput.SetTextInputRect(box.MouseRect);
}
_subscriber = value;
if (value != null)
{
value.Selected = true;
}
}
}
}
}