Unthread tastudio seek progress bar (#2774)

Co-authored-by: feos <feos-theos@yandex.ru>
This commit is contained in:
nattthebear 2021-10-18 14:03:25 -04:00 committed by GitHub
parent 681b564bce
commit 09ccf0dbe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 69 deletions

View File

@ -154,7 +154,7 @@ namespace BizHawk.Client.EmuHawk
this.TasView = new BizHawk.Client.EmuHawk.InputRoll(); this.TasView = new BizHawk.Client.EmuHawk.InputRoll();
this.TasStatusStrip = new StatusStripEx(); this.TasStatusStrip = new StatusStripEx();
this.MessageStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.MessageStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.SavingProgressBar = new System.Windows.Forms.ToolStripProgressBar(); this.ProgressBar = new System.Windows.Forms.ToolStripProgressBar();
this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
this.SplicerStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.SplicerStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.TasPlaybackBox = new BizHawk.Client.EmuHawk.PlaybackBox(); this.TasPlaybackBox = new BizHawk.Client.EmuHawk.PlaybackBox();
@ -925,7 +925,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.TasStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.TasStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.MessageStatusLabel, this.MessageStatusLabel,
this.SavingProgressBar, this.ProgressBar,
this.toolStripStatusLabel2, this.toolStripStatusLabel2,
this.SplicerStatusLabel}); this.SplicerStatusLabel});
this.TasStatusStrip.Location = new System.Drawing.Point(0, 554); this.TasStatusStrip.Location = new System.Drawing.Point(0, 554);
@ -938,10 +938,10 @@ namespace BizHawk.Client.EmuHawk
this.MessageStatusLabel.Size = new System.Drawing.Size(95, 17); this.MessageStatusLabel.Size = new System.Drawing.Size(95, 17);
this.MessageStatusLabel.Text = "TAStudio engaged"; this.MessageStatusLabel.Text = "TAStudio engaged";
// //
// SavingProgressBar // ProgressBar
// //
this.SavingProgressBar.Name = "SavingProgressBar"; this.ProgressBar.Name = "ProgressBar";
this.SavingProgressBar.Size = new System.Drawing.Size(100, 16); this.ProgressBar.Size = new System.Drawing.Size(100, 16);
// //
// toolStripStatusLabel2 // toolStripStatusLabel2
// //
@ -1310,7 +1310,7 @@ namespace BizHawk.Client.EmuHawk
private BizHawk.WinForms.Controls.ToolStripSeparatorEx StartFromNowSeparator; private BizHawk.WinForms.Controls.ToolStripSeparatorEx StartFromNowSeparator;
private BizHawk.WinForms.Controls.ToolStripMenuItemEx StartNewProjectFromNowMenuItem; private BizHawk.WinForms.Controls.ToolStripMenuItemEx StartNewProjectFromNowMenuItem;
private BizHawk.WinForms.Controls.ToolStripMenuItemEx RotateMenuItem; private BizHawk.WinForms.Controls.ToolStripMenuItemEx RotateMenuItem;
private System.Windows.Forms.ToolStripProgressBar SavingProgressBar; private System.Windows.Forms.ToolStripProgressBar ProgressBar;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
private BizHawk.WinForms.Controls.ToolStripMenuItemEx HideLagFramesSubMenu; private BizHawk.WinForms.Controls.ToolStripMenuItemEx HideLagFramesSubMenu;
private BizHawk.WinForms.Controls.ToolStripMenuItemEx HideLagFrames3; private BizHawk.WinForms.Controls.ToolStripMenuItemEx HideLagFrames3;

View File

@ -24,6 +24,37 @@ namespace BizHawk.Client.EmuHawk
private int _lastRefresh; private int _lastRefresh;
private void UpdateProgressBar()
{
if (MainForm.PauseOnFrame.HasValue)
{
int diff = Emulator.Frame - _seekStartFrame.Value;
int unit = MainForm.PauseOnFrame.Value - _seekStartFrame.Value;
double progress = 0;
if (diff != 0 && unit != 0)
{
progress = (double)100d / unit * diff;
}
if (progress < 0)
{
progress = 0;
}
else if (progress > 100)
{
progress = 100;
}
ProgressBar.Value = (int)progress;
}
else
{
ProgressBar.Visible = false;
MessageStatusLabel.Text = "";
}
}
protected override void GeneralUpdate() protected override void GeneralUpdate()
{ {
RefreshDialog(); RefreshDialog();
@ -61,6 +92,12 @@ namespace BizHawk.Client.EmuHawk
} }
RefreshDialog(refreshNeeded, refreshBranches: false); RefreshDialog(refreshNeeded, refreshBranches: false);
UpdateProgressBar();
}
protected override void FastUpdateAfter()
{
UpdateProgressBar();
} }
public override void Restart() public override void Restart()

