-Various fixes, mostly to Undo/Redo.

-Changed Program.cs to not use a couple try statements when debugger is attached.
-Implemented the Undo/Redo menu item buttons.
-Ctrl-deselecting frames in TasView now supports dragging.
This commit is contained in:
SuuperW 2015-03-01 19:29:33 +00:00
parent 4cb72c43ec
commit bff3d64a4a
8 changed files with 224 additions and 83 deletions

View File

@ -78,9 +78,10 @@ namespace BizHawk.Client.Common
{
if (frames.Any())
{
ChangeLog.AddGeneralUndo(frames.Min(), frames.Max());
var invalidateAfter = frames.Min();
ChangeLog.AddGeneralUndo(invalidateAfter, InputLogLength - 1);
var invalidateAfter = frames.Min(x => x);
foreach (var frame in frames.OrderByDescending(x => x)) // Removin them in reverse order allows us to remove by index;
{
_log.RemoveAt(frame);
@ -92,10 +93,22 @@ namespace BizHawk.Client.Common
ChangeLog.SetGeneralRedo();
}
}
public void RemoveFrames(int removeStart, int removeUpTo)
{
ChangeLog.AddGeneralUndo(removeStart, InputLogLength - 1);
for (int i = removeUpTo - 1; i >= removeStart; i--)
_log.RemoveAt(i);
Changes = true;
InvalidateAfter(removeStart);
ChangeLog.SetGeneralRedo();
}
public void InsertInput(int frame, IEnumerable<string> inputLog)
{
ChangeLog.AddGeneralUndo(frame, frame + inputLog.Count() - 1);
ChangeLog.AddGeneralUndo(frame, InputLogLength + inputLog.Count() - 1);
_log.InsertRange(frame, inputLog);
Changes = true;
@ -106,7 +119,7 @@ namespace BizHawk.Client.Common
public void InsertInput(int frame, IEnumerable<IController> inputStates)
{
ChangeLog.AddGeneralUndo(frame, frame + inputStates.Count() - 1);
ChangeLog.AddGeneralUndo(frame, InputLogLength + inputStates.Count() - 1);
var lg = LogGeneratorInstance();
@ -143,7 +156,7 @@ namespace BizHawk.Client.Common
public void InsertEmptyFrame(int frame, int count = 1)
{
ChangeLog.AddGeneralUndo(frame, frame + count - 1);
ChangeLog.AddGeneralUndo(frame, InputLogLength + count - 1);
var lg = LogGeneratorInstance();
lg.SetSource(Global.MovieSession.MovieControllerInstance());

View File

@ -59,6 +59,7 @@ namespace BizHawk.Client.Common
}
/// <summary>
/// Ends the current undo batch. Future changes will be one undo each.
/// If not already recording a batch, does (essentially) nothing.
/// </summary>
public void EndBatch()
{
@ -110,6 +111,9 @@ namespace BizHawk.Client.Common
return PreviousUndoFrame;
}
public bool CanUndo { get { return UndoIndex > -1; } }
public bool CanRedo { get { return UndoIndex < History.Count - 1; } }
public int PreviousUndoFrame
{
get
@ -117,6 +121,9 @@ namespace BizHawk.Client.Common
if (UndoIndex == History.Count - 1)
return Movie.InputLogLength;
if (History[UndoIndex + 1].Count == 0)
return Movie.InputLogLength;
return History[UndoIndex + 1].Max(a => a.FirstFrame);
}
}
@ -127,6 +134,9 @@ namespace BizHawk.Client.Common
if (UndoIndex == -1)
return Movie.InputLogLength;
if (History[UndoIndex].Count == 0)
return Movie.InputLogLength;
return History[UndoIndex].Max(a => a.FirstFrame);
}
}
@ -246,7 +256,7 @@ namespace BizHawk.Client.Common
movie.SetFrame(FirstFrame + i, oldLog[i]);
if (undoLength != length)
movie.Truncate(FirstFrame + undoLength);
movie.RemoveFrames(FirstFrame + undoLength, movie.InputLogLength);
movie.ChangeLog.AutoRecord = wasRecording;
}
@ -262,7 +272,7 @@ namespace BizHawk.Client.Common
movie.SetFrame(FirstFrame + i, newLog[i]);
if (redoLength != length)
movie.Truncate(FirstFrame + redoLength);
movie.RemoveFrames(FirstFrame + redoLength, movie.InputLogLength);
movie.ChangeLog.AutoRecord = wasRecording;
}

