Debugger: Added add/edit actions to the label list

This commit is contained in:
Souryo 2016-11-22 23:07:28 -05:00
parent 512e37c6af
commit 24d1ae096f
5 changed files with 75 additions and 23 deletions

View file

@ -247,17 +247,7 @@ namespace Mesen.GUI.Debugger
InteropEmu.DebugGetAbsoluteAddressAndType((UInt32)relativeAddress, ref info);
if(info.Address >= 0) {
CodeLabel existingLabel = LabelManager.GetLabel((UInt32)info.Address, info.Type);
CodeLabel newLabel = new CodeLabel() { Address = (UInt32)info.Address, AddressType = info.Type, Label = existingLabel?.Label, Comment = existingLabel?.Comment };
frmEditLabel frm = new frmEditLabel(newLabel);
if(frm.ShowDialog() == DialogResult.OK) {
if(string.IsNullOrWhiteSpace(newLabel.Label) && string.IsNullOrWhiteSpace(newLabel.Comment)) {
LabelManager.DeleteLabel(newLabel.Address, newLabel.AddressType);
} else {
LabelManager.SetLabel(newLabel.Address, newLabel.AddressType, newLabel.Label, newLabel.Comment);
}
}
ctrlLabelList.EditLabel((UInt32)info.Address, info.Type);
}
}
}

View file

@ -34,6 +34,8 @@
this.colMemoryAddress = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuDelete = new System.Windows.Forms.ToolStripMenuItem();
this.mnuAdd = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEdit = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenu.SuspendLayout();
this.SuspendLayout();
//
@ -76,9 +78,11 @@
// contextMenu
//
this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuAdd,
this.mnuEdit,
this.mnuDelete});
this.contextMenu.Name = "contextMenu";
this.contextMenu.Size = new System.Drawing.Size(153, 48);
this.contextMenu.Size = new System.Drawing.Size(153, 92);
this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.mnuActions_Opening);
//
// mnuDelete
@ -89,6 +93,21 @@
this.mnuDelete.Text = "Delete";
this.mnuDelete.Click += new System.EventHandler(this.mnuDelete_Click);
//
// mnuAdd
//
this.mnuAdd.Name = "mnuAdd";
this.mnuAdd.ShortcutKeys = System.Windows.Forms.Keys.Insert;
this.mnuAdd.Size = new System.Drawing.Size(152, 22);
this.mnuAdd.Text = "Add";
this.mnuAdd.Click += new System.EventHandler(this.mnuAdd_Click);
//
// mnuEdit
//
this.mnuEdit.Name = "mnuEdit";
this.mnuEdit.Size = new System.Drawing.Size(152, 22);
this.mnuEdit.Text = "Edit";
this.mnuEdit.Click += new System.EventHandler(this.mnuEdit_Click);
//
// ctrlLabelList
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -109,5 +128,7 @@
private System.Windows.Forms.ColumnHeader colMemoryAddress;
private System.Windows.Forms.ContextMenuStrip contextMenu;
private System.Windows.Forms.ToolStripMenuItem mnuDelete;
private System.Windows.Forms.ToolStripMenuItem mnuAdd;
private System.Windows.Forms.ToolStripMenuItem mnuEdit;
}
}

View file

