TAStudio: -Fix: Undo/Redo didn't always jump back to valid frame.

-Performance boosts with multiple selected rows
This commit is contained in:
Suuper 2015-07-25 22:42:50 -05:00
parent 7a0103963d
commit f72eadb76e
7 changed files with 68 additions and 38 deletions

View File

@ -164,7 +164,7 @@ namespace BizHawk.Client.Common
if (!batch.Where(a => a.GetType() != typeof(MovieActionMarker)).Any()) if (!batch.Where(a => a.GetType() != typeof(MovieActionMarker)).Any())
return Movie.InputLogLength; return Movie.InputLogLength;
return PreviousUndoFrame; return PreviousRedoFrame;
} }
public bool CanUndo { get { return UndoIndex > -1; } } public bool CanUndo { get { return UndoIndex > -1; } }
@ -180,7 +180,7 @@ namespace BizHawk.Client.Common
if (History[UndoIndex + 1].Count == 0) if (History[UndoIndex + 1].Count == 0)
return Movie.InputLogLength; return Movie.InputLogLength;
return History[UndoIndex + 1].Max(a => a.FirstFrame); return History[UndoIndex + 1].Min(a => a.FirstFrame);
} }
} }
public int PreviousRedoFrame public int PreviousRedoFrame
@ -193,7 +193,7 @@ namespace BizHawk.Client.Common
if (History[UndoIndex].Count == 0) if (History[UndoIndex].Count == 0)
return Movie.InputLogLength; return Movie.InputLogLength;
return History[UndoIndex].Max(a => a.FirstFrame); return History[UndoIndex].Min(a => a.FirstFrame);
} }
} }

View File

