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:
parent
2fbdf059cb
commit
549b948ffd
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue