diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs index 9d168f6709..09aa7dc81e 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/InputRoll.cs @@ -38,7 +38,7 @@ namespace BizHawk.Client.EmuHawk // Hiding lag frames (Mainly intended for 30fps play.) public int LagFramesToHide { get; set; } - private int[] lagFrames = new int[50]; // Large enough value that it shouldn't ever need resizing. + private int[] lagFrames = new int[100]; // Large enough value that it shouldn't ever need resizing. private IntPtr RotatedFont; private Font NormalFont; @@ -218,23 +218,6 @@ namespace BizHawk.Client.EmuHawk [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)] public RollColumns AllColumns { get { return _columns; } } - public void SelectAll() - { - var oldFullRowVal = FullRowSelect; - FullRowSelect = true; - for (int i = 0; i < RowCount; i++) - { - SelectRow(i, true); - } - - FullRowSelect = oldFullRowVal; - } - - public void DeselectAll() - { - SelectedItems.Clear(); - } - #endregion #region Event Handlers @@ -385,6 +368,22 @@ namespace BizHawk.Client.EmuHawk } } + public void SelectAll() + { + var oldFullRowVal = FullRowSelect; + FullRowSelect = true; + for (int i = 0; i < RowCount; i++) + { + SelectRow(i, true); + } + + FullRowSelect = oldFullRowVal; + } + public void DeselectAll() + { + SelectedItems.Clear(); + } + [Browsable(false)] [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden)] public bool IsPointingAtColumnHeader @@ -567,7 +566,7 @@ namespace BizHawk.Client.EmuHawk int HalfRow = 0; if ((DrawHeight - ColumnHeight - 3) % CellHeight < CellHeight / 2) HalfRow = 1; - return FirstVisibleRow + VisibleRows - HalfRow + CountLagFramesDisplay(VisibleRows); + return FirstVisibleRow + VisibleRows - HalfRow + CountLagFramesDisplay(VisibleRows - HalfRow); } } public int LastVisibleRow @@ -588,18 +587,22 @@ namespace BizHawk.Client.EmuHawk } else { - int Last = LastVisibleRow - HalfRow; - - if (Math.Abs(Last - value) > VisibleRows) // Big jump + if (Math.Abs(LastFullyVisibleRow - value) > VisibleRows) // Big jump FirstVisibleRow = Math.Max(value - (ExpectedDisplayRange() - HalfRow), 0); - else // Small jump - FirstVisibleRow -= (Last - value); - // SuuperW: This can cause an infinite loop, don't have time to debug it right now. - //// Now a second re-check, with lagFrames[] updated. - //SetLagFramesArray(); - //if (Math.Abs(LastFullyVisibleRow - value) > LagFramesToHide) - // LastVisibleRow = value; + // Small jump, more accurate + int lastVisible; + do + { + SetLagFramesArray(); + lastVisible = LastFullyVisibleRow; + if ((lastVisible - value) / (LagFramesToHide + 1) != 0) + FirstVisibleRow = Math.Max(FirstVisibleRow - ((lastVisible - value) / (LagFramesToHide + 1)), 0); + else + FirstVisibleRow -= Math.Sign(lastVisible - value); + } while ((lastVisible - value < 0 || lastVisible - value > lagFrames[VisibleRows]) && FirstVisibleRow != 0); + + System.Diagnostics.Debug.Print("Jumped to: " + value + " (" + LastFullyVisibleRow + ")"); } } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs index 3f340038a2..01e15a3364 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs @@ -121,6 +121,7 @@ namespace BizHawk.Client.EmuHawk private void RemoveBtn_Click(object sender, EventArgs e) { SelectedMarkers.ForEach(i => Tastudio.CurrentTasMovie.Markers.Remove(i)); + MarkerInputRoll.DeselectAll(); Tastudio.RefreshDialog(); MarkerView_SelectedIndexChanged(sender, e); } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs index 6514b12944..49e0fcb005 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IToolForm.cs @@ -36,7 +36,7 @@ namespace BizHawk.Client.EmuHawk } RefreshDialog(); - } + } public void FastUpdate() { @@ -130,7 +130,10 @@ namespace BizHawk.Client.EmuHawk if (!TasView.IsVisible(indexThatMustBeVisible.Value)) { - TasView.LastVisibleRow = indexThatMustBeVisible.Value; + if (TasView.FirstVisibleRow > indexThatMustBeVisible.Value) + TasView.FirstVisibleRow = indexThatMustBeVisible.Value; + else + TasView.LastVisibleRow = indexThatMustBeVisible.Value; } } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index ace6bc534f..cfcaf4d757 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -170,9 +170,16 @@ namespace BizHawk.Client.EmuHawk } else if (Emulator.Frame == CurrentTasMovie.InputLogLength) // In this situation we have a "pending" frame for the user to click { - text = CurrentTasMovie.CreateDisplayValueForButton( - Global.ClickyVirtualPadController, - columnName); + if (Global.MovieSession.MovieControllerAdapter.Type.BoolButtons.Contains(columnName)) + { + text = CurrentTasMovie.CreateDisplayValueForButton( + Global.ClickyVirtualPadController, columnName); + } + else + { + text = CurrentTasMovie.CreateDisplayValueForButton( + Global.StickyXORAdapter, columnName); + } } } } @@ -267,7 +274,7 @@ namespace BizHawk.Client.EmuHawk else { _floatEditYPos = e.Y; - _floatPaintState = CurrentTasMovie.GetFloatValue(frame, buttonName); + _floatPaintState = GetFloatValue(frame, buttonName); return; } } @@ -304,37 +311,33 @@ namespace BizHawk.Client.EmuHawk } else { + if (frame < CurrentTasMovie.InputLogLength) + { + _floatPaintState = CurrentTasMovie.GetFloatValue(frame, buttonName); + } + else + { + _floatPaintState = Global.StickyXORAdapter.GetFloat(buttonName); + } + if (e.Clicks != 2) { _startFloatDrawColumn = buttonName; - - if (frame < CurrentTasMovie.InputLogLength) - { - _floatPaintState = CurrentTasMovie.GetFloatValue(frame, buttonName); - } - else - { - _floatPaintState = Global.ClickyVirtualPadController.GetFloat(buttonName); - } } else // Double-click enters float editing mode { if (_floatEditColumn == buttonName && _floatEditRow == frame) - { _floatEditRow = -1; - RefreshDialog(); - } else { _floatEditColumn = buttonName; _floatEditRow = frame; _floatTypedValue = ""; _floatEditYPos = e.Y; - _floatPaintState = CurrentTasMovie.GetFloatValue(_floatEditRow, _floatEditColumn); _triggerAutoRestore = true; _triggerAutoRestoreFromFrame = frame; - RefreshDialog(); } + RefreshDialog(); } } } @@ -354,7 +357,7 @@ namespace BizHawk.Client.EmuHawk _startBoolDrawColumn = string.Empty; _startFloatDrawColumn = string.Empty; // Exit float editing if value was changed with cursor - if (_floatEditRow != -1 && _floatPaintState != CurrentTasMovie.GetFloatValue(_floatEditRow, _floatEditColumn)) + if (_floatEditRow != -1 && _floatPaintState != GetFloatValue(_floatEditRow, _floatEditColumn)) { _floatEditRow = -1; RefreshDialog(); @@ -470,7 +473,7 @@ namespace BizHawk.Client.EmuHawk { if (i < CurrentTasMovie.InputLogLength) // TODO: how do we really want to handle the user setting the float state of the pending frame? { - CurrentTasMovie.SetFloatState(i, _startFloatDrawColumn, _floatPaintState); // Notice it uses new row, old column, you can only paint across a single column + SetFloatValue(i, _startFloatDrawColumn, _floatPaintState); // Notice it uses new row, old column, you can only paint across a single column _triggerAutoRestore = true; _triggerAutoRestoreFromFrame = TasView.CurrentCell.RowIndex.Value; } @@ -484,14 +487,14 @@ namespace BizHawk.Client.EmuHawk private void TasView_MouseMove(object sender, MouseEventArgs e) { // For float editing - int increment = (e.Y - _floatEditYPos) / 3; + int increment = (_floatEditYPos - e.Y) / 3; 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)]; - // Range for N64 Y axis has max -128 and min 127. That should probably be fixed elsewhere, 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, but I'll put a quick fix here anyway. float rMax = range.Max; float rMin = range.Min; if (rMax < rMin) @@ -504,7 +507,7 @@ namespace BizHawk.Client.EmuHawk else if (value < rMin) value = rMin; - CurrentTasMovie.SetFloatState(_floatEditRow, _floatEditColumn, value); + SetFloatValue(_floatEditRow, _floatEditColumn, value); RefreshDialog(); } @@ -540,10 +543,10 @@ namespace BizHawk.Client.EmuHawk // SuuperW: Float Editing if (_floatEditRow != -1) { - float value = CurrentTasMovie.GetFloatValue(_floatEditRow, _floatEditColumn); + float value = GetFloatValue(_floatEditRow, _floatEditColumn); 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 elsewhere, 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 ControllerDefinition.cs, but I'll put a quick fix here anyway. float rMax = range.Max; float rMin = range.Min; if (rMax < rMin) @@ -588,7 +591,7 @@ namespace BizHawk.Client.EmuHawk if (_floatEditYPos != -1) // Cancel change from dragging cursor { _floatEditYPos = -1; - CurrentTasMovie.SetFloatState(_floatEditRow, _floatEditColumn, _floatPaintState); + SetFloatValue(_floatEditRow, _floatEditColumn, _floatPaintState); } _floatEditRow = -1; } @@ -607,13 +610,13 @@ namespace BizHawk.Client.EmuHawk _floatTypedValue = value.ToString(); } - if (_floatEditRow != -1 && value != CurrentTasMovie.GetFloatValue(_floatEditRow, _floatEditColumn)) + if (_floatEditRow != -1 && value != GetFloatValue(_floatEditRow, _floatEditColumn)) { if (value > rMax) value = rMax; else if (value < rMin) value = rMin; - CurrentTasMovie.SetFloatState(_floatEditRow, _floatEditColumn, value); + SetFloatValue(_floatEditRow, _floatEditColumn, value); } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index f9b75175c6..133f394c3c 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -487,6 +487,22 @@ namespace BizHawk.Client.EmuHawk } } + private float GetFloatValue(int frame, string buttonName) + { + if (frame < CurrentTasMovie.InputLogLength) + return CurrentTasMovie.GetFloatValue(frame, buttonName); + else if (frame == Emulator.Frame && frame == CurrentTasMovie.InputLogLength) + return Global.StickyXORAdapter.GetFloat(buttonName); + return 0; // ? Should I do it differently so it will error instead? + } + private void SetFloatValue(int frame, string buttonName, float value) + { + if (frame < CurrentTasMovie.InputLogLength) + CurrentTasMovie.SetFloatState(frame, buttonName, value); + else if (frame == Emulator.Frame && frame == CurrentTasMovie.InputLogLength) + Global.StickyXORAdapter.SetFloat(buttonName, value); + } + private void SetColumnsFromCurrentStickies() { foreach (var column in TasView.VisibleColumns)