View File

@ -84,7 +84,7 @@ namespace BizHawk.Client.EmuHawk
GlobalWin.CR_GL = GlobalWin.GLManager.GetContextForIGL(GlobalWin.GL);
//now create the "GL" context for the display method. we can reuse the IGL_TK context if opengl display method is chosen
REDO_DISPMETHOD:
REDO_DISPMETHOD:
if (Global.Config.DispMethod == Config.EDispMethod.GdiPlus)
GlobalWin.GL = new Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus();
else if (Global.Config.DispMethod == Config.EDispMethod.SlimDX9)
@ -110,8 +110,8 @@ REDO_DISPMETHOD:
string dllDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll");
SetDllDirectory(dllDir);
try
{
if (System.Diagnostics.Debugger.IsAttached)
{ // Let the debugger handle errors
#if WINDOWS
if (Global.Config.SingleInstanceMode)
{
@ -125,64 +125,100 @@ REDO_DISPMETHOD:
}
}
else
{
#endif
{
using (var mf = new MainForm(args))
{
var title = mf.Text;
mf.Show();
mf.Text = title;
mf.ProgramRunLoop();
}
}
}
else
{ // Display error message windows
try
{
#if WINDOWS
if (Global.Config.SingleInstanceMode)
{
try
{
mf.ProgramRunLoop();
new SingleInstanceController(args).Run(args);
}
catch (Exception e)
catch (ObjectDisposedException)
{
#if WINDOWS
if (!VersionInfo.DeveloperBuild && Global.MovieSession.Movie.IsActive)
{
var result = MessageBox.Show(
"EmuHawk has thrown a fatal exception and is about to close.\nA movie has been detected. Would you like to try to save?\n(Note: Depending on what caused this error, this may or may succeed)",
"Fatal error: " + e.GetType().Name,
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation
);
if (result == DialogResult.Yes)
{
Global.MovieSession.Movie.Save();
}
}
#endif
throw;
/*Eat it, MainForm disposed itself and Run attempts to dispose of itself. Eventually we would want to figure out a way to prevent that, but in the meantime it is harmless, so just eat the error*/
}
}
#if WINDOWS
}
else
#endif
}
catch (Exception e)
{
string message = e.ToString();
if (e.InnerException != null)
{
message += "\n\nInner Exception:\n\n" + e.InnerException;
}
{
using (var mf = new MainForm(args))
{
var title = mf.Text;
mf.Show();
mf.Text = title;
message += "\n\nStackTrace:\n" + e.StackTrace;
MessageBox.Show(message);
}
if (System.Diagnostics.Debugger.IsAttached)
{
mf.ProgramRunLoop();
}
else
{
try
{
mf.ProgramRunLoop();
}
catch (Exception e)
{
#if WINDOWS
finally
{
if (GlobalWin.Sound != null)
{
GlobalWin.Sound.Dispose();
GlobalWin.Sound = null;
}
GlobalWin.GL.Dispose();
GamePad.CloseAll();
}
if (!VersionInfo.DeveloperBuild && Global.MovieSession.Movie.IsActive)
{
var result = MessageBox.Show(
"EmuHawk has thrown a fatal exception and is about to close.\nA movie has been detected. Would you like to try to save?\n(Note: Depending on what caused this error, this may or may succeed)",
"Fatal error: " + e.GetType().Name,
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation
);
if (result == DialogResult.Yes)
{
Global.MovieSession.Movie.Save();
}
}
#endif
throw;
}
}
}
}
}
catch (Exception e)
{
string message = e.ToString();
if (e.InnerException != null)
{
message += "\n\nInner Exception:\n\n" + e.InnerException;
}
message += "\n\nStackTrace:\n" + e.StackTrace;
MessageBox.Show(message);
}
#if WINDOWS
finally
{
if (GlobalWin.Sound != null)
{
GlobalWin.Sound.Dispose();
GlobalWin.Sound = null;
}
GlobalWin.GL.Dispose();
GamePad.CloseAll();
}
#endif
}
}
//declared here instead of a more usual place to avoid dependencies on the more usual place
@ -276,7 +312,7 @@ REDO_DISPMETHOD:
MainForm.Show();
MainForm.Text = title;
(MainForm as MainForm).ProgramRunLoop();
}
}
}

