diff --git a/BizHawk.MultiClient/tools/Cheats/CheatList.cs b/BizHawk.MultiClient/tools/Cheats/CheatList.cs index ff91bc1cc2..42efc22efc 100644 --- a/BizHawk.MultiClient/tools/Cheats/CheatList.cs +++ b/BizHawk.MultiClient/tools/Cheats/CheatList.cs @@ -146,13 +146,24 @@ namespace BizHawk.MultiClient public bool Save() { - if (!String.IsNullOrWhiteSpace(_currentFileName)) + if (String.IsNullOrWhiteSpace(_currentFileName)) { - return SaveFile(); + _currentFileName = GenerateDefaultFilename(); + } + + return SaveFile(_currentFileName); + } + + public bool SaveAs() + { + var file = GetSaveFileFromUser(); + if (file != null) + { + return SaveFile(file.FullName); } else { - return SaveAs(); + return false; } } @@ -186,41 +197,48 @@ namespace BizHawk.MultiClient { try { - int ADDR, VALUE; - int? COMPARE; - MemoryDomain DOMAIN; - bool ENABLED; - string NAME; - - if (s.Length < 6) continue; - //NewCheat c = new NewCheat( - string[] vals = s.Split('\t'); - ADDR = Int32.Parse(vals[0], NumberStyles.HexNumber); - VALUE = Int32.Parse(vals[1], NumberStyles.HexNumber); - - if (vals[2] == "N") + if (s == "----") { - COMPARE = null; + _cheatList.Add(NewCheat.Separator); } else { - COMPARE = Int32.Parse(vals[2], NumberStyles.HexNumber); + int ADDR, VALUE; + int? COMPARE; + MemoryDomain DOMAIN; + bool ENABLED; + string NAME; + + if (s.Length < 6) continue; + //NewCheat c = new NewCheat( + string[] vals = s.Split('\t'); + ADDR = Int32.Parse(vals[0], NumberStyles.HexNumber); + VALUE = Int32.Parse(vals[1], NumberStyles.HexNumber); + + if (vals[2] == "N") + { + COMPARE = null; + } + else + { + COMPARE = Int32.Parse(vals[2], NumberStyles.HexNumber); + } + DOMAIN = ToolHelpers.DomainByName(vals[3]); + ENABLED = vals[4] == "1"; + NAME = vals[5]; + + Watch w = Watch.GenerateWatch( + DOMAIN, + ADDR, + Watch.WatchSize.Byte, + Watch.DisplayType.Hex, + NAME, + false + ); + + NewCheat c = new NewCheat(w, COMPARE, ENABLED); + _cheatList.Add(c); } - DOMAIN = ToolHelpers.DomainByName(vals[3]); - ENABLED = vals[4] == "1"; - NAME = vals[5]; - - Watch w = Watch.GenerateWatch( - DOMAIN, - ADDR, - Watch.WatchSize.Byte, - Watch.DisplayType.Hex, - NAME, - false - ); - - NewCheat c = new NewCheat(w, COMPARE, ENABLED); - _cheatList.Add(c); } catch { @@ -239,14 +257,74 @@ namespace BizHawk.MultiClient #region privates - private bool SaveFile() + private string GenerateDefaultFilename() { - throw new NotImplementedException(); + PathEntry pathEntry = Global.Config.PathEntries[Global.Emulator.SystemId, "Cheats"]; + if (pathEntry == null) + { + pathEntry = Global.Config.PathEntries[Global.Emulator.SystemId, "Base"]; + } + string path = PathManager.MakeAbsolutePath(pathEntry.Path, Global.Emulator.SystemId); + + var f = new FileInfo(path); + if (f.Directory != null && f.Directory.Exists == false) + { + f.Directory.Create(); + } + + return Path.Combine(path, PathManager.FilesystemSafeName(Global.Game) + ".cht"); } - private bool SaveAs() + private bool SaveFile(string path) { - throw new NotImplementedException(); + try + { + FileInfo file = new FileInfo(path); + if (file.Directory != null && !file.Directory.Exists) + { + file.Directory.Create(); + } + + using (StreamWriter sw = new StreamWriter(path)) + { + StringBuilder sb = new StringBuilder(); + + foreach (var cheat in _cheatList) + { + if (cheat.IsSeparator) + { + sb.AppendLine("----"); + } + else + { + //Set to hex for saving + Watch.DisplayType type = cheat.Type; + cheat.SetType(Watch.DisplayType.Hex); + + sb + .Append(cheat.AddressStr).Append('\t') + .Append(cheat.ValueStr).Append('\t') + .Append(cheat.Compare.HasValue ? cheat.Compare.Value : 'N').Append('\t') + .Append(cheat.Domain != null ? cheat.Domain.Name : String.Empty).Append('\t') + .Append(cheat.Enabled ? '1' : '0').Append('\t') + .Append(cheat.Name) + .AppendLine(); + + //TODO: save big endian, size, and display type + } + } + + sw.WriteLine(sb.ToString()); + } + + _changes = false; + _currentFileName = path; + return true; + } + catch + { + return false; + } } #endregion @@ -273,6 +351,33 @@ namespace BizHawk.MultiClient return file; } + private FileInfo GetSaveFileFromUser() + { + var sfd = new SaveFileDialog(); + if (!String.IsNullOrWhiteSpace(_currentFileName)) + { + sfd.FileName = Path.GetFileNameWithoutExtension(Global.CheatList.CurrentCheatFile); + } + else if (!(Global.Emulator is NullEmulator)) + { + sfd.FileName = PathManager.FilesystemSafeName(Global.Game); + } + sfd.InitialDirectory = PathManager.GetCheatsPath(Global.Game); + sfd.Filter = "Cheat Files (*.cht)|*.cht|All Files|*.*"; + sfd.RestoreDirectory = true; + Global.Sound.StopSound(); + var result = sfd.ShowDialog(); + Global.Sound.StartSound(); + if (result != DialogResult.OK) + { + return null; + } + + var file = new FileInfo(sfd.FileName); + Global.Config.LastRomPath = file.DirectoryName; + return file; + } + #endregion } } diff --git a/BizHawk.MultiClient/tools/Cheats/NewCheat.cs b/BizHawk.MultiClient/tools/Cheats/NewCheat.cs index 45d51f6887..c9c67cd7d7 100644 --- a/BizHawk.MultiClient/tools/Cheats/NewCheat.cs +++ b/BizHawk.MultiClient/tools/Cheats/NewCheat.cs @@ -81,7 +81,13 @@ namespace BizHawk.MultiClient get { if (_compare.HasValue && !IsSeparator) return _compare; else return null; } } - public MemoryDomain Domain { get { return _watch.Domain; } } + public MemoryDomain Domain + { + get + { + return _watch.Domain; + } + } public Watch.WatchSize Size { @@ -213,6 +219,14 @@ namespace BizHawk.MultiClient } } + public void SetType(Watch.DisplayType type) + { + if (Watch.AvailableTypes(_watch.Size).Contains(type)) + { + _watch.Type = type; + } + } + #endregion #region private parts diff --git a/BizHawk.MultiClient/tools/Cheats/NewCheatForm.Designer.cs b/BizHawk.MultiClient/tools/Cheats/NewCheatForm.Designer.cs index 8189348aa3..48eee15e7d 100644 --- a/BizHawk.MultiClient/tools/Cheats/NewCheatForm.Designer.cs +++ b/BizHawk.MultiClient/tools/Cheats/NewCheatForm.Designer.cs @@ -204,21 +204,21 @@ // // SaveMenuItem // - this.SaveMenuItem.Enabled = false; this.SaveMenuItem.Image = global::BizHawk.MultiClient.Properties.Resources.SaveAs; this.SaveMenuItem.Name = "SaveMenuItem"; this.SaveMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.SaveMenuItem.Size = new System.Drawing.Size(195, 22); this.SaveMenuItem.Text = "&Save"; + this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click); // // SaveAsMenuItem // - this.SaveAsMenuItem.Enabled = false; this.SaveAsMenuItem.Name = "SaveAsMenuItem"; this.SaveAsMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); this.SaveAsMenuItem.Size = new System.Drawing.Size(195, 22); this.SaveAsMenuItem.Text = "Save &As..."; + this.SaveAsMenuItem.Click += new System.EventHandler(this.SaveAsMenuItem_Click); // // AppendMenuItem // @@ -503,12 +503,12 @@ // SaveToolBarItem // this.SaveToolBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.SaveToolBarItem.Enabled = false; this.SaveToolBarItem.Image = ((System.Drawing.Image)(resources.GetObject("SaveToolBarItem.Image"))); this.SaveToolBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; this.SaveToolBarItem.Name = "SaveToolBarItem"; this.SaveToolBarItem.Size = new System.Drawing.Size(23, 22); this.SaveToolBarItem.Text = "&Save"; + this.SaveToolBarItem.Click += new System.EventHandler(this.SaveMenuItem_Click); // // toolStripSeparator // diff --git a/BizHawk.MultiClient/tools/Cheats/NewCheatForm.cs b/BizHawk.MultiClient/tools/Cheats/NewCheatForm.cs index bdb253e650..40e874916f 100644 --- a/BizHawk.MultiClient/tools/Cheats/NewCheatForm.cs +++ b/BizHawk.MultiClient/tools/Cheats/NewCheatForm.cs @@ -56,7 +56,7 @@ namespace BizHawk.MultiClient { CheatListView.ItemCount = Global.CheatList2.Count; TotalLabel.Text = Global.CheatList2.CheatCount.ToString() - + (Global.CheatList2.CheatCount == 1 ? " cheat" : " cheats") + + (Global.CheatList2.CheatCount == 1 ? " cheat " : " cheats ") + Global.CheatList2.ActiveCheatCount.ToString() + " active"; } @@ -87,16 +87,14 @@ namespace BizHawk.MultiClient private void UpdateMessageLabel(bool saved = false) { string message = String.Empty; - if (!String.IsNullOrWhiteSpace(Global.CheatList2.CurrentFileName)) + + if (saved) { - if (saved) - { - message = Path.GetFileName(Global.CheatList2.CurrentFileName) + " saved."; - } - else - { - message = Path.GetFileName(Global.CheatList2.CurrentFileName) + (Global.CheatList2.Changes ? " *" : String.Empty); - } + message = Path.GetFileName(Global.CheatList2.CurrentFileName) + " saved."; + } + else + { + message = Path.GetFileName(Global.CheatList2.CurrentFileName) + (Global.CheatList2.Changes ? " *" : String.Empty); } MessageLabel.Text = message; @@ -145,6 +143,7 @@ namespace BizHawk.MultiClient { Global.CheatList2.Load(file.FullName, append); UpdateListView(); + UpdateMessageLabel(); Global.Config.RecentCheats.Add(Global.CheatList2.CurrentFileName); } } @@ -397,6 +396,29 @@ namespace BizHawk.MultiClient SaveMenuItem.Enabled = Global.CheatList2.Changes; } + private void SaveMenuItem_Click(object sender, EventArgs e) + { + if (Global.CheatList2.Changes) + { + if (Global.CheatList2.Save()) + { + UpdateMessageLabel(saved: true); + } + } + else + { + SaveAsMenuItem_Click(sender, e); + } + } + + private void SaveAsMenuItem_Click(object sender, EventArgs e) + { + if (Global.CheatList2.SaveAs()) + { + UpdateMessageLabel(saved: true); + } + } + private void RecentSubMenu_DropDownOpened(object sender, EventArgs e) { RecentSubMenu.DropDownItems.Clear(); @@ -467,8 +489,9 @@ namespace BizHawk.MultiClient { Global.CheatList2.Add(NewCheat.Separator); } - + UpdateListView(); + UpdateMessageLabel(); } private void MoveUpMenuItem_Click(object sender, EventArgs e)