From 9a518bcf9bd02bb66b42be22195fc7acc66fa948 Mon Sep 17 00:00:00 2001 From: SuuperW Date: Tue, 16 Jun 2026 14:44:09 -0500 Subject: [PATCH] a potential fix for #2619 --- .../tools/Lua/Libraries/TAStudioLuaLibrary.cs | 4 +- .../tools/TAStudio/PlaybackBox.cs | 48 +++++++++++-------- .../tools/TAStudio/TAStudio.Navigation.cs | 2 +- .../tools/TAStudio/TAStudio.cs | 16 +++---- 4 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs index 6c7406e0428..82fc992fd08 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/Libraries/TAStudioLuaLibrary.cs @@ -82,14 +82,14 @@ public bool Engaged() [LuaMethod("getrecording", "returns whether or not TAStudio is in recording mode")] public bool GetRecording() { - return Tastudio.TasPlaybackBox.RecordingMode; + return Tastudio.TasPlaybackBox.IsRecording; } [LuaMethodExample("tastudio.setrecording( true );")] [LuaMethod("setrecording", "sets the recording mode on/off depending on the parameter")] public void SetRecording(bool val) { - if (Tastudio.TasPlaybackBox.RecordingMode != val) + if (Tastudio.TasPlaybackBox.IsRecording != val) { Tastudio.ToggleReadOnly(); } diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/PlaybackBox.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/PlaybackBox.cs index 67f0eb259d3..3c4209ca20f 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/PlaybackBox.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/PlaybackBox.cs @@ -35,26 +35,34 @@ public bool FollowCursor set => FollowCursorCheckbox.Checked = value; } - [Browsable(true)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public bool RecordingMode + public enum RecordingModeState { - get => Tastudio.CurrentTasMovie.IsRecording(); - set - { - RecordingModeCheckbox.Checked = value; - Tastudio.MovieSession.ReadOnly = !value; - if (RecordingModeCheckbox.Checked) - { - Tastudio.CurrentTasMovie.SwitchToRecord(); - } - else - { - Tastudio.CurrentTasMovie.SwitchToPlay(); - } + Off, + On, + Suspended, + } - Tastudio.MainForm.SetMainformMovieInfo(); + public bool IsRecording => Tastudio.CurrentTasMovie.IsRecording(); + public void SetRecordingState(RecordingModeState value) + { + RecordingModeCheckbox.CheckState = value switch + { + RecordingModeState.On => CheckState.Checked, + RecordingModeState.Off => CheckState.Unchecked, + RecordingModeState.Suspended => CheckState.Indeterminate, + _ => CheckState.Unchecked, + }; + Tastudio.MovieSession.ReadOnly = value == RecordingModeState.Off; + if (value == RecordingModeState.On) + { + Tastudio.CurrentTasMovie.SwitchToRecord(); } + else + { + Tastudio.CurrentTasMovie.SwitchToPlay(); + } + + Tastudio.MainForm.SetMainformMovieInfo(); } public PlaybackBox() @@ -113,7 +121,7 @@ protected override void OnLoad(EventArgs e) TurboSeekCheckbox.Checked = Tastudio.Config?.TurboSeek ?? false; AutoRestoreCheckbox.Checked = Tastudio.Settings.AutoRestoreLastPosition; FollowCursorCheckbox.Checked = Tastudio.Settings.FollowCursor; - RecordingModeCheckbox.Checked = RecordingMode; + RecordingModeCheckbox.Checked = IsRecording; _loading = false; } @@ -158,8 +166,8 @@ private void FollowCursorCheckbox_CheckedChanged(object sender, EventArgs e) private void RecordingModeCheckbox_MouseClick(object sender, MouseEventArgs e) { - RecordingMode = !RecordingMode; - Tastudio.WasRecording = RecordingMode; // hard reset at manual click and hotkey + SetRecordingState(RecordingModeCheckbox.Checked ? RecordingModeState.On : RecordingModeState.Off); + Tastudio.WasRecording = RecordingModeCheckbox.Checked; // hard reset at manual click and hotkey } private void RewindButton_MouseDown(object sender, MouseEventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs index 131b2537738..53d11344882 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs @@ -23,7 +23,7 @@ public void GoToFrame(int frame, bool OnLeftMouseDown = false, bool skipLoadStat // Other answer: turbo seek, navigating while unpaused _pauseAfterSeeking = MainForm.EmulatorPaused || (SeekingTo != -1 && _pauseAfterSeeking); WasRecording = CurrentTasMovie.IsRecording() || WasRecording; - TastudioPlayMode(); + TasPlaybackBox.SetRecordingState(WasRecording ? PlaybackBox.RecordingModeState.Suspended : PlaybackBox.RecordingModeState.Off); SeekingTo = frame; // must be before LoadState, since it calls UpdateAfter (potentially doing end-of-seek logic if prior seek was to before this frame) instead of SavestateLoaded for ??? reason. var closestState = GetPriorStateForFramebuffer(frame); diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 14a72d843bb..73f71a8b575 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -829,28 +829,28 @@ private void DummyLoadMacro(string path) private void TastudioToggleReadOnly() { - TasPlaybackBox.RecordingMode = !TasPlaybackBox.RecordingMode; - WasRecording = TasPlaybackBox.RecordingMode; // hard reset at manual click and hotkey + TasPlaybackBox.SetRecordingState(TasPlaybackBox.IsRecording ? PlaybackBox.RecordingModeState.Off : PlaybackBox.RecordingModeState.On); + WasRecording = TasPlaybackBox.IsRecording; // hard reset at manual click and hotkey } private void TastudioPlayMode(bool resetWasRecording = false) { - TasPlaybackBox.RecordingMode = false; + TasPlaybackBox.SetRecordingState(PlaybackBox.RecordingModeState.Off); // once user started editing, rec mode is unsafe if (resetWasRecording) { - WasRecording = TasPlaybackBox.RecordingMode; + WasRecording = TasPlaybackBox.IsRecording; } } private void TastudioRecordMode(bool resetWasRecording = false) { - TasPlaybackBox.RecordingMode = true; + TasPlaybackBox.SetRecordingState(PlaybackBox.RecordingModeState.On); if (resetWasRecording) { - WasRecording = TasPlaybackBox.RecordingMode; + WasRecording = TasPlaybackBox.IsRecording; } } @@ -1306,7 +1306,7 @@ private void HandleRotationChanged(object sender, EventArgs e) private bool _suspendEditLogic; public void LoadBranch(TasBranch branch) { - if (Settings.OldControlSchemeForBranches && !TasPlaybackBox.RecordingMode) + if (Settings.OldControlSchemeForBranches && !TasPlaybackBox.IsRecording) { GoToFrame(branch.Frame); return; @@ -1320,7 +1320,7 @@ public void LoadBranch(TasBranch branch) CurrentTasMovie.TasStateManager.Capture(Emulator.Frame, Emulator.AsStatable()); QuickBmpFile.Copy(new BitmapBufferVideoProvider(branch.CoreFrameBuffer), VideoProvider); - if (Settings.OldControlSchemeForBranches && TasPlaybackBox.RecordingMode) + if (Settings.OldControlSchemeForBranches && TasPlaybackBox.IsRecording) { CurrentTasMovie.Truncate(branch.Frame); }