Simplify Hotkey parsing.
This commit is contained in:
@@ -262,5 +262,22 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
public static T Parse(string s) { return (T)Enum.Parse(typeof(T), s); }
|
public static T Parse(string s) { return (T)Enum.Parse(typeof(T), s); }
|
||||||
public static T[] GetValues() { return (T[])Enum.GetValues(typeof(T)); }
|
public static T[] GetValues() { return (T[])Enum.GetValues(typeof(T)); }
|
||||||
|
|
||||||
|
public static bool TryParse(string s, bool ignoreCase, out T value)
|
||||||
|
{
|
||||||
|
// The string may be a comma delimited list of values
|
||||||
|
var names = ignoreCase ? Enum.GetNames(typeof(T)).Select(x => x.ToLowerInvariant()) : Enum.GetNames(typeof(T));
|
||||||
|
var values = ignoreCase ? s.Split(',').Select(x => x.Trim().ToLowerInvariant()) : s.Split(',').Select(x => x.Trim());
|
||||||
|
|
||||||
|
if (values.Any(x => !names.Contains(x)))
|
||||||
|
{
|
||||||
|
value = default(T);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = (T)Enum.Parse(typeof(T), s, ignoreCase);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,43 +25,22 @@ namespace OpenRA
|
|||||||
public static bool TryParse(string s, out Hotkey result)
|
public static bool TryParse(string s, out Hotkey result)
|
||||||
{
|
{
|
||||||
result = Invalid;
|
result = Invalid;
|
||||||
|
|
||||||
var parts = s.Split(' ');
|
var parts = s.Split(' ');
|
||||||
|
|
||||||
|
Keycode key;
|
||||||
|
if (!Enum<Keycode>.TryParse(parts[0], true, out key))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var mods = Modifiers.None;
|
||||||
if (parts.Length >= 2)
|
if (parts.Length >= 2)
|
||||||
{
|
{
|
||||||
if (!Enum.GetNames(typeof(Keycode)).Contains(parts[0]))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var modString = s.Substring(s.IndexOf(' '));
|
var modString = s.Substring(s.IndexOf(' '));
|
||||||
var modParts = modString.Split(',').Select(x => x.Trim());
|
if (!Enum<Modifiers>.TryParse(modString, true, out mods))
|
||||||
if (modParts.Any(p => !Enum.GetNames(typeof(Modifiers)).Contains(p)))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var key = (Keycode)Enum.Parse(typeof(Keycode), parts[0]);
|
|
||||||
var mods = (Modifiers)Enum.Parse(typeof(Modifiers), modString);
|
|
||||||
|
|
||||||
result = new Hotkey(key, mods);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts.Length == 1)
|
result = new Hotkey(key, mods);
|
||||||
{
|
return true;
|
||||||
// HACK: Try parsing as a legacy key name
|
|
||||||
// This is a stop-gap solution to keep backwards
|
|
||||||
// compatibility while outside code is converted
|
|
||||||
var i = 0;
|
|
||||||
for (; i < (int)Keycode.LAST; i++)
|
|
||||||
if (KeycodeExts.DisplayString((Keycode)i) == parts[0])
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (i < (int)Keycode.LAST)
|
|
||||||
{
|
|
||||||
result = new Hotkey((Keycode)i, Modifiers.None);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Hotkey FromKeyInput(KeyInput ki)
|
public static Hotkey FromKeyInput(KeyInput ki)
|
||||||
|
|||||||
Reference in New Issue
Block a user