2014-10-17 17:58:48 +00:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
using System.Text ;
using System.Windows.Forms ;
using BizHawk.Client.Common ;
using BizHawk.Client.Common.MovieConversionExtensions ;
using BizHawk.Client.EmuHawk.ToolExtensions ;
2014-11-15 15:36:22 +00:00
using BizHawk.Client.EmuHawk.WinFormExtensions ;
2014-10-17 17:58:48 +00:00
namespace BizHawk.Client.EmuHawk
{
public partial class TAStudio
{
#region File Menu
private void FileSubMenu_DropDownOpened ( object sender , EventArgs e )
{
2014-10-20 19:04:59 +00:00
ToBk2MenuItem . Enabled =
2014-10-20 21:26:01 +00:00
! string . IsNullOrWhiteSpace ( CurrentTasMovie . Filename ) & &
( CurrentTasMovie . Filename ! = DefaultTasProjName ( ) ) ;
2014-10-18 15:50:12 +00:00
SaveTASMenuItem . Enabled =
2014-10-20 19:04:59 +00:00
! string . IsNullOrWhiteSpace ( CurrentTasMovie . Filename ) & &
( CurrentTasMovie . Filename ! = DefaultTasProjName ( ) ) ;
2016-02-20 12:27:41 +00:00
SaveTASMenuItem . Enabled =
SaveAsTASMenuItem . Enabled =
! _saveBackgroundWorker . IsBusy ;
2014-10-17 17:58:48 +00:00
}
private void RecentSubMenu_DropDownOpened ( object sender , EventArgs e )
{
RecentSubMenu . DropDownItems . Clear ( ) ;
RecentSubMenu . DropDownItems . AddRange (
2015-01-01 18:24:35 +00:00
Settings . RecentTas . RecentMenu ( DummyLoadProject , true ) ) ;
2014-10-17 17:58:48 +00:00
}
private void NewTasMenuItem_Click ( object sender , EventArgs e )
{
2014-10-20 00:31:05 +00:00
if ( GlobalWin . MainForm . GameIsClosing )
{
Close ( ) ;
}
else
{
StartNewTasMovie ( ) ;
}
2014-10-17 17:58:48 +00:00
}
private void OpenTasMenuItem_Click ( object sender , EventArgs e )
{
if ( AskSaveChanges ( ) )
{
2014-10-20 19:04:59 +00:00
var filename = CurrentTasMovie . Filename ;
2014-10-18 15:50:12 +00:00
if ( string . IsNullOrWhiteSpace ( filename ) | | filename = = DefaultTasProjName ( ) )
{
2015-09-06 01:39:57 +00:00
filename = string . Empty ;
2014-10-18 15:50:12 +00:00
}
2016-01-31 01:24:30 +00:00
var file = OpenFileDialog (
2015-09-06 01:39:57 +00:00
filename ,
PathManager . MakeAbsolutePath ( Global . Config . PathEntries . MoviesPathFragment , null ) ,
"Tas Project Files" ,
"tasproj" ) ;
2014-10-17 17:58:48 +00:00
if ( file ! = null )
{
2014-10-21 13:12:12 +00:00
LoadFile ( file ) ;
2014-10-17 17:58:48 +00:00
}
}
}
2015-01-06 16:35:22 +00:00
private bool _exiting = false ;
2014-10-17 17:58:48 +00:00
private void SaveTasMenuItem_Click ( object sender , EventArgs e )
{
2014-10-20 19:04:59 +00:00
if ( string . IsNullOrEmpty ( CurrentTasMovie . Filename ) | |
CurrentTasMovie . Filename = = DefaultTasProjName ( ) )
2014-10-17 17:58:48 +00:00
{
SaveAsTasMenuItem_Click ( sender , e ) ;
}
else
{
2015-01-06 16:35:22 +00:00
if ( _exiting )
{
CurrentTasMovie . Save ( ) ;
}
else
{
_saveBackgroundWorker . RunWorkerAsync ( ) ;
}
2015-01-01 18:24:35 +00:00
Settings . RecentTas . Add ( CurrentTasMovie . Filename ) ;
2014-10-17 17:58:48 +00:00
}
}
private void SaveAsTasMenuItem_Click ( object sender , EventArgs e )
{
2014-10-20 19:04:59 +00:00
var filename = CurrentTasMovie . Filename ;
2014-10-18 15:50:12 +00:00
if ( string . IsNullOrWhiteSpace ( filename ) | | filename = = DefaultTasProjName ( ) )
{
filename = SuggestedTasProjName ( ) ;
}
2016-01-31 01:24:30 +00:00
var file = SaveFileDialog (
2015-09-06 01:39:57 +00:00
filename ,
PathManager . MakeAbsolutePath ( Global . Config . PathEntries . MoviesPathFragment , null ) ,
"Tas Project Files" ,
"tasproj" ) ;
2014-10-17 17:58:48 +00:00
if ( file ! = null )
{
2014-10-20 19:04:59 +00:00
CurrentTasMovie . Filename = file . FullName ;
2015-01-03 02:29:55 +00:00
2015-01-06 16:35:22 +00:00
if ( _exiting )
{
CurrentTasMovie . Save ( ) ;
}
else
{
_saveBackgroundWorker . RunWorkerAsync ( ) ;
}
2015-01-01 18:24:35 +00:00
Settings . RecentTas . Add ( CurrentTasMovie . Filename ) ;
2014-10-18 15:50:12 +00:00
SetTextProperty ( ) ;
2014-10-17 17:58:48 +00:00
}
}
2015-03-11 16:14:02 +00:00
private void saveSelectionToMacroToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-03-15 06:26:57 +00:00
if ( TasView . LastSelectedIndex = = CurrentTasMovie . InputLogLength )
TasView . SelectRow ( CurrentTasMovie . InputLogLength , false ) ;
2015-07-26 03:42:50 +00:00
if ( ! TasView . AnyRowsSelected )
2015-03-11 16:14:02 +00:00
return ;
MovieZone macro = new MovieZone ( CurrentTasMovie , TasView . FirstSelectedIndex . Value ,
TasView . LastSelectedIndex . Value - TasView . FirstSelectedIndex . Value + 1 ) ;
MacroInputTool . SaveMacroAs ( macro ) ;
}
private void placeMacroAtSelectionToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( ! TasView . AnyRowsSelected )
2015-03-11 16:14:02 +00:00
return ;
MovieZone macro = MacroInputTool . LoadMacro ( ) ;
if ( macro ! = null )
{
macro . Start = TasView . FirstSelectedIndex . Value ;
macro . PlaceZone ( CurrentTasMovie ) ;
}
}
private void recentMacrosToolStripMenuItem_DropDownOpened ( object sender , EventArgs e )
{
recentMacrosToolStripMenuItem . DropDownItems . Clear ( ) ;
recentMacrosToolStripMenuItem . DropDownItems . AddRange ( Global . Config . RecentMacros . RecentMenu ( DummyLoadMacro ) ) ;
}
2014-10-17 17:58:48 +00:00
private void ToBk2MenuItem_Click ( object sender , EventArgs e )
{
2014-10-23 01:32:27 +00:00
var bk2 = CurrentTasMovie . ToBk2 ( true ) ;
2014-10-17 17:58:48 +00:00
bk2 . Save ( ) ;
MessageStatusLabel . Text = Path . GetFileName ( bk2 . Filename ) + " created." ;
}
private void ExitMenuItem_Click ( object sender , EventArgs e )
{
Close ( ) ;
}
#endregion
#region Edit
2015-03-01 19:29:33 +00:00
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 ;
}
2015-03-04 19:03:00 +00:00
private void showUndoHistoryToolStripMenuItem_Click ( object sender , EventArgs e )
{
undoForm = new UndoHistoryForm ( this ) ;
2015-03-08 04:42:04 +00:00
undoForm . Owner = this ;
2015-03-04 19:03:00 +00:00
undoForm . Show ( ) ;
undoForm . UpdateValues ( ) ;
}
2014-10-17 17:58:48 +00:00
private void EditSubMenu_DropDownOpened ( object sender , EventArgs e )
{
DeselectMenuItem . Enabled =
SelectBetweenMarkersMenuItem . Enabled =
CopyMenuItem . Enabled =
CutMenuItem . Enabled =
ClearMenuItem . Enabled =
DeleteFramesMenuItem . Enabled =
CloneMenuItem . Enabled =
TruncateMenuItem . Enabled =
2015-07-26 03:42:50 +00:00
TasView . AnyRowsSelected ;
2014-10-17 17:58:48 +00:00
ReselectClipboardMenuItem . Enabled =
PasteMenuItem . Enabled =
PasteInsertMenuItem . Enabled =
_tasClipboard . Any ( ) ;
ClearGreenzoneMenuItem . Enabled =
2014-10-20 19:04:59 +00:00
CurrentTasMovie ! = null & & CurrentTasMovie . TasStateManager . Any ( ) ;
2014-10-17 17:58:48 +00:00
GreenzoneICheckSeparator . Visible =
2015-03-17 01:02:38 +00:00
StateHistoryIntegrityCheckMenuItem . Visible =
2014-10-17 17:58:48 +00:00
VersionInfo . DeveloperBuild ;
}
private void DeselectMenuItem_Click ( object sender , EventArgs e )
{
TasView . DeselectAll ( ) ;
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-10-17 17:58:48 +00:00
}
private void SelectAllMenuItem_Click ( object sender , EventArgs e )
{
TasView . SelectAll ( ) ;
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-10-17 17:58:48 +00:00
}
private void SelectBetweenMarkersMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
2014-10-20 19:04:59 +00:00
var prevMarker = CurrentTasMovie . Markers . PreviousOrCurrent ( TasView . LastSelectedIndex . Value ) ;
var nextMarker = CurrentTasMovie . Markers . Next ( TasView . LastSelectedIndex . Value ) ;
2014-10-17 17:58:48 +00:00
int prev = prevMarker ! = null ? prevMarker . Frame : 0 ;
2014-10-20 19:04:59 +00:00
int next = nextMarker ! = null ? nextMarker . Frame : CurrentTasMovie . InputLogLength ;
2014-10-17 17:58:48 +00:00
for ( int i = prev ; i < next ; i + + )
{
TasView . SelectRow ( i , true ) ;
}
2015-03-10 06:14:14 +00:00
RefreshTasView ( ) ;
2014-10-17 17:58:48 +00:00
}
}
private void ReselectClipboardMenuItem_Click ( object sender , EventArgs e )
{
TasView . DeselectAll ( ) ;
foreach ( var item in _tasClipboard )
{
TasView . SelectRow ( item . Frame , true ) ;
}
2015-03-10 06:14:14 +00:00
RefreshTasView ( ) ;
2014-10-17 17:58:48 +00:00
}
private void CopyMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
_tasClipboard . Clear ( ) ;
var list = TasView . SelectedRows . ToList ( ) ;
var sb = new StringBuilder ( ) ;
2014-10-17 18:14:21 +00:00
foreach ( var index in list )
2014-10-17 17:58:48 +00:00
{
2014-10-20 19:04:59 +00:00
var input = CurrentTasMovie . GetInputState ( index ) ;
2014-10-17 18:14:21 +00:00
_tasClipboard . Add ( new TasClipboardEntry ( index , input ) ) ;
2014-10-20 19:04:59 +00:00
var lg = CurrentTasMovie . LogGeneratorInstance ( ) ;
2014-10-17 17:58:48 +00:00
lg . SetSource ( input ) ;
sb . AppendLine ( lg . GenerateLogEntry ( ) ) ;
}
Clipboard . SetDataObject ( sb . ToString ( ) ) ;
SetSplicer ( ) ;
}
}
private void PasteMenuItem_Click ( object sender , EventArgs e )
{
// TODO: if highlighting 2 rows and pasting 3, only paste 2 of them
// FCEUX Taseditor does't do this, but I think it is the expected behavior in editor programs
2014-10-23 21:09:54 +00:00
var wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2014-10-17 17:58:48 +00:00
if ( _tasClipboard . Any ( ) )
{
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
2014-10-20 19:04:59 +00:00
CurrentTasMovie . CopyOverInput ( TasView . FirstSelectedIndex . Value , _tasClipboard . Select ( x = > x . ControllerState ) ) ;
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( TasView . FirstSelectedIndex . Value ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
}
private void PasteInsertMenuItem_Click ( object sender , EventArgs e )
{
2014-10-23 21:09:54 +00:00
var wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2014-10-17 17:58:48 +00:00
if ( _tasClipboard . Any ( ) )
{
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
2014-10-20 19:04:59 +00:00
CurrentTasMovie . InsertInput ( TasView . FirstSelectedIndex . Value , _tasClipboard . Select ( x = > x . ControllerState ) ) ;
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( TasView . FirstSelectedIndex . Value ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
}
private void CutMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
2014-10-23 21:09:54 +00:00
var wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
var rollBackFrame = TasView . FirstSelectedIndex . Value ;
_tasClipboard . Clear ( ) ;
var list = TasView . SelectedRows . ToArray ( ) ;
var sb = new StringBuilder ( ) ;
for ( var i = 0 ; i < list . Length ; i + + )
{
2014-10-20 19:04:59 +00:00
var input = CurrentTasMovie . GetInputState ( i ) ;
2014-10-17 17:58:48 +00:00
_tasClipboard . Add ( new TasClipboardEntry ( list [ i ] , input ) ) ;
2014-10-20 19:04:59 +00:00
var lg = CurrentTasMovie . LogGeneratorInstance ( ) ;
2014-10-17 17:58:48 +00:00
lg . SetSource ( input ) ;
sb . AppendLine ( lg . GenerateLogEntry ( ) ) ;
}
Clipboard . SetDataObject ( sb . ToString ( ) ) ;
2014-10-20 19:04:59 +00:00
CurrentTasMovie . RemoveFrames ( list ) ;
2014-10-17 17:58:48 +00:00
SetSplicer ( ) ;
2016-02-05 18:41:40 +00:00
//TasView.DeselectAll(); feos: what if I want to continuously cut?
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( rollBackFrame ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
}
private void ClearMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
2015-07-16 19:39:33 +00:00
bool wasPaused = GlobalWin . MainForm . EmulatorPaused ;
bool needsToRollback = ! ( TasView . FirstSelectedIndex > Emulator . Frame ) ;
int rollBackFrame = TasView . FirstSelectedIndex . Value ;
2014-10-17 17:58:48 +00:00
2015-07-16 19:39:33 +00:00
CurrentTasMovie . ChangeLog . BeginNewBatch ( "Clear frames " + TasView . SelectedRows . Min ( ) + "-" + TasView . SelectedRows . Max ( ) ) ;
foreach ( int frame in TasView . SelectedRows )
2014-10-17 17:58:48 +00:00
{
2014-10-20 19:04:59 +00:00
CurrentTasMovie . ClearFrame ( frame ) ;
2014-10-17 17:58:48 +00:00
}
2015-07-16 19:39:33 +00:00
CurrentTasMovie . ChangeLog . EndBatch ( ) ;
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( rollBackFrame ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
}
private void DeleteFramesMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
2014-10-23 21:09:54 +00:00
var wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
var rollBackFrame = TasView . FirstSelectedIndex . Value ;
2015-03-01 19:29:33 +00:00
if ( rollBackFrame > = CurrentTasMovie . InputLogLength )
{ // Cannot delete non-existant frames
RefreshDialog ( ) ;
return ;
}
2014-10-17 17:58:48 +00:00
2014-10-20 19:04:59 +00:00
CurrentTasMovie . RemoveFrames ( TasView . SelectedRows . ToArray ( ) ) ;
2014-10-17 17:58:48 +00:00
SetSplicer ( ) ;
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( rollBackFrame ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
}
private void CloneMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
2014-10-23 21:09:54 +00:00
var wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2014-10-17 17:58:48 +00:00
var framesToInsert = TasView . SelectedRows . ToList ( ) ;
2015-03-01 19:29:33 +00:00
var insertionFrame = Math . Min ( TasView . LastSelectedIndex . Value + 1 , CurrentTasMovie . InputLogLength ) ;
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
2014-10-17 18:14:21 +00:00
var inputLog = framesToInsert
2014-10-20 19:04:59 +00:00
. Select ( frame = > CurrentTasMovie . GetInputLogEntry ( frame ) )
2014-10-17 18:14:21 +00:00
. ToList ( ) ;
2014-10-17 17:58:48 +00:00
2014-10-20 19:04:59 +00:00
CurrentTasMovie . InsertInput ( insertionFrame , inputLog ) ;
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( insertionFrame ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
}
private void InsertFrameMenuItem_Click ( object sender , EventArgs e )
{
2014-10-23 21:09:54 +00:00
var wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2015-07-26 03:42:50 +00:00
var insertionFrame = TasView . AnyRowsSelected ? TasView . FirstSelectedIndex . Value : 0 ;
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
2014-10-20 19:04:59 +00:00
CurrentTasMovie . InsertEmptyFrame ( insertionFrame ) ;
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( insertionFrame ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
private void InsertNumFramesMenuItem_Click ( object sender , EventArgs e )
{
2015-07-24 20:13:39 +00:00
bool wasPaused = GlobalWin . MainForm . EmulatorPaused ;
2015-07-26 03:42:50 +00:00
int insertionFrame = TasView . AnyRowsSelected ? TasView . FirstSelectedIndex . Value : 0 ;
2015-07-24 20:13:39 +00:00
bool needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
2015-07-24 20:13:39 +00:00
FramesPrompt framesPrompt = new FramesPrompt ( ) ;
DialogResult result = framesPrompt . ShowDialog ( ) ;
2014-10-17 17:58:48 +00:00
if ( result = = DialogResult . OK )
{
2014-10-20 19:04:59 +00:00
CurrentTasMovie . InsertEmptyFrame ( insertionFrame , framesPrompt . Frames ) ;
2014-10-17 17:58:48 +00:00
}
if ( needsToRollback )
{
GoToLastEmulatedFrameIfNecessary ( insertionFrame ) ;
2014-10-23 21:09:54 +00:00
if ( wasPaused )
{
DoAutoRestore ( ) ;
}
else
{
GlobalWin . MainForm . UnpauseEmulator ( ) ;
}
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog ( ) ;
}
}
private void TruncateMenuItem_Click ( object sender , EventArgs e )
{
2015-07-26 03:42:50 +00:00
if ( TasView . AnyRowsSelected )
2014-10-17 17:58:48 +00:00
{
2014-10-19 16:36:47 +00:00
var rollbackFrame = TasView . LastSelectedIndex . Value ;
2015-03-03 08:32:39 +00:00
var needsToRollback = TasView . FirstSelectedIndex < Emulator . Frame ;
2014-10-17 17:58:48 +00:00
2014-10-20 19:04:59 +00:00
CurrentTasMovie . Truncate ( rollbackFrame ) ;
2015-02-27 19:34:31 +00:00
MarkerControl . MarkerInputRoll . TruncateSelection ( CurrentTasMovie . Markers . Count - 1 ) ;
2014-10-17 17:58:48 +00:00
if ( needsToRollback )
{
GoToFrame ( rollbackFrame ) ;
}
else
{
RefreshDialog ( ) ;
}
}
}
private void SetMarkersMenuItem_Click ( object sender , EventArgs e )
{
2015-12-01 16:36:13 +00:00
if ( TasView . SelectedRows . Count ( ) > 50 )
{
var result = MessageBox . Show ( "Are you sure you want to add more than 50 markers?" , "Add markers" , MessageBoxButtons . OKCancel , MessageBoxIcon . Question ) ;
if ( result ! = DialogResult . OK )
return ;
}
2014-10-17 18:14:21 +00:00
foreach ( var index in TasView . SelectedRows )
2014-10-17 17:58:48 +00:00
{
2015-12-01 16:36:13 +00:00
MarkerControl . AddMarker ( false , index ) ;
2014-10-17 17:58:48 +00:00
}
}
2015-12-01 16:36:13 +00:00
private void SetMarkerWithTextMenuItem_Click ( object sender , EventArgs e )
{
MarkerControl . AddMarker ( true , TasView . SelectedRows . FirstOrDefault ( ) ) ;
}
2014-10-17 17:58:48 +00:00
private void RemoveMarkersMenuItem_Click ( object sender , EventArgs e )
{
2015-03-01 19:29:33 +00:00
IEnumerable < TasMovieMarker > markers = CurrentTasMovie . Markers . Where ( m = > TasView . SelectedRows . Contains ( m . Frame ) ) ;
2015-07-08 21:48:04 +00:00
foreach ( TasMovieMarker m in markers . ToList ( ) )
2015-03-01 19:29:33 +00:00
{
2015-03-10 17:11:29 +00:00
CurrentTasMovie . Markers . Remove ( m ) ;
2015-03-01 19:29:33 +00:00
}
2014-10-17 17:58:48 +00:00
RefreshDialog ( ) ;
}
private void ClearGreenzoneMenuItem_Click ( object sender , EventArgs e )
{
2014-10-20 19:04:59 +00:00
CurrentTasMovie . ClearGreenzone ( ) ;
2014-10-17 17:58:48 +00:00
RefreshDialog ( ) ;
}
2015-03-17 01:02:38 +00:00
private void StateHistoryIntegrityCheckMenuItem_Click ( object sender , EventArgs e )
2014-10-17 17:58:48 +00:00
{
2015-03-10 05:12:13 +00:00
if ( ! Emulator . DeterministicEmulation )
{
2015-03-17 01:02:38 +00:00
if ( MessageBox . Show ( "The emulator is not deterministic. It might fail even if the difference isn't enough to cause a desync.\nContinue with check?" , "Not Deterministic" , MessageBoxButtons . YesNo )
2015-03-10 05:12:13 +00:00
= = System . Windows . Forms . DialogResult . No )
return ;
}
2014-10-17 17:58:48 +00:00
2015-03-10 05:12:13 +00:00
GoToFrame ( 0 ) ;
int lastState = 0 ;
2015-03-17 01:02:38 +00:00
int goToFrame = CurrentTasMovie . TasStateManager . LastEmulatedFrame ;
2015-03-10 05:12:13 +00:00
do
2014-10-17 17:58:48 +00:00
{
2015-03-10 05:12:13 +00:00
GlobalWin . MainForm . FrameAdvance ( ) ;
2014-10-17 17:58:48 +00:00
2015-03-10 05:12:13 +00:00
if ( CurrentTasMovie . TasStateManager . HasState ( Emulator . Frame ) )
2014-10-17 17:58:48 +00:00
{
2015-03-10 05:12:13 +00:00
byte [ ] state = ( byte [ ] ) StatableEmulator . SaveStateBinary ( ) . Clone ( ) ; // Why is this cloning it?
byte [ ] greenzone = CurrentTasMovie . TasStateManager [ Emulator . Frame ] . Value ;
if ( ! state . SequenceEqual ( greenzone ) )
{
MessageBox . Show ( "Bad data between frames " + lastState + " and " + Emulator . Frame ) ;
return ;
}
lastState = Emulator . Frame ;
2014-10-17 17:58:48 +00:00
}
2015-03-17 01:02:38 +00:00
} while ( Global . Emulator . Frame < goToFrame ) ;
2014-10-17 17:58:48 +00:00
MessageBox . Show ( "Integrity Check passed" ) ;
}
#endregion
#region Config
2015-03-03 21:10:48 +00:00
private void SetMaxUndoLevelsMenuItem_Click ( object sender , EventArgs e )
{
using ( var prompt = new InputPrompt
{
TextInputType = InputPrompt . InputType . Unsigned ,
Message = "Number of Undo Levels to keep" ,
InitialValue = CurrentTasMovie . ChangeLog . MaxSteps . ToString ( )
} )
{
DialogResult result = prompt . ShowDialog ( ) ;
if ( result = = DialogResult . OK )
{
int val = int . Parse ( prompt . PromptText ) ;
if ( val > 0 )
CurrentTasMovie . ChangeLog . MaxSteps = val ;
}
}
}
2015-11-30 20:44:31 +00:00
private void SetBranchCellHoverIntervalMenuItem_Click ( object sender , EventArgs e )
{
using ( var prompt = new InputPrompt
{
TextInputType = InputPrompt . InputType . Unsigned ,
Message = "ScreenshotPopUp Delay" ,
InitialValue = Settings . BranchCellHoverInterval . ToString ( )
} )
{
DialogResult result = prompt . ShowDialog ( ) ;
if ( result = = DialogResult . OK )
{
int val = int . Parse ( prompt . PromptText ) ;
if ( val > 0 )
{
Settings . BranchCellHoverInterval = val ;
BookMarkControl . HoverInterval = val ;
}
}
}
}
2016-01-27 13:18:20 +00:00
private void SetSeekingCutoffIntervalMenuItem_Click ( object sender , EventArgs e )
{
using ( var prompt = new InputPrompt
{
TextInputType = InputPrompt . InputType . Unsigned ,
Message = "Seeking Cutoff Interval" ,
InitialValue = Settings . SeekingCutoffInterval . ToString ( )
} )
{
DialogResult result = prompt . ShowDialog ( ) ;
if ( result = = DialogResult . OK )
{
int val = int . Parse ( prompt . PromptText ) ;
if ( val > 0 )
{
Settings . SeekingCutoffInterval = val ;
TasView . SeekingCutoffInterval = val ;
}
}
}
}
2014-10-17 17:58:48 +00:00
private void ConfigSubMenu_DropDownOpened ( object sender , EventArgs e )
{
2015-01-01 18:24:35 +00:00
DrawInputByDraggingMenuItem . Checked = Settings . DrawInput ;
AutopauseAtEndOfMovieMenuItem . Checked = Settings . AutoPause ;
EmptyNewMarkerNotesMenuItem . Checked = Settings . EmptyMarkers ;
2014-10-17 17:58:48 +00:00
}
private void DrawInputByDraggingMenuItem_Click ( object sender , EventArgs e )
{
2015-01-01 18:24:35 +00:00
TasView . InputPaintingMode = Settings . DrawInput ^ = true ;
2014-10-17 17:58:48 +00:00
}
2015-03-23 22:11:55 +00:00
private void applyPatternToPaintedInputToolStripMenuItem_CheckedChanged ( object sender , EventArgs e )
{
onlyOnAutoFireColumnsToolStripMenuItem . Enabled = applyPatternToPaintedInputToolStripMenuItem . Checked ;
}
2015-03-03 08:32:39 +00:00
private void BindMarkersToInputMenuItem_Click ( object sender , EventArgs e )
{
CurrentTasMovie . BindMarkersToInput = BindMarkersToInputMenuItem . Checked ;
}
2014-10-17 17:58:48 +00:00
private void EmptyNewMarkerNotesMenuItem_Click ( object sender , EventArgs e )
{
2015-01-01 18:24:35 +00:00
Settings . EmptyMarkers ^ = true ;
2014-10-17 17:58:48 +00:00
}
private void AutopauseAtEndMenuItem_Click ( object sender , EventArgs e )
{
2015-01-01 18:24:35 +00:00
Settings . AutoPause ^ = true ;
2014-10-17 17:58:48 +00:00
}
2015-03-08 04:42:04 +00:00
private void autoHoldToolStripMenuItem_CheckedChanged ( object sender , EventArgs e )
{
if ( autoHoldToolStripMenuItem . Checked )
{
autoFireToolStripMenuItem . Checked = false ;
customPatternToolStripMenuItem . Checked = false ;
if ( ! keepSetPatternsToolStripMenuItem . Checked )
UpdateAutoFire ( ) ;
}
}
private void autoFireToolStripMenuItem_CheckedChanged ( object sender , EventArgs e )
{
if ( autoFireToolStripMenuItem . Checked )
{
autoHoldToolStripMenuItem . Checked = false ;
customPatternToolStripMenuItem . Checked = false ;
if ( ! keepSetPatternsToolStripMenuItem . Checked )
UpdateAutoFire ( ) ;
}
}
private void customPatternToolStripMenuItem_CheckedChanged ( object sender , EventArgs e )
{
if ( customPatternToolStripMenuItem . Checked )
{
autoHoldToolStripMenuItem . Checked = false ;
autoFireToolStripMenuItem . Checked = false ;
if ( ! keepSetPatternsToolStripMenuItem . Checked )
UpdateAutoFire ( ) ;
}
}
private void setCustomsToolStripMenuItem_Click ( object sender , EventArgs e )
{
// Exceptions in PatternsForm are not caught by the debugger, I have no idea why.
// Exceptions in UndoForm are caught, which makes it weirder.
PatternsForm pForm = new PatternsForm ( this ) ;
pForm . Owner = this ;
pForm . Show ( ) ;
}
2014-10-17 17:58:48 +00:00
#endregion
#region Metadata
private void HeaderMenuItem_Click ( object sender , EventArgs e )
{
2014-11-15 15:36:22 +00:00
new MovieHeaderEditor ( CurrentTasMovie )
{
Owner = GlobalWin . MainForm ,
Location = this . ChildPointToScreen ( TasView )
} . Show ( ) ;
2014-10-17 17:58:48 +00:00
UpdateChangesIndicator ( ) ;
}
2015-03-02 23:43:52 +00:00
private void StateHistorySettingsMenuItem_Click ( object sender , EventArgs e )
2014-10-17 17:58:48 +00:00
{
2015-03-02 23:43:52 +00:00
new StateHistorySettingsForm ( CurrentTasMovie . TasStateManager . Settings )
2014-11-15 15:36:22 +00:00
{
Owner = GlobalWin . MainForm ,
2014-12-21 18:25:04 +00:00
Location = this . ChildPointToScreen ( TasView ) ,
Statable = this . StatableEmulator
2015-08-16 16:27:26 +00:00
} . ShowDialog ( ) ;
2015-08-15 15:07:56 +00:00
CurrentTasMovie . TasStateManager . LimitStateCount ( ) ;
2014-10-17 17:58:48 +00:00
UpdateChangesIndicator ( ) ;
}
private void CommentsMenuItem_Click ( object sender , EventArgs e )
{
var form = new EditCommentsForm ( ) ;
2014-10-20 19:04:59 +00:00
form . GetMovie ( CurrentTasMovie ) ;
2014-11-02 15:20:17 +00:00
form . ForceReadWrite = true ;
form . Show ( ) ;
2014-10-17 17:58:48 +00:00
}
private void SubtitlesMenuItem_Click ( object sender , EventArgs e )
{
var form = new EditSubtitlesForm { ReadOnly = false } ;
form . GetMovie ( Global . MovieSession . Movie ) ;
form . ShowDialog ( ) ;
}
2014-10-18 01:01:45 +00:00
private void DefaultStateSettingsMenuItem_Click ( object sender , EventArgs e )
{
2014-11-15 15:36:22 +00:00
new DefaultGreenzoneSettings
{
Location = this . ChildPointToScreen ( TasView )
} . ShowDialog ( ) ;
2014-10-18 01:01:45 +00:00
}
2014-10-17 17:58:48 +00:00
#endregion
#region Settings Menu
private void SettingsSubMenu_DropDownOpened ( object sender , EventArgs e )
{
2015-01-01 18:10:07 +00:00
RotateMenuItem . ShortcutKeyDisplayString = TasView . RotateHotkeyStr ;
2014-10-17 17:58:48 +00:00
}
2015-02-24 20:38:46 +00:00
private void HideLagFramesSubMenu_DropDownOpened ( object sender , EventArgs e )
{
HideLagFrames0 . Checked = TasView . LagFramesToHide = = 0 ;
HideLagFrames1 . Checked = TasView . LagFramesToHide = = 1 ;
HideLagFrames2 . Checked = TasView . LagFramesToHide = = 2 ;
HideLagFrames3 . Checked = TasView . LagFramesToHide = = 3 ;
2015-03-10 17:11:29 +00:00
hideWasLagFramesToolStripMenuItem . Checked = TasView . HideWasLagFrames ;
2015-02-24 20:38:46 +00:00
}
2015-01-01 18:10:07 +00:00
private void RotateMenuItem_Click ( object sender , EventArgs e )
2014-10-17 17:58:48 +00:00
{
2015-01-01 18:10:07 +00:00
TasView . HorizontalOrientation ^ = true ;
CurrentTasMovie . FlagChanges ( ) ;
2014-10-17 17:58:48 +00:00
}
2015-02-27 19:34:31 +00:00
private void HideLagFramesX_Click ( object sender , EventArgs e )
2015-02-24 20:38:46 +00:00
{
2015-02-27 19:34:31 +00:00
TasView . LagFramesToHide = ( int ) ( sender as ToolStripMenuItem ) . Tag ;
2015-07-26 00:55:52 +00:00
MaybeFollowCursor ( ) ;
2015-02-27 19:34:31 +00:00
RefreshDialog ( ) ;
2015-02-24 20:38:46 +00:00
}
2015-03-10 17:11:29 +00:00
private void hideWasLagFramesToolStripMenuItem_Click ( object sender , EventArgs e )
{
TasView . HideWasLagFrames ^ = true ;
}
2015-03-14 16:38:07 +00:00
private void alwaysScrollToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-07-25 08:33:23 +00:00
TasView . AlwaysScroll = Settings . FollowCursorAlwaysScroll = alwaysScrollToolStripMenuItem . Checked ;
2015-03-14 16:38:07 +00:00
}
private void scrollToViewToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-07-25 08:33:23 +00:00
TasView . ScrollMethod = Settings . FollowCursorScrollMethod = "near" ;
2015-03-14 16:38:07 +00:00
}
private void scrollToTopToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-07-25 08:33:23 +00:00
TasView . ScrollMethod = Settings . FollowCursorScrollMethod = "top" ;
2015-03-14 16:38:07 +00:00
}
private void scrollToBottomToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-07-25 08:33:23 +00:00
TasView . ScrollMethod = Settings . FollowCursorScrollMethod = "bottom" ;
2015-03-14 16:38:07 +00:00
}
private void scrollToCenterToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-07-25 08:33:23 +00:00
TasView . ScrollMethod = Settings . FollowCursorScrollMethod = "center" ;
2015-08-30 16:45:14 +00:00
}
private void iconsToolStripMenuItem_DropDownOpened ( object sender , EventArgs e )
{
denoteStatesWithIconsToolStripMenuItem . Checked = Settings . denoteStatesWithIcons ;
denoteStatesWithBGColorToolStripMenuItem . Checked = Settings . denoteStatesWithBGColor ;
denoteMarkersWithIconsToolStripMenuItem . Checked = Settings . denoteMarkersWithIcons ;
denoteMarkersWithBGColorToolStripMenuItem . Checked = Settings . denoteMarkersWithBGColor ;
}
private void denoteStatesWithIconsToolStripMenuItem_Click ( object sender , EventArgs e )
{
TasView . denoteStatesWithIcons = Settings . denoteStatesWithIcons = denoteStatesWithIconsToolStripMenuItem . Checked ;
RefreshDialog ( ) ;
}
private void denoteStatesWithBGColorToolStripMenuItem_Click ( object sender , EventArgs e )
{
TasView . denoteStatesWithBGColor = Settings . denoteStatesWithBGColor = denoteStatesWithBGColorToolStripMenuItem . Checked ;
RefreshDialog ( ) ;
}
private void denoteMarkersWithIconsToolStripMenuItem_Click ( object sender , EventArgs e )
{
TasView . denoteMarkersWithIcons = Settings . denoteMarkersWithIcons = denoteMarkersWithIconsToolStripMenuItem . Checked ;
RefreshDialog ( ) ;
}
private void denoteMarkersWithBGColorToolStripMenuItem_Click ( object sender , EventArgs e )
{
TasView . denoteMarkersWithBGColor = Settings . denoteMarkersWithBGColor = denoteMarkersWithBGColorToolStripMenuItem . Checked ;
RefreshDialog ( ) ;
}
2015-03-14 16:38:07 +00:00
private void followCursorToolStripMenuItem_DropDownOpened ( object sender , EventArgs e )
{
2015-07-26 01:01:02 +00:00
alwaysScrollToolStripMenuItem . Checked = Settings . FollowCursorAlwaysScroll ;
2015-03-14 16:38:07 +00:00
scrollToViewToolStripMenuItem . Checked = false ;
scrollToTopToolStripMenuItem . Checked = false ;
scrollToBottomToolStripMenuItem . Checked = false ;
scrollToCenterToolStripMenuItem . Checked = false ;
if ( TasView . ScrollMethod = = "near" )
scrollToViewToolStripMenuItem . Checked = true ;
else if ( TasView . ScrollMethod = = "top" )
scrollToTopToolStripMenuItem . Checked = true ;
else if ( TasView . ScrollMethod = = "bottom" )
scrollToBottomToolStripMenuItem . Checked = true ;
else
scrollToCenterToolStripMenuItem . Checked = true ;
}
2015-03-10 17:11:29 +00:00
2015-07-24 20:13:39 +00:00
private void wheelScrollSpeedToolStripMenuItem_Click ( object sender , EventArgs e )
{
InputPrompt inputpromt = new InputPrompt ( ) ;
inputpromt . TextInputType = InputPrompt . InputType . Unsigned ;
inputpromt . Message = "Frames per tick:" ;
2015-07-25 08:20:16 +00:00
inputpromt . InitialValue = TasView . ScrollSpeed . ToString ( ) ;
2015-07-26 01:30:16 +00:00
if ( inputpromt . ShowDialog ( ) = = System . Windows . Forms . DialogResult . OK )
{
TasView . ScrollSpeed = int . Parse ( inputpromt . PromptText ) ;
Settings . ScrollSpeed = TasView . ScrollSpeed ;
}
2015-07-24 20:13:39 +00:00
}
2014-10-17 17:58:48 +00:00
#endregion
#region Columns
2015-03-10 00:33:58 +00:00
private void SetUpToolStripColumns ( )
2014-10-17 17:58:48 +00:00
{
ColumnsSubMenu . DropDownItems . Clear ( ) ;
var columns = TasView . AllColumns
. Where ( x = > ! string . IsNullOrWhiteSpace ( x . Text ) )
. Where ( x = > x . Name ! = "FrameColumn" ) ;
2015-03-09 23:27:01 +00:00
ToolStripMenuItem [ ] playerMenus = new ToolStripMenuItem [ Global . Emulator . ControllerDefinition . PlayerCount + 1 ] ;
playerMenus [ 0 ] = ColumnsSubMenu ;
for ( int i = 1 ; i < playerMenus . Length ; i + + )
{
playerMenus [ i ] = new ToolStripMenuItem ( "Player " + i ) ;
}
int player = 0 ;
2015-03-23 20:15:35 +00:00
foreach ( InputRoll . RollColumn column in columns )
2014-10-17 17:58:48 +00:00
{
2015-03-23 20:15:35 +00:00
ToolStripMenuItem menuItem = new ToolStripMenuItem
2014-10-17 17:58:48 +00:00
{
2015-02-24 22:46:35 +00:00
Text = column . Text + " (" + column . Name + ")" ,
2015-03-09 23:27:01 +00:00
Checked = column . Visible ,
2015-03-10 00:33:58 +00:00
CheckOnClick = true ,
2015-03-12 18:31:28 +00:00
Tag = column . Name
2014-10-17 17:58:48 +00:00
} ;
2015-03-09 23:27:01 +00:00
menuItem . CheckedChanged + = ( o , ev ) = >
2014-10-17 17:58:48 +00:00
{
2015-03-16 20:42:14 +00:00
ToolStripMenuItem sender = o as ToolStripMenuItem ;
2015-03-12 18:31:28 +00:00
TasView . AllColumns . Find ( c = > c . Name = = ( string ) sender . Tag ) . Visible = sender . Checked ;
2014-10-17 17:58:48 +00:00
TasView . AllColumns . ColumnsChanged ( ) ;
2014-10-20 19:04:59 +00:00
CurrentTasMovie . FlagChanges ( ) ;
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2015-03-10 00:33:58 +00:00
ColumnsSubMenu . ShowDropDown ( ) ;
( sender . OwnerItem as ToolStripMenuItem ) . ShowDropDown ( ) ;
2014-10-17 17:58:48 +00:00
} ;
2015-06-21 16:13:35 +00:00
if ( column . Name . StartsWith ( "P" ) & & column . Name . Length > 1 & & char . IsNumber ( column . Name , 1 ) )
{
2015-03-23 20:15:35 +00:00
player = int . Parse ( column . Name [ 1 ] . ToString ( ) ) ;
2015-06-21 16:13:35 +00:00
}
2015-03-23 20:15:35 +00:00
else
2015-06-21 16:13:35 +00:00
{
2015-03-23 20:15:35 +00:00
player = 0 ;
2015-06-21 16:13:35 +00:00
}
2015-03-09 23:27:01 +00:00
playerMenus [ player ] . DropDownItems . Add ( menuItem ) ;
}
2015-03-23 20:15:35 +00:00
for ( int i = 1 ; i < playerMenus . Length ; i + + )
ColumnsSubMenu . DropDownItems . Add ( playerMenus [ i ] ) ;
2015-03-09 23:27:01 +00:00
ColumnsSubMenu . DropDownItems . Add ( new ToolStripSeparator ( ) ) ;
for ( int i = 1 ; i < playerMenus . Length ; i + + )
{
ToolStripMenuItem item = new ToolStripMenuItem ( "Show Player " + i ) ;
item . CheckOnClick = true ;
2015-03-10 00:33:58 +00:00
item . Checked = true ;
2015-03-09 23:27:01 +00:00
2015-03-10 00:33:58 +00:00
int dummyInt = i ;
ToolStripMenuItem dummyObject = playerMenus [ i ] ;
2015-03-09 23:27:01 +00:00
item . CheckedChanged + = ( o , ev ) = >
{
2015-03-16 20:42:14 +00:00
ToolStripMenuItem sender = o as ToolStripMenuItem ;
2015-03-10 00:33:58 +00:00
foreach ( ToolStripMenuItem menuItem in dummyObject . DropDownItems )
{
2015-03-16 20:42:14 +00:00
TasView . AllColumns . Find ( c = > c . Name = = ( string ) menuItem . Tag ) . Visible = sender . Checked ;
2015-03-10 00:33:58 +00:00
}
2015-03-09 23:27:01 +00:00
CurrentTasMovie . FlagChanges ( ) ;
RefreshTasView ( ) ;
} ;
ColumnsSubMenu . DropDownItems . Add ( item ) ;
2014-10-17 17:58:48 +00:00
}
2014-10-19 15:13:53 +00:00
ColumnsSubMenu . DropDownItems . Add ( new ToolStripSeparator ( ) ) ;
var defaults = new ToolStripMenuItem
{
Name = "RestoreDefaultColumnConfiguration" ,
Text = "Restore defaults"
} ;
defaults . Click + = ( o , ev ) = >
{
TasView . AllColumns . Clear ( ) ;
SetUpColumns ( ) ;
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-10-20 19:04:59 +00:00
CurrentTasMovie . FlagChanges ( ) ;
2014-10-19 15:13:53 +00:00
} ;
ColumnsSubMenu . DropDownItems . Add ( defaults ) ;
2014-10-17 17:58:48 +00:00
}
#endregion
2014-10-23 23:18:42 +00:00
#region Context Menu
2014-10-30 23:29:21 +00:00
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 =
2015-07-26 03:42:50 +00:00
TasView . AnyRowsSelected ;
2014-10-30 23:29:21 +00:00
2015-07-27 23:25:15 +00:00
2015-09-05 22:10:21 +00:00
StartNewProjectFromNowMenuItem . Visible =
TasView . SelectedRows . Count ( ) = = 1
2015-09-05 22:26:34 +00:00
& & TasView . SelectedRows . Contains ( Emulator . Frame )
& & ! CurrentTasMovie . StartsFromSaveRam ;
2015-09-05 23:06:13 +00:00
StartANewProjectFromSaveRamMenuItem . Visible =
TasView . SelectedRows . Count ( ) = = 1
& & SaveRamEmulator ! = null
& & ! CurrentTasMovie . StartsFromSavestate ;
2015-07-27 23:25:15 +00:00
StartFromNowSeparator . Visible = StartNewProjectFromNowMenuItem . Visible | | StartANewProjectFromSaveRamMenuItem . Visible ;
2014-10-30 23:29:21 +00:00
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 ;
2015-07-27 23:25:15 +00:00
BranchContextMenuItem . Visible = TasView . CurrentCell . RowIndex = = Emulator . Frame ;
2014-10-30 23:29:21 +00:00
}
2014-10-23 23:18:42 +00:00
private void CancelSeekContextMenuItem_Click ( object sender , EventArgs e )
{
GlobalWin . MainForm . PauseOnFrame = null ;
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-10-23 23:18:42 +00:00
}
2015-07-20 01:57:41 +00:00
private void BranchContextMenuItem_Click ( object sender , EventArgs e )
{
BookMarkControl . Branch ( ) ;
}
2014-10-30 23:29:21 +00:00
private void StartNewProjectFromNowMenuItem_Click ( object sender , EventArgs e )
{
2015-09-05 23:25:27 +00:00
if ( AskSaveChanges ( ) )
2014-10-30 23:29:21 +00:00
{
2015-09-05 23:25:27 +00:00
int index = Emulator . Frame ;
2014-10-30 23:29:21 +00:00
2015-09-05 23:25:27 +00:00
TasMovie newProject = CurrentTasMovie . ConvertToSavestateAnchoredMovie (
index , ( byte [ ] ) StatableEmulator . SaveStateBinary ( ) . Clone ( ) ) ;
2014-10-30 23:29:21 +00:00
2015-09-05 23:25:27 +00:00
GlobalWin . MainForm . PauseEmulator ( ) ;
2015-12-08 20:38:00 +00:00
LoadFile ( new FileInfo ( newProject . Filename ) , true ) ;
2014-10-30 23:29:21 +00:00
}
}
2015-09-05 23:06:13 +00:00
private void StartANewProjectFromSaveRamMenuItem_Click ( object sender , EventArgs e )
{
2015-09-05 23:25:27 +00:00
if ( AskSaveChanges ( ) )
2015-09-05 23:06:13 +00:00
{
2015-09-05 23:25:27 +00:00
int index = TasView . SelectedRows . First ( ) ;
GoToFrame ( index ) ;
2015-09-05 23:06:13 +00:00
2015-09-05 23:25:27 +00:00
TasMovie newProject = CurrentTasMovie . ConvertToSaveRamAnchoredMovie (
SaveRamEmulator . CloneSaveRam ( ) ) ;
2015-09-05 23:06:13 +00:00
2015-09-05 23:25:27 +00:00
GlobalWin . MainForm . PauseEmulator ( ) ;
2015-12-08 20:38:00 +00:00
LoadFile ( new FileInfo ( newProject . Filename ) , true ) ;
2015-09-05 23:06:13 +00:00
}
}
2014-10-23 23:18:42 +00:00
#endregion
2014-10-17 17:58:48 +00:00
}
}