152 lines
5.4 KiB
C#
152 lines
5.4 KiB
C#
using System;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Xml.Linq;
|
|
using Barotrauma.LuaCs.Data;
|
|
using Microsoft.Toolkit.Diagnostics;
|
|
using Microsoft.Xna.Framework.Input;
|
|
using OneOf;
|
|
|
|
namespace Barotrauma.LuaCs.Data;
|
|
|
|
public sealed class SettingControl : SettingBase, ISettingControl
|
|
{
|
|
public class Factory : ISettingBase.IFactory<ISettingBase>
|
|
{
|
|
public ISettingBase CreateInstance(IConfigInfo configInfo, Func<OneOf<string, XElement, object>, bool> valueChangePredicate)
|
|
{
|
|
Guard.IsNotNull(configInfo, nameof(configInfo));
|
|
return new SettingControl(configInfo, valueChangePredicate);
|
|
}
|
|
}
|
|
|
|
public SettingControl(IConfigInfo configInfo, Func<OneOf<string, XElement, object>, bool> valueChangePredicate) : base(configInfo)
|
|
{
|
|
_valueChangePredicate = valueChangePredicate;
|
|
TrySetValue(configInfo.Element);
|
|
}
|
|
|
|
protected override void OnDispose()
|
|
{
|
|
OnValueChanged = null;
|
|
}
|
|
|
|
private Func<OneOf<string, XElement, object>, bool> _valueChangePredicate;
|
|
public override Type GetValueType() => typeof(KeyOrMouse);
|
|
public override string GetStringValue() => Value.ToString();
|
|
public override string GetDefaultStringValue() => new KeyOrMouse(Keys.NumLock).ToString();
|
|
|
|
public override bool TrySetValue(OneOf<string, XElement> value)
|
|
{
|
|
var newVal = value.Match<KeyOrMouse>(
|
|
(string v) => GetKeyOrMouse(v),
|
|
(XElement e) => e.GetAttributeKeyOrMouse("Value", null));
|
|
|
|
if (newVal is null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (_valueChangePredicate is not null && !_valueChangePredicate.Invoke(newVal))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
Value = newVal;
|
|
OnValueChanged?.Invoke(this);
|
|
return true;
|
|
|
|
KeyOrMouse GetKeyOrMouse(string strValue)
|
|
{
|
|
strValue ??= string.Empty;
|
|
if (Enum.TryParse(strValue, true, out Microsoft.Xna.Framework.Input.Keys key))
|
|
{
|
|
return key;
|
|
}
|
|
else if (Enum.TryParse(strValue, out MouseButton mouseButton))
|
|
{
|
|
return mouseButton;
|
|
}
|
|
else if (int.TryParse(strValue, NumberStyles.Any, CultureInfo.InvariantCulture, out int mouseButtonInt) &&
|
|
Enum.GetValues<MouseButton>().Contains((MouseButton)mouseButtonInt))
|
|
{
|
|
return (MouseButton)mouseButtonInt;
|
|
}
|
|
else if (string.Equals(strValue, "LeftMouse", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
return !PlayerInput.MouseButtonsSwapped() ? MouseButton.PrimaryMouse : MouseButton.SecondaryMouse;
|
|
}
|
|
else if (string.Equals(strValue, "RightMouse", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
return !PlayerInput.MouseButtonsSwapped() ? MouseButton.SecondaryMouse : MouseButton.PrimaryMouse;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
public override event Action<ISettingBase> OnValueChanged;
|
|
public override OneOf<string, XElement> GetSerializableValue() => Value.ToString();
|
|
public KeyOrMouse Value { get; private set; } = new KeyOrMouse(Keys.NumLock);
|
|
|
|
public bool TrySetValue(KeyOrMouse value)
|
|
{
|
|
Value = value;
|
|
OnValueChanged?.Invoke(this);
|
|
return true;
|
|
}
|
|
|
|
public bool IsDown()
|
|
{
|
|
if (this.Value is null)
|
|
return false;
|
|
switch (this.Value.MouseButton)
|
|
{
|
|
case MouseButton.None:
|
|
return Barotrauma.PlayerInput.KeyDown(this.Value.Key);
|
|
case MouseButton.PrimaryMouse:
|
|
return Barotrauma.PlayerInput.PrimaryMouseButtonHeld();
|
|
case MouseButton.SecondaryMouse:
|
|
return Barotrauma.PlayerInput.SecondaryMouseButtonHeld();
|
|
case MouseButton.MiddleMouse:
|
|
return Barotrauma.PlayerInput.MidButtonHeld();
|
|
case MouseButton.MouseButton4:
|
|
return Barotrauma.PlayerInput.Mouse4ButtonHeld();
|
|
case MouseButton.MouseButton5:
|
|
return Barotrauma.PlayerInput.Mouse5ButtonHeld();
|
|
case MouseButton.MouseWheelUp:
|
|
return Barotrauma.PlayerInput.MouseWheelUpClicked();
|
|
case MouseButton.MouseWheelDown:
|
|
return Barotrauma.PlayerInput.MouseWheelDownClicked();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool IsHit()
|
|
{
|
|
if (this.Value is null)
|
|
return false;
|
|
switch (this.Value.MouseButton)
|
|
{
|
|
case MouseButton.None:
|
|
return Barotrauma.PlayerInput.KeyHit(this.Value.Key);
|
|
case MouseButton.PrimaryMouse:
|
|
return Barotrauma.PlayerInput.PrimaryMouseButtonClicked();
|
|
case MouseButton.SecondaryMouse:
|
|
return Barotrauma.PlayerInput.SecondaryMouseButtonClicked();
|
|
case MouseButton.MiddleMouse:
|
|
return Barotrauma.PlayerInput.MidButtonClicked();
|
|
case MouseButton.MouseButton4:
|
|
return Barotrauma.PlayerInput.Mouse4ButtonClicked();
|
|
case MouseButton.MouseButton5:
|
|
return Barotrauma.PlayerInput.Mouse5ButtonClicked();
|
|
case MouseButton.MouseWheelUp:
|
|
return Barotrauma.PlayerInput.MouseWheelUpClicked();
|
|
case MouseButton.MouseWheelDown:
|
|
return Barotrauma.PlayerInput.MouseWheelDownClicked();
|
|
}
|
|
return false;
|
|
}
|
|
}
|