2014-07-09 23:04:22 +00:00
using System ;
using System.Drawing ;
2014-07-28 16:43:47 +00:00
using System.Linq ;
2014-07-09 23:04:22 +00:00
using System.Windows.Forms ;
using BizHawk.Client.Common ;
namespace BizHawk.Client.EmuHawk
{
public partial class TAStudio
{
2014-07-11 16:08:47 +00:00
// Input Painting
2014-07-11 16:26:19 +00:00
private string _startBoolDrawColumn = string . Empty ;
private string _startFloatDrawColumn = string . Empty ;
2014-07-11 16:08:47 +00:00
private bool _boolPaintState ;
2014-07-11 16:26:19 +00:00
private float _floatPaintState ;
2014-07-11 16:08:47 +00:00
private bool _startMarkerDrag ;
private bool _startFrameDrag ;
2015-03-01 19:29:33 +00:00
private bool _frameDragState ;
2014-10-17 18:14:21 +00:00
private bool _supressContextMenu ;
2015-02-24 06:47:32 +00:00
// SuuperW: For editing analog input
private string _floatEditColumn = string . Empty ;
private int _floatEditRow = - 1 ;
private string _floatTypedValue ;
2015-02-25 21:17:50 +00:00
private int _floatEditYPos = - 1 ;
2015-03-03 18:22:54 +00:00
// Right-click dragging
private string [ ] _rightClickInput = null ;
private string [ ] _rightClickOverInput = null ;
private int _rightClickFrame = - 1 ;
private int _rightClickLastFrame = - 1 ;
private bool _rightClickShift , _rightClickControl ;
private bool _leftButtonHeld = false ;
private bool mouseButtonHeld
{
get
{ // Need a left click
return _rightClickFrame ! = - 1 | | _leftButtonHeld ;
}
}
2014-07-11 16:08:47 +00:00
2014-10-17 20:10:21 +00:00
private bool _triggerAutoRestore ; // If true, autorestore will be called on mouse up
2015-02-25 21:17:50 +00:00
private int? _triggerAutoRestoreFromFrame ; // If set and _triggerAutoRestore is true, will call GoToFrameIfNecessary() with this value
2014-10-17 20:10:21 +00:00
2014-07-21 02:23:47 +00:00
public static Color CurrentFrame_FrameCol = Color . FromArgb ( 0xCFEDFC ) ;
public static Color CurrentFrame_InputLog = Color . FromArgb ( 0xB5E7F7 ) ;
2014-07-16 00:10:37 +00:00
2014-07-21 02:23:47 +00:00
public static Color GreenZone_FrameCol = Color . FromArgb ( 0xDDFFDD ) ;
2014-08-22 16:05:06 +00:00
public static Color GreenZone_Invalidated_FrameCol = Color . FromArgb ( 0xFFFFFF ) ;
2014-07-21 02:23:47 +00:00
public static Color GreenZone_InputLog = Color . FromArgb ( 0xC4F7C8 ) ;
2014-08-22 16:05:06 +00:00
public static Color GreenZone_Invalidated_InputLog = Color . FromArgb ( 0xE0FBE0 ) ;
2014-07-16 00:10:37 +00:00
2014-07-21 02:23:47 +00:00
public static Color LagZone_FrameCol = Color . FromArgb ( 0xFFDCDD ) ;
2014-08-22 16:05:06 +00:00
public static Color LagZone_Invalidated_FrameCol = Color . FromArgb ( 0xFFE9E9 ) ;
2014-07-21 02:23:47 +00:00
public static Color LagZone_InputLog = Color . FromArgb ( 0xF0D0D2 ) ;
2014-08-22 16:05:06 +00:00
public static Color LagZone_Invalidated_InputLog = Color . FromArgb ( 0xF7E5E5 ) ;
2014-07-16 00:10:37 +00:00
2014-07-21 02:23:47 +00:00
public static Color Marker_FrameCol = Color . FromArgb ( 0xF7FFC9 ) ;
2015-02-24 06:47:32 +00:00
public static Color AnalogEdit_Col = Color . FromArgb ( 0x909070 ) ; // SuuperW: When editing an analog value, it will be a gray color.
2014-07-16 00:10:37 +00:00
2015-03-08 04:42:04 +00:00
private Emulation . Common . ControllerDefinition controllerType
{ get { return Global . MovieSession . MovieControllerAdapter . Type ; } }
public AutoPatternBool [ ] BoolPatterns ;
public AutoPatternFloat [ ] FloatPatterns ;
2014-07-09 23:04:22 +00:00
#region Query callbacks
2014-10-13 19:30:59 +00:00
private void TasView_QueryItemIcon ( int index , InputRoll . RollColumn column , ref Bitmap bitmap )
2014-09-03 03:16:16 +00:00
{
2014-10-13 19:30:59 +00:00
var columnName = column . Name ;
2014-09-03 03:16:16 +00:00
if ( columnName = = MarkerColumnName )
{
2014-12-14 01:20:19 +00:00
if ( index = = Emulator . Frame & & index = = GlobalWin . MainForm . PauseOnFrame )
2014-09-16 19:20:19 +00:00
{
2014-10-17 18:14:21 +00:00
bitmap = TasView . HorizontalOrientation ?
Properties . Resources . ts_v_arrow_green_blue :
Properties . Resources . ts_h_arrow_green_blue ;
2014-09-16 19:20:19 +00:00
}
2014-12-14 01:20:19 +00:00
else if ( index = = Emulator . Frame )
2014-09-03 03:16:16 +00:00
{
2014-10-17 18:14:21 +00:00
bitmap = TasView . HorizontalOrientation ?
Properties . Resources . ts_v_arrow_blue :
Properties . Resources . ts_h_arrow_blue ;
2014-09-03 03:16:16 +00:00
}
2014-09-16 19:20:19 +00:00
else if ( index = = GlobalWin . MainForm . PauseOnFrame )
{
2014-10-17 18:14:21 +00:00
bitmap = TasView . HorizontalOrientation ?
Properties . Resources . ts_v_arrow_green :
Properties . Resources . ts_h_arrow_green ;
2014-09-16 19:20:19 +00:00
}
2014-09-03 03:16:16 +00:00
}
}
2014-10-13 19:30:59 +00:00
private void TasView_QueryItemBkColor ( int index , InputRoll . RollColumn column , ref Color color )
2014-07-09 23:04:22 +00:00
{
2014-10-13 19:30:59 +00:00
var columnName = column . Name ;
2014-10-20 19:04:59 +00:00
var record = CurrentTasMovie [ index ] ;
2014-07-16 00:10:37 +00:00
if ( columnName = = MarkerColumnName )
2014-07-09 23:04:22 +00:00
{
2014-09-22 21:47:07 +00:00
if ( VersionInfo . DeveloperBuild ) // For debugging purposes, let's visually show the state frames
2014-07-16 23:04:56 +00:00
{
2014-09-22 21:47:07 +00:00
color = ( record . HasState ? color = Color . FromArgb ( 0xEEEEEE ) : Color . White ) ;
2014-07-16 23:04:56 +00:00
}
2015-02-24 03:06:57 +00:00
2014-07-16 23:04:56 +00:00
return ;
2014-07-09 23:04:22 +00:00
}
2014-07-16 23:04:56 +00:00
if ( columnName = = FrameColumnName )
2014-07-09 23:04:22 +00:00
{
2014-12-14 01:20:19 +00:00
if ( Emulator . Frame = = index )
2014-07-16 00:10:37 +00:00
{
color = CurrentFrame_FrameCol ;
}
2014-10-20 19:04:59 +00:00
else if ( CurrentTasMovie . Markers . IsMarker ( index ) )
2014-07-16 00:10:37 +00:00
{
color = Marker_FrameCol ;
}
else if ( record . Lagged . HasValue )
2014-07-10 19:24:21 +00:00
{
2014-10-17 18:14:21 +00:00
color = record . Lagged . Value ?
LagZone_FrameCol :
GreenZone_FrameCol ;
2014-07-10 19:24:21 +00:00
}
2015-02-24 21:23:16 +00:00
else if ( record . WasLagged . HasValue )
{
color = record . WasLagged . Value ?
LagZone_Invalidated_FrameCol :
GreenZone_Invalidated_FrameCol ;
}
2014-07-10 19:24:21 +00:00
else
{
2014-07-16 00:10:37 +00:00
color = Color . White ;
}
}
else
{
2015-02-24 06:47:32 +00:00
// SuuperW: Analog editing is indicated by a color change.
if ( index = = _floatEditRow & & columnName = = _floatEditColumn )
{
color = AnalogEdit_Col ;
return ;
}
2014-12-14 01:20:19 +00:00
if ( Emulator . Frame = = index )
2014-07-16 00:10:37 +00:00
{
color = CurrentFrame_InputLog ;
}
else
{
if ( record . Lagged . HasValue )
{
2014-10-17 18:14:21 +00:00
color = record . Lagged . Value ?
LagZone_InputLog :
GreenZone_InputLog ;
2014-07-16 00:10:37 +00:00
}
2015-02-24 21:23:16 +00:00
else if ( record . WasLagged . HasValue )
{
color = record . WasLagged . Value ?
LagZone_Invalidated_InputLog :
GreenZone_Invalidated_FrameCol ;
}
2014-07-16 00:10:37 +00:00
else
{
2014-10-15 19:06:33 +00:00
color = Color . FromArgb ( 0xFFFEEE ) ;
2014-07-16 00:10:37 +00:00
}
2014-07-10 19:24:21 +00:00
}
2014-07-09 23:04:22 +00:00
}
}
2014-10-13 19:10:11 +00:00
private void TasView_QueryItemText ( int index , InputRoll . RollColumn column , out string text )
2014-07-09 23:04:22 +00:00
{
try
{
2014-07-16 23:04:56 +00:00
text = string . Empty ;
2014-10-13 19:10:11 +00:00
var columnName = column . Name ;
2014-07-09 23:04:22 +00:00
if ( columnName = = MarkerColumnName )
{
2014-09-18 00:51:16 +00:00
// Do nothing
2014-07-09 23:04:22 +00:00
}
else if ( columnName = = FrameColumnName )
{
2014-10-20 19:04:59 +00:00
text = ( index ) . ToString ( ) . PadLeft ( CurrentTasMovie . InputLogLength . ToString ( ) . Length , '0' ) ;
2014-07-09 23:04:22 +00:00
}
else
{
2014-10-20 19:04:59 +00:00
if ( index < CurrentTasMovie . InputLogLength )
text = CurrentTasMovie . DisplayValue ( index , columnName ) ;
2014-07-09 23:04:22 +00:00
}
}
catch ( Exception ex )
{
text = string . Empty ;
MessageBox . Show ( "oops\n" + ex ) ;
}
}
2015-02-24 19:00:12 +00:00
// SuuperW: Used in InputRoll.cs to hide lag frames.
2015-03-10 17:11:29 +00:00
private bool TasView_QueryFrameLag ( int index , bool hideWasLag )
2015-02-24 19:00:12 +00:00
{
2015-03-10 17:11:29 +00:00
TasMovieRecord lag = CurrentTasMovie [ index ] ;
return ( lag . Lagged . HasValue & & lag . Lagged . Value ) | | ( hideWasLag & & lag . WasLagged . HasValue & & lag . WasLagged . Value ) ;
2015-02-24 19:00:12 +00:00
}
2014-07-09 23:04:22 +00:00
#endregion
#region Events
2014-10-14 00:31:59 +00:00
private void TasView_ColumnClick ( object sender , InputRoll . ColumnClickEventArgs e )
2014-07-28 16:43:47 +00:00
{
2014-08-30 18:42:14 +00:00
if ( TasView . SelectedRows . Any ( ) )
2014-07-28 16:43:47 +00:00
{
2014-10-14 00:31:59 +00:00
var columnName = e . Column . Name ;
2014-07-28 16:43:47 +00:00
if ( columnName = = FrameColumnName )
{
2014-10-20 19:04:59 +00:00
CurrentTasMovie . Markers . Add ( TasView . LastSelectedIndex . Value , "" ) ;
2014-09-19 01:15:14 +00:00
RefreshDialog ( ) ;
2015-02-24 03:06:57 +00:00
2014-07-28 16:43:47 +00:00
}
else if ( columnName ! = MarkerColumnName ) // TODO: what about float?
{
2014-08-30 18:42:14 +00:00
foreach ( var index in TasView . SelectedRows )
2014-07-28 16:43:47 +00:00
{
2015-03-10 04:16:42 +00:00
CurrentTasMovie . ToggleBoolState ( index , columnName ) ;
2014-10-17 20:10:21 +00:00
_triggerAutoRestore = true ;
_triggerAutoRestoreFromFrame = TasView . SelectedRows . Min ( ) ;
2014-07-28 16:43:47 +00:00
}
RefreshDialog ( ) ;
}
}
}
2014-10-14 00:31:59 +00:00
private void TasView_ColumnRightClick ( object sender , InputRoll . ColumnClickEventArgs e )
2014-09-25 17:52:21 +00:00
{
2014-10-14 00:31:59 +00:00
e . Column . Emphasis ^ = true ;
2014-09-25 17:52:21 +00:00
2015-03-08 04:42:04 +00:00
UpdateAutoFire ( e . Column . Name , e . Column . Emphasis ) ;
2014-09-25 18:12:18 +00:00
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-09-25 17:52:21 +00:00
}
2015-03-08 04:42:04 +00:00
private void UpdateAutoFire ( )
{
for ( int i = 2 ; i < TasView . AllColumns . Count ; i + + )
UpdateAutoFire ( TasView . AllColumns [ i ] . Name , TasView . AllColumns [ i ] . Emphasis ) ;
}
public void UpdateAutoFire ( string button , bool? isOn )
{
if ( ! isOn . HasValue ) // No value means don't change whether it's on or off.
isOn = TasView . AllColumns . Find ( c = > c . Name = = button ) . Emphasis ;
int index = 0 ;
if ( autoHoldToolStripMenuItem . Checked ) index = 1 ;
if ( autoFireToolStripMenuItem . Checked ) index = 2 ;
if ( controllerType . BoolButtons . Contains ( button ) )
{
if ( index = = 0 )
index = controllerType . BoolButtons . IndexOf ( button ) ;
else
index + = controllerType . BoolButtons . Count - 1 ;
AutoPatternBool p = BoolPatterns [ index ] ;
Global . AutofireStickyXORAdapter . SetSticky ( button , isOn . Value , p ) ;
}
else
{
if ( index = = 0 )
index = controllerType . FloatControls . IndexOf ( button ) ;
else
index + = controllerType . FloatControls . Count - 1 ;
float? value = null ;
if ( isOn . Value ) value = 0f ;
AutoPatternFloat p = FloatPatterns [ index ] ;
Global . AutofireStickyXORAdapter . SetFloat ( button , value , p ) ;
}
}
2014-09-25 17:52:21 +00:00
2014-10-19 14:46:01 +00:00
private void TasView_ColumnReordered ( object sender , InputRoll . ColumnReorderedEventArgs e )
{
2014-10-20 19:04:59 +00:00
CurrentTasMovie . FlagChanges ( ) ;
2014-10-19 14:46:01 +00:00
}
2014-10-17 17:40:11 +00:00
private void TasView_MouseEnter ( object sender , EventArgs e )
{
TasView . Focus ( ) ;
}
2014-07-09 23:04:22 +00:00
private void TasView_MouseDown ( object sender , MouseEventArgs e )
{
2015-03-03 18:22:54 +00:00
// Clicking with left while right is held or vice versa does weird stuff
if ( mouseButtonHeld )
return ;
2014-07-17 20:35:12 +00:00
if ( e . Button = = MouseButtons . Middle )
{
TogglePause ( ) ;
return ;
}
2015-02-24 06:47:32 +00:00
// SuuperW: Moved these.
if ( TasView . CurrentCell = = null | | ! TasView . CurrentCell . RowIndex . HasValue | | TasView . CurrentCell . Column = = null )
return ;
var frame = TasView . CurrentCell . RowIndex . Value ;
var buttonName = TasView . CurrentCell . Column . Name ;
if ( e . Button = = MouseButtons . Left )
2014-07-09 23:04:22 +00:00
{
2015-03-03 18:22:54 +00:00
_leftButtonHeld = true ;
2015-02-25 21:17:50 +00:00
// SuuperW: Exit float editing mode, or re-enter mouse editing
if ( _floatEditRow ! = - 1 )
{
if ( _floatEditColumn ! = buttonName | | _floatEditRow ! = frame )
{
_floatEditRow = - 1 ;
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2015-02-25 21:17:50 +00:00
}
else
{
_floatEditYPos = e . Y ;
2015-03-10 04:16:42 +00:00
_floatPaintState = CurrentTasMovie . GetFloatState ( frame , buttonName ) ;
2015-02-25 21:17:50 +00:00
return ;
}
}
2015-02-24 06:47:32 +00:00
if ( TasView . CurrentCell . Column . Name = = MarkerColumnName )
2014-07-09 23:04:22 +00:00
{
2015-02-24 06:47:32 +00:00
_startMarkerDrag = true ;
GoToFrame ( TasView . CurrentCell . RowIndex . Value ) ;
}
else if ( TasView . CurrentCell . Column . Name = = FrameColumnName )
{
_startFrameDrag = true ;
2015-03-01 19:29:33 +00:00
_frameDragState = TasView . SelectedRows . Contains ( frame ) ;
2015-02-24 06:47:32 +00:00
}
else // User changed input
{
if ( Global . MovieSession . MovieControllerAdapter . Type . BoolButtons . Contains ( buttonName ) )
2014-07-11 16:26:19 +00:00
{
2015-03-04 19:03:00 +00:00
CurrentTasMovie . ChangeLog . BeginNewBatch ( "Paint Bool" ) ;
2015-03-03 18:22:54 +00:00
2015-03-10 04:16:42 +00:00
CurrentTasMovie . ToggleBoolState ( TasView . CurrentCell . RowIndex . Value , buttonName ) ;
2015-02-24 06:47:32 +00:00
_triggerAutoRestore = true ;
_triggerAutoRestoreFromFrame = TasView . CurrentCell . RowIndex . Value ;
RefreshDialog ( ) ;
2014-07-14 01:49:37 +00:00
2015-02-24 06:47:32 +00:00
_startBoolDrawColumn = buttonName ;
2014-07-14 01:49:37 +00:00
2015-03-10 04:16:42 +00:00
_boolPaintState = CurrentTasMovie . BoolIsPressed ( frame , buttonName ) ;
2015-02-24 06:47:32 +00:00
}
else
{
2015-03-10 04:16:42 +00:00
if ( frame > = CurrentTasMovie . InputLogLength )
2015-02-27 19:06:02 +00:00
{
2015-03-10 04:16:42 +00:00
CurrentTasMovie . SetFloatState ( frame , buttonName , 0 ) ;
RefreshDialog ( ) ;
2015-02-27 19:06:02 +00:00
}
2015-03-10 04:16:42 +00:00
_floatPaintState = CurrentTasMovie . GetFloatState ( frame , buttonName ) ;
2015-02-25 21:17:50 +00:00
if ( e . Clicks ! = 2 )
2015-02-24 06:47:32 +00:00
{
2015-03-04 19:03:00 +00:00
CurrentTasMovie . ChangeLog . BeginNewBatch ( "Paint Float" ) ;
2015-02-25 21:17:50 +00:00
_startFloatDrawColumn = buttonName ;
2014-07-14 01:49:37 +00:00
}
2015-02-25 21:17:50 +00:00
else // Double-click enters float editing mode
2014-07-14 01:49:37 +00:00
{
2015-02-25 21:17:50 +00:00
if ( _floatEditColumn = = buttonName & & _floatEditRow = = frame )
_floatEditRow = - 1 ;
else
{
2015-03-04 19:03:00 +00:00
CurrentTasMovie . ChangeLog . BeginNewBatch ( "Float Edit: " + frame ) ;
2015-02-25 21:17:50 +00:00
_floatEditColumn = buttonName ;
_floatEditRow = frame ;
_floatTypedValue = "" ;
_floatEditYPos = e . Y ;
_triggerAutoRestore = true ;
_triggerAutoRestoreFromFrame = frame ;
}
2015-02-27 19:06:02 +00:00
RefreshDialog ( ) ;
2014-07-14 01:49:37 +00:00
}
2014-07-11 16:26:19 +00:00
}
2014-07-09 23:04:22 +00:00
}
}
2015-03-03 18:22:54 +00:00
else if ( e . Button = = System . Windows . Forms . MouseButtons . Right )
{
2015-03-10 05:12:13 +00:00
if ( TasView . CurrentCell . Column . Name = = FrameColumnName & & frame < CurrentTasMovie . InputLogLength )
2015-03-03 18:22:54 +00:00
{
_rightClickControl = ( Control . ModifierKeys | Keys . Control ) = = Control . ModifierKeys ;
_rightClickShift = ( Control . ModifierKeys | Keys . Shift ) = = Control . ModifierKeys ;
if ( TasView . SelectedRows . Contains ( frame ) )
{
_rightClickInput = new string [ TasView . SelectedRows . Count ( ) ] ;
_rightClickFrame = TasView . FirstSelectedIndex . Value ;
CurrentTasMovie . GetLogEntries ( ) . CopyTo ( _rightClickFrame , _rightClickInput , 0 , TasView . SelectedRows . Count ( ) ) ;
if ( _rightClickControl & & _rightClickShift )
_rightClickFrame + = _rightClickInput . Length ;
}
else
{
_rightClickInput = new string [ 1 ] ;
_rightClickInput [ 0 ] = CurrentTasMovie . GetLogEntries ( ) [ frame ] ;
_rightClickFrame = frame ;
}
_rightClickLastFrame = - 1 ;
// TODO: Turn off ChangeLog.IsRecording and handle the GeneralUndo here.
2015-03-04 19:03:00 +00:00
CurrentTasMovie . ChangeLog . BeginNewBatch ( "Right-Click Edit" ) ;
2015-03-03 18:22:54 +00:00
}
}
2014-07-09 23:04:22 +00:00
}
private void TasView_MouseUp ( object sender , MouseEventArgs e )
{
2014-10-19 00:24:33 +00:00
if ( e . Button = = MouseButtons . Right & & ! TasView . IsPointingAtColumnHeader & & ! _supressContextMenu )
2014-10-15 22:52:23 +00:00
{
RightClickMenu . Show ( TasView , e . X , e . Y ) ;
}
else if ( e . Button = = MouseButtons . Left )
{
_startMarkerDrag = false ;
_startFrameDrag = false ;
_startBoolDrawColumn = string . Empty ;
_startFloatDrawColumn = string . Empty ;
2015-02-25 21:17:50 +00:00
// Exit float editing if value was changed with cursor
2015-03-10 04:16:42 +00:00
if ( _floatEditRow ! = - 1 & & _floatPaintState ! = CurrentTasMovie . GetFloatState ( _floatEditRow , _floatEditColumn ) )
2015-02-25 21:17:50 +00:00
{
_floatEditRow = - 1 ;
RefreshDialog ( ) ;
}
2014-10-15 22:52:23 +00:00
_floatPaintState = 0 ;
2015-02-25 21:17:50 +00:00
_floatEditYPos = - 1 ;
2015-03-03 18:22:54 +00:00
_leftButtonHeld = false ;
2015-03-04 19:03:00 +00:00
if ( _floatEditRow = = - 1 )
CurrentTasMovie . ChangeLog . EndBatch ( ) ;
2015-03-03 18:22:54 +00:00
}
2015-03-10 05:12:13 +00:00
if ( e . Button = = System . Windows . Forms . MouseButtons . Right )
2015-03-03 18:22:54 +00:00
{
if ( _rightClickFrame ! = - 1 )
{
_rightClickInput = null ;
_rightClickFrame = - 1 ;
CurrentTasMovie . ChangeLog . EndBatch ( ) ;
}
2014-10-15 22:52:23 +00:00
}
_supressContextMenu = false ;
2014-10-17 20:10:21 +00:00
2014-10-21 01:31:41 +00:00
DoTriggeredAutoRestoreIfNeeded ( ) ;
2014-07-09 23:04:22 +00:00
}
2014-07-16 01:37:50 +00:00
private void TasView_MouseWheel ( object sender , MouseEventArgs e )
{
2014-08-23 13:14:25 +00:00
if ( TasView . RightButtonHeld & & TasView . CurrentCell . RowIndex . HasValue )
2014-07-16 01:37:50 +00:00
{
2014-10-15 22:52:23 +00:00
_supressContextMenu = true ;
2014-07-16 01:37:50 +00:00
if ( e . Delta < 0 )
{
2014-10-23 21:21:43 +00:00
GoToNextFrame ( ) ;
2014-07-16 01:37:50 +00:00
}
else
{
2014-10-23 21:21:43 +00:00
GoToPreviousFrame ( ) ;
2014-07-16 01:37:50 +00:00
}
}
}
private void TasView_MouseDoubleClick ( object sender , MouseEventArgs e )
{
2015-02-24 06:47:32 +00:00
if ( e . Button = = MouseButtons . Left )
2014-07-16 01:37:50 +00:00
{
2015-02-24 06:47:32 +00:00
var buttonName = TasView . CurrentCell . Column . Name ;
if ( TasView . CurrentCell . RowIndex . HasValue & &
buttonName = = FrameColumnName )
2014-10-15 16:09:14 +00:00
{
2015-02-24 06:47:32 +00:00
if ( Settings . EmptyMarkers )
{
CurrentTasMovie . Markers . Add ( TasView . CurrentCell . RowIndex . Value , string . Empty ) ;
RefreshDialog ( ) ;
}
else
{
CallAddMarkerPopUp ( TasView . CurrentCell . RowIndex . Value ) ;
}
2014-10-15 16:09:14 +00:00
}
2014-07-16 01:37:50 +00:00
}
}
2014-08-23 15:19:48 +00:00
private void TasView_PointedCellChanged ( object sender , InputRoll . CellEventArgs e )
2014-07-09 23:04:22 +00:00
{
2014-08-23 15:19:48 +00:00
// TODO: think about nullability
// For now return if a null because this happens OnEnter which doesn't have any of the below behaviors yet?
// Most of these are stupid but I got annoyed at null crashes
if ( e . OldCell = = null | | e . OldCell . Column = = null | | e . OldCell . RowIndex = = null | |
e . NewCell = = null | | e . NewCell . RowIndex = = null | | e . NewCell . Column = = null )
{
return ;
}
2014-07-11 16:08:47 +00:00
int startVal , endVal ;
2015-03-03 18:22:54 +00:00
int frame = e . NewCell . RowIndex . Value ;
2014-08-23 13:14:25 +00:00
if ( e . OldCell . RowIndex . Value < e . NewCell . RowIndex . Value )
2014-07-11 16:08:47 +00:00
{
2014-08-23 13:14:25 +00:00
startVal = e . OldCell . RowIndex . Value ;
endVal = e . NewCell . RowIndex . Value ;
2014-07-11 16:08:47 +00:00
}
else
{
2014-08-23 13:14:25 +00:00
startVal = e . NewCell . RowIndex . Value ;
endVal = e . OldCell . RowIndex . Value ;
2014-07-11 16:08:47 +00:00
}
2014-07-09 23:04:22 +00:00
if ( _startMarkerDrag )
{
2014-08-23 13:14:25 +00:00
if ( e . NewCell . RowIndex . HasValue )
2014-07-09 23:04:22 +00:00
{
2014-08-23 13:14:25 +00:00
GoToFrame ( e . NewCell . RowIndex . Value ) ;
2014-07-09 23:04:22 +00:00
}
}
else if ( _startFrameDrag )
{
2014-08-23 13:14:25 +00:00
if ( e . OldCell . RowIndex . HasValue & & e . NewCell . RowIndex . HasValue )
2014-07-09 23:04:22 +00:00
{
2015-03-01 19:29:33 +00:00
for ( var i = startVal ; i < = endVal ; i + + )
2014-07-09 23:04:22 +00:00
{
2015-03-01 19:29:33 +00:00
TasView . SelectRow ( i , _frameDragState ) ;
2014-07-09 23:04:22 +00:00
}
2014-10-20 00:11:07 +00:00
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-07-09 23:04:22 +00:00
}
}
2015-03-10 05:12:13 +00:00
2015-03-03 18:22:54 +00:00
else if ( _rightClickFrame ! = - 1 )
{
2015-03-10 05:12:13 +00:00
_supressContextMenu = true ;
2015-03-03 18:22:54 +00:00
if ( frame > CurrentTasMovie . InputLogLength - _rightClickInput . Length )
frame = CurrentTasMovie . InputLogLength - _rightClickInput . Length ;
if ( _rightClickShift )
{
if ( _rightClickControl ) // Insert
{
// If going backwards, delete!
bool shouldInsert = true ;
if ( startVal < _rightClickFrame )
{ // Cloning to a previous frame makes no sense.
startVal = _rightClickFrame - 1 ;
}
if ( startVal < _rightClickLastFrame )
shouldInsert = false ;
if ( shouldInsert )
{
for ( int i = startVal + 1 ; i < = endVal ; i + + )
CurrentTasMovie . InsertInput ( i , _rightClickInput [ ( i - _rightClickFrame ) % _rightClickInput . Length ] ) ;
}
else
{
CurrentTasMovie . RemoveFrames ( startVal + 1 , endVal + 1 ) ;
}
_rightClickLastFrame = frame ;
}
else // Overwrite
{
for ( int i = startVal ; i < = endVal ; i + + )
CurrentTasMovie . SetFrame ( i , _rightClickInput [ ( _rightClickFrame - i ) % _rightClickInput . Length ] ) ;
}
}
else
{
if ( _rightClickControl )
{
for ( int i = 0 ; i < _rightClickInput . Length ; i + + ) // Re-set initial range, just to verify it's still there.
CurrentTasMovie . SetFrame ( _rightClickFrame + i , _rightClickInput [ i ] ) ;
if ( _rightClickOverInput ! = null ) // Restore overwritten input from previous movement
{
for ( int i = 0 ; i < _rightClickOverInput . Length ; i + + )
CurrentTasMovie . SetFrame ( _rightClickLastFrame + i , _rightClickOverInput [ i ] ) ;
}
else
_rightClickOverInput = new string [ _rightClickInput . Length ] ;
_rightClickLastFrame = frame ; // Set new restore log
CurrentTasMovie . GetLogEntries ( ) . CopyTo ( frame , _rightClickOverInput , 0 , _rightClickOverInput . Length ) ;
for ( int i = 0 ; i < _rightClickInput . Length ; i + + ) // Place copied input
CurrentTasMovie . SetFrame ( frame + i , _rightClickInput [ i ] ) ;
}
else
{
int shiftBy = _rightClickFrame - frame ;
string [ ] shiftInput = new string [ Math . Abs ( shiftBy ) ] ;
int shiftFrom = frame ;
if ( shiftBy < 0 )
shiftFrom = _rightClickFrame + _rightClickInput . Length ;
CurrentTasMovie . GetLogEntries ( ) . CopyTo ( shiftFrom , shiftInput , 0 , shiftInput . Length ) ;
int shiftTo = shiftFrom + ( _rightClickInput . Length * Math . Sign ( shiftBy ) ) ;
for ( int i = 0 ; i < shiftInput . Length ; i + + )
CurrentTasMovie . SetFrame ( shiftTo + i , shiftInput [ i ] ) ;
for ( int i = 0 ; i < _rightClickInput . Length ; i + + )
CurrentTasMovie . SetFrame ( frame + i , _rightClickInput [ i ] ) ;
_rightClickFrame = frame ;
}
}
RefreshTasView ( ) ;
}
2015-03-10 05:12:13 +00:00
2014-08-23 13:14:25 +00:00
else if ( TasView . IsPaintDown & & e . NewCell . RowIndex . HasValue & & ! string . IsNullOrEmpty ( _startBoolDrawColumn ) )
2014-07-11 16:26:19 +00:00
{
2014-08-23 13:14:25 +00:00
if ( e . OldCell . RowIndex . HasValue & & e . NewCell . RowIndex . HasValue )
2014-07-11 16:26:19 +00:00
{
2015-02-24 03:06:57 +00:00
for ( var i = startVal ; i < = endVal ; i + + ) // SuuperW: <= so that it will edit the cell you are hovering over. (Inclusive)
2014-07-11 16:26:19 +00:00
{
2015-03-10 04:16:42 +00:00
CurrentTasMovie . SetBoolState ( i , _startBoolDrawColumn , _boolPaintState ) ; // Notice it uses new row, old column, you can only paint across a single column
2014-10-17 20:10:21 +00:00
_triggerAutoRestore = true ;
_triggerAutoRestoreFromFrame = TasView . CurrentCell . RowIndex . Value ;
2014-07-11 16:26:19 +00:00
}
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-07-11 16:26:19 +00:00
}
}
2015-03-10 05:12:13 +00:00
2014-08-23 13:14:25 +00:00
else if ( TasView . IsPaintDown & & e . NewCell . RowIndex . HasValue & & ! string . IsNullOrEmpty ( _startFloatDrawColumn ) )
2014-07-09 23:04:22 +00:00
{
2014-08-23 13:14:25 +00:00
if ( e . OldCell . RowIndex . HasValue & & e . NewCell . RowIndex . HasValue )
2014-07-11 16:08:47 +00:00
{
2015-02-24 03:06:57 +00:00
for ( var i = startVal ; i < = endVal ; i + + ) // SuuperW: <= so that it will edit the cell you are hovering over. (Inclusive)
2014-07-11 16:08:47 +00:00
{
2015-03-01 19:29:33 +00:00
if ( i < CurrentTasMovie . InputLogLength )
2014-07-16 23:04:56 +00:00
{
2015-03-10 04:16:42 +00:00
CurrentTasMovie . SetFloatState ( i , _startFloatDrawColumn , _floatPaintState ) ; // Notice it uses new row, old column, you can only paint across a single column
2014-10-17 20:10:21 +00:00
_triggerAutoRestore = true ;
_triggerAutoRestoreFromFrame = TasView . CurrentCell . RowIndex . Value ;
2014-07-16 23:04:56 +00:00
}
2014-07-11 16:08:47 +00:00
}
2014-07-11 16:26:19 +00:00
2015-03-03 06:56:45 +00:00
RefreshTasView ( ) ;
2014-07-11 16:08:47 +00:00
}
2014-07-09 23:04:22 +00:00
}
}
2015-02-25 21:17:50 +00:00
private void TasView_MouseMove ( object sender , MouseEventArgs e )
{
// For float editing
2015-02-27 19:06:02 +00:00
int increment = ( _floatEditYPos - e . Y ) / 3 ;
2015-02-25 21:17:50 +00:00
if ( _floatEditYPos = = - 1 )
return ;
float value = _floatPaintState + increment ;
Emulation . Common . ControllerDefinition . FloatRange range = Global . MovieSession . MovieControllerAdapter . Type . FloatRanges
[Global.MovieSession.MovieControllerAdapter.Type.FloatControls.IndexOf(_floatEditColumn)] ;
2015-03-01 19:29:33 +00:00
// 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.
2015-02-25 21:17:50 +00:00
float rMax = range . Max ;
float rMin = range . Min ;
if ( rMax < rMin )
{
rMax = range . Min ;
rMin = range . Max ;
}
if ( value > rMax )
value = rMax ;
else if ( value < rMin )
value = rMin ;
2015-03-10 04:16:42 +00:00
CurrentTasMovie . SetFloatState ( _floatEditRow , _floatEditColumn , value ) ;
2015-02-25 21:17:50 +00:00
RefreshDialog ( ) ;
}
2014-07-09 23:04:22 +00:00
private void TasView_SelectedIndexChanged ( object sender , EventArgs e )
{
SetSplicer ( ) ;
}
2014-07-17 19:57:44 +00:00
private void TasView_KeyDown ( object sender , KeyEventArgs e )
{
if ( e . Control & & ! e . Shift & & ! e . Alt & & e . KeyCode = = Keys . Left ) // Ctrl + Left
{
GoToPreviousMarker ( ) ;
}
else if ( e . Control & & ! e . Shift & & ! e . Alt & & e . KeyCode = = Keys . Right ) // Ctrl + Left
{
GoToNextMarker ( ) ;
}
2014-07-25 01:02:24 +00:00
else if ( e . Control & & ! e . Shift & & ! e . Alt & & e . KeyCode = = Keys . Up ) // Ctrl + Up
{
GoToPreviousFrame ( ) ;
}
else if ( e . Control & & ! e . Shift & & ! e . Alt & & e . KeyCode = = Keys . Down ) // Ctrl + Down
{
GoToNextFrame ( ) ;
2014-10-17 19:31:42 +00:00
}
else if ( e . Control & & ! e . Alt & & e . Shift & & e . KeyCode = = Keys . R ) // Ctrl + Shift + R
2014-09-01 15:35:48 +00:00
{
TasView . HorizontalOrientation ^ = true ;
2014-07-25 01:02:24 +00:00
}
2014-07-17 19:57:44 +00:00
2015-02-24 06:47:32 +00:00
// SuuperW: Float Editing
if ( _floatEditRow ! = - 1 )
{
2015-03-10 04:16:42 +00:00
float value = CurrentTasMovie . GetFloatState ( _floatEditRow , _floatEditColumn ) ;
2015-02-24 06:47:32 +00:00
Emulation . Common . ControllerDefinition . FloatRange range = Global . MovieSession . MovieControllerAdapter . Type . FloatRanges
[Global.MovieSession.MovieControllerAdapter.Type.FloatControls.IndexOf(_floatEditColumn)] ;
2015-02-27 19:06:02 +00:00
// Range for N64 Y axis has max -128 and min 127. That should probably be fixed ControllerDefinition.cs, but I'll put a quick fix here anyway.
2015-02-24 06:47:32 +00:00
float rMax = range . Max ;
float rMin = range . Min ;
2015-02-24 20:55:24 +00:00
if ( rMax < rMin )
2015-02-24 06:47:32 +00:00
{
rMax = range . Min ;
rMin = range . Max ;
}
2015-02-24 20:55:24 +00:00
if ( e . KeyCode = = Keys . Right )
value = rMax ;
2015-02-24 06:47:32 +00:00
else if ( e . KeyCode = = Keys . Left )
2015-02-24 20:55:24 +00:00
value = rMin ;
2015-02-24 06:47:32 +00:00
else if ( e . KeyCode > = Keys . D0 & & e . KeyCode < = Keys . D9 )
_floatTypedValue + = e . KeyCode - Keys . D0 ;
else if ( e . KeyCode > = Keys . NumPad0 & & e . KeyCode < = Keys . NumPad9 )
_floatTypedValue + = e . KeyCode - Keys . NumPad0 ;
2015-03-10 04:16:42 +00:00
else if ( e . KeyCode = = Keys . OemMinus )
{
if ( _floatTypedValue . StartsWith ( "-" ) )
_floatTypedValue = _floatTypedValue . Substring ( 1 ) ;
else
_floatTypedValue = "-" + _floatTypedValue ;
2015-02-24 06:47:32 +00:00
}
else if ( e . KeyCode = = Keys . Back )
{
if ( _floatTypedValue = = "" ) // Very first key press is backspace?
_floatTypedValue = value . ToString ( ) ;
_floatTypedValue = _floatTypedValue . Substring ( 0 , _floatTypedValue . Length - 1 ) ;
if ( _floatTypedValue = = "" | | _floatTypedValue = = "-" )
value = 0f ;
else
value = Convert . ToSingle ( _floatTypedValue ) ;
}
else if ( e . KeyCode = = Keys . Escape )
{
2015-02-25 21:17:50 +00:00
if ( _floatEditYPos ! = - 1 ) // Cancel change from dragging cursor
{
_floatEditYPos = - 1 ;
2015-03-10 04:16:42 +00:00
CurrentTasMovie . SetFloatState ( _floatEditRow , _floatEditColumn , _floatPaintState ) ;
2015-02-25 21:17:50 +00:00
}
2015-02-24 06:47:32 +00:00
_floatEditRow = - 1 ;
}
else
{
float changeBy = 0 ;
if ( e . KeyCode = = Keys . Up )
2015-03-10 04:16:42 +00:00
changeBy = 1 ; // We're assuming for now that ALL float controls should contain integers.
2015-02-24 06:47:32 +00:00
else if ( e . KeyCode = = Keys . Down )
changeBy = - 1 ;
if ( e . Shift )
changeBy * = 10 ;
value + = changeBy ;
2015-02-24 20:55:24 +00:00
if ( changeBy ! = 0 )
_floatTypedValue = value . ToString ( ) ;
2015-02-24 06:47:32 +00:00
}
2015-03-10 04:16:42 +00:00
if ( _floatEditRow = = - 1 )
CurrentTasMovie . ChangeLog . EndBatch ( ) ;
else
2015-02-24 06:47:32 +00:00
{
2015-03-10 04:16:42 +00:00
if ( _floatTypedValue = = "" )
{
value = 0f ;
CurrentTasMovie . SetFloatState ( _floatEditRow , _floatEditColumn , value ) ;
}
else
{
value = Convert . ToSingle ( _floatTypedValue ) ;
if ( value > rMax )
value = rMax ;
else if ( value < rMin )
value = rMin ;
CurrentTasMovie . SetFloatState ( _floatEditRow , _floatEditColumn , value ) ;
}
2015-02-24 06:47:32 +00:00
}
2015-03-10 04:16:42 +00:00
2015-02-24 06:47:32 +00:00
}
2015-03-01 05:47:32 +00:00
RefreshDialog ( ) ;
2015-02-24 06:47:32 +00:00
}
2015-02-24 20:55:24 +00:00
/// <summary>
/// This allows arrow keys to be detected by KeyDown.
/// </summary>
private void TasView_PreviewKeyDown ( object sender , PreviewKeyDownEventArgs e )
{
2015-03-01 19:29:33 +00:00
if ( e . KeyCode = = Keys . Left | | e . KeyCode = = Keys . Right | | e . KeyCode = = Keys . Up | | e . KeyCode = = Keys . Down )
e . IsInputKey = true ;
2015-02-24 20:55:24 +00:00
}
2014-07-09 23:04:22 +00:00
#endregion
}
}