From 72b650d60623b31749d064f0d9dc10096ca6c606 Mon Sep 17 00:00:00 2001 From: feos Date: Mon, 7 Dec 2015 20:04:30 +0300 Subject: [PATCH] tastudio: properly save/load column settings. wrap MainForm savestate functions that tastudio can now control into IControlMainform. --- BizHawk.Client.EmuHawk/IControlMainform.cs | 12 + BizHawk.Client.EmuHawk/MainForm.Hotkey.cs | 4 +- BizHawk.Client.EmuHawk/MainForm.cs | 585 +++++++++--------- .../GenericDebugger.IControlMainform.cs | 12 + .../tools/TAStudio/TAStudio.Designer.cs | 2 +- .../TAStudio/TAStudio.IControlMainForm.cs | 42 +- .../tools/TAStudio/TAStudio.cs | 31 +- 7 files changed, 385 insertions(+), 303 deletions(-) diff --git a/BizHawk.Client.EmuHawk/IControlMainform.cs b/BizHawk.Client.EmuHawk/IControlMainform.cs index 25d0e07832..3716de65b5 100644 --- a/BizHawk.Client.EmuHawk/IControlMainform.cs +++ b/BizHawk.Client.EmuHawk/IControlMainform.cs @@ -2,6 +2,18 @@ { public interface IControlMainform { + bool WantsToControlSavestates { get; } + + void SaveState(); + void LoadState(); + void SaveStateAs(); + void LoadStateAs(); + void SaveQuickSave(int slot); + void LoadQuickSave(int slot); + void SelectSlot(int slot); + void PreviousSlot(); + void NextSlot(); + bool WantsToControlReadOnly { get; } /// diff --git a/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs b/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs index 9ad188dee1..4bf55b1360 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs @@ -343,10 +343,10 @@ namespace BizHawk.Client.EmuHawk //TAStudio case "Add Branch": - GlobalWin.Tools.TAStudio.BookMarkControl.AddBranchExternal(); + GlobalWin.Tools.TAStudio.AddBranchExternal(); break; case "Delete Branch": - GlobalWin.Tools.TAStudio.BookMarkControl.RemoveBranchExtrenal(); + GlobalWin.Tools.TAStudio.RemoveBranchExtrenal(); break; // SNES diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 4267e8ce9f..e920e9b783 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -1570,22 +1570,6 @@ namespace BizHawk.Client.EmuHawk } } - private void SelectSlot(int num) - { - if (Global.Emulator.HasSavestates()) - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(num); - return; - } - - Global.Config.SaveSlot = num; - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - private void RewireSound() { if (_dumpProxy != null) @@ -1888,75 +1872,6 @@ namespace BizHawk.Client.EmuHawk return bb; } - private void SaveStateAs() - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - return; - } - - var path = PathManager.GetSaveStatePath(Global.Game); - - var file = new FileInfo(path); - if (file.Directory != null && file.Directory.Exists == false) - { - file.Directory.Create(); - } - - var sfd = new SaveFileDialog - { - AddExtension = true, - DefaultExt = "State", - Filter = "Save States (*.State)|*.State|All Files|*.*", - InitialDirectory = path, - FileName = PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave0.State" - }; - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - SaveState(sfd.FileName, sfd.FileName, false); - } - } - - private void LoadStateAs() - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - return; - } - - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetSaveStatePath(Global.Game), - Filter = "Save States (*.State)|*.State|All Files|*.*", - RestoreDirectory = true - }; - - var result = ofd.ShowHawkDialog(); - if (result != DialogResult.OK) - { - return; - } - - if (File.Exists(ofd.FileName) == false) - { - return; - } - - LoadState(ofd.FileName, Path.GetFileName(ofd.FileName)); - } - private void SaveSlotSelectedMessage() { int slot = Global.Config.SaveSlot; @@ -2196,62 +2111,6 @@ namespace BizHawk.Client.EmuHawk ConfigService.Save(PathManager.DefaultIniPath, Global.Config); } - private void PreviousSlot() - { - if (Global.Emulator.HasSavestates()) - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(false); - return; - } - - if (Global.Config.SaveSlot == 0) - { - Global.Config.SaveSlot = 9; // Wrap to end of slot list - } - else if (Global.Config.SaveSlot > 9) - { - Global.Config.SaveSlot = 9; // Meh, just in case - } - else - { - Global.Config.SaveSlot--; - } - - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - - private void NextSlot() - { - if (Global.Emulator.HasSavestates()) - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(true); - return; - } - - if (Global.Config.SaveSlot >= 9) - { - Global.Config.SaveSlot = 0; // Wrap to beginning of slot list - } - else if (Global.Config.SaveSlot < 0) - { - Global.Config.SaveSlot = 0; // Meh, just in case - } - else - { - Global.Config.SaveSlot++; - } - - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - private static void ToggleFPS() { Global.Config.DisplayFPS ^= true; @@ -2708,112 +2567,6 @@ namespace BizHawk.Client.EmuHawk }); } - private int SlotToInt(string slot) - { - return int.Parse(slot.Substring(slot.Length - 1, 1)); - } - - public void LoadState(string path, string userFriendlyStateName, bool fromLua = false, bool supressOSD = false) // Move to client.common - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.LoadBranchExternal(); - return; - } - - // If from lua, disable counting rerecords - bool wasCountingRerecords = Global.MovieSession.Movie.IsCountingRerecords; - - if (fromLua) - Global.MovieSession.Movie.IsCountingRerecords = false; - - GlobalWin.DisplayManager.NeedsToPaint = true; - - if (SavestateManager.LoadStateFile(path, userFriendlyStateName)) - { - SetMainformMovieInfo(); - GlobalWin.OSD.ClearGUIText(); - GlobalWin.Tools.UpdateToolsBefore(fromLua); - UpdateToolsAfter(fromLua); - UpdateToolsLoadstate(); - Global.AutoFireController.ClearStarts(); - - if (!supressOSD) - { - GlobalWin.OSD.AddMessage("Loaded state: " + userFriendlyStateName); - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallLoadStateEvent(userFriendlyStateName); - } - } - else - { - GlobalWin.OSD.AddMessage("Loadstate error!"); - } - - Global.MovieSession.Movie.IsCountingRerecords = wasCountingRerecords; - } - - public void LoadQuickSave(string quickSlotName, bool fromLua = false, bool supressOSD = false) - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.LoadBranchExternal(SlotToInt(quickSlotName)); - return; - } - - var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; - if (File.Exists(path) == false) - { - GlobalWin.OSD.AddMessage("Unable to load " + quickSlotName + ".State"); - - return; - } - - LoadState(path, quickSlotName, fromLua, supressOSD); - } - - public void SaveState(string path, string userFriendlyStateName, bool fromLua) - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.UpdateBranchExternal(); - return; - } - - try - { - SavestateManager.SaveStateFile(path, userFriendlyStateName); - - GlobalWin.OSD.AddMessage("Saved state: " + userFriendlyStateName); - } - catch (IOException) - { - GlobalWin.OSD.AddMessage("Unable to save state " + path); - } - if (!fromLua) - { - UpdateStatusSlots(); - } - } - // Alt key hacks protected override void WndProc(ref Message m) { @@ -3725,50 +3478,6 @@ namespace BizHawk.Client.EmuHawk } } - // TODO: should backup logic be stuffed in into Client.Common.SaveStateManager? - public void SaveQuickSave(string quickSlotName) - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.UpdateBranchExternal(SlotToInt(quickSlotName)); - return; - } - - var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; - - var file = new FileInfo(path); - if (file.Directory != null && file.Directory.Exists == false) - { - file.Directory.Create(); - } - - - // Make backup first - if (Global.Config.BackupSavestates && file.Exists) - { - var backup = path + ".bak"; - var backupFile = new FileInfo(backup); - if (backupFile.Exists) - { - backupFile.Delete(); - } - - File.Move(path, backup); - } - - SaveState(path, quickSlotName, false); - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallSaveStateEvent(quickSlotName); - } - } - private static void CommitCoreSettingsToConfig() { // save settings object @@ -3894,11 +3603,305 @@ namespace BizHawk.Client.EmuHawk // TODO: move me public IControlMainform master { get; private set; } + public void RelinquishControl(IControlMainform master) { this.master = master; } + private int SlotToInt(string slot) + { + return int.Parse(slot.Substring(slot.Length - 1, 1)); + } + + public void LoadState(string path, string userFriendlyStateName, bool fromLua = false, bool supressOSD = false) // Move to client.common + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.LoadState(); + return; + } + + // If from lua, disable counting rerecords + bool wasCountingRerecords = Global.MovieSession.Movie.IsCountingRerecords; + + if (fromLua) + Global.MovieSession.Movie.IsCountingRerecords = false; + + GlobalWin.DisplayManager.NeedsToPaint = true; + + if (SavestateManager.LoadStateFile(path, userFriendlyStateName)) + { + SetMainformMovieInfo(); + GlobalWin.OSD.ClearGUIText(); + GlobalWin.Tools.UpdateToolsBefore(fromLua); + UpdateToolsAfter(fromLua); + UpdateToolsLoadstate(); + Global.AutoFireController.ClearStarts(); + + if (!supressOSD) + { + GlobalWin.OSD.AddMessage("Loaded state: " + userFriendlyStateName); + } + + if (GlobalWin.Tools.Has()) + { + GlobalWin.Tools.LuaConsole.LuaImp.CallLoadStateEvent(userFriendlyStateName); + } + } + else + { + GlobalWin.OSD.AddMessage("Loadstate error!"); + } + + Global.MovieSession.Movie.IsCountingRerecords = wasCountingRerecords; + } + + public void LoadQuickSave(string quickSlotName, bool fromLua = false, bool supressOSD = false) + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.LoadQuickSave(SlotToInt(quickSlotName)); + return; + } + + var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; + if (File.Exists(path) == false) + { + GlobalWin.OSD.AddMessage("Unable to load " + quickSlotName + ".State"); + + return; + } + + LoadState(path, quickSlotName, fromLua, supressOSD); + } + + public void SaveState(string path, string userFriendlyStateName, bool fromLua) + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.SaveState(); + return; + } + + try + { + SavestateManager.SaveStateFile(path, userFriendlyStateName); + + GlobalWin.OSD.AddMessage("Saved state: " + userFriendlyStateName); + } + catch (IOException) + { + GlobalWin.OSD.AddMessage("Unable to save state " + path); + } + if (!fromLua) + { + UpdateStatusSlots(); + } + } + + // TODO: should backup logic be stuffed in into Client.Common.SaveStateManager? + public void SaveQuickSave(string quickSlotName) + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.SaveQuickSave(SlotToInt(quickSlotName)); + return; + } + + var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; + + var file = new FileInfo(path); + if (file.Directory != null && file.Directory.Exists == false) + { + file.Directory.Create(); + } + + + // Make backup first + if (Global.Config.BackupSavestates && file.Exists) + { + var backup = path + ".bak"; + var backupFile = new FileInfo(backup); + if (backupFile.Exists) + { + backupFile.Delete(); + } + + File.Move(path, backup); + } + + SaveState(path, quickSlotName, false); + + if (GlobalWin.Tools.Has()) + { + GlobalWin.Tools.LuaConsole.LuaImp.CallSaveStateEvent(quickSlotName); + } + } + + private void SaveStateAs() + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.SaveStateAs(); + return; + } + + var path = PathManager.GetSaveStatePath(Global.Game); + + var file = new FileInfo(path); + if (file.Directory != null && file.Directory.Exists == false) + { + file.Directory.Create(); + } + + var sfd = new SaveFileDialog + { + AddExtension = true, + DefaultExt = "State", + Filter = "Save States (*.State)|*.State|All Files|*.*", + InitialDirectory = path, + FileName = PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave0.State" + }; + + var result = sfd.ShowHawkDialog(); + if (result == DialogResult.OK) + { + SaveState(sfd.FileName, sfd.FileName, false); + } + } + + private void LoadStateAs() + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.LoadStateAs(); + return; + } + + var ofd = new OpenFileDialog + { + InitialDirectory = PathManager.GetSaveStatePath(Global.Game), + Filter = "Save States (*.State)|*.State|All Files|*.*", + RestoreDirectory = true + }; + + var result = ofd.ShowHawkDialog(); + if (result != DialogResult.OK) + { + return; + } + + if (File.Exists(ofd.FileName) == false) + { + return; + } + + LoadState(ofd.FileName, Path.GetFileName(ofd.FileName)); + } + + private void SelectSlot(int slot) + { + if (Global.Emulator.HasSavestates()) + { + if (IsSlave && master.WantsToControlSavestates) + { + master.SelectSlot(slot); + return; + } + + Global.Config.SaveSlot = slot; + SaveSlotSelectedMessage(); + UpdateStatusSlots(); + } + } + + private void PreviousSlot() + { + if (Global.Emulator.HasSavestates()) + { + if (IsSlave && master.WantsToControlSavestates) + { + master.PreviousSlot(); + return; + } + + if (Global.Config.SaveSlot == 0) + { + Global.Config.SaveSlot = 9; // Wrap to end of slot list + } + else if (Global.Config.SaveSlot > 9) + { + Global.Config.SaveSlot = 9; // Meh, just in case + } + else + { + Global.Config.SaveSlot--; + } + + SaveSlotSelectedMessage(); + UpdateStatusSlots(); + } + } + + private void NextSlot() + { + if (Global.Emulator.HasSavestates()) + { + if (IsSlave && master.WantsToControlSavestates) + { + master.NextSlot(); + return; + } + + if (Global.Config.SaveSlot >= 9) + { + Global.Config.SaveSlot = 0; // Wrap to beginning of slot list + } + else if (Global.Config.SaveSlot < 0) + { + Global.Config.SaveSlot = 0; // Meh, just in case + } + else + { + Global.Config.SaveSlot++; + } + + SaveSlotSelectedMessage(); + UpdateStatusSlots(); + } + } + private void ToggleReadOnly() { if (IsSlave && master.WantsToControlReadOnly) diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs index e7a947045e..c7f95fbc04 100644 --- a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs +++ b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs @@ -7,6 +7,18 @@ namespace BizHawk.Client.EmuHawk { public partial class GenericDebugger : IControlMainform { + public bool WantsToControlSavestates { get { return false; } } + + public void SaveState() { } + public void LoadState() { } + public void SaveStateAs() { } + public void LoadStateAs() { } + public void SaveQuickSave(int slot) { } + public void LoadQuickSave(int slot) { } + public void SelectSlot(int slot) { } + public void PreviousSlot() { } + public void NextSlot() { } + public bool WantsToControlReadOnly { get { return false; } } public void ToggleReadOnly() { } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs index ed3540c9b1..03440d8b38 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs @@ -1674,7 +1674,7 @@ namespace BizHawk.Client.EmuHawk private System.Windows.Forms.ToolStripMenuItem scrollToCenterToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem applyPatternToPaintedInputToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem onlyOnAutoFireColumnsToolStripMenuItem; - public BookmarksBranchesBox BookMarkControl; + private BookmarksBranchesBox BookMarkControl; private System.Windows.Forms.ToolStripMenuItem BranchContextMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; private System.Windows.Forms.ToolStripMenuItem wheelScrollSpeedToolStripMenuItem; diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs index 0645648728..9ad2455e74 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs @@ -6,7 +6,47 @@ namespace BizHawk.Client.EmuHawk { private bool _suppressAskSave = false; + public bool WantsToControlSavestates { get { return true; } } + + public void SaveState() + { + BookMarkControl.UpdateBranchExternal(); + } + public void LoadState() + { + BookMarkControl.LoadBranchExternal(); + } + public void SaveStateAs() + { + // dummy + } + public void LoadStateAs() + { + // dummy + } + public void SaveQuickSave(int slot) + { + BookMarkControl.UpdateBranchExternal(slot); + } + public void LoadQuickSave(int slot) + { + BookMarkControl.LoadBranchExternal(slot); + } + public void SelectSlot(int slot) + { + BookMarkControl.SelectBranchExternal(slot); + } + public void PreviousSlot() + { + BookMarkControl.SelectBranchExternal(false); + } + public void NextSlot() + { + BookMarkControl.SelectBranchExternal(true); + } + public bool WantsToControlReadOnly { get { return false; } } + public void ToggleReadOnly() { GlobalWin.OSD.AddMessage("TAStudio does not allow manual readonly toggle"); @@ -31,7 +71,7 @@ namespace BizHawk.Client.EmuHawk public bool Rewind() { - GoToPreviousFrame(); + GoToPreviousFrame(); // todo: behave as normal rewind in differentiating between hitting rewind once and holding it. return true; } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index e99f770ea8..36644401a9 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -296,10 +296,12 @@ namespace BizHawk.Client.EmuHawk return true; } - private void SetTasMovieCallbacks() + private void SetTasMovieCallbacks(TasMovie movie = null) { - CurrentTasMovie.ClientSettingsForSave = ClientSettingsForSave; - CurrentTasMovie.GetClientSettingsOnLoad = GetClientSettingsOnLoad; + if (movie == null) + movie = CurrentTasMovie; + movie.ClientSettingsForSave = ClientSettingsForSave; + movie.GetClientSettingsOnLoad = GetClientSettingsOnLoad; } private string ClientSettingsForSave() @@ -343,8 +345,7 @@ namespace BizHawk.Client.EmuHawk column.Visible = false; } - TasView.AllColumns.ColumnsChanged(); - + TasView.AllColumns.ColumnsChanged(); // Patterns int bStart = 0; @@ -437,7 +438,8 @@ namespace BizHawk.Client.EmuHawk if (!HandleMovieLoadStuff(newMovie)) return false; - SetUpColumns(); + if (TasView.AllColumns.Count() == 0) + SetUpColumns(); GoToFrame(CurrentTasMovie.Session.CurrentFrame); CurrentTasMovie.CurrentBranch = CurrentTasMovie.Session.CurrentBranch; @@ -476,9 +478,9 @@ namespace BizHawk.Client.EmuHawk private bool HandleMovieLoadStuff(TasMovie movie = null) { - - WantsToControlStopMovie = false; bool result; + WantsToControlStopMovie = false; + if (movie == null) { movie = CurrentTasMovie; @@ -486,8 +488,10 @@ namespace BizHawk.Client.EmuHawk } else result = StartNewMovieWrapper(false, movie); + if (!result) return false; + WantsToControlStopMovie = true; CurrentTasMovie.ChangeLog.ClearLog(); @@ -503,6 +507,7 @@ namespace BizHawk.Client.EmuHawk _initializing = true; if (movie == null) movie = CurrentTasMovie; + SetTasMovieCallbacks(movie as TasMovie); bool result = GlobalWin.MainForm.StartNewMovie(movie, record); _initializing = false; @@ -686,6 +691,16 @@ namespace BizHawk.Client.EmuHawk _hackyDontUpdate = false; } + public void AddBranchExternal() + { + BookMarkControl.AddBranchExternal(); + } + + public void RemoveBranchExtrenal() + { + BookMarkControl.RemoveBranchExtrenal(); + } + private void UpdateOtherTools() // a hack probably, surely there is a better way to do this { _hackyDontUpdate = true;