-Useful refactoring!

--prevList, undoPrevList, and redoPrevList removed. All of the definitions for previous are now stored in separate data items.
---Should yield small speed increases.
---Makes it easier to port these definitions to Ram Watch eventually.
---Auto-aligns data, making it impossible for issues, such as the original values not aligning with the correct values because the prevList wasn't recreated, impossible.
---Makes it possible for the field to automatically update when the definition is changed (Implemented).
--Value/PrevToString() now use the same code.
--Reduces redundancy.
---This was a problem as PrevToString wasn't taking into account the data type, whereas Value was. This is now fixed.
-Watch now stores the data for the "last change" previous definition. Now I just have to set up the option in the GUI.
This commit is contained in:
brandman211 2012-06-09 01:56:56 +00:00
parent eefb41f0b3
commit 3b54bd268a
3 changed files with 223 additions and 120 deletions

View File

@ -22,11 +22,8 @@ namespace BizHawk.MultiClient
string systemID = "NULL"; string systemID = "NULL";
List<Watch> searchList = new List<Watch>(); List<Watch> searchList = new List<Watch>();
List<Watch> undoList = new List<Watch>(); List<Watch> undoList = new List<Watch>();
List<Watch> undoPrevList = new List<Watch>();
List<Watch> weededList = new List<Watch>(); //When addresses are weeded out, the new list goes here, before going into searchList List<Watch> weededList = new List<Watch>(); //When addresses are weeded out, the new list goes here, before going into searchList
List<Watch> prevList = new List<Watch>();
List<Watch> redoList = new List<Watch>(); List<Watch> redoList = new List<Watch>();
List<Watch> redoPrevList = new List<Watch>();
private bool IsAWeededList = false; //For deciding whether the weeded list is relevant (0 size could mean all were removed in a legit preview private bool IsAWeededList = false; //For deciding whether the weeded list is relevant (0 size could mean all were removed in a legit preview
List<ToolStripMenuItem> domainMenuItems = new List<ToolStripMenuItem>(); List<ToolStripMenuItem> domainMenuItems = new List<ToolStripMenuItem>();
MemoryDomain Domain = new MemoryDomain("NULL", 1, Endian.Little, addr => 0, (a, v) => { }); MemoryDomain Domain = new MemoryDomain("NULL", 1, Endian.Little, addr => 0, (a, v) => { });
@ -401,6 +398,8 @@ namespace BizHawk.MultiClient
searchList[x].signed = GetDataType(); searchList[x].signed = GetDataType();
searchList[x].PeekAddress(Domain); searchList[x].PeekAddress(Domain);
searchList[x].prev = searchList[x].value; searchList[x].prev = searchList[x].value;
searchList[x].original = searchList[x].value;
searchList[x].lastsearch = searchList[x].value;
if (includeMisalignedToolStripMenuItem.Checked) if (includeMisalignedToolStripMenuItem.Checked)
count++; count++;
else else
@ -422,7 +421,6 @@ namespace BizHawk.MultiClient
} }
if (Global.Config.AlwaysExcludeRamWatch) if (Global.Config.AlwaysExcludeRamWatch)
ExcludeRamWatchList(); ExcludeRamWatchList();
MakePreviousList();
SetSpecificValueBoxMaxLength(); SetSpecificValueBoxMaxLength();
MessageLabel.Text = "New search started"; MessageLabel.Text = "New search started";
sortReverse = false; sortReverse = false;
@ -430,14 +428,6 @@ namespace BizHawk.MultiClient
DisplaySearchList(); DisplaySearchList();
} }
private void MakePreviousList()
{
prevList = new List<Watch>();
for (int x = 0; x < searchList.Count; x++)
prevList.Add(new Watch(searchList[x]));
}
private void DisplaySearchList() private void DisplaySearchList()
{ {
SearchListView.ItemCount = searchList.Count; SearchListView.ItemCount = searchList.Count;
@ -524,11 +514,8 @@ namespace BizHawk.MultiClient
private void SaveUndo() private void SaveUndo()
{ {
undoList.Clear(); undoList.Clear();
undoPrevList.Clear();
for (int x = 0; x < searchList.Count; x++) for (int x = 0; x < searchList.Count; x++)
undoList.Add(new Watch(searchList[x])); undoList.Add(new Watch(searchList[x]));
for (int x = 0; x < prevList.Count; x++)
undoPrevList.Add(new Watch(prevList[x]));
UndotoolStripButton.Enabled = true; UndotoolStripButton.Enabled = true;
} }
@ -538,9 +525,7 @@ namespace BizHawk.MultiClient
{ {
MessageLabel.Text = MakeAddressString(undoList.Count - searchList.Count) + " restored"; MessageLabel.Text = MakeAddressString(undoList.Count - searchList.Count) + " restored";
redoList = new List<Watch>(searchList); redoList = new List<Watch>(searchList);
redoPrevList = new List<Watch>(prevList);
searchList = new List<Watch>(undoList); searchList = new List<Watch>(undoList);
prevList = new List<Watch>(undoPrevList);
ClearUndo(); ClearUndo();
RedotoolStripButton2.Enabled = true; RedotoolStripButton2.Enabled = true;
DisplaySearchList(); DisplaySearchList();
@ -552,14 +537,12 @@ namespace BizHawk.MultiClient
private void ClearUndo() private void ClearUndo()
{ {
undoList.Clear(); undoList.Clear();
undoPrevList.Clear();
UndotoolStripButton.Enabled = false; UndotoolStripButton.Enabled = false;
} }
private void ClearRedo() private void ClearRedo()
{ {
redoList.Clear(); redoList.Clear();
redoPrevList.Clear();
RedotoolStripButton2.Enabled = false; RedotoolStripButton2.Enabled = false;
} }
@ -569,9 +552,7 @@ namespace BizHawk.MultiClient
{ {
MessageLabel.Text = MakeAddressString(searchList.Count - redoList.Count) + " removed"; MessageLabel.Text = MakeAddressString(searchList.Count - redoList.Count) + " removed";
undoList = new List<Watch>(searchList); undoList = new List<Watch>(searchList);
undoPrevList = new List<Watch>(prevList);
searchList = new List<Watch>(redoList); searchList = new List<Watch>(redoList);
prevList = new List<Watch>(redoPrevList);
ClearRedo(); ClearRedo();
UndotoolStripButton.Enabled = true; UndotoolStripButton.Enabled = true;
DisplaySearchList(); DisplaySearchList();
@ -620,10 +601,19 @@ namespace BizHawk.MultiClient
} }
if (column == 2) if (column == 2)
{ {
if (Global.Config.RamSearchPreviousAs == 2) //If prev frame switch (Global.Config.RamSearchPreviousAs)
{
case 0:
text = searchList[index].LastSearchToString();
break;
case 1:
text = searchList[index].OriginalToString();
break;
default:
case 2:
text = searchList[index].PrevToString(); text = searchList[index].PrevToString();
else break;
text = prevList[index].ValueToString(); }
} }
if (column == 3) if (column == 3)
{ {
@ -675,7 +665,7 @@ namespace BizHawk.MultiClient
SaveUndo(); SaveUndo();
MessageLabel.Text = MakeAddressString(searchList.Count - weededList.Count) + " removed"; MessageLabel.Text = MakeAddressString(searchList.Count - weededList.Count) + " removed";
ReplaceSearchListWithWeedOutList(); ReplaceSearchListWithWeedOutList();
if (Global.Config.RamSearchPreviousAs != 1) MakePreviousList(); //1 = Original value UpdateLastSearch();
DisplaySearchList(); DisplaySearchList();
} }
else else
@ -745,14 +735,15 @@ namespace BizHawk.MultiClient
private int GetPreviousValue(int pos) private int GetPreviousValue(int pos)
{ {
if (Global.Config.RamSearchPreviousAs == 2) //If Previous frame switch (Global.Config.RamSearchPreviousAs)
return searchList[pos].prev;
else
{ {
if (pos < prevList.Count) case 0:
return prevList[pos].value; return searchList[pos].lastsearch;
else case 1:
return 0; return searchList[pos].original;
default:
case 2:
return searchList[pos].prev;
} }
} }
@ -1089,18 +1080,11 @@ namespace BizHawk.MultiClient
searchList[x].signed = s; searchList[x].signed = s;
for (int x = 0; x < undoList.Count; x++) for (int x = 0; x < undoList.Count; x++)
undoList[x].signed = s; undoList[x].signed = s;
for (int x = 0; x < undoPrevList.Count; x++)
undoPrevList[x].signed = s;
for (int x = 0; x < weededList.Count; x++) for (int x = 0; x < weededList.Count; x++)
weededList[x].signed = s; weededList[x].signed = s;
for (int x = 0; x < prevList.Count; x++)
prevList[x].signed = s;
for (int x = 0; x < redoList.Count; x++) for (int x = 0; x < redoList.Count; x++)
redoList[x].signed = s; redoList[x].signed = s;
for (int x = 0; x < redoPrevList.Count; x++)
redoPrevList[x].signed = s;
SetSpecificValueBoxMaxLength(); SetSpecificValueBoxMaxLength();
MessageLabel.Text = "Data type converted";
DisplaySearchList(); DisplaySearchList();
} }
@ -1506,16 +1490,19 @@ namespace BizHawk.MultiClient
private void sinceLastSearchToolStripMenuItem_Click(object sender, EventArgs e) private void sinceLastSearchToolStripMenuItem_Click(object sender, EventArgs e)
{ {
Global.Config.RamSearchPreviousAs = 0; Global.Config.RamSearchPreviousAs = 0;
DisplaySearchList();
} }
private void sinceLastFrameToolStripMenuItem_Click(object sender, EventArgs e) private void sinceLastFrameToolStripMenuItem_Click(object sender, EventArgs e)
{ {
Global.Config.RamSearchPreviousAs = 2; Global.Config.RamSearchPreviousAs = 2;
DisplaySearchList();
} }
private void originalValueToolStripMenuItem_Click(object sender, EventArgs e) private void originalValueToolStripMenuItem_Click(object sender, EventArgs e)
{ {
Global.Config.RamSearchPreviousAs = 1; Global.Config.RamSearchPreviousAs = 1;
DisplaySearchList();
} }
private void definePreviousValueToolStripMenuItem_DropDownOpened(object sender, EventArgs e) private void definePreviousValueToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
@ -1643,7 +1630,7 @@ namespace BizHawk.MultiClient
SaveUndo(); SaveUndo();
MessageLabel.Text = MakeAddressString(searchList.Count - weededList.Count) + " removed"; MessageLabel.Text = MakeAddressString(searchList.Count - weededList.Count) + " removed";
ReplaceSearchListWithWeedOutList(); ReplaceSearchListWithWeedOutList();
if (Global.Config.RamSearchPreviousAs != 1) MakePreviousList(); //1 = Original value UpdateLastSearch();
DisplaySearchList(); DisplaySearchList();
} }
@ -1691,13 +1678,20 @@ namespace BizHawk.MultiClient
{ {
for (int x = 0; x < searchList.Count; x++) for (int x = 0; x < searchList.Count; x++)
{ {
prevList[x].value = searchList[x].value; searchList[x].lastsearch = searchList[x].value;
searchList[x].original = searchList[x].value;
searchList[x].prev = searchList[x].value; searchList[x].prev = searchList[x].value;
} }
DisplaySearchList(); DisplaySearchList();
DoPreview(); DoPreview();
} }
private void UpdateLastSearch()
{
for (int x = 0; x < searchList.Count; x++)
searchList[x].lastsearch = searchList[x].value;
}
private void SetCurrToPrevtoolStripButton2_Click(object sender, EventArgs e) private void SetCurrToPrevtoolStripButton2_Click(object sender, EventArgs e)
{ {
CopyValueToPrev(); CopyValueToPrev();
@ -2009,10 +2003,17 @@ namespace BizHawk.MultiClient
string columnName = SearchListView.Columns[columnToOrder].Text; string columnName = SearchListView.Columns[columnToOrder].Text;
if (sortedCol.CompareTo(columnName) != 0) if (sortedCol.CompareTo(columnName) != 0)
sortReverse = false; sortReverse = false;
if (columnName == "Prev" && Global.Config.RamSearchPreviousAs != 2) string previous = "Last Frame";
prevList.Sort((x, y) => x.CompareTo(y, columnName) * (sortReverse ? -1 : 1)); switch (Global.Config.RamSearchPreviousAs)
else {
searchList.Sort((x, y) => x.CompareTo(y, columnName) * (sortReverse ? -1 : 1)); case 0:
previous = "Last Search";
break;
case 1:
previous = "Original";
break;
}
searchList.Sort((x, y) => x.CompareTo(y, columnName, previous) * (sortReverse ? -1 : 1));
sortedCol = columnName; sortedCol = columnName;
sortReverse = !(sortReverse); sortReverse = !(sortReverse);
SearchListView.Refresh(); SearchListView.Refresh();

View File

@ -1318,7 +1318,7 @@ namespace BizHawk.MultiClient
string columnName = WatchListView.Columns[columnToOrder].Text; string columnName = WatchListView.Columns[columnToOrder].Text;
if (sortedCol.CompareTo(columnName) != 0) if (sortedCol.CompareTo(columnName) != 0)
sortReverse = false; sortReverse = false;
watchList.Sort((x, y) => x.CompareTo(y, columnName) * (sortReverse ? -1 : 1)); watchList.Sort((x, y) => x.CompareTo(y, columnName, "Last Frame") * (sortReverse ? -1 : 1));
sortedCol = columnName; sortedCol = columnName;
sortReverse = !(sortReverse); sortReverse = !(sortReverse);
WatchListView.Refresh(); WatchListView.Refresh();

View File

@ -23,6 +23,9 @@ namespace BizHawk.MultiClient
notes = ""; notes = "";
changecount = 0; changecount = 0;
prev = 0; prev = 0;
original = 0;
lastchange = 0;
lastsearch = 0;
} }
public Watch(Watch w) public Watch(Watch w)
@ -35,6 +38,9 @@ namespace BizHawk.MultiClient
notes = w.notes; notes = w.notes;
changecount = w.changecount; changecount = w.changecount;
prev = w.prev; prev = w.prev;
original = w.original;
lastchange = w.lastchange;
lastsearch = w.lastsearch;
} }
public Watch(int Address, int Value, atype Type, asigned Signed, bool BigEndian, string Notes) public Watch(int Address, int Value, atype Type, asigned Signed, bool BigEndian, string Notes)
@ -47,10 +53,16 @@ namespace BizHawk.MultiClient
notes = Notes; notes = Notes;
changecount = 0; changecount = 0;
prev = 0; prev = 0;
original = value;
lastchange = 0;
lastsearch = value;
} }
public int address { get; set; } public int address { get; set; }
public int value { get; set; } //Current value public int value { get; set; } //Current value
public int prev { get; set; } public int prev { get; set; }
public int original { get; set; }
public int lastchange { get; set; }
public int lastsearch { get; set; }
public atype type { get; set; } //Address type (byte, word, dword, etc public atype type { get; set; } //Address type (byte, word, dword, etc
public asigned signed { get; set; } //Signed/Unsigned? public asigned signed { get; set; } //Signed/Unsigned?
public bool bigendian { get; set; } public bool bigendian { get; set; }
@ -177,8 +189,11 @@ namespace BizHawk.MultiClient
} }
if (value != prev) if (value != prev)
{
lastchange = prev;
changecount++; changecount++;
} }
}
private void PokeByte(MemoryDomain domain) private void PokeByte(MemoryDomain domain)
{ {
@ -243,82 +258,79 @@ namespace BizHawk.MultiClient
StringBuilder str = new StringBuilder(notes); StringBuilder str = new StringBuilder(notes);
str.Append(": "); str.Append(": ");
str.Append(ValueToString()); str.Append(ValToString(value));
return str.ToString(); return str.ToString();
} }
public string ValToString(int val)
{
if (type == atype.SEPARATOR)
return "";
else
{
switch (signed)
{
case asigned.HEX:
switch (type)
{
default:
case atype.BYTE:
return String.Format("{0:X2}", val);
case atype.WORD:
return String.Format("{0:X4}", val);
case atype.DWORD:
return String.Format("{0:X8}", val);
}
case asigned.SIGNED:
switch (type)
{
default:
case atype.BYTE:
return ((sbyte)val).ToString();
case atype.WORD:
return ((short)val).ToString();
case atype.DWORD:
return ((int)val).ToString();
}
default:
case asigned.UNSIGNED:
switch (type)
{
default:
case atype.BYTE:
return ((byte)val).ToString();
case atype.WORD:
return ((ushort)val).ToString();
case atype.DWORD:
return ((uint)val).ToString();
}
}
}
}
public string ValueToString() public string ValueToString()
{ {
if (type == atype.SEPARATOR) return ValToString(value);
return "";
else
{
switch (signed)
{
case asigned.HEX:
switch (type)
{
default:
case atype.BYTE:
return String.Format("{0:X2}", value);
case atype.WORD:
return String.Format("{0:X4}", value);
case atype.DWORD:
return String.Format("{0:X8}", value);
}
case asigned.SIGNED:
switch (type)
{
default:
case atype.BYTE:
return ((sbyte)value).ToString();
case atype.WORD:
return ((short)value).ToString();
case atype.DWORD:
return ((int)value).ToString();
}
default:
case asigned.UNSIGNED:
switch (type)
{
default:
case atype.BYTE:
return ((byte)value).ToString();
case atype.WORD:
return ((ushort)value).ToString();
case atype.DWORD:
return ((uint)value).ToString();
}
}
}
} }
public string PrevToString() public string PrevToString()
{ {
if (type == atype.SEPARATOR) return ValToString(prev);
return "";
else
{
switch (signed)
{
case asigned.HEX:
switch (type)
{
default:
case atype.BYTE:
return String.Format("{0:X2}", prev);
case atype.WORD:
return String.Format("{0:X4}", prev);
case atype.DWORD:
return String.Format("{0:X8}", prev);
} }
case asigned.SIGNED:
return ((sbyte)prev).ToString(); public string OriginalToString()
default: {
case asigned.UNSIGNED: return ValToString(original);
return prev.ToString();
} }
public string LastChangeToString()
{
return ValToString(lastchange);
} }
public string LastSearchToString()
{
return ValToString(lastsearch);
} }
private int CompareAddress(Watch Other) private int CompareAddress(Watch Other)
@ -351,6 +363,36 @@ namespace BizHawk.MultiClient
return 0; return 0;
} }
private int CompareOriginal(Watch Other)
{
if (this.original < Other.original)
return -1;
else if (this.original > Other.original)
return 1;
else
return 0;
}
private int CompareLastChange(Watch Other)
{
if (this.lastchange < Other.lastchange)
return -1;
else if (this.lastchange > Other.lastchange)
return 1;
else
return 0;
}
private int CompareLastSearch(Watch Other)
{
if (this.lastsearch < Other.lastsearch)
return -1;
else if (this.lastsearch > Other.lastsearch)
return 1;
else
return 0;
}
private int CompareChanges(Watch Other) private int CompareChanges(Watch Other)
{ {
if (this.changecount < Other.changecount) if (this.changecount < Other.changecount)
@ -373,7 +415,7 @@ namespace BizHawk.MultiClient
return this.notes.CompareTo(Other.notes); return this.notes.CompareTo(Other.notes);
} }
public int CompareTo(Watch Other, string parameter) public int CompareTo(Watch Other, string parameter, string previous)
{ {
int compare = 0; int compare = 0;
if (parameter == "Address") if (parameter == "Address")
@ -387,7 +429,19 @@ namespace BizHawk.MultiClient
compare = CompareChanges(Other); compare = CompareChanges(Other);
if (compare == 0) if (compare == 0)
{ {
switch (previous)
{
case "Last Search":
compare = CompareLastSearch(Other);
break;
case "Original":
compare = CompareOriginal(Other);
break;
case "Last Frame":
default:
compare = ComparePrev(Other); compare = ComparePrev(Other);
break;
}
if (compare == 0) if (compare == 0)
compare = CompareNotes(Other); compare = CompareNotes(Other);
} }
@ -406,7 +460,19 @@ namespace BizHawk.MultiClient
compare = CompareChanges(Other); compare = CompareChanges(Other);
if (compare == 0) if (compare == 0)
{ {
switch (previous)
{
case "Last Search":
compare = CompareLastSearch(Other);
break;
case "Original":
compare = CompareOriginal(Other);
break;
case "Last Frame":
default:
compare = ComparePrev(Other); compare = ComparePrev(Other);
break;
}
if (compare == 0) if (compare == 0)
compare = CompareNotes(Other); compare = CompareNotes(Other);
} }
@ -416,7 +482,19 @@ namespace BizHawk.MultiClient
else if (parameter == "Prev") else if (parameter == "Prev")
{ {
switch (previous)
{
case "Last Search":
compare = CompareLastSearch(Other);
break;
case "Original":
compare = CompareOriginal(Other);
break;
case "Last Frame":
default:
compare = ComparePrev(Other); compare = ComparePrev(Other);
break;
}
if (compare == 0) if (compare == 0)
{ {
compare = CompareAddress(Other); compare = CompareAddress(Other);
@ -444,7 +522,19 @@ namespace BizHawk.MultiClient
compare = CompareValue(Other); compare = CompareValue(Other);
if (compare == 0) if (compare == 0)
{ {
switch (previous)
{
case "Last Search":
compare = CompareLastSearch(Other);
break;
case "Original":
compare = CompareOriginal(Other);
break;
case "Last Frame":
default:
compare = ComparePrev(Other); compare = ComparePrev(Other);
break;
}
if (compare == 0) if (compare == 0)
compare = CompareNotes(Other); compare = CompareNotes(Other);
} }
@ -465,7 +555,19 @@ namespace BizHawk.MultiClient
{ {
compare = CompareChanges(Other); compare = CompareChanges(Other);
if (compare == 0) if (compare == 0)
switch (previous)
{
case "Last Search":
compare = CompareLastSearch(Other);
break;
case "Original":
compare = CompareOriginal(Other);
break;
case "Last Frame":
default:
compare = ComparePrev(Other); compare = ComparePrev(Other);
break;
}
} }
} }
} }