Hex and Watch Boxes - prevent user from pasting invalid input, also if they do manage to get the textbox into an invalid state, interpret the value as 0 rather than throwing an exception

This commit is contained in:
adelikat 2014-07-03 16:43:39 +00:00
parent 1964f3754a
commit 6bbd3ca80d
4 changed files with 258 additions and 36 deletions

View File

@ -213,7 +213,7 @@ namespace BizHawk.Client.EmuHawk
protected override void OnTextChanged(EventArgs e)
{
if (string.IsNullOrWhiteSpace(Text))
if (string.IsNullOrWhiteSpace(Text) || !Text.IsHex())
{
ResetText();
}
@ -223,7 +223,7 @@ namespace BizHawk.Client.EmuHawk
public int? ToRawInt()
{
if (string.IsNullOrWhiteSpace(Text))
if (string.IsNullOrWhiteSpace(Text) || !Text.IsHex())
{
if (Nullable)
{

View File

@ -1377,7 +1377,7 @@ namespace BizHawk.Client.EmuHawk
if (data != null && data.GetDataPresent(DataFormats.Text))
{
var clipboardRaw = (string)data.GetData(DataFormats.Text);
var hex = clipboardRaw.DoHexString();
var hex = clipboardRaw.OnlyHex();
var numBytes = hex.Length / 2;
for (var i = 0; i < numBytes; i++)

View File

@ -533,6 +533,31 @@ namespace BizHawk.Client.EmuHawk
{
ResetText();
}
switch (_type)
{
case Watch.DisplayType.Signed:
Text = Text.OnlySigned();
break;
case Watch.DisplayType.Unsigned:
Text = Text.OnlyUnsigned();
break;
case Watch.DisplayType.Binary:
Text = Text.OnlyBinary();
break;
case Watch.DisplayType.Hex:
Text = Text.OnlyHex();
break;
case Watch.DisplayType.FixedPoint_12_4:
case Watch.DisplayType.FixedPoint_20_12:
Text = Text.OnlyFixedPoint();
break;
case Watch.DisplayType.Float:
Text = Text.OnlyFloat();
break;
}
base.OnTextChanged(e);
}
public int? ToRawInt()
@ -549,24 +574,60 @@ namespace BizHawk.Client.EmuHawk
switch (_type)
{
default:
case Watch.DisplayType.Signed:
return int.Parse(Text);
if (Text.IsSigned())
{
return int.Parse(Text);
}
break;
case Watch.DisplayType.Unsigned:
return (int)uint.Parse(Text);
if (Text.IsUnsigned())
{
return (int)uint.Parse(Text);
}
break;
case Watch.DisplayType.Binary:
return Convert.ToInt32(Text, 2);
if (Text.IsBinary())
{
return Convert.ToInt32(Text, 2);
}
break;
case Watch.DisplayType.Hex:
return int.Parse(Text, NumberStyles.HexNumber);
if (Text.IsHex())
{
return int.Parse(Text, NumberStyles.HexNumber);
}
break;
case Watch.DisplayType.FixedPoint_12_4:
return (int)(double.Parse(Text) * 16.0);
if (Text.IsFixedPoint())
{
return (int)(double.Parse(Text) * 16.0);
}
break;
case Watch.DisplayType.FixedPoint_20_12:
return (int)(double.Parse(Text) * 4096.0);
if (Text.IsFixedPoint())
{
return (int)(double.Parse(Text) * 4096.0);
}
break;
case Watch.DisplayType.Float:
float val = float.Parse(Text);
var bytes = BitConverter.GetBytes(val);
return BitConverter.ToInt32(bytes, 0);
if (Text.IsFloat())
{
float val = float.Parse(Text);
var bytes = BitConverter.GetBytes(val);
return BitConverter.ToInt32(bytes, 0);
}
break;
}
return 0;
}
public void SetFromRawInt(int? val)

View File

@ -149,29 +149,6 @@ namespace BizHawk.Common.StringExtensions
return char.ToUpper(c) >= 'A' && char.ToUpper(c) <= 'F';
}
/// <summary>
/// Takes any string and removes any value that is not a valid hex value (0-9, a-f, A-F), returns the remaining characters in uppercase
/// </summary>
public static string DoHexString(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
foreach (var chr in raw)
{
if (IsHex(chr))
{
output.Append(char.ToUpper(chr));
}
}
return output.ToString();
}
/// <summary>
/// Validates all chars are 0 or 1
/// </summary>
@ -238,6 +215,190 @@ namespace BizHawk.Common.StringExtensions
return c.IsFixedPoint() || c == '-';
}
/// <summary>
/// Takes any string and removes any value that is not a valid binary value (0 or 1)
/// </summary>
public static string OnlyBinary(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
foreach (var chr in raw)
{
if (IsBinary(chr))
{
output.Append(chr);
}
}
return output.ToString();
}
/// <summary>
/// Takes any string and removes any value that is not a valid unsigned integer value (0-9)
/// </summary>
public static string OnlyUnsigned(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
foreach (var chr in raw)
{
if (IsUnsigned(chr))
{
output.Append(chr);
}
}
return output.ToString();
}
/// <summary>
/// Takes any string and removes any value that is not a valid unsigned integer value (0-9 or -)
/// Note: a "-" will only be kept if it is the first digit
/// </summary>
public static string OnlySigned(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
int count = 0;
foreach (var chr in raw)
{
if (count == 0 && chr == '-')
{
output.Append(chr);
}
else if (IsUnsigned(chr))
{
output.Append(chr);
}
count++;
}
return output.ToString();
}
/// <summary>
/// Takes any string and removes any value that is not a valid hex value (0-9, a-f, A-F), returns the remaining characters in uppercase
/// </summary>
public static string OnlyHex(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
foreach (var chr in raw)
{
if (IsHex(chr))
{
output.Append(char.ToUpper(chr));
}
}
return output.ToString();
}
/// <summary>
/// Takes any string and removes any value that is not a fixed point value (0-9 or .)
/// Note: only the first occurance of a . will be kept
/// </summary>
public static string OnlyFixedPoint(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
bool usedDot = false;
foreach (var chr in raw)
{
if (chr == '.')
{
if (usedDot)
{
continue;
}
else
{
usedDot = true;
}
}
if (IsFixedPoint(chr))
{
output.Append(chr);
}
}
return output.ToString();
}
/// <summary>
/// Takes any string and removes any value that is not a float point value (0-9, -, or .)
/// Note: - is only valid as the first character, and only the first occurance of a . will be kept
/// </summary>
public static string OnlyFloat(this string raw)
{
if (raw == null)
{
return string.Empty;
}
var output = new StringBuilder();
bool usedDot = false;
int count = 0;
foreach (var chr in raw)
{
if (count == 0 && chr == '-')
{
output.Append(chr);
}
else
{
if (chr == '.')
{
if (usedDot)
{
continue;
}
else
{
usedDot = true;
}
}
if (IsFixedPoint(chr))
{
output.Append(chr);
}
}
}
count++;
return output.ToString();
}
#endregion
}
}