-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:
parent
4cb72c43ec
commit
bff3d64a4a
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue