Simplify Hotkey parsing.

This commit is contained in:
Paul Chote
2013-11-04 20:50:20 +13:00
parent 133b79e2c2
commit 4b8b7fb75f
2 changed files with 26 additions and 30 deletions

View File

@@ -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;
}
} }
} }

View File

@@ -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)