Add deduper utility to RAM Watch

This commit is contained in:
YoshiRulz 2023-06-13 23:40:20 +10:00
parent 25ad59d895
commit 4ee7e4cad7
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
1 changed files with 40 additions and 0 deletions

View File

@ -12,7 +12,9 @@ using BizHawk.Emulation.Common;
using BizHawk.Client.Common;
using BizHawk.Client.EmuHawk.Properties;
using BizHawk.Client.EmuHawk.ToolExtensions;
using BizHawk.Common;
using BizHawk.Common.CollectionExtensions;
using BizHawk.WinForms.Controls;
namespace BizHawk.Client.EmuHawk
{
@ -86,6 +88,44 @@ namespace BizHawk.Client.EmuHawk
MoveBottomMenuItem.Image = Resources.MoveBottom;
Icon = ToolIcon;
ToolStripMenuItemEx deduperMenuItem = new() { Text = "Purge Duplicate Watches" };
deduperMenuItem.Click += (_, _) =>
{
if (!this.ModalMessageBox2(
caption: "Purge duplicates?",
text: "This will go through each watch starting from the top,\n"
+ "removing it if its (domain & addr & size) has been seen before.\n"
+ "Neither the endianness nor display type are considered.\n"
+ "Overlapping watches also aren't considered.",
useOKCancel: true))
{
return;
}
var seen = new SortedList<(string Domain, long Addr)>[] { null, new(), new(), null, new() };
//TODO check if it's faster to build up a toRemove list and then batch Remove (by ref) at end
var i = 0;
Watch w;
while (i < _watches.Count)
{
w = _watches[i];
if (w.IsSeparator)
{
i++;
continue;
}
var l = seen[(int) w.Size];
var tuple = (w.Domain.Name, w.Address);
if (l.Contains(tuple))
{
_watches.RemoveAt(i);
continue;
}
l.Add(tuple);
i++;
}
};
WatchesSubMenu.DropDownItems.Insert(11, deduperMenuItem);
Settings = new RamWatchSettings();
WatchListView.QueryItemText += WatchListView_QueryItemText;