diff --git a/BizHawk.Client.Common/config/Config.cs b/BizHawk.Client.Common/config/Config.cs index ca613bbffd..c0f8bd01e0 100644 --- a/BizHawk.Client.Common/config/Config.cs +++ b/BizHawk.Client.Common/config/Config.cs @@ -523,6 +523,7 @@ namespace BizHawk.Client.Common public bool AutoloadTAStudio = false; public bool AutoloadTAStudioProject = false; public bool TAStudioDrawInput = true; + public bool TAStudioAutoPause = true; public bool TAStudioAutoRestoreLastPosition = false; public bool AutoloadExperimentalTAStudio = false; diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs index af8908b06f..c1eb6d5541 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.ModeApi.cs @@ -4,8 +4,8 @@ namespace BizHawk.Client.Common { public partial class Bk2Movie { - private enum Moviemode { Inactive, Play, Record, Finished } - private Moviemode _mode = Moviemode.Inactive; + protected enum Moviemode { Inactive, Play, Record, Finished } + protected Moviemode _mode = Moviemode.Inactive; public bool IsActive { @@ -39,17 +39,17 @@ namespace BizHawk.Client.Common _log.Clear(); } - public void StartNewPlayback() + public virtual void StartNewPlayback() { _mode = Moviemode.Play; } - public void SwitchToRecord() + public virtual void SwitchToRecord() { _mode = Moviemode.Record; } - public void SwitchToPlay() + public virtual void SwitchToPlay() { _mode = Moviemode.Play; Save(); diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs index 4a4eae8dcb..34aa219d0c 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs @@ -47,7 +47,7 @@ namespace BizHawk.Client.Common public virtual string PreferredExtension { get { return Extension; } } public const string Extension = "bk2"; - public bool Changes { get; protected set; } + public virtual bool Changes { get; protected set; } public bool IsCountingRerecords { get; set; } public ILogEntryGenerator LogGeneratorInstance() diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs index 580eca9465..43638702ae 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs @@ -6,10 +6,11 @@ using System.Text; using BizHawk.Common; using BizHawk.Emulation.Common; +using System.ComponentModel; namespace BizHawk.Client.Common { - public sealed partial class TasMovie : Bk2Movie + public sealed partial class TasMovie : Bk2Movie, INotifyPropertyChanged { private List LagLog = new List(); private readonly TasStateManager StateManager; @@ -30,6 +31,36 @@ namespace BizHawk.Client.Common get { return Extension; } } + #region OnPropertyChanged Event + + public event PropertyChangedEventHandler PropertyChanged; + + private bool _changes; + public override bool Changes + { + get { return _changes; } + protected set + { + if (_changes != value) + { + _changes = value; + OnPropertyChanged("Changes"); + } + } + } + + #endregion + + //This event is Raised ony when Changes is TOGGLED. + private void OnPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + { + //Raising the event when FirstName or LastName property value changed + PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } + public new const string Extension = "tasproj"; public TasMovieMarkerList Markers { get; set; } @@ -62,6 +93,11 @@ namespace BizHawk.Client.Common Markers.Add(0, StartsFromSavestate ? "Savestate" : "Power on"); } + public override void SwitchToPlay() + { + _mode = Moviemode.Play; + } + /// /// Removes lag log and greenzone after this frame /// diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs index 7462af80fa..1956584ae5 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs @@ -555,10 +555,10 @@ namespace BizHawk.Client.EmuHawk // // AutopauseAtEndOfMovieMenuItem // - this.AutopauseAtEndOfMovieMenuItem.Enabled = false; this.AutopauseAtEndOfMovieMenuItem.Name = "AutopauseAtEndOfMovieMenuItem"; this.AutopauseAtEndOfMovieMenuItem.Size = new System.Drawing.Size(288, 22); this.AutopauseAtEndOfMovieMenuItem.Text = "Autopause at end of Movie"; + this.AutopauseAtEndOfMovieMenuItem.Click += new System.EventHandler(this.AutopauseAtEndMenuItem_Click); // // MetaSubMenu // diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 728a395197..665508eb58 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; +using System.ComponentModel; using BizHawk.Client.Common; using BizHawk.Client.Common.MovieConversionExtensions; @@ -96,6 +97,7 @@ namespace BizHawk.Client.EmuHawk private void NewTasMovie() { Global.MovieSession.Movie = new TasMovie(); + _currentTasMovie.PropertyChanged += TasMovie_OnPropertyChanged; _currentTasMovie = Global.MovieSession.Movie as TasMovie; _currentTasMovie.Filename = DefaultTasProjName(); // TODO don't do this, take over any mainform actions that can crash without a filename _currentTasMovie.PopulateWithDefaultHeaderValues(); @@ -126,10 +128,11 @@ namespace BizHawk.Client.EmuHawk { if (AskSaveChanges()) { - var movie = new TasMovie + var movie = new TasMovie() { Filename = path }; + movie.PropertyChanged += TasMovie_OnPropertyChanged; var file = new FileInfo(path); if (!file.Exists) @@ -287,7 +290,15 @@ namespace BizHawk.Client.EmuHawk _currentTasMovie.SwitchToPlay(); // TODO: stop copy/pasting this logic Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(_currentTasMovie[_currentTasMovie.LastEmulatedFrame].State.ToArray()))); GlobalWin.MainForm.UnpauseEmulator(); - GlobalWin.MainForm.PauseOnFrame = frame; + if(Global.Config.TAStudioAutoPause) + { + GlobalWin.MainForm.PauseOnFrame = _currentTasMovie.LastEmulatedFrame; + } + else + { + GlobalWin.MainForm.PauseOnFrame = frame; + } + } RefreshDialog(); @@ -337,18 +348,18 @@ namespace BizHawk.Client.EmuHawk // TODO: columns selected // TODO: clipboard var list = TasView.SelectedIndices; - string message; + string message = "Selected: "; if (list.Count > 0) { - message = list.Count + " rows, 0 col, clipboard: "; + message += list.Count + " rows 0 col, Clipboard: "; } else { - message = list.Count + " selected: none, clipboard: "; + message += list.Count + " none, Clipboard: "; } - message += _tasClipboard.Any() ? _tasClipboard.Count.ToString() : "empty"; + message += _tasClipboard.Any() ? _tasClipboard.Count.ToString() + " rows 0 col": "empty"; SplicerStatusLabel.Text = message; } @@ -798,6 +809,7 @@ namespace BizHawk.Client.EmuHawk private void ConfigSubMenu_DropDownOpened(object sender, EventArgs e) { DrawInputByDraggingMenuItem.Checked = Global.Config.TAStudioDrawInput; + AutopauseAtEndOfMovieMenuItem.Checked = Global.Config.TAStudioAutoPause; } private void DrawInputByDraggingMenuItem_Click(object sender, EventArgs e) @@ -806,6 +818,11 @@ namespace BizHawk.Client.EmuHawk TasView.InputPaintingMode = Global.Config.TAStudioDrawInput ^= true; } + private void AutopauseAtEndMenuItem_Click(object sender, EventArgs e) + { + Global.Config.TAStudioAutoPause ^= true; + } + #endregion #region Metadata @@ -954,6 +971,20 @@ namespace BizHawk.Client.EmuHawk } } + //This method is called everytime the Changes property is toggled on a TasMovie instance. + private void TasMovie_OnPropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (_currentTasMovie.Changes) + { + + Text += "*"; + } + else + { + Text = Text.Replace("*", ""); + } + } + #endregion #endregion