@ -19,6 +19,23 @@ namespace Mesen.GUI.Debugger.Controls
InitializeComponent();
}
public static void EditLabel(UInt32 address, AddressType type)
{
CodeLabel existingLabel = LabelManager.GetLabel(address, type);
CodeLabel newLabel = new CodeLabel() { Address = address, AddressType = type, Label = existingLabel?.Label, Comment = existingLabel?.Comment };
frmEditLabel frm = new frmEditLabel(newLabel, existingLabel);
if(frm.ShowDialog() == DialogResult.OK) {
bool empty = string.IsNullOrWhiteSpace(newLabel.Label) && string.IsNullOrWhiteSpace(newLabel.Comment);
if(existingLabel != null) {
LabelManager.DeleteLabel(existingLabel.Address, existingLabel.AddressType, empty);
}
if(!empty) {
LabelManager.SetLabel(newLabel.Address, newLabel.AddressType, newLabel.Label, newLabel.Comment);
}
}
}
public void UpdateLabelList()
{
Int32[] entryPoints = InteropEmu.DebugGetFunctionEntryPoints();
@ -61,13 +78,31 @@ namespace Mesen.GUI.Debugger.Controls
private void mnuActions_Opening(object sender, CancelEventArgs e)
{
mnuDelete.Enabled = lstLabels.SelectedItems.Count > 0;
mnuEdit.Enabled = lstLabels.SelectedItems.Count == 1;
}
private void mnuDelete_Click(object sender, EventArgs e)
{
foreach(ListViewItem item in lstLabels.SelectedItems) {
LabelManager.DeleteLabel(((CodeLabel)item.SubItems[1].Tag).Address, ((CodeLabel)item.SubItems[1].Tag).AddressType);
for(int i = lstLabels.SelectedItems.Count - 1; i >= 0; i--) {
CodeLabel label = (CodeLabel)lstLabels.SelectedItems[i].SubItems[1].Tag;
LabelManager.DeleteLabel(label.Address, label.AddressType, i == 0);
}
}
private void mnuAdd_Click(object sender, EventArgs e)
{
CodeLabel newLabel = new CodeLabel() { Address = 0, AddressType = AddressType.InternalRam, Label = "", Comment = "" };
frmEditLabel frm = new frmEditLabel(newLabel);
if(frm.ShowDialog() == DialogResult.OK) {
LabelManager.SetLabel(newLabel.Address, newLabel.AddressType, newLabel.Label, newLabel.Comment);
}
}
private void mnuEdit_Click(object sender, EventArgs e)
{
CodeLabel label = (CodeLabel)lstLabels.SelectedItems[0].SubItems[1].Tag;
EditLabel(label.Address, label.AddressType);
}
}
}

View file

@ -64,14 +64,16 @@ namespace Mesen.GUI.Debugger
return true;
}
public static void DeleteLabel(UInt32 address, AddressType type)
public static void DeleteLabel(UInt32 address, AddressType type, bool raiseEvent)
{
if(_labels.ContainsKey(GetKey(address, type))) {
_reverseLookup.Remove(_labels[GetKey(address, type)].Label);
}
if(_labels.Remove(GetKey(address, type))) {
InteropEmu.DebugSetLabel(address, type, string.Empty, string.Empty);
OnLabelUpdated?.Invoke(null, null);
if(raiseEvent) {
OnLabelUpdated?.Invoke(null, null);
}
}
}
}

View file

@ -14,15 +14,13 @@ namespace Mesen.GUI.Debugger
{
public partial class frmEditLabel : BaseConfigForm
{
private UInt32 _originalAddress;
private AddressType _originalMemoryType;
private CodeLabel _originalLabel;
public frmEditLabel(CodeLabel label)
public frmEditLabel(CodeLabel label, CodeLabel originalLabel = null)
{
InitializeComponent();
_originalAddress = label.Address;
_originalMemoryType = label.AddressType;
_originalLabel = originalLabel;
Entity = label;
@ -40,9 +38,15 @@ namespace Mesen.GUI.Debugger
protected override bool ValidateInput()
{
CodeLabel existingLabel = LabelManager.GetLabel(txtLabel.Text);
UpdateObject();
return (existingLabel == null || (existingLabel.Address == _originalAddress && existingLabel.AddressType == _originalMemoryType))
CodeLabel sameLabel = LabelManager.GetLabel(txtLabel.Text);
CodeLabel sameAddress = LabelManager.GetLabel(((CodeLabel)Entity).Address, ((CodeLabel)Entity).AddressType);
return
(sameLabel == null || sameLabel == _originalLabel)
&& (sameAddress == null || sameAddress == _originalLabel)
&& (_originalLabel != null || txtLabel.Text.Length > 0 || txtComment.Text.Length > 0)
&& !txtComment.Text.Contains('\x1') && !txtComment.Text.Contains('\x2')
&& (txtLabel.Text.Length == 0 || Regex.IsMatch(txtLabel.Text, "^[_a-zA-Z]+[_a-zA-Z0-9]*"));
}