View File

@ -128,6 +128,11 @@ namespace BizHawk.Client.EmuHawk
this.UngreenzoneContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.CancelSeekContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator();
this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pasteInsertToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.separateToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator();
this.ClearContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.DeleteFramesContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.CloneContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -287,11 +292,11 @@ namespace BizHawk.Client.EmuHawk
//
// UndoMenuItem
//
this.UndoMenuItem.Enabled = false;
this.UndoMenuItem.Name = "UndoMenuItem";
this.UndoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z)));
this.UndoMenuItem.Size = new System.Drawing.Size(282, 22);
this.UndoMenuItem.Text = "&Undo";
this.UndoMenuItem.Click += new System.EventHandler(this.UndoMenuItem_Click);
//
// RedoMenuItem
//
@ -300,6 +305,7 @@ namespace BizHawk.Client.EmuHawk
this.RedoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y)));
this.RedoMenuItem.Size = new System.Drawing.Size(282, 22);
this.RedoMenuItem.Text = "&Redo";
this.RedoMenuItem.Click += new System.EventHandler(this.RedoMenuItem_Click);
//
// SelectionUndoMenuItem
//
@ -680,7 +686,7 @@ namespace BizHawk.Client.EmuHawk
this.HideLagFrames0.CheckOnClick = true;
this.HideLagFrames0.CheckState = System.Windows.Forms.CheckState.Checked;
this.HideLagFrames0.Name = "HideLagFrames0";
this.HideLagFrames0.Size = new System.Drawing.Size(152, 22);
this.HideLagFrames0.Size = new System.Drawing.Size(131, 22);
this.HideLagFrames0.Tag = 0;
this.HideLagFrames0.Text = "Don\'t Hide";
this.HideLagFrames0.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -689,7 +695,7 @@ namespace BizHawk.Client.EmuHawk
//
this.HideLagFrames1.CheckOnClick = true;
this.HideLagFrames1.Name = "HideLagFrames1";
this.HideLagFrames1.Size = new System.Drawing.Size(152, 22);
this.HideLagFrames1.Size = new System.Drawing.Size(131, 22);
this.HideLagFrames1.Tag = 1;
this.HideLagFrames1.Text = "1 (30 fps)";
this.HideLagFrames1.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -697,7 +703,7 @@ namespace BizHawk.Client.EmuHawk
// HideLagFrames2
//
this.HideLagFrames2.Name = "HideLagFrames2";
this.HideLagFrames2.Size = new System.Drawing.Size(152, 22);
this.HideLagFrames2.Size = new System.Drawing.Size(131, 22);
this.HideLagFrames2.Tag = 2;
this.HideLagFrames2.Text = "2 (20 fps)";
this.HideLagFrames2.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -706,7 +712,7 @@ namespace BizHawk.Client.EmuHawk
//
this.HideLagFrames3.CheckOnClick = true;
this.HideLagFrames3.Name = "HideLagFrames3";
this.HideLagFrames3.Size = new System.Drawing.Size(152, 22);
this.HideLagFrames3.Size = new System.Drawing.Size(131, 22);
this.HideLagFrames3.Tag = 3;
this.HideLagFrames3.Text = "3 (15fps)";
this.HideLagFrames3.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -889,6 +895,11 @@ namespace BizHawk.Client.EmuHawk
this.UngreenzoneContextMenuItem,
this.CancelSeekContextMenuItem,
this.toolStripSeparator17,
this.copyToolStripMenuItem,
this.pasteToolStripMenuItem,
this.pasteInsertToolStripMenuItem,
this.cutToolStripMenuItem,
this.separateToolStripMenuItem,
this.ClearContextMenuItem,
this.DeleteFramesContextMenuItem,
this.CloneContextMenuItem,
@ -899,7 +910,7 @@ namespace BizHawk.Client.EmuHawk
this.StartFromNowSeparator,
this.StartNewProjectFromNowMenuItem});
this.RightClickMenu.Name = "RightClickMenu";
this.RightClickMenu.Size = new System.Drawing.Size(273, 320);
this.RightClickMenu.Size = new System.Drawing.Size(273, 414);
this.RightClickMenu.Opened += new System.EventHandler(this.RightClickMenu_Opened);
//
// SetMarkersContextMenuItem
@ -961,6 +972,43 @@ namespace BizHawk.Client.EmuHawk
this.toolStripSeparator17.Name = "toolStripSeparator17";
this.toolStripSeparator17.Size = new System.Drawing.Size(269, 6);
//
// copyToolStripMenuItem
//
this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";
this.copyToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+C";
this.copyToolStripMenuItem.Size = new System.Drawing.Size(272, 22);
this.copyToolStripMenuItem.Text = "Copy";
this.copyToolStripMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click);
//
// pasteToolStripMenuItem
//
this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem";
this.pasteToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+V";
this.pasteToolStripMenuItem.Size = new System.Drawing.Size(272, 22);
this.pasteToolStripMenuItem.Text = "Paste";
this.pasteToolStripMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click);
//
// pasteInsertToolStripMenuItem
//
this.pasteInsertToolStripMenuItem.Name = "pasteInsertToolStripMenuItem";
this.pasteInsertToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+Shift+V";
this.pasteInsertToolStripMenuItem.Size = new System.Drawing.Size(272, 22);
this.pasteInsertToolStripMenuItem.Text = "Paste Insert";
this.pasteInsertToolStripMenuItem.Click += new System.EventHandler(this.PasteInsertMenuItem_Click);
//
// cutToolStripMenuItem
//
this.cutToolStripMenuItem.Name = "cutToolStripMenuItem";
this.cutToolStripMenuItem.ShortcutKeyDisplayString = "Ctrl+X";
this.cutToolStripMenuItem.Size = new System.Drawing.Size(272, 22);
this.cutToolStripMenuItem.Text = "Cut";
this.cutToolStripMenuItem.Click += new System.EventHandler(this.CutMenuItem_Click);
//
// separateToolStripMenuItem
//
this.separateToolStripMenuItem.Name = "separateToolStripMenuItem";
this.separateToolStripMenuItem.Size = new System.Drawing.Size(269, 6);
//
// ClearContextMenuItem
//
this.ClearContextMenuItem.Name = "ClearContextMenuItem";
@ -1054,7 +1102,7 @@ namespace BizHawk.Client.EmuHawk
this.MinimumSize = new System.Drawing.Size(437, 148);
this.Name = "TAStudio";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "a";
this.Text = "TAStudio";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Tastudio_Closing);
this.Load += new System.EventHandler(this.Tastudio_Load);
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.TAStudio_DragDrop);
@ -1180,5 +1228,10 @@ namespace BizHawk.Client.EmuHawk
private System.Windows.Forms.ToolStripMenuItem HideLagFrames0;
private System.Windows.Forms.ToolStripMenuItem HideLagFrames1;
private System.Windows.Forms.ToolStripMenuItem HideLagFrames2;
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator separateToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem pasteInsertToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem;
}
}

