diff --git a/BizHawk.MultiClient/BizHawk.MultiClient.csproj b/BizHawk.MultiClient/BizHawk.MultiClient.csproj index 3c8ed8d5d3..55b131de77 100644 --- a/BizHawk.MultiClient/BizHawk.MultiClient.csproj +++ b/BizHawk.MultiClient/BizHawk.MultiClient.csproj @@ -690,6 +690,7 @@ WatchEditor.cs + diff --git a/BizHawk.MultiClient/BizHawk.MultiClient_v4.5.csproj b/BizHawk.MultiClient/BizHawk.MultiClient_v4.5.csproj index 4f45a4c13b..d522d75677 100644 --- a/BizHawk.MultiClient/BizHawk.MultiClient_v4.5.csproj +++ b/BizHawk.MultiClient/BizHawk.MultiClient_v4.5.csproj @@ -692,6 +692,7 @@ WatchEditor.cs + diff --git a/BizHawk.MultiClient/tools/Watch/NewRamSearch.Designer.cs b/BizHawk.MultiClient/tools/Watch/NewRamSearch.Designer.cs index 750cc6d498..62f8909bd1 100644 --- a/BizHawk.MultiClient/tools/Watch/NewRamSearch.Designer.cs +++ b/BizHawk.MultiClient/tools/Watch/NewRamSearch.Designer.cs @@ -84,8 +84,8 @@ this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.newSearchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.UndoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RedoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.CopyValueToPrevMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ClearChangeCountsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.RemoveMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -94,7 +94,7 @@ this.PokeAddressMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.FreezeAddressMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.clearUndoHistoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ClearUndoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.PreviewModeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.AutoSearchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -142,6 +142,9 @@ this.GreaterThanRadio = new System.Windows.Forms.RadioButton(); this.LessThanRadio = new System.Windows.Forms.RadioButton(); this.DiffColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.UndoToolBarButton = new System.Windows.Forms.ToolStripButton(); + this.RedoToolBarItem = new System.Windows.Forms.ToolStripButton(); this.SpecificValueBox = new BizHawk.MultiClient.WatchValueBox(); SearchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStrip1.SuspendLayout(); @@ -590,8 +593,8 @@ this.newSearchToolStripMenuItem, this.toolStripSeparator7, SearchMenuItem, - this.undoToolStripMenuItem, - this.redoToolStripMenuItem, + this.UndoMenuItem, + this.RedoMenuItem, this.CopyValueToPrevMenuItem, this.ClearChangeCountsMenuItem, this.RemoveMenuItem, @@ -600,7 +603,7 @@ this.PokeAddressMenuItem, this.FreezeAddressMenuItem, this.toolStripSeparator13, - this.clearUndoHistoryToolStripMenuItem}); + this.ClearUndoMenuItem}); this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20); this.searchToolStripMenuItem.Text = "&Search"; @@ -619,24 +622,24 @@ this.toolStripSeparator7.Name = "toolStripSeparator7"; this.toolStripSeparator7.Size = new System.Drawing.Size(212, 6); // - // undoToolStripMenuItem + // UndoMenuItem // - this.undoToolStripMenuItem.Enabled = false; - this.undoToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.undo; - this.undoToolStripMenuItem.Name = "undoToolStripMenuItem"; - this.undoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); - this.undoToolStripMenuItem.Size = new System.Drawing.Size(215, 22); - this.undoToolStripMenuItem.Text = "&Undo"; + this.UndoMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.undo; + this.UndoMenuItem.Name = "UndoMenuItem"; + this.UndoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); + this.UndoMenuItem.Size = new System.Drawing.Size(215, 22); + this.UndoMenuItem.Text = "&Undo"; + this.UndoMenuItem.Click += new System.EventHandler(this.UndoMenuItem_Click); // - // redoToolStripMenuItem + // RedoMenuItem // - this.redoToolStripMenuItem.Enabled = false; - this.redoToolStripMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.redo; - this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; - this.redoToolStripMenuItem.ShortcutKeyDisplayString = ""; - this.redoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); - this.redoToolStripMenuItem.Size = new System.Drawing.Size(215, 22); - this.redoToolStripMenuItem.Text = "&Redo"; + this.RedoMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.redo; + this.RedoMenuItem.Name = "RedoMenuItem"; + this.RedoMenuItem.ShortcutKeyDisplayString = ""; + this.RedoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.RedoMenuItem.Size = new System.Drawing.Size(215, 22); + this.RedoMenuItem.Text = "&Redo"; + this.RedoMenuItem.Click += new System.EventHandler(this.RedoMenuItem_Click); // // CopyValueToPrevMenuItem // @@ -699,12 +702,12 @@ this.toolStripSeparator13.Name = "toolStripSeparator13"; this.toolStripSeparator13.Size = new System.Drawing.Size(212, 6); // - // clearUndoHistoryToolStripMenuItem + // ClearUndoMenuItem // - this.clearUndoHistoryToolStripMenuItem.Enabled = false; - this.clearUndoHistoryToolStripMenuItem.Name = "clearUndoHistoryToolStripMenuItem"; - this.clearUndoHistoryToolStripMenuItem.Size = new System.Drawing.Size(215, 22); - this.clearUndoHistoryToolStripMenuItem.Text = "Clear Undo History"; + this.ClearUndoMenuItem.Name = "ClearUndoMenuItem"; + this.ClearUndoMenuItem.Size = new System.Drawing.Size(215, 22); + this.ClearUndoMenuItem.Text = "Clear Undo History"; + this.ClearUndoMenuItem.Click += new System.EventHandler(this.ClearUndoMenuItem_Click); // // optionsToolStripMenuItem // @@ -948,7 +951,10 @@ this.RemoveToolBarItem, this.AddToRamWatchToolBarItem, this.PokeAddressToolBarItem, - this.FreezeAddressToolBarItem}); + this.FreezeAddressToolBarItem, + this.toolStripSeparator12, + this.UndoToolBarButton, + this.RedoToolBarItem}); this.toolStrip1.Location = new System.Drawing.Point(0, 24); this.toolStrip1.Name = "toolStrip1"; this.toolStrip1.Size = new System.Drawing.Size(470, 25); @@ -1168,6 +1174,33 @@ // this.DiffColumn.Text = "Diff"; // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(6, 25); + // + // UndoToolBarButton + // + this.UndoToolBarButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.UndoToolBarButton.Enabled = false; + this.UndoToolBarButton.Image = global::BizHawk.MultiClient.Properties.Resources.undo; + this.UndoToolBarButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.UndoToolBarButton.Name = "UndoToolBarButton"; + this.UndoToolBarButton.Size = new System.Drawing.Size(23, 22); + this.UndoToolBarButton.Text = "Undo Search"; + this.UndoToolBarButton.Click += new System.EventHandler(this.UndoMenuItem_Click); + // + // RedoToolBarItem + // + this.RedoToolBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.RedoToolBarItem.Enabled = false; + this.RedoToolBarItem.Image = global::BizHawk.MultiClient.Properties.Resources.redo; + this.RedoToolBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.RedoToolBarItem.Name = "RedoToolBarItem"; + this.RedoToolBarItem.Size = new System.Drawing.Size(23, 22); + this.RedoToolBarItem.Text = "Redo"; + this.RedoToolBarItem.Click += new System.EventHandler(this.RedoMenuItem_Click); + // // SpecificValueBox // this.SpecificValueBox.ByteSize = BizHawk.MultiClient.Watch.WatchSize.Byte; @@ -1239,7 +1272,7 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem ClearChangeCountsMenuItem; - private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem UndoMenuItem; private System.Windows.Forms.ToolStripMenuItem RemoveMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; private System.Windows.Forms.ToolStripMenuItem AddToRamWatchMenuItem; @@ -1258,7 +1291,7 @@ private System.Windows.Forms.ToolStripMenuItem FreezeContextMenuItem; private MenuStripEx menuStrip1; private System.Windows.Forms.ToolTip toolTip1; - private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem RedoMenuItem; private System.Windows.Forms.ToolStripMenuItem ViewInHexEditorContextMenuItem; private System.Windows.Forms.ToolStripMenuItem AutoloadDialogMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; @@ -1266,7 +1299,7 @@ private System.Windows.Forms.ToolStripSeparator ContextMenuSeparator3; private System.Windows.Forms.ToolStripMenuItem AlwaysOnTopMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; - private System.Windows.Forms.ToolStripMenuItem clearUndoHistoryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ClearUndoMenuItem; private System.Windows.Forms.ToolStripMenuItem useUndoHistoryToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator ContextMenuSeparator2; private System.Windows.Forms.ToolStripMenuItem ClearPreviewContextMenuItem; @@ -1329,5 +1362,8 @@ private System.Windows.Forms.ToolStripMenuItem AutoSearchMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; private System.Windows.Forms.ColumnHeader DiffColumn; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripButton UndoToolBarButton; + private System.Windows.Forms.ToolStripButton RedoToolBarItem; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/tools/Watch/NewRamSearch.cs b/BizHawk.MultiClient/tools/Watch/NewRamSearch.cs index c3164d2225..664106b704 100644 --- a/BizHawk.MultiClient/tools/Watch/NewRamSearch.cs +++ b/BizHawk.MultiClient/tools/Watch/NewRamSearch.cs @@ -216,6 +216,7 @@ namespace BizHawk.MultiClient DoSearchToolButton.Enabled = CopyValueToPrevToolBarItem.Enabled = Searches.Count > 0; + UpdateUndoToolBarButtons(); } private void DoSearch() @@ -225,7 +226,6 @@ namespace BizHawk.MultiClient WatchListView.ItemCount = Searches.Count; SetRemovedMessage(removed); ToggleSearchDependentToolBarItems(); - } private List SelectedIndices @@ -499,6 +499,12 @@ namespace BizHawk.MultiClient SetTotal(); } + private void UpdateUndoToolBarButtons() + { + UndoToolBarButton.Enabled = Searches.CanUndo; + RedoToolBarItem.Enabled = Searches.CanRedo; + } + #endregion #region Winform Events @@ -718,6 +724,12 @@ namespace BizHawk.MultiClient PokeAddressMenuItem.Enabled = FreezeAddressMenuItem.Enabled = SelectedIndices.Any(); + + UndoMenuItem.Enabled = + ClearUndoMenuItem.Enabled = + Searches.CanUndo; + + RedoMenuItem.Enabled = Searches.CanRedo; } private void NewSearchMenuMenuItem_Click(object sender, EventArgs e) @@ -730,6 +742,24 @@ namespace BizHawk.MultiClient DoSearch(); } + private void UndoMenuItem_Click(object sender, EventArgs e) + { + if (Searches.CanUndo) + { + Searches.Undo(); + UpdateUndoToolBarButtons(); + } + } + + private void RedoMenuItem_Click(object sender, EventArgs e) + { + if (Searches.CanRedo) + { + Searches.Redo(); + UpdateUndoToolBarButtons(); + } + } + private void CopyValueToPrevMenuItem_Click(object sender, EventArgs e) { Searches.SetPrevousToCurrent(); @@ -762,6 +792,12 @@ namespace BizHawk.MultiClient FreezeAddress(); } + private void ClearUndoMenuItem_Click(object sender, EventArgs e) + { + Searches.ClearHistory(); + UpdateUndoToolBarButtons(); + } + #endregion #region Options diff --git a/BizHawk.MultiClient/tools/Watch/RamSearchEngine.cs b/BizHawk.MultiClient/tools/Watch/RamSearchEngine.cs index 7074ff4866..41734424e4 100644 --- a/BizHawk.MultiClient/tools/Watch/RamSearchEngine.cs +++ b/BizHawk.MultiClient/tools/Watch/RamSearchEngine.cs @@ -8,33 +8,31 @@ using System.Threading.Tasks; namespace BizHawk.MultiClient { - class RamSearchEngine + public class RamSearchEngine { public enum ComparisonOperator { Equal, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, NotEqual, DifferentBy }; public enum Compare { Previous, SpecificValue, SpecificAddress, Changes, Difference } - private List _watchList = new List(); - private Settings _settings; - public Compare CompareTo = Compare.Previous; public int? CompareValue = null; public ComparisonOperator Operator = ComparisonOperator.Equal; public int? DifferentBy = null; - #region Constructors + private List _watchList = new List(); + private Settings _settings; + private WatchHistory _history = new WatchHistory(true); public RamSearchEngine(Settings settings) { _settings = settings; } - #endregion - #region API public void Start() { _watchList.Clear(); + _history.Clear(); switch (_settings.Size) { default: @@ -87,6 +85,8 @@ namespace BizHawk.MultiClient } break; } + + _history.AddState(_watchList); } /// @@ -126,6 +126,7 @@ namespace BizHawk.MultiClient public int DoSearch() { int before = _watchList.Count; + switch (CompareTo) { default: @@ -151,6 +152,8 @@ namespace BizHawk.MultiClient SetPrevousToCurrent(); } + _history.AddState(_watchList); + return before - _watchList.Count; } @@ -291,6 +294,28 @@ namespace BizHawk.MultiClient } } + #endregion + + #region Undo API + + public bool CanUndo { get { return _history.CanUndo; } } + public bool CanRedo { get { return _history.CanRedo; } } + + public void ClearHistory() + { + _history.Clear(); + } + + public void Undo() + { + _watchList = _history.Undo(); + } + + public void Redo() + { + _watchList = _history.Redo(); + } + #endregion #region Comparisons @@ -512,7 +537,7 @@ namespace BizHawk.MultiClient #region Classes - private interface IMiniWatch + public interface IMiniWatch { int Address { get; } int Previous { get; } diff --git a/BizHawk.MultiClient/tools/Watch/WatchHistory.cs b/BizHawk.MultiClient/tools/Watch/WatchHistory.cs new file mode 100644 index 0000000000..83b64d9740 --- /dev/null +++ b/BizHawk.MultiClient/tools/Watch/WatchHistory.cs @@ -0,0 +1,87 @@ +using System.Collections.Generic; +using System.Linq; + +namespace BizHawk.MultiClient +{ + public class WatchHistory + { + private List> _history = new List>(); + private int curPos; //1-based + public bool Enabled { get; private set; } + + public WatchHistory(bool enabled) + { + Enabled = enabled; + } + + public WatchHistory(List newState, bool enabled) + { + AddState(newState); + Enabled = enabled; + } + + public void Clear() + { + _history = new List>(); + curPos = 0; + } + + public bool CanUndo + { + get { return Enabled && curPos > 1; } + } + + public bool CanRedo + { + get { return Enabled && curPos < _history.Count; } + } + + public bool HasHistory + { + get { return Enabled && _history.Any(); } + } + + public void AddState(List newState) + { + if (Enabled) + { + if (curPos < _history.Count) + { + for (int i = curPos + 1; i <= _history.Count; i++) + { + _history.Remove(_history[i - 1]); + } + } + + _history.Add(newState); + curPos = _history.Count; + } + } + + public List Undo() + { + if (CanUndo && Enabled) + { + curPos--; + return _history[curPos - 1]; + } + else + { + return null; + } + } + + public List Redo() + { + if (CanRedo && Enabled) + { + curPos++; + return _history[curPos - 1]; + } + else + { + return null; + } + } + } +}