View File

@ -98,15 +98,15 @@ namespace BizHawk.Client.EmuHawk
TastudioPlayMode(); // suspend rec mode until seek ends, to allow mouse editing TastudioPlayMode(); // suspend rec mode until seek ends, to allow mouse editing
MainForm.UnpauseEmulator(); MainForm.UnpauseEmulator();
if (!_seekBackgroundWorker.IsBusy && diff > TasView.VisibleRows) if (diff > TasView.VisibleRows)
{ {
_seekBackgroundWorker.RunWorkerAsync(); MessageStatusLabel.Text = "Seeking...";
ProgressBar.Visible = true;
} }
} }
public void StopSeeking(bool skipRecModeCheck = false) public void StopSeeking(bool skipRecModeCheck = false)
{ {
_seekBackgroundWorker.CancelAsync();
if (WasRecording && !skipRecModeCheck) if (WasRecording && !skipRecModeCheck)
{ {
TastudioRecordMode(); TastudioRecordMode();

View File

@ -30,7 +30,6 @@ namespace BizHawk.Client.EmuHawk
private readonly List<TasClipboardEntry> _tasClipboard = new List<TasClipboardEntry>(); private readonly List<TasClipboardEntry> _tasClipboard = new List<TasClipboardEntry>();
private const string CursorColumnName = "CursorColumn"; private const string CursorColumnName = "CursorColumn";
private const string FrameColumnName = "FrameColumn"; private const string FrameColumnName = "FrameColumn";
private BackgroundWorker _seekBackgroundWorker;
private MovieEndAction _originalEndAction; // The movie end behavior selected by the user (that is overridden by TAStudio) private MovieEndAction _originalEndAction; // The movie end behavior selected by the user (that is overridden by TAStudio)
private UndoHistoryForm _undoForm; private UndoHistoryForm _undoForm;
private Timer _autosaveTimer; private Timer _autosaveTimer;
@ -121,13 +120,11 @@ namespace BizHawk.Client.EmuHawk
ForumThreadMenuItem.Image = Resources.TAStudio; ForumThreadMenuItem.Image = Resources.TAStudio;
Icon = Resources.TAStudioIcon; Icon = Resources.TAStudioIcon;
InitializeSeekWorker();
_defaultMainSplitDistance = MainVertialSplit.SplitterDistance; _defaultMainSplitDistance = MainVertialSplit.SplitterDistance;
_defaultBranchMarkerSplitDistance = BranchesMarkersSplit.SplitterDistance; _defaultBranchMarkerSplitDistance = BranchesMarkersSplit.SplitterDistance;
// TODO: show this at all times or hide it when saving is done? // TODO: show this at all times or hide it when saving is done?
SavingProgressBar.Visible = false; ProgressBar.Visible = false;
WantsToControlStopMovie = true; WantsToControlStopMovie = true;
WantsToControlRestartMovie = true; WantsToControlRestartMovie = true;
@ -323,62 +320,6 @@ namespace BizHawk.Client.EmuHawk
} }
} }
private void InitializeSeekWorker()
{
_seekBackgroundWorker?.Dispose();
_seekBackgroundWorker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_seekBackgroundWorker.DoWork += (s, e) =>
{
this.Invoke(() => MessageStatusLabel.Text = "Seeking...");
this.Invoke(() => SavingProgressBar.Visible = true);
for (;;)
{
if (_seekBackgroundWorker.CancellationPending || !IsHandleCreated || !MainForm.PauseOnFrame.HasValue)
{
e.Cancel = true;
break;
}
int diff = Emulator.Frame - _seekStartFrame.Value;
int unit = MainForm.PauseOnFrame.Value - _seekStartFrame.Value;
double progress = 0;
if (diff != 0 && unit != 0)
{
progress = (double)100d / unit * diff;
}
if (progress < 0)
{
progress = 0;
}
else if (progress > 100)
{
progress = 100;
}
_seekBackgroundWorker.ReportProgress((int)progress);
System.Threading.Thread.Sleep(1);
}
};
_seekBackgroundWorker.ProgressChanged += (s, e) =>
{
this.Invoke(() => SavingProgressBar.Value = e.ProgressPercentage);
};
_seekBackgroundWorker.RunWorkerCompleted += (s, e) =>
{
this.Invoke(() => SavingProgressBar.Visible = false);
this.Invoke(() => MessageStatusLabel.Text = "");
};
}
private void SetTasMovieCallbacks(ITasMovie movie) private void SetTasMovieCallbacks(ITasMovie movie)
{ {
movie.ClientSettingsForSave = () => TasView.UserSettingsSerialized(); movie.ClientSettingsForSave = () => TasView.UserSettingsSerialized();