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); InteropEmu.DebugGetAbsoluteAddressAndType((UInt32)relativeAddress, ref info);
if(info.Address >= 0) { if(info.Address >= 0) {
CodeLabel existingLabel = LabelManager.GetLabel((UInt32)info.Address, info.Type); ctrlLabelList.EditLabel((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);
}
}
} }
} }
} }

View file

@ -34,6 +34,8 @@
this.colMemoryAddress = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colMemoryAddress = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuDelete = new System.Windows.Forms.ToolStripMenuItem(); 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.contextMenu.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -76,9 +78,11 @@
// contextMenu // contextMenu
// //
this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuAdd,
this.mnuEdit,
this.mnuDelete}); this.mnuDelete});
this.contextMenu.Name = "contextMenu"; 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); this.contextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.mnuActions_Opening);
// //
// mnuDelete // mnuDelete
@ -89,6 +93,21 @@
this.mnuDelete.Text = "Delete"; this.mnuDelete.Text = "Delete";
this.mnuDelete.Click += new System.EventHandler(this.mnuDelete_Click); 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 // ctrlLabelList
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -109,5 +128,7 @@
private System.Windows.Forms.ColumnHeader colMemoryAddress; private System.Windows.Forms.ColumnHeader colMemoryAddress;
private System.Windows.Forms.ContextMenuStrip contextMenu; private System.Windows.Forms.ContextMenuStrip contextMenu;
private System.Windows.Forms.ToolStripMenuItem mnuDelete; 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(); 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() public void UpdateLabelList()
{ {
Int32[] entryPoints = InteropEmu.DebugGetFunctionEntryPoints(); Int32[] entryPoints = InteropEmu.DebugGetFunctionEntryPoints();
@ -61,13 +78,31 @@ namespace Mesen.GUI.Debugger.Controls
private void mnuActions_Opening(object sender, CancelEventArgs e) private void mnuActions_Opening(object sender, CancelEventArgs e)
{ {
mnuDelete.Enabled = lstLabels.SelectedItems.Count > 0; mnuDelete.Enabled = lstLabels.SelectedItems.Count > 0;
mnuEdit.Enabled = lstLabels.SelectedItems.Count == 1;
} }
private void mnuDelete_Click(object sender, EventArgs e) private void mnuDelete_Click(object sender, EventArgs e)
{ {
foreach(ListViewItem item in lstLabels.SelectedItems) { for(int i = lstLabels.SelectedItems.Count - 1; i >= 0; i--) {
LabelManager.DeleteLabel(((CodeLabel)item.SubItems[1].Tag).Address, ((CodeLabel)item.SubItems[1].Tag).AddressType); 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,15 +64,17 @@ namespace Mesen.GUI.Debugger
return true; 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))) { if(_labels.ContainsKey(GetKey(address, type))) {
_reverseLookup.Remove(_labels[GetKey(address, type)].Label); _reverseLookup.Remove(_labels[GetKey(address, type)].Label);
} }
if(_labels.Remove(GetKey(address, type))) { if(_labels.Remove(GetKey(address, type))) {
InteropEmu.DebugSetLabel(address, type, string.Empty, string.Empty); InteropEmu.DebugSetLabel(address, type, string.Empty, string.Empty);
if(raiseEvent) {
OnLabelUpdated?.Invoke(null, null); OnLabelUpdated?.Invoke(null, null);
} }
} }
} }
} }
}

View file

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