Tastudio - add a context menu "create new project from here", it will take the currently selected frame and create a savestate-anchored project on this frame (keeping any input after this frame), and load this new project.

This commit is contained in:
adelikat 2014-10-30 23:29:21 +00:00
parent 2fbdf059cb
commit 549b948ffd
6 changed files with 158 additions and 22 deletions

View File

@ -8,7 +8,7 @@ namespace BizHawk.Client.Common
{
public partial class Bk2Movie
{
protected readonly List<string> _log = new List<string>();
protected List<string> _log = new List<string>();
private string _logKey = string.Empty;
public string GetInputLog()

View File

@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Linq;
using BizHawk.Common.ReflectionExtensions;
using BizHawk.Emulation.Common;
@ -113,6 +114,71 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
return bk2;
}
public static TasMovie ConvertToSavestateAnchoredMovie(this TasMovie old, int frame, byte[] savestate)
{
string newFilename = old.Filename + "." + TasMovie.Extension;
if (File.Exists(newFilename))
{
int fileNum = 1;
bool fileConflict = true;
while (fileConflict)
{
if (File.Exists(newFilename))
{
newFilename = old.Filename + " (" + fileNum + ")" + "." + TasMovie.Extension;
fileNum++;
}
else
{
fileConflict = false;
}
}
}
var tas = new TasMovie(newFilename, true);
tas.BinarySavestate = savestate;
tas.TasStateManager.Clear();
tas.ClearLagLog();
tas.CopyLog(old.Log);
tas.DeleteLogBefore(frame);
tas.HeaderEntries.Clear();
foreach (var kvp in old.HeaderEntries)
{
tas.HeaderEntries[kvp.Key] = kvp.Value;
}
tas.StartsFromSavestate = true;
tas.SyncSettingsJson = old.SyncSettingsJson;
tas.Comments.Clear();
foreach (var comment in old.Comments)
{
tas.Comments.Add(comment);
}
tas.Subtitles.Clear();
foreach (var sub in old.Subtitles)
{
tas.Subtitles.Add(sub);
}
foreach(var marker in old.Markers)
{
if (marker.Frame > 0)
{
tas.Markers.Add(marker);
}
}
tas.TasStateManager.Settings = old.TasStateManager.Settings;
tas.Save();
return tas;
}
// TODO: This doesn't really belong here, but not sure where to put it
public static void PopulateWithDefaultHeaderValues(this IMovie movie, string author = null)
{

View File

@ -313,5 +313,32 @@ namespace BizHawk.Client.Common
return base.GetInputState(frame);
}
public void ClearLagLog()
{
LagLog.Clear();
}
public void DeleteLogBefore(int frame)
{
if (frame < _log.Count)
{
_log.RemoveRange(0, frame);
}
}
public List<string> Log
{
get { return _log; }
}
public void CopyLog(List<string> log)
{
_log.Clear();
foreach(var entry in log)
{
_log.Add(entry);
}
}
}
}

View File

@ -136,6 +136,8 @@ namespace BizHawk.Client.EmuHawk
this.InsertNumFramesContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator();
this.TruncateContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.StartFromNowSeparator = new System.Windows.Forms.ToolStripSeparator();
this.StartNewProjectFromNowMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.TASMenu.SuspendLayout();
this.TasStatusStrip.SuspendLayout();
@ -887,9 +889,11 @@ namespace BizHawk.Client.EmuHawk
this.InsertFrameContextMenuItem,
this.InsertNumFramesContextMenuItem,
this.toolStripSeparator18,
this.TruncateContextMenuItem});
this.TruncateContextMenuItem,
this.StartFromNowSeparator,
this.StartNewProjectFromNowMenuItem});
this.RightClickMenu.Name = "RightClickMenu";
this.RightClickMenu.Size = new System.Drawing.Size(273, 292);
this.RightClickMenu.Size = new System.Drawing.Size(273, 342);
this.RightClickMenu.Opened += new System.EventHandler(this.RightClickMenu_Opened);
//
// SetMarkersContextMenuItem
@ -1004,6 +1008,18 @@ namespace BizHawk.Client.EmuHawk
this.TruncateContextMenuItem.Text = "Truncate Movie";
this.TruncateContextMenuItem.Click += new System.EventHandler(this.TruncateMenuItem_Click);
//
// StartFromNowSeparator
//
this.StartFromNowSeparator.Name = "StartFromNowSeparator";
this.StartFromNowSeparator.Size = new System.Drawing.Size(269, 6);
//
// StartNewProjectFromNowMenuItem
//
this.StartNewProjectFromNowMenuItem.Name = "StartNewProjectFromNowMenuItem";
this.StartNewProjectFromNowMenuItem.Size = new System.Drawing.Size(272, 22);
this.StartNewProjectFromNowMenuItem.Text = "Start a new project from Here";
this.StartNewProjectFromNowMenuItem.Click += new System.EventHandler(this.StartNewProjectFromNowMenuItem_Click);
//
// groupBox1
//
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@ -1157,5 +1173,7 @@ namespace BizHawk.Client.EmuHawk
private System.Windows.Forms.ToolStripMenuItem EditMarkerContextMenuItem;
private System.Windows.Forms.ToolStripMenuItem AddMarkerContextMenuItem;
private System.Windows.Forms.ToolStripMenuItem RemoveMarkerContextMenuItem;
private System.Windows.Forms.ToolStripSeparator StartFromNowSeparator;
private System.Windows.Forms.ToolStripMenuItem StartNewProjectFromNowMenuItem;
}
}

View File

@ -694,12 +694,56 @@ namespace BizHawk.Client.EmuHawk
#region Context Menu
private void RightClickMenu_Opened(object sender, EventArgs e)
{
SetMarkersContextMenuItem.Enabled =
SelectBetweenMarkersContextMenuItem.Enabled =
RemoveMarkersContextMenuItem.Enabled =
DeselectContextMenuItem.Enabled =
ClearContextMenuItem.Enabled =
DeleteFramesContextMenuItem.Enabled =
CloneContextMenuItem.Enabled =
InsertFrameContextMenuItem.Enabled =
InsertNumFramesContextMenuItem.Enabled =
TruncateContextMenuItem.Enabled =
TasView.SelectedRows.Any();
StartFromNowSeparator.Visible =
StartNewProjectFromNowMenuItem.Visible =
TasView.SelectedRows.Count() == 1 &&
!CurrentTasMovie.StartsFromSavestate;
RemoveMarkersContextMenuItem.Enabled = CurrentTasMovie.Markers.Any(m => TasView.SelectedRows.Contains(m.Frame)); // Disable the option to remove markers if no markers are selected (FCEUX does this).
CancelSeekContextMenuItem.Enabled = GlobalWin.MainForm.PauseOnFrame.HasValue;
}
private void CancelSeekContextMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.MainForm.PauseOnFrame = null;
TasView.Refresh();
}
private void StartNewProjectFromNowMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Count() == 1 &&
!CurrentTasMovie.StartsFromSavestate)
{
if (AskSaveChanges())
{
var index = TasView.SelectedRows.First();
GoToFrame(index);
var newProject = CurrentTasMovie.ConvertToSavestateAnchoredMovie(
index,
(byte[])Global.Emulator.SaveStateBinary().Clone());
GlobalWin.MainForm.PauseEmulator();
LoadProject(newProject.Filename);
}
}
}
#endregion
}
}

View File

@ -605,25 +605,6 @@ namespace BizHawk.Client.EmuHawk
SetTextProperty();
}
private void RightClickMenu_Opened(object sender, EventArgs e)
{
SetMarkersContextMenuItem.Enabled =
SelectBetweenMarkersContextMenuItem.Enabled =
RemoveMarkersContextMenuItem.Enabled =
DeselectContextMenuItem.Enabled =
ClearContextMenuItem.Enabled =
DeleteFramesContextMenuItem.Enabled =
CloneContextMenuItem.Enabled =
InsertFrameContextMenuItem.Enabled =
InsertNumFramesContextMenuItem.Enabled =
TruncateContextMenuItem.Enabled =
TasView.SelectedRows.Any();
RemoveMarkersContextMenuItem.Enabled = CurrentTasMovie.Markers.Any(m => TasView.SelectedRows.Contains(m.Frame)); // Disable the option to remove markers if no markers are selected (FCEUX does this).
CancelSeekContextMenuItem.Enabled = GlobalWin.MainForm.PauseOnFrame.HasValue;
}
private void TAStudio_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None;