@ -61,7 +61,7 @@ namespace BizHawk.Client.EmuHawk
{ {
get get
{ {
if (BranchView.SelectedRows.Any()) if (BranchView.AnyRowsSelected)
{ {
return Branches[BranchView.SelectedRows.First()]; return Branches[BranchView.SelectedRows.First()];
} }

View File

@ -18,7 +18,7 @@ namespace BizHawk.Client.EmuHawk
public class InputRoll : Control public class InputRoll : Control
{ {
private readonly GDIRenderer Gdi; private readonly GDIRenderer Gdi;
private readonly List<Cell> SelectedItems = new List<Cell>(); private readonly SortedSet<Cell> SelectedItems = new SortedSet<Cell>(new sortCell());
private readonly VScrollBar VBar; private readonly VScrollBar VBar;
private readonly HScrollBar HBar; private readonly HScrollBar HBar;
@ -448,8 +448,8 @@ namespace BizHawk.Client.EmuHawk
} }
else else
{ {
var items = SelectedItems.Where(cell => cell.RowIndex == index); IEnumerable<Cell> items = SelectedItems.Where(cell => cell.RowIndex == index);
SelectedItems.RemoveAll(items.Contains); SelectedItems.RemoveWhere(items.Contains);
} }
} }
} }
@ -471,7 +471,7 @@ namespace BizHawk.Client.EmuHawk
} }
public void TruncateSelection(int index) public void TruncateSelection(int index)
{ {
SelectedItems.RemoveAll(cell => cell.RowIndex > index); SelectedItems.RemoveWhere(cell => cell.RowIndex > index);
} }
[Browsable(false)] [Browsable(false)]
@ -490,11 +490,9 @@ namespace BizHawk.Client.EmuHawk
{ {
get get
{ {
if (SelectedRows.Any()) if (AnyRowsSelected)
{ {
return SelectedRows return SelectedRows.Min();
.OrderBy(x => x)
.First();
} }
return null; return null;
@ -507,11 +505,9 @@ namespace BizHawk.Client.EmuHawk
{ {
get get
{ {
if (SelectedRows.Any()) if (AnyRowsSelected)
{ {
return SelectedRows return SelectedRows.Max();
.OrderBy(x => x)
.Last();
} }
return null; return null;
@ -852,6 +848,13 @@ namespace BizHawk.Client.EmuHawk
.Distinct(); .Distinct();
} }
} }
public bool AnyRowsSelected
{
get
{
return SelectedItems.Any(cell => cell.RowIndex.HasValue);
}
}
public void ClearSelectedRows() public void ClearSelectedRows()
{ {
@ -998,7 +1001,7 @@ namespace BizHawk.Client.EmuHawk
private void DrawData(PaintEventArgs e) private void DrawData(PaintEventArgs e)
{ {
var columns = _columns.VisibleColumns.ToList(); List<RollColumn> columns = _columns.VisibleColumns.ToList();
if (QueryItemText != null) if (QueryItemText != null)
{ {
if (HorizontalOrientation) if (HorizontalOrientation)
@ -1300,12 +1303,12 @@ namespace BizHawk.Client.EmuHawk
{ {
// SuuperW: This allows user to see other colors in selected frames. // SuuperW: This allows user to see other colors in selected frames.
Color Highlight_Color = new Color(); Color Highlight_Color = new Color();
foreach (var cell in SelectedItems) foreach (Cell cell in SelectedItems)
{ {
if (cell.RowIndex > LastVisibleRow || cell.RowIndex < FirstVisibleRow) if (cell.RowIndex > LastVisibleRow || cell.RowIndex < FirstVisibleRow)
continue; continue;
var relativeCell = new Cell Cell relativeCell = new Cell
{ {
RowIndex = cell.RowIndex - FirstVisibleRow, RowIndex = cell.RowIndex - FirstVisibleRow,
Column = cell.Column, Column = cell.Column,
@ -1366,7 +1369,7 @@ namespace BizHawk.Client.EmuHawk
/// <param name="e"></param> /// <param name="e"></param>
private void DoBackGroundCallback(PaintEventArgs e) private void DoBackGroundCallback(PaintEventArgs e)
{ {
var columns = _columns.VisibleColumns.ToList(); List<RollColumn> columns = _columns.VisibleColumns.ToList();
if (HorizontalOrientation) if (HorizontalOrientation)
{ {
@ -2588,6 +2591,33 @@ namespace BizHawk.Client.EmuHawk
} }
} }
private class sortCell : IComparer<Cell>
{
int IComparer<Cell>.Compare(Cell a, Cell b)
{
Cell c1 = a as Cell;
Cell c2 = b as Cell;
if (c1.RowIndex.HasValue)
{
if (c2.RowIndex.HasValue)
{
int row = c1.RowIndex.Value.CompareTo(c2.RowIndex.Value);
if (row == 0)
{
return c1.Column.Name.CompareTo(c2.Column.Name);
}
else
return row;
}
else
return 1;
}
else if (c2.RowIndex.HasValue)
return -1;
else
return c1.Column.Name.CompareTo(c2.Column.Name);
}
}
#endregion #endregion
} }
} }

View File

@ -156,7 +156,7 @@ namespace BizHawk.Client.EmuHawk
public void EditMarker() public void EditMarker()
{ {
if (MarkerView.SelectedRows.Any()) if (MarkerView.AnyRowsSelected)
{ {
var index = MarkerView.SelectedRows.First(); var index = MarkerView.SelectedRows.First();
var marker = Tastudio.CurrentTasMovie.Markers[index]; var marker = Tastudio.CurrentTasMovie.Markers[index];
@ -179,7 +179,7 @@ namespace BizHawk.Client.EmuHawk
public int SelectedMarkerFrame() public int SelectedMarkerFrame()
{ {
if (MarkerView.SelectedRows.Any()) if (MarkerView.AnyRowsSelected)
{ {
var index = MarkerView.SelectedRows.First(); var index = MarkerView.SelectedRows.First();
var marker = Tastudio.CurrentTasMovie.Markers[index]; var marker = Tastudio.CurrentTasMovie.Markers[index];

View File

@ -228,7 +228,7 @@ namespace BizHawk.Client.EmuHawk
private void TasView_ColumnClick(object sender, InputRoll.ColumnClickEventArgs e) private void TasView_ColumnClick(object sender, InputRoll.ColumnClickEventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
var columnName = e.Column.Name; var columnName = e.Column.Name;

View File

@ -123,7 +123,7 @@ namespace BizHawk.Client.EmuHawk
if (TasView.LastSelectedIndex == CurrentTasMovie.InputLogLength) if (TasView.LastSelectedIndex == CurrentTasMovie.InputLogLength)
TasView.SelectRow(CurrentTasMovie.InputLogLength, false); TasView.SelectRow(CurrentTasMovie.InputLogLength, false);
if (!TasView.SelectedRows.Any()) if (!TasView.AnyRowsSelected)
return; return;
MovieZone macro = new MovieZone(CurrentTasMovie, TasView.FirstSelectedIndex.Value, MovieZone macro = new MovieZone(CurrentTasMovie, TasView.FirstSelectedIndex.Value,
@ -132,7 +132,7 @@ namespace BizHawk.Client.EmuHawk
} }
private void placeMacroAtSelectionToolStripMenuItem_Click(object sender, EventArgs e) private void placeMacroAtSelectionToolStripMenuItem_Click(object sender, EventArgs e)
{ {
if (!TasView.SelectedRows.Any()) if (!TasView.AnyRowsSelected)
return; return;
MovieZone macro = MacroInputTool.LoadMacro(); MovieZone macro = MacroInputTool.LoadMacro();
@ -207,7 +207,7 @@ namespace BizHawk.Client.EmuHawk
DeleteFramesMenuItem.Enabled = DeleteFramesMenuItem.Enabled =
CloneMenuItem.Enabled = CloneMenuItem.Enabled =
TruncateMenuItem.Enabled = TruncateMenuItem.Enabled =
TasView.SelectedRows.Any(); TasView.AnyRowsSelected;
ReselectClipboardMenuItem.Enabled = ReselectClipboardMenuItem.Enabled =
PasteMenuItem.Enabled = PasteMenuItem.Enabled =
PasteInsertMenuItem.Enabled = PasteInsertMenuItem.Enabled =
@ -235,7 +235,7 @@ namespace BizHawk.Client.EmuHawk
private void SelectBetweenMarkersMenuItem_Click(object sender, EventArgs e) private void SelectBetweenMarkersMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
var prevMarker = CurrentTasMovie.Markers.PreviousOrCurrent(TasView.LastSelectedIndex.Value); var prevMarker = CurrentTasMovie.Markers.PreviousOrCurrent(TasView.LastSelectedIndex.Value);
var nextMarker = CurrentTasMovie.Markers.Next(TasView.LastSelectedIndex.Value); var nextMarker = CurrentTasMovie.Markers.Next(TasView.LastSelectedIndex.Value);
@ -265,7 +265,7 @@ namespace BizHawk.Client.EmuHawk
private void CopyMenuItem_Click(object sender, EventArgs e) private void CopyMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
_tasClipboard.Clear(); _tasClipboard.Clear();
var list = TasView.SelectedRows.ToList(); var list = TasView.SelectedRows.ToList();
@ -348,7 +348,7 @@ namespace BizHawk.Client.EmuHawk
private void CutMenuItem_Click(object sender, EventArgs e) private void CutMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
var wasPaused = GlobalWin.MainForm.EmulatorPaused; var wasPaused = GlobalWin.MainForm.EmulatorPaused;
var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
@ -392,7 +392,7 @@ namespace BizHawk.Client.EmuHawk
private void ClearMenuItem_Click(object sender, EventArgs e) private void ClearMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
bool wasPaused = GlobalWin.MainForm.EmulatorPaused; bool wasPaused = GlobalWin.MainForm.EmulatorPaused;
bool needsToRollback = !(TasView.FirstSelectedIndex > Emulator.Frame); bool needsToRollback = !(TasView.FirstSelectedIndex > Emulator.Frame);
@ -426,7 +426,7 @@ namespace BizHawk.Client.EmuHawk
private void DeleteFramesMenuItem_Click(object sender, EventArgs e) private void DeleteFramesMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
var wasPaused = GlobalWin.MainForm.EmulatorPaused; var wasPaused = GlobalWin.MainForm.EmulatorPaused;
var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
@ -461,7 +461,7 @@ namespace BizHawk.Client.EmuHawk
private void CloneMenuItem_Click(object sender, EventArgs e) private void CloneMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
var wasPaused = GlobalWin.MainForm.EmulatorPaused; var wasPaused = GlobalWin.MainForm.EmulatorPaused;
var framesToInsert = TasView.SelectedRows.ToList(); var framesToInsert = TasView.SelectedRows.ToList();
@ -496,7 +496,7 @@ namespace BizHawk.Client.EmuHawk
private void InsertFrameMenuItem_Click(object sender, EventArgs e) private void InsertFrameMenuItem_Click(object sender, EventArgs e)
{ {
var wasPaused = GlobalWin.MainForm.EmulatorPaused; var wasPaused = GlobalWin.MainForm.EmulatorPaused;
var insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0; var insertionFrame = TasView.AnyRowsSelected ? TasView.FirstSelectedIndex.Value : 0;
var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
CurrentTasMovie.InsertEmptyFrame(insertionFrame); CurrentTasMovie.InsertEmptyFrame(insertionFrame);
@ -522,7 +522,7 @@ namespace BizHawk.Client.EmuHawk
private void InsertNumFramesMenuItem_Click(object sender, EventArgs e) private void InsertNumFramesMenuItem_Click(object sender, EventArgs e)
{ {
bool wasPaused = GlobalWin.MainForm.EmulatorPaused; bool wasPaused = GlobalWin.MainForm.EmulatorPaused;
int insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0; int insertionFrame = TasView.AnyRowsSelected ? TasView.FirstSelectedIndex.Value : 0;
bool needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; bool needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
FramesPrompt framesPrompt = new FramesPrompt(); FramesPrompt framesPrompt = new FramesPrompt();
@ -552,7 +552,7 @@ namespace BizHawk.Client.EmuHawk
private void TruncateMenuItem_Click(object sender, EventArgs e) private void TruncateMenuItem_Click(object sender, EventArgs e)
{ {
if (TasView.SelectedRows.Any()) if (TasView.AnyRowsSelected)
{ {
var rollbackFrame = TasView.LastSelectedIndex.Value; var rollbackFrame = TasView.LastSelectedIndex.Value;
var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame;
@ -981,7 +981,7 @@ namespace BizHawk.Client.EmuHawk
InsertFrameContextMenuItem.Enabled = InsertFrameContextMenuItem.Enabled =
InsertNumFramesContextMenuItem.Enabled = InsertNumFramesContextMenuItem.Enabled =
TruncateContextMenuItem.Enabled = TruncateContextMenuItem.Enabled =
TasView.SelectedRows.Any(); TasView.AnyRowsSelected;
StartFromNowSeparator.Visible = StartFromNowSeparator.Visible =
StartNewProjectFromNowMenuItem.Visible = StartNewProjectFromNowMenuItem.Visible =

View File

@ -469,7 +469,7 @@ namespace BizHawk.Client.EmuHawk
} }
private void DummyLoadMacro(string path) private void DummyLoadMacro(string path)
{ {
if (!TasView.SelectedRows.Any()) if (!TasView.AnyRowsSelected)
return; return;
MovieZone loadZone = new MovieZone(path); MovieZone loadZone = new MovieZone(path);
@ -803,7 +803,7 @@ namespace BizHawk.Client.EmuHawk
EditMarkerContextMenuItem.Enabled = EditMarkerContextMenuItem.Enabled =
RemoveMarkerContextMenuItem.Enabled = RemoveMarkerContextMenuItem.Enabled =
ScrollToMarkerToolStripMenuItem.Enabled = ScrollToMarkerToolStripMenuItem.Enabled =
MarkerControl.MarkerInputRoll.SelectedRows.Any(); MarkerControl.MarkerInputRoll.AnyRowsSelected;
} }
private void ScrollToMarkerToolStripMenuItem_Click(object sender, EventArgs e) private void ScrollToMarkerToolStripMenuItem_Click(object sender, EventArgs e)