Skip to content

Commit

Permalink
Add "set by keyboard" button to KeyCode settings
Browse files Browse the repository at this point in the history
  • Loading branch information
ManlyMarco committed Dec 24, 2022
1 parent da2fc62 commit 89261bb
Showing 1 changed file with 56 additions and 13 deletions.
69 changes: 56 additions & 13 deletions ConfigurationManager/SettingFieldDrawer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ internal class SettingFieldDrawer
private static readonly Dictionary<SettingEntryBase, ComboBox> _comboBoxCache = new Dictionary<SettingEntryBase, ComboBox>();
private static readonly Dictionary<SettingEntryBase, ColorCacheEntry> _colorCache = new Dictionary<SettingEntryBase, ColorCacheEntry>();

private readonly ConfigurationManager _instance;
private static ConfigurationManager _instance;

private static SettingEntryBase _currentKeyboardShortcutToSet;
public static bool SettingKeyboardShortcut => _currentKeyboardShortcutToSet != null;
Expand All @@ -33,6 +33,7 @@ static SettingFieldDrawer()
{
{typeof(bool), DrawBoolField},
{typeof(BepInEx.Configuration.KeyboardShortcut), DrawKeyboardShortcut},
{typeof(KeyCode), DrawKeyCode },
{typeof(Color), DrawColor },
{typeof(Vector2), DrawVector2 },
{typeof(Vector3), DrawVector3 },
Expand All @@ -54,15 +55,12 @@ public void DrawSettingValue(SettingEntryBase setting)
DrawRangeField(setting);
else if (setting.AcceptableValues != null)
DrawListField(setting);
else if (DrawFieldBasedOnValueType(setting))
return;
else if (setting.SettingType.IsEnum)
{
if (setting.SettingType.GetCustomAttributes(typeof(FlagsAttribute), false).Any())
DrawFlagsField(setting, Enum.GetValues(setting.SettingType), _instance.RightColumnWidth);
else
DrawComboboxField(setting, Enum.GetValues(setting.SettingType), _instance.SettingWindowRect.yMax);
}
DrawEnumField(setting);
else
DrawFieldBasedOnValueType(setting);
DrawUnknownField(setting, _instance.RightColumnWidth);
}

public static void ClearCache()
Expand Down Expand Up @@ -129,7 +127,7 @@ public static bool DrawCurrentDropdown()
return false;
}

private void DrawListField(SettingEntryBase setting)
private static void DrawListField(SettingEntryBase setting)
{
var acceptableValues = setting.AcceptableValues;
if (acceptableValues.Length == 0)
Expand All @@ -138,15 +136,20 @@ private void DrawListField(SettingEntryBase setting)
if (!setting.SettingType.IsInstanceOfType(acceptableValues.FirstOrDefault(x => x != null)))
throw new ArgumentException("AcceptableValueListAttribute returned a list with items of type other than the settng type itself.");

DrawComboboxField(setting, acceptableValues, _instance.SettingWindowRect.yMax);
if (setting.SettingType == typeof(KeyCode))
DrawKeyCode(setting);
else
DrawComboboxField(setting, acceptableValues, _instance.SettingWindowRect.yMax);
}

private void DrawFieldBasedOnValueType(SettingEntryBase setting)
private static bool DrawFieldBasedOnValueType(SettingEntryBase setting)
{
if (SettingDrawHandlers.TryGetValue(setting.SettingType, out var drawMethod))
{
drawMethod(setting);
else
DrawUnknownField(setting, _instance.RightColumnWidth);
return true;
}
return false;
}

private static void DrawBoolField(SettingEntryBase setting)
Expand All @@ -157,6 +160,14 @@ private static void DrawBoolField(SettingEntryBase setting)
setting.Set(result);
}

private static void DrawEnumField(SettingEntryBase setting)
{
if (setting.SettingType.GetCustomAttributes(typeof(FlagsAttribute), false).Any())
DrawFlagsField(setting, Enum.GetValues(setting.SettingType), _instance.RightColumnWidth);
else
DrawComboboxField(setting, Enum.GetValues(setting.SettingType), _instance.SettingWindowRect.yMax);
}

private static void DrawFlagsField(SettingEntryBase setting, IList enumValues, int maxWidth)
{
var currentValue = Convert.ToInt64(setting.Get());
Expand Down Expand Up @@ -331,6 +342,38 @@ private bool CanCovert(string value, Type type)
}
}

private static void DrawKeyCode(SettingEntryBase setting)
{
if (_currentKeyboardShortcutToSet == setting)
{
GUILayout.Label("Press any key", GUILayout.ExpandWidth(true));
GUIUtility.keyboardControl = -1;

var input = UnityInput.Current;
if (_keysToCheck == null) _keysToCheck = input.SupportedKeyCodes.Except(new[] { KeyCode.Mouse0, KeyCode.None }).ToArray();
foreach (var key in _keysToCheck)
{
if (input.GetKeyUp(key))
{
setting.Set(key);
_currentKeyboardShortcutToSet = null;
break;
}
}

if (GUILayout.Button("Cancel", GUILayout.ExpandWidth(false)))
_currentKeyboardShortcutToSet = null;
}
else
{
var acceptableValues = setting.AcceptableValues?.Length > 1 ? setting.AcceptableValues : Enum.GetValues(setting.SettingType);
DrawComboboxField(setting, acceptableValues, _instance.SettingWindowRect.yMax);

if (GUILayout.Button(new GUIContent("Set...", "Set the key by pressing any key on your keyboard."), GUILayout.ExpandWidth(false)))
_currentKeyboardShortcutToSet = setting;
}
}

private static void DrawKeyboardShortcut(SettingEntryBase setting)
{
if (_currentKeyboardShortcutToSet == setting)
Expand Down

0 comments on commit 89261bb

Please sign in to comment.
  翻译: