Files

113 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Diagnostics;
using Barotrauma;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
using System.IO;
using EventInput;
namespace QICrabUI
{
public class CUIFocusResolver
{
private CUIComponent focusedCUIComponent;
public CUIComponent FocusedCUIComponent
{
get => focusedCUIComponent;
set
{
CUIComponent oldFocused = focusedCUIComponent;
CUIComponent newFocused = value;
if (oldFocused == newFocused) return;
if (oldFocused != null)
{
oldFocused.Focused = false;
oldFocused.InvokeOnFocusLost();
}
if (newFocused != null)
{
newFocused.Focused = true;
newFocused.InvokeOnFocus();
}
if (oldFocused is IKeyboardSubscriber || newFocused is null)
{
OnVanillaIKeyboardSubscriberSet(null, true);
}
if (newFocused is IKeyboardSubscriber)
{
OnVanillaIKeyboardSubscriberSet((IKeyboardSubscriber)newFocused, true);
}
focusedCUIComponent = value;
}
}
public void OnVanillaIKeyboardSubscriberSet(IKeyboardSubscriber value, bool callFromCUI = false)
{
try
{
KeyboardDispatcher _ = GUI.KeyboardDispatcher;
IKeyboardSubscriber oldSubscriber = _._subscriber;
IKeyboardSubscriber newSubscriber = value;
if (newSubscriber == oldSubscriber) { return; }
// this case should be handled in CUI
if (!callFromCUI && oldSubscriber is CUIComponent && newSubscriber is null) { return; }
//CUI.Log($"new IKeyboardSubscriber {oldSubscriber} -> {newSubscriber}");
if (oldSubscriber != null)
{
TextInput.StopTextInput();
oldSubscriber.Selected = false;
}
if (oldSubscriber is CUIComponent component && newSubscriber is GUITextBox)
{
//TODO for some season TextInput doesn't loose focus here
component.InvokeOnFocusLost();
component.Focused = false;
focusedCUIComponent = null;
}
if (newSubscriber != null)
{
if (newSubscriber is GUITextBox box)
{
TextInput.SetTextInputRect(box.MouseRect);
TextInput.StartTextInput();
TextInput.SetTextInputRect(box.MouseRect);
}
if (newSubscriber is CUIComponent)
{
TextInput.StartTextInput();
}
newSubscriber.Selected = true;
}
_._subscriber = value;
}
catch (Exception e)
{
CUI.Error(e);
}
}
}
}