Progress on new watch editor

This commit is contained in:
adelikat 2013-09-07 20:00:17 +00:00
parent e49c00ac36
commit ddb6adf593
6 changed files with 122 additions and 370 deletions

View File

@ -193,13 +193,13 @@
// NewWatchStripButton1
//
this.NewWatchStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.NewWatchStripButton1.Enabled = false;
this.NewWatchStripButton1.Image = global::BizHawk.MultiClient.Properties.Resources.FindHS;
this.NewWatchStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
this.NewWatchStripButton1.Name = "NewWatchStripButton1";
this.NewWatchStripButton1.Size = new System.Drawing.Size(23, 22);
this.NewWatchStripButton1.Text = "New Watch";
this.NewWatchStripButton1.ToolTipText = "New Watch";
this.NewWatchStripButton1.Click += new System.EventHandler(this.newWatchToolStripMenuItem_Click);
//
// EditWatchToolStripButton1
//
@ -445,12 +445,12 @@
//
// newWatchToolStripMenuItem
//
this.newWatchToolStripMenuItem.Enabled = false;
this.newWatchToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.FindHS;
this.newWatchToolStripMenuItem.Name = "newWatchToolStripMenuItem";
this.newWatchToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W)));
this.newWatchToolStripMenuItem.Size = new System.Drawing.Size(224, 22);
this.newWatchToolStripMenuItem.Text = "&New Watch";
this.newWatchToolStripMenuItem.Click += new System.EventHandler(this.newWatchToolStripMenuItem_Click);
//
// editWatchToolStripMenuItem
//

View File

@ -167,8 +167,7 @@ namespace BizHawk.MultiClient
private void UpdateWatchCount()
{
int count = Watches.WatchCount;
WatchCountLabel.Text = count.ToString() + (count == 1 ? " watch" : " watches");
WatchCountLabel.Text = Watches.WatchCount.ToString() + (Watches.WatchCount == 1 ? " watch" : " watches");
}
private void SetPlatformAndMemoryDomainLabel()
@ -214,6 +213,7 @@ namespace BizHawk.MultiClient
}
DisplayWatches();
UpdateWatchCount();
Watches.Changes = false;
}
}
@ -347,6 +347,30 @@ namespace BizHawk.MultiClient
DisplayWatches();
}
private Point GetPromptPoint()
{
return PointToScreen(new Point(WatchListView.Location.X, WatchListView.Location.Y));
}
private void AddNewWatch()
{
WatchEditor we = new WatchEditor()
{
InitialLocation = GetPromptPoint()
};
we.SetWatch(Watches.Domain);
Global.Sound.StopSound();
we.ShowDialog();
Global.Sound.StartSound();
if (we.DialogResult == DialogResult.OK)
{
Watches.Add(we.Watches[0]);
UpdateWatchCount();
DisplayWatches();
}
}
#region Winform Events
private void NewRamWatch_Load(object sender, EventArgs e)
@ -470,6 +494,11 @@ namespace BizHawk.MultiClient
memoryDomainsToolStripMenuItem.DropDownItems.AddRange(ToolHelpers.GenerateMemoryDomainMenuItems(SetMemoryDomain, Watches.Domain.Name));
}
private void newWatchToolStripMenuItem_Click(object sender, EventArgs e)
{
AddNewWatch();
}
private void removeWatchToolStripMenuItem_Click(object sender, EventArgs e)
{
ListView.SelectedIndexCollection indexes = WatchListView.SelectedIndices;

View File

@ -31,7 +31,7 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RamWatchNewWatch));
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.AddressBox = new HexTextBox();
this.AddressBox = new BizHawk.HexTextBox();
this.NotesBox = new System.Windows.Forms.TextBox();
this.DataTypeGroupBox = new System.Windows.Forms.GroupBox();
this.HexRadio = new System.Windows.Forms.RadioButton();
@ -245,6 +245,7 @@
//
// DomainComboBox
//
this.DomainComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.DomainComboBox.FormattingEnabled = true;
this.DomainComboBox.Location = new System.Drawing.Point(12, 230);
this.DomainComboBox.Name = "DomainComboBox";

View File

@ -693,6 +693,12 @@ namespace BizHawk.MultiClient
Changes = true;
}
public void AddRange(IList<Watch> watches)
{
_watchList.AddRange(watches);
Changes = true;
}
public void Remove(Watch watch)
{
_watchList.Remove(watch);

View File

@ -32,24 +32,10 @@
this.label2 = new System.Windows.Forms.Label();
this.AddressBox = new BizHawk.HexTextBox();
this.NotesBox = new System.Windows.Forms.TextBox();
this.DataTypeGroupBox = new System.Windows.Forms.GroupBox();
this.HexRadio = new System.Windows.Forms.RadioButton();
this.UnsignedRadio = new System.Windows.Forms.RadioButton();
this.SignedRadio = new System.Windows.Forms.RadioButton();
this.DataSizeBox = new System.Windows.Forms.GroupBox();
this.Byte4Radio = new System.Windows.Forms.RadioButton();
this.Byte2Radio = new System.Windows.Forms.RadioButton();
this.Byte1Radio = new System.Windows.Forms.RadioButton();
this.EndianBox = new System.Windows.Forms.GroupBox();
this.LittleEndianRadio = new System.Windows.Forms.RadioButton();
this.BigEndianRadio = new System.Windows.Forms.RadioButton();
this.OK = new System.Windows.Forms.Button();
this.Cancel = new System.Windows.Forms.Button();
this.label6 = new System.Windows.Forms.Label();
this.DomainComboBox = new System.Windows.Forms.ComboBox();
this.DataTypeGroupBox.SuspendLayout();
this.DataSizeBox.SuspendLayout();
this.EndianBox.SuspendLayout();
this.SuspendLayout();
//
// label1
@ -79,7 +65,6 @@
this.AddressBox.Size = new System.Drawing.Size(100, 20);
this.AddressBox.TabIndex = 2;
this.AddressBox.Text = "00000000";
this.AddressBox.Leave += new System.EventHandler(this.AddressBox_Leave);
//
// NotesBox
//
@ -89,127 +74,6 @@
this.NotesBox.Size = new System.Drawing.Size(100, 20);
this.NotesBox.TabIndex = 3;
//
// DataTypeGroupBox
//
this.DataTypeGroupBox.Controls.Add(this.HexRadio);
this.DataTypeGroupBox.Controls.Add(this.UnsignedRadio);
this.DataTypeGroupBox.Controls.Add(this.SignedRadio);
this.DataTypeGroupBox.Location = new System.Drawing.Point(12, 67);
this.DataTypeGroupBox.Name = "DataTypeGroupBox";
this.DataTypeGroupBox.Size = new System.Drawing.Size(95, 79);
this.DataTypeGroupBox.TabIndex = 4;
this.DataTypeGroupBox.TabStop = false;
this.DataTypeGroupBox.Text = "Data Type";
//
// HexRadio
//
this.HexRadio.AutoSize = true;
this.HexRadio.Location = new System.Drawing.Point(4, 51);
this.HexRadio.Name = "HexRadio";
this.HexRadio.Size = new System.Drawing.Size(86, 17);
this.HexRadio.TabIndex = 2;
this.HexRadio.Text = "Hexadecimal";
this.HexRadio.UseVisualStyleBackColor = true;
//
// UnsignedRadio
//
this.UnsignedRadio.AutoSize = true;
this.UnsignedRadio.Checked = true;
this.UnsignedRadio.Location = new System.Drawing.Point(4, 34);
this.UnsignedRadio.Name = "UnsignedRadio";
this.UnsignedRadio.Size = new System.Drawing.Size(70, 17);
this.UnsignedRadio.TabIndex = 1;
this.UnsignedRadio.TabStop = true;
this.UnsignedRadio.Text = "Unsigned";
this.UnsignedRadio.UseVisualStyleBackColor = true;
//
// SignedRadio
//
this.SignedRadio.AutoSize = true;
this.SignedRadio.Location = new System.Drawing.Point(4, 17);
this.SignedRadio.Name = "SignedRadio";
this.SignedRadio.Size = new System.Drawing.Size(58, 17);
this.SignedRadio.TabIndex = 0;
this.SignedRadio.Text = "Signed";
this.SignedRadio.UseVisualStyleBackColor = true;
//
// DataSizeBox
//
this.DataSizeBox.Controls.Add(this.Byte4Radio);
this.DataSizeBox.Controls.Add(this.Byte2Radio);
this.DataSizeBox.Controls.Add(this.Byte1Radio);
this.DataSizeBox.Location = new System.Drawing.Point(115, 67);
this.DataSizeBox.Name = "DataSizeBox";
this.DataSizeBox.Size = new System.Drawing.Size(83, 79);
this.DataSizeBox.TabIndex = 5;
this.DataSizeBox.TabStop = false;
this.DataSizeBox.Text = "Data Size:";
//
// Byte4Radio
//
this.Byte4Radio.AutoSize = true;
this.Byte4Radio.Location = new System.Drawing.Point(5, 51);
this.Byte4Radio.Name = "Byte4Radio";
this.Byte4Radio.Size = new System.Drawing.Size(60, 17);
this.Byte4Radio.TabIndex = 2;
this.Byte4Radio.Text = "4 Bytes";
this.Byte4Radio.UseVisualStyleBackColor = true;
//
// Byte2Radio
//
this.Byte2Radio.AutoSize = true;
this.Byte2Radio.Location = new System.Drawing.Point(5, 34);
this.Byte2Radio.Name = "Byte2Radio";
this.Byte2Radio.Size = new System.Drawing.Size(60, 17);
this.Byte2Radio.TabIndex = 1;
this.Byte2Radio.Text = "2 Bytes";
this.Byte2Radio.UseVisualStyleBackColor = true;
//
// Byte1Radio
//
this.Byte1Radio.AutoSize = true;
this.Byte1Radio.Checked = true;
this.Byte1Radio.Location = new System.Drawing.Point(5, 17);
this.Byte1Radio.Name = "Byte1Radio";
this.Byte1Radio.Size = new System.Drawing.Size(55, 17);
this.Byte1Radio.TabIndex = 0;
this.Byte1Radio.TabStop = true;
this.Byte1Radio.Text = "1 Byte";
this.Byte1Radio.UseVisualStyleBackColor = true;
//
// EndianBox
//
this.EndianBox.Controls.Add(this.LittleEndianRadio);
this.EndianBox.Controls.Add(this.BigEndianRadio);
this.EndianBox.Location = new System.Drawing.Point(12, 152);
this.EndianBox.Name = "EndianBox";
this.EndianBox.Size = new System.Drawing.Size(117, 55);
this.EndianBox.TabIndex = 6;
this.EndianBox.TabStop = false;
this.EndianBox.Text = "Endian";
//
// LittleEndianRadio
//
this.LittleEndianRadio.AutoSize = true;
this.LittleEndianRadio.Location = new System.Drawing.Point(4, 35);
this.LittleEndianRadio.Name = "LittleEndianRadio";
this.LittleEndianRadio.Size = new System.Drawing.Size(83, 17);
this.LittleEndianRadio.TabIndex = 1;
this.LittleEndianRadio.Text = "Little Endian";
this.LittleEndianRadio.UseVisualStyleBackColor = true;
//
// BigEndianRadio
//
this.BigEndianRadio.AutoSize = true;
this.BigEndianRadio.Checked = true;
this.BigEndianRadio.Location = new System.Drawing.Point(4, 18);
this.BigEndianRadio.Name = "BigEndianRadio";
this.BigEndianRadio.Size = new System.Drawing.Size(76, 17);
this.BigEndianRadio.TabIndex = 0;
this.BigEndianRadio.TabStop = true;
this.BigEndianRadio.Text = "Big Endian";
this.BigEndianRadio.UseVisualStyleBackColor = true;
//
// OK
//
this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@ -244,6 +108,7 @@
//
// DomainComboBox
//
this.DomainComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.DomainComboBox.FormattingEnabled = true;
this.DomainComboBox.Location = new System.Drawing.Point(12, 230);
this.DomainComboBox.Name = "DomainComboBox";
@ -262,9 +127,6 @@
this.Controls.Add(this.DomainComboBox);
this.Controls.Add(this.Cancel);
this.Controls.Add(this.OK);
this.Controls.Add(this.EndianBox);
this.Controls.Add(this.DataSizeBox);
this.Controls.Add(this.DataTypeGroupBox);
this.Controls.Add(this.NotesBox);
this.Controls.Add(this.AddressBox);
this.Controls.Add(this.label2);
@ -275,12 +137,6 @@
this.Name = "WatchEditor";
this.Text = "New Watch";
this.Load += new System.EventHandler(this.RamWatchNewWatch_Load);
this.DataTypeGroupBox.ResumeLayout(false);
this.DataTypeGroupBox.PerformLayout();
this.DataSizeBox.ResumeLayout(false);
this.DataSizeBox.PerformLayout();
this.EndianBox.ResumeLayout(false);
this.EndianBox.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@ -291,18 +147,7 @@
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private HexTextBox AddressBox;
private System.Windows.Forms.TextBox NotesBox;
private System.Windows.Forms.GroupBox DataTypeGroupBox;
private System.Windows.Forms.RadioButton SignedRadio;
private System.Windows.Forms.RadioButton UnsignedRadio;
private System.Windows.Forms.RadioButton HexRadio;
private System.Windows.Forms.GroupBox DataSizeBox;
private System.Windows.Forms.RadioButton Byte1Radio;
private System.Windows.Forms.RadioButton Byte2Radio;
private System.Windows.Forms.RadioButton Byte4Radio;
private System.Windows.Forms.GroupBox EndianBox;
private System.Windows.Forms.RadioButton BigEndianRadio;
private System.Windows.Forms.RadioButton LittleEndianRadio;
private System.Windows.Forms.TextBox NotesBox;
private System.Windows.Forms.Button OK;
private System.Windows.Forms.Button Cancel;
private System.Windows.Forms.Label label6;

View File

@ -1,246 +1,117 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
namespace BizHawk.MultiClient
{
public partial class WatchEditor : Form
{
public Watch_Legacy Watch = new Watch_Legacy();
public bool SelectionWasMade = false;
public Point location = new Point();
public enum Mode { New, Duplicate, Edit };
private List<Watch> _watchList = new List<Watch>();
private Mode _mode = Mode.New;
private bool _loading = true;
private string _addressFormatStr = "{0:X2}";
private bool DoNotResetAddress;
public Mode EditorMode { get { return _mode; } }
public List<Watch> Watches { get { return _watchList; } }
public Point InitialLocation = new Point(0, 0);
public WatchEditor()
{
InitializeComponent();
}
public void SetWatch(Watch_Legacy watch, string message = "New Watch")
private void RamWatchNewWatch_Load(object sender, EventArgs e)
{
DoNotResetAddress = true; //Hack for the drop down event changing when initializing the drop down
Watch = new Watch_Legacy(watch);
Text = message;
if (InitialLocation.X > 0 || InitialLocation.Y > 0)
{
Location = InitialLocation;
}
_loading = false;
SetAddressBoxProperties();
}
NotesBox.Text = watch.Notes;
setTypeRadio();
setSignedRadio();
setEndianBox();
setDomainSelection();
setAddressBox();
public void SetWatch(MemoryDomain domain = null, List<Watch> watches = null, Mode mode = Mode.New)
{
if (watches != null)
{
_watchList.AddRange(watches);
}
SetTitle();
DoMemoryDomainDropdown(domain ?? Global.Emulator.MainMemory);
}
private void SetTitle()
{
switch(_mode)
{
default:
case WatchEditor.Mode.New:
Text = "New Watch";
break;
case WatchEditor.Mode.Edit:
Text = "Edit Watch" + (_watchList.Count > 1 ? "es" : "");
break;
case WatchEditor.Mode.Duplicate:
Text = "Duplicate Watch";
break;
}
}
private void DoMemoryDomainDropdown(MemoryDomain startDomain)
{
DomainComboBox.Items.Clear();
if (Global.Emulator.MemoryDomains.Count > 0)
{
foreach (MemoryDomain domain in Global.Emulator.MemoryDomains)
{
var result = DomainComboBox.Items.Add(domain.ToString());
if (domain.Name == startDomain.Name)
{
DomainComboBox.SelectedIndex = result;
}
}
}
}
private void SetAddressBoxProperties()
{
if (!_loading)
{
var domain = Global.Emulator.MemoryDomains.FirstOrDefault(d => d.Name == DomainComboBox.SelectedItem.ToString());
if (domain != null)
{
AddressBox.MaxLength = IntHelpers.GetNumDigits(domain.Size - 1);
_addressFormatStr = "{0:X" + AddressBox.MaxLength.ToString() + "}";
AddressBox.Text = String.Format(_addressFormatStr, 0);
}
}
}
#region Events
private void RamWatchNewWatch_Load(object sender, EventArgs e)
{
if (location.X > 0 && location.Y > 0)
{
Location = location;
}
populateMemoryDomainComboBox();
DoNotResetAddress = false;
}
private void Cancel_Click(object sender, EventArgs e)
{
SelectionWasMade = false;
DialogResult = DialogResult.Cancel;
Close();
}
private void OK_Click(object sender, EventArgs e)
{
//Put user settings in the watch file
SelectionWasMade = true;
if (InputValidate.IsValidHexNumber(AddressBox.Text))
{
Watch.Address = int.Parse(AddressBox.Text, NumberStyles.HexNumber);
}
else
{
MessageBox.Show("Not a valid address (enter a valid Hex number)", "Invalid Address", MessageBoxButtons.OK, MessageBoxIcon.Error);
AddressBox.Focus();
AddressBox.SelectAll();
DialogResult = DialogResult.OK;
return;
}
if (SignedRadio.Checked)
{
Watch.Signed = Watch_Legacy.DISPTYPE.SIGNED;
}
else if (UnsignedRadio.Checked)
{
Watch.Signed = Watch_Legacy.DISPTYPE.UNSIGNED;
}
else if (HexRadio.Checked)
{
Watch.Signed = Watch_Legacy.DISPTYPE.HEX;
}
if (Byte1Radio.Checked)
{
Watch.Type = Watch_Legacy.TYPE.BYTE;
}
else if (Byte2Radio.Checked)
{
Watch.Type = Watch_Legacy.TYPE.WORD;
}
else if (Byte4Radio.Checked)
{
Watch.Type = Watch_Legacy.TYPE.DWORD;
}
if (BigEndianRadio.Checked)
{
Watch.BigEndian = true;
}
else if (LittleEndianRadio.Checked)
{
Watch.BigEndian = false;
}
Watch.Domain = Global.Emulator.MemoryDomains[DomainComboBox.SelectedIndex];
Watch.Notes = NotesBox.Text;
//TODO
Close();
}
private void AddressBox_Leave(object sender, EventArgs e)
{
AddressBox.Text = AddressBox.Text.Replace(" ", "");
if (!InputValidate.IsValidHexNumber(AddressBox.Text))
{
AddressBox.Focus();
AddressBox.SelectAll();
ToolTip t = new ToolTip();
t.Show("Must be a valid hexadecimal vaue", AddressBox, 5000);
}
else
{
try
{
Watch.Address = int.Parse(AddressBox.Text, NumberStyles.HexNumber);
AddressBox.Text = String.Format("{0:X" + getNumDigits(Watch.Domain.Size - 1) + "}", Watch.Address);
}
catch
{
//Do nothing
}
}
}
private void DomainComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (!DoNotResetAddress)
{
Watch.Domain = Global.Emulator.MemoryDomains[DomainComboBox.SelectedIndex];
Watch.Address = 0;
Watch.Value = 0;
setAddressBox();
AddressBox.MaxLength = getNumDigits(Watch.Domain.Size);
}
}
#endregion
#region Helpers
private void setTypeRadio()
{
switch (Watch.Type)
{
case Watch_Legacy.TYPE.BYTE:
Byte1Radio.Checked = true;
break;
case Watch_Legacy.TYPE.WORD:
Byte2Radio.Checked = true;
break;
case Watch_Legacy.TYPE.DWORD:
Byte4Radio.Checked = true;
break;
default:
break;
}
}
private void setEndianBox()
{
if (Watch.BigEndian == true)
{
BigEndianRadio.Checked = true;
}
else
{
LittleEndianRadio.Checked = true;
}
}
private void setDomainSelection()
{
//Counts should always be the same, but just in case, let's check
int max;
if (Global.Emulator.MemoryDomains.Count < DomainComboBox.Items.Count)
{
max = Global.Emulator.MemoryDomains.Count;
}
else
{
max = DomainComboBox.Items.Count;
}
for (int i = 0; i < max; i++)
{
if (Watch.Domain.ToString() == DomainComboBox.Items[i].ToString())
{
DomainComboBox.SelectedIndex = i;
}
}
}
private void populateMemoryDomainComboBox()
{
DomainComboBox.Items.Clear();
if (Global.Emulator.MemoryDomains.Count > 0)
{
foreach (MemoryDomain t in Global.Emulator.MemoryDomains)
{
DomainComboBox.Items.Add(t.ToString());
}
}
setDomainSelection();
}
private void setAddressBox()
{
AddressBox.Text = String.Format("{0:X" + getNumDigits(Watch.Domain.Size - 1) + "}", Watch.Address);
}
private void setSignedRadio()
{
switch (Watch.Signed)
{
case Watch_Legacy.DISPTYPE.SIGNED:
SignedRadio.Checked = true;
break;
case Watch_Legacy.DISPTYPE.UNSIGNED:
UnsignedRadio.Checked = true;
break;
case Watch_Legacy.DISPTYPE.HEX:
HexRadio.Checked = true;
break;
}
}
private int getNumDigits(Int32 i)
{
if (i < 0x10000) return 4;
if (i < 0x1000000) return 6;
if (i < 0x10000000) return 7;
else return 8;
SetAddressBoxProperties();
}
#endregion