diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs
index bead4dccb7..533d0bacec 100644
--- a/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs
+++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.Editing.cs
@@ -108,11 +108,15 @@ namespace BizHawk.Client.Common
InvalidateAfter(frame);
}
- public void InsertEmptyFrame(int frame)
+ public void InsertEmptyFrame(int frame, int count = 1)
{
var lg = LogGeneratorInstance();
lg.SetSource(Global.MovieSession.MovieControllerInstance());
- _log.Insert(frame, lg.EmptyEntry);
+
+ for (int i = 0; i < count; i++)
+ {
+ _log.Insert(frame, lg.EmptyEntry);
+ }
Changes = true;
InvalidateAfter(frame - 1);
diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj
index 8795a0d8ce..db40540529 100644
--- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj
+++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj
@@ -823,6 +823,12 @@
BookmarksBranchesBox.cs
+
+ Form
+
+
+ FramesPrompt.cs
+
Form
@@ -1258,6 +1264,9 @@
BookmarksBranchesBox.cs
+
+ FramesPrompt.cs
+
GreenzoneSettings.cs
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.Designer.cs
new file mode 100644
index 0000000000..a79e0c2c60
--- /dev/null
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.Designer.cs
@@ -0,0 +1,111 @@
+namespace BizHawk.Client.EmuHawk
+{
+ partial class FramesPrompt
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.OkBtn = new System.Windows.Forms.Button();
+ this.CancelBtn = new System.Windows.Forms.Button();
+ this.NumFramesBox = new BizHawk.Client.EmuHawk.WatchValueBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // OkBtn
+ //
+ this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.OkBtn.Location = new System.Drawing.Point(67, 47);
+ this.OkBtn.Name = "OkBtn";
+ this.OkBtn.Size = new System.Drawing.Size(60, 23);
+ this.OkBtn.TabIndex = 1;
+ this.OkBtn.Text = "&Ok";
+ this.OkBtn.UseVisualStyleBackColor = true;
+ this.OkBtn.Click += new System.EventHandler(this.OkBtn_Click);
+ //
+ // CancelBtn
+ //
+ this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelBtn.Location = new System.Drawing.Point(134, 47);
+ this.CancelBtn.Name = "CancelBtn";
+ this.CancelBtn.Size = new System.Drawing.Size(60, 23);
+ this.CancelBtn.TabIndex = 2;
+ this.CancelBtn.Text = "&Cancel";
+ this.CancelBtn.UseVisualStyleBackColor = true;
+ this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click);
+ //
+ // NumFramesBox
+ //
+ this.NumFramesBox.ByteSize = BizHawk.Client.Common.Watch.WatchSize.Byte;
+ this.NumFramesBox.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
+ this.NumFramesBox.Location = new System.Drawing.Point(138, 16);
+ this.NumFramesBox.MaxLength = 3;
+ this.NumFramesBox.Name = "NumFramesBox";
+ this.NumFramesBox.Nullable = false;
+ this.NumFramesBox.Size = new System.Drawing.Size(51, 20);
+ this.NumFramesBox.TabIndex = 3;
+ this.NumFramesBox.Text = "1";
+ this.NumFramesBox.Type = BizHawk.Client.Common.Watch.DisplayType.Unsigned;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(12, 20);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(120, 13);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "Insert number of frames:";
+ //
+ // FramesPrompt
+ //
+ this.AcceptButton = this.OkBtn;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.CancelBtn;
+ this.ClientSize = new System.Drawing.Size(206, 82);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.NumFramesBox);
+ this.Controls.Add(this.CancelBtn);
+ this.Controls.Add(this.OkBtn);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Name = "FramesPrompt";
+ this.ShowIcon = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Insert Frames";
+ this.Load += new System.EventHandler(this.FramesPrompt_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button OkBtn;
+ private System.Windows.Forms.Button CancelBtn;
+ private WatchValueBox NumFramesBox;
+ private System.Windows.Forms.Label label1;
+ }
+}
\ No newline at end of file
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.cs
new file mode 100644
index 0000000000..0d646bbbad
--- /dev/null
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace BizHawk.Client.EmuHawk
+{
+ public partial class FramesPrompt : Form
+ {
+ public FramesPrompt()
+ {
+ InitializeComponent();
+ }
+
+ public int Frames
+ {
+ get { return NumFramesBox.ToRawInt() ?? 0; }
+ }
+
+ private void FramesPrompt_Load(object sender, EventArgs e)
+ {
+ NumFramesBox.Select();
+ }
+
+ private void OkBtn_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ private void CancelBtn_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ }
+}
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.resx b/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.resx
new file mode 100644
index 0000000000..29dcb1b3a3
--- /dev/null
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/FramesPrompt.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs
index 86c3639077..b9bb162466 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs
@@ -394,11 +394,11 @@ namespace BizHawk.Client.EmuHawk
//
// InsertNumFramesMenuItem
//
- this.InsertNumFramesMenuItem.Enabled = false;
this.InsertNumFramesMenuItem.Name = "InsertNumFramesMenuItem";
this.InsertNumFramesMenuItem.ShortcutKeyDisplayString = "Ins";
this.InsertNumFramesMenuItem.Size = new System.Drawing.Size(240, 22);
this.InsertNumFramesMenuItem.Text = "Insert # of Frames";
+ this.InsertNumFramesMenuItem.Click += new System.EventHandler(this.InsertNumFramesMenuItem_Click);
//
// toolStripSeparator6
//
diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
index 7723ba6fc0..85875687d1 100644
--- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
+++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs
@@ -417,21 +417,24 @@ namespace BizHawk.Client.EmuHawk
private void CopyMenuItem_Click(object sender, EventArgs e)
{
- _tasClipboard.Clear();
- var list = TasView.SelectedIndices;
- var sb = new StringBuilder();
- for (var i = 0; i < list.Count; i++)
+ if (SelectedIndices.Any())
{
- var input = _tas.GetInputState(list[i]);
- _tasClipboard.Add(new TasClipboardEntry(list[i], input));
- var lg = _tas.LogGeneratorInstance();
- lg.SetSource(input);
- sb.AppendLine(lg.GenerateLogEntry());
+ _tasClipboard.Clear();
+ var list = TasView.SelectedIndices;
+ var sb = new StringBuilder();
+ for (var i = 0; i < list.Count; i++)
+ {
+ var input = _tas.GetInputState(list[i]);
+ _tasClipboard.Add(new TasClipboardEntry(list[i], input));
+ var lg = _tas.LogGeneratorInstance();
+ lg.SetSource(input);
+ sb.AppendLine(lg.GenerateLogEntry());
+ }
+
+ Clipboard.SetDataObject(sb.ToString());
+
+ SetSplicer();
}
-
- Clipboard.SetDataObject(sb.ToString());
-
- SetSplicer();
}
private void PasteMenuItem_Click(object sender, EventArgs e)
@@ -441,44 +444,43 @@ namespace BizHawk.Client.EmuHawk
if (_tasClipboard.Any())
{
_tas.CopyOverInput(FirstSelectedIndex, _tasClipboard.Select(x => x.ControllerState));
+ RefreshDialog();
}
-
- RefreshDialog();
}
private void PasteInsertMenuItem_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
if (_tasClipboard.Any())
{
_tas.InsertInput(FirstSelectedIndex, _tasClipboard.Select(x => x.ControllerState));
+ RefreshDialog();
}
-
- RefreshDialog();
}
private void CutMenuItem_Click(object sender, EventArgs e)
{
- _tasClipboard.Clear();
- var list = SelectedIndices.ToArray();
- var sb = new StringBuilder();
- for (var i = 0; i < list.Length; i++)
+ if (SelectedIndices.Any())
{
- var input = _tas.GetInputState(i);
- _tasClipboard.Add(new TasClipboardEntry(list[i], input));
- var lg = _tas.LogGeneratorInstance();
- lg.SetSource(input);
- sb.AppendLine(lg.GenerateLogEntry());
+ _tasClipboard.Clear();
+ var list = SelectedIndices.ToArray();
+ var sb = new StringBuilder();
+ for (var i = 0; i < list.Length; i++)
+ {
+ var input = _tas.GetInputState(i);
+ _tasClipboard.Add(new TasClipboardEntry(list[i], input));
+ var lg = _tas.LogGeneratorInstance();
+ lg.SetSource(input);
+ sb.AppendLine(lg.GenerateLogEntry());
+ }
+
+ Clipboard.SetDataObject(sb.ToString());
+
+ _tas.RemoveFrames(list);
+
+ SetSplicer();
+ TasView.DeselectAll();
+ RefreshDialog();
}
-
- Clipboard.SetDataObject(sb.ToString());
-
- _tas.RemoveFrames(list);
-
- SetSplicer();
- TasView.DeselectAll();
- RefreshDialog();
}
private void ClearMenuItem_Click(object sender, EventArgs e)
@@ -493,39 +495,66 @@ namespace BizHawk.Client.EmuHawk
private void DeleteFramesMenuItem_Click(object sender, EventArgs e)
{
- _tasClipboard.Clear();
- _tas.RemoveFrames(SelectedIndices.ToArray());
- SetSplicer();
- TasView.DeselectAll();
- RefreshDialog();
+ if (SelectedIndices.Any())
+ {
+ _tasClipboard.Clear();
+ _tas.RemoveFrames(SelectedIndices.ToArray());
+ SetSplicer();
+ TasView.DeselectAll();
+ RefreshDialog();
+ }
}
private void CloneMenuItem_Click(object sender, EventArgs e)
{
- var framesToInsert = SelectedIndices.ToList();
- var insertionFrame = LastSelectedIndex + 1;
- var inputLog = new List();
-
- foreach (var frame in framesToInsert)
+ if (SelectedIndices.Any())
{
- inputLog.Add(_tas.GetInput(frame));
+ var framesToInsert = SelectedIndices.ToList();
+ var insertionFrame = LastSelectedIndex + 1;
+ var inputLog = new List();
+
+ foreach (var frame in framesToInsert)
+ {
+ inputLog.Add(_tas.GetInput(frame));
+ }
+
+ _tas.InsertInput(insertionFrame, inputLog);
+
+ RefreshDialog();
}
-
- _tas.InsertInput(insertionFrame, inputLog);
-
- RefreshDialog();
}
private void InsertFrameMenuItem_Click(object sender, EventArgs e)
{
- _tas.InsertEmptyFrame(LastSelectedIndex + 1);
+ if (SelectedIndices.Any())
+ {
+ _tas.InsertEmptyFrame(LastSelectedIndex + 1);
+ RefreshDialog();
+ }
+ }
+
+ private void InsertNumFramesMenuItem_Click(object sender, EventArgs e)
+ {
+ if (SelectedIndices.Any())
+ {
+ var framesPrompt = new FramesPrompt();
+ var result = framesPrompt.ShowDialog();
+ if (result == DialogResult.OK)
+ {
+ _tas.InsertEmptyFrame(LastSelectedIndex + 1, framesPrompt.Frames);
+ }
+ }
+
RefreshDialog();
}
private void TruncateMenuItem_Click(object sender, EventArgs e)
{
- _tas.Truncate(LastSelectedIndex + 1);
- RefreshDialog();
+ if (SelectedIndices.Any())
+ {
+ _tas.Truncate(LastSelectedIndex + 1);
+ RefreshDialog();
+ }
}