BizHawk/BizHawk.Client.EmuHawk/tools/Watch/RamPoke.cs

110 lines
2.9 KiB
C#
Raw Normal View History

2016-07-21 16:22:43 +00:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class RamPoke : Form
{
// TODO: don't use textboxes as labels
private List<Watch> _watchList = new List<Watch>();
public Point InitialLocation { get; set; } = new Point(0, 0);
public RamPoke()
{
InitializeComponent();
}
public IToolForm ParentTool { get; set; }
2013-11-25 02:08:45 +00:00
public void SetWatch(IEnumerable<Watch> watches)
{
2013-11-25 02:08:45 +00:00
_watchList = watches.ToList();
}
private void UnSupportedConfiguration()
{
2016-07-21 16:22:43 +00:00
MessageBox.Show("RAM Poke does not support mixed types", "Unsupported Options", MessageBoxButtons.OK, MessageBoxIcon.Error);
Close();
}
private void RamPoke_Load(object sender, EventArgs e)
{
_watchList = _watchList.Where(x => !x.IsSeparator).ToList(); // Weed out separators just in case
if (_watchList.Count == 0)
{
ValueBox.Enabled = false;
return;
}
if (InitialLocation.X > 0 || InitialLocation.Y > 0)
{
Location = InitialLocation;
}
if (_watchList.Count > 1)
{
2015-03-22 16:55:34 +00:00
bool hasMixedSizes = _watchList.Select(x => x.Size).Distinct().Count() > 1;
bool hasMixedTypes = _watchList.Select(x => x.Type).Distinct().Count() > 1;
bool hasMixedEndian = _watchList.Select(x => x.BigEndian).Distinct().Count() > 1;
if (hasMixedSizes || hasMixedTypes || hasMixedEndian)
{
UnSupportedConfiguration();
}
}
AddressBox.SetHexProperties(_watchList[0].Domain.Size);
2019-03-18 14:06:37 +00:00
AddressBox.Text = (_watchList.Count > 10 ? _watchList.Take(10) : _watchList) // Hack in case an absurd amount of addresses are picked, this can be slow and create too long of a string
.Select(a => a.AddressString)
.Distinct()
.Aggregate((addrStr, nextStr) => $"{addrStr},{nextStr}");
2015-03-22 16:55:34 +00:00
ValueBox.ByteSize = _watchList[0].Size;
ValueBox.Type = _watchList[0].Type;
2017-05-10 11:45:23 +00:00
ValueHexLabel.Text = _watchList[0].Type == DisplayType.Hex ? "0x" : "";
ValueBox.Text = _watchList[0].ValueString.Replace(" ", "");
DomainLabel.Text = _watchList[0].Domain.Name;
SizeLabel.Text = _watchList[0].Size.ToString();
DisplayTypeLabel.Text = Watch.DisplayTypeToString(_watchList[0].Type);
BigEndianLabel.Text = _watchList[0].BigEndian ? "Big Endian" : "Little Endian";
SetTitle();
}
private void SetTitle()
{
2019-03-18 14:06:37 +00:00
Text = $"RAM Poke - {_watchList[0].Domain.Name}";
}
private void Cancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
private void Ok_Click(object sender, EventArgs e)
{
var success = _watchList.All(watch => watch.Poke(ValueBox.Text));
ParentTool?.UpdateValues();
if (success)
{
DialogResult = DialogResult.OK;
Close();
}
else
{
OutputLabel.Text = "An error occured when writing Value.";
}
}
}
}