View File

@ -16,6 +16,7 @@ namespace BizHawk.Client.EmuHawk
private float _floatPaintState;
private bool _startMarkerDrag;
private bool _startFrameDrag;
private bool _frameDragState;
private bool _supressContextMenu;
// SuuperW: For editing analog input
private string _floatEditColumn = string.Empty;
@ -287,6 +288,7 @@ namespace BizHawk.Client.EmuHawk
else if (TasView.CurrentCell.Column.Name == FrameColumnName)
{
_startFrameDrag = true;
_frameDragState = TasView.SelectedRows.Contains(frame);
}
else // User changed input
{
@ -297,6 +299,7 @@ namespace BizHawk.Client.EmuHawk
_triggerAutoRestoreFromFrame = TasView.CurrentCell.RowIndex.Value;
RefreshDialog();
CurrentTasMovie.ChangeLog.BeginNewBatch();
_startBoolDrawColumn = buttonName;
if (frame < CurrentTasMovie.InputLogLength)
@ -322,6 +325,7 @@ namespace BizHawk.Client.EmuHawk
if (e.Clicks != 2)
{
CurrentTasMovie.ChangeLog.BeginNewBatch();
_startFloatDrawColumn = buttonName;
}
else // Double-click enters float editing mode
@ -354,6 +358,8 @@ namespace BizHawk.Client.EmuHawk
{
_startMarkerDrag = false;
_startFrameDrag = false;
if (_startBoolDrawColumn != string.Empty || _startFloatDrawColumn != string.Empty)
CurrentTasMovie.ChangeLog.EndBatch();
_startBoolDrawColumn = string.Empty;
_startFloatDrawColumn = string.Empty;
// Exit float editing if value was changed with cursor
@ -443,9 +449,9 @@ namespace BizHawk.Client.EmuHawk
{
if (e.OldCell.RowIndex.HasValue && e.NewCell.RowIndex.HasValue)
{
for (var i = startVal; i < endVal; i++)
for (var i = startVal; i <= endVal; i++)
{
TasView.SelectRow(i, true);
TasView.SelectRow(i, _frameDragState);
}
TasView.Refresh();
@ -471,7 +477,7 @@ namespace BizHawk.Client.EmuHawk
{
for (var i = startVal; i <= endVal; i++) // SuuperW: <= so that it will edit the cell you are hovering over. (Inclusive)
{
if (i < CurrentTasMovie.InputLogLength) // TODO: how do we really want to handle the user setting the float state of the pending frame?
if (i < CurrentTasMovie.InputLogLength)
{
SetFloatValue(i, _startFloatDrawColumn, _floatPaintState); // Notice it uses new row, old column, you can only paint across a single column
_triggerAutoRestore = true;
@ -494,7 +500,8 @@ namespace BizHawk.Client.EmuHawk
float value = _floatPaintState + increment;
Emulation.Common.ControllerDefinition.FloatRange range = Global.MovieSession.MovieControllerAdapter.Type.FloatRanges
[Global.MovieSession.MovieControllerAdapter.Type.FloatControls.IndexOf(_floatEditColumn)];
// Range for N64 Y axis has max -128 and min 127. That should probably be fixed in ControllerDefinition.cs, but I'll put a quick fix here anyway.
// Range for N64 Y axis has max -128 and min 127. That should probably be fixed in ControllerDefinition.cs.
// SuuperW: I really don't think changing it would break anything, but adelikat isn't so sure.
float rMax = range.Max;
float rMin = range.Min;
if (rMax < rMin)
@ -539,16 +546,6 @@ namespace BizHawk.Client.EmuHawk
{
TasView.HorizontalOrientation ^= true;
}
else if (e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.Z) // Ctrl + Z
{
if (CurrentTasMovie.ChangeLog.Undo() < Emulator.Frame)
GoToFrame(CurrentTasMovie.ChangeLog.PreviousUndoFrame);
}
else if (e.Control && !e.Alt && !e.Shift && e.KeyCode == Keys.Y) // Ctrl + Y
{
if (CurrentTasMovie.ChangeLog.Redo() < Emulator.Frame)
GoToFrame(CurrentTasMovie.ChangeLog.PreviousRedoFrame);
}
// SuuperW: Float Editing
if (_floatEditRow != -1)
@ -638,7 +635,8 @@ namespace BizHawk.Client.EmuHawk
/// </summary>
private void TasView_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
e.IsInputKey = true;
if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
e.IsInputKey = true;
}
#endregion
}

View File

@ -135,6 +135,29 @@ namespace BizHawk.Client.EmuHawk
#region Edit
private void UndoMenuItem_Click(object sender, EventArgs e)
{
if (CurrentTasMovie.ChangeLog.Undo() < Emulator.Frame)
GoToFrame(CurrentTasMovie.ChangeLog.PreviousUndoFrame);
else
RefreshDialog();
// Currently I don't have a way to easily detect when CanUndo changes, so this button should be enabled always.
//UndoMenuItem.Enabled = CurrentTasMovie.ChangeLog.CanUndo;
RedoMenuItem.Enabled = CurrentTasMovie.ChangeLog.CanRedo;
}
private void RedoMenuItem_Click(object sender, EventArgs e)
{
if (CurrentTasMovie.ChangeLog.Redo() < Emulator.Frame)
GoToFrame(CurrentTasMovie.ChangeLog.PreviousRedoFrame);
else
RefreshDialog();
//UndoMenuItem.Enabled = CurrentTasMovie.ChangeLog.CanUndo;
RedoMenuItem.Enabled = CurrentTasMovie.ChangeLog.CanRedo;
}
private void EditSubMenu_DropDownOpened(object sender, EventArgs e)
{
DeselectMenuItem.Enabled =
@ -361,10 +384,14 @@ namespace BizHawk.Client.EmuHawk
if (TasView.SelectedRows.Any())
{
var wasPaused = GlobalWin.MainForm.EmulatorPaused;
var needsToRollback = !(TasView.FirstSelectedIndex > Emulator.Frame);
var needsToRollback = TasView.FirstSelectedIndex <= Emulator.Frame;
var rollBackFrame = TasView.FirstSelectedIndex.Value;
if (rollBackFrame >= CurrentTasMovie.InputLogLength)
{ // Cannot delete non-existant frames
RefreshDialog();
return;
}
_tasClipboard.Clear();
CurrentTasMovie.RemoveFrames(TasView.SelectedRows.ToArray());
SetSplicer();
@ -393,8 +420,8 @@ namespace BizHawk.Client.EmuHawk
{
var wasPaused = GlobalWin.MainForm.EmulatorPaused;
var framesToInsert = TasView.SelectedRows.ToList();
var insertionFrame = TasView.LastSelectedIndex.Value + 1;
var needsToRollback = !(insertionFrame > Emulator.Frame);
var insertionFrame = Math.Min(TasView.LastSelectedIndex.Value + 1, CurrentTasMovie.InputLogLength);
var needsToRollback = insertionFrame <= Emulator.Frame;
var inputLog = framesToInsert
.Select(frame => CurrentTasMovie.GetInputLogEntry(frame))
@ -509,7 +536,11 @@ namespace BizHawk.Client.EmuHawk
private void RemoveMarkersMenuItem_Click(object sender, EventArgs e)
{
CurrentTasMovie.Markers.RemoveAll(m => TasView.SelectedRows.Contains(m.Frame));
IEnumerable<TasMovieMarker> markers = CurrentTasMovie.Markers.Where(m => TasView.SelectedRows.Contains(m.Frame));
foreach (TasMovieMarker m in markers)
{
RemoveMarker(m);
}
RefreshDialog();
}

View File

@ -97,9 +97,7 @@ namespace BizHawk.Client.EmuHawk
CurrentTasMovie.SwitchToPlay();
// no reason to loadstate when we can emulate a frame instead
var shouldLoadstate = frame - Emulator.Frame != 1;
if (CurrentTasMovie.TasStateManager.LastEmulatedFrame > 0 && shouldLoadstate)
if (frame - Emulator.Frame != 1)
{
LoadState(CurrentTasMovie[CurrentTasMovie.TasStateManager.LastEmulatedFrame].State);
}

View File

@ -744,6 +744,7 @@ namespace BizHawk.Client.EmuHawk
MarkerControl.RemoveMarker();
}
// TODO: Move AddMarkerChange calls to TasMovieMarker.cs
public void AddMarker(int markerFrame, string message)
{
TasMovieMarker marker = new TasMovieMarker(markerFrame, message);
@ -761,5 +762,6 @@ namespace BizHawk.Client.EmuHawk
marker.Message = message;
CurrentTasMovie.ChangeLog.AddMarkerChange(marker, marker.Frame, old);
}
}
}