diff --git a/GUI.NET/Debugger/Controls/ctrlDebuggerCode.cs b/GUI.NET/Debugger/Controls/ctrlDebuggerCode.cs index d04fab19..3ecb43d1 100644 --- a/GUI.NET/Debugger/Controls/ctrlDebuggerCode.cs +++ b/GUI.NET/Debugger/Controls/ctrlDebuggerCode.cs @@ -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); } } } diff --git a/GUI.NET/Debugger/Controls/ctrlLabelList.Designer.cs b/GUI.NET/Debugger/Controls/ctrlLabelList.Designer.cs index db3bf590..cdf3a79b 100644 --- a/GUI.NET/Debugger/Controls/ctrlLabelList.Designer.cs +++ b/GUI.NET/Debugger/Controls/ctrlLabelList.Designer.cs @@ -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; } } diff --git a/GUI.NET/Debugger/Controls/ctrlLabelList.cs b/GUI.NET/Debugger/Controls/ctrlLabelList.cs index a196855f..9ea323fd 100644 --- a/GUI.NET/Debugger/Controls/ctrlLabelList.cs +++ b/GUI.NET/Debugger/Controls/ctrlLabelList.cs @@ -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); + } } } diff --git a/GUI.NET/Debugger/LabelManager.cs b/GUI.NET/Debugger/LabelManager.cs index 340b4b42..0cf75696 100644 --- a/GUI.NET/Debugger/LabelManager.cs +++ b/GUI.NET/Debugger/LabelManager.cs @@ -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); + } } } } diff --git a/GUI.NET/Debugger/frmEditLabel.cs b/GUI.NET/Debugger/frmEditLabel.cs index 9b6c5a82..ddd2577a 100644 --- a/GUI.NET/Debugger/frmEditLabel.cs +++ b/GUI.NET/Debugger/frmEditLabel.cs @@ -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]*")); }