BizHawk/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs

637 lines
17 KiB
C#
Raw Normal View History

2014-10-17 17:58:48 +00:00
using System;
using System.Collections.Generic;
using System.Drawing;
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;
namespace BizHawk.Client.EmuHawk
{
public partial class TAStudio
{
#region File Menu
private void FileSubMenu_DropDownOpened(object sender, EventArgs e)
{
ToBk2MenuItem.Enabled =
2014-10-17 17:58:48 +00:00
!string.IsNullOrWhiteSpace(_currentTasMovie.Filename);
SaveTASMenuItem.Enabled =
!string.IsNullOrWhiteSpace(_currentTasMovie.Filename) &&
(_currentTasMovie.Filename != DefaultTasProjName());
2014-10-17 17:58:48 +00:00
}
private void RecentSubMenu_DropDownOpened(object sender, EventArgs e)
{
RecentSubMenu.DropDownItems.Clear();
RecentSubMenu.DropDownItems.AddRange(
Global.Config.RecentTas.RecentMenu(DummyLoadProject));
}
private void NewTasMenuItem_Click(object sender, EventArgs e)
{
StartNewTasMovie();
}
private void OpenTasMenuItem_Click(object sender, EventArgs e)
{
if (AskSaveChanges())
{
var filename = _currentTasMovie.Filename;
if (string.IsNullOrWhiteSpace(filename) || filename == DefaultTasProjName())
{
filename = "";
}
var file = ToolHelpers.GetTasProjFileFromUser(filename);
2014-10-17 17:58:48 +00:00
if (file != null)
{
_currentTasMovie.Filename = file.FullName;
_currentTasMovie.Load();
Global.Config.RecentTas.Add(_currentTasMovie.Filename);
if (_currentTasMovie.InputLogLength > 0) // TODO: this is probably reoccuring logic, break off into a function
{
_currentTasMovie.SwitchToPlay();
}
else
{
_currentTasMovie.SwitchToRecord();
}
RefreshDialog();
MessageStatusLabel.Text = Path.GetFileName(_currentTasMovie.Filename) + " loaded.";
}
}
}
private void SaveTasMenuItem_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(_currentTasMovie.Filename) ||
_currentTasMovie.Filename == DefaultTasProjName())
2014-10-17 17:58:48 +00:00
{
SaveAsTasMenuItem_Click(sender, e);
}
else
{
_currentTasMovie.Save();
MessageStatusLabel.Text = Path.GetFileName(_currentTasMovie.Filename) + " saved.";
Global.Config.RecentTas.Add(_currentTasMovie.Filename);
}
}
private void SaveAsTasMenuItem_Click(object sender, EventArgs e)
{
var filename = _currentTasMovie.Filename;
if (string.IsNullOrWhiteSpace(filename) || filename == DefaultTasProjName())
{
filename = SuggestedTasProjName();
}
var file = ToolHelpers.GetTasProjSaveFileFromUser(filename);
2014-10-17 17:58:48 +00:00
if (file != null)
{
_currentTasMovie.Filename = file.FullName;
_currentTasMovie.Save();
Global.Config.RecentTas.Add(_currentTasMovie.Filename);
MessageStatusLabel.Text = Path.GetFileName(_currentTasMovie.Filename) + " saved.";
SetTextProperty();
2014-10-17 17:58:48 +00:00
}
}
private void ToBk2MenuItem_Click(object sender, EventArgs e)
{
var bk2 = _currentTasMovie.ToBk2();
bk2.Save();
MessageStatusLabel.Text = Path.GetFileName(bk2.Filename) + " created.";
}
private void ExitMenuItem_Click(object sender, EventArgs e)
{
Close();
}
#endregion
#region Edit
private void EditSubMenu_DropDownOpened(object sender, EventArgs e)
{
DeselectMenuItem.Enabled =
SelectBetweenMarkersMenuItem.Enabled =
CopyMenuItem.Enabled =
CutMenuItem.Enabled =
ClearMenuItem.Enabled =
DeleteFramesMenuItem.Enabled =
CloneMenuItem.Enabled =
TruncateMenuItem.Enabled =
TasView.SelectedRows.Any();
ReselectClipboardMenuItem.Enabled =
PasteMenuItem.Enabled =
PasteInsertMenuItem.Enabled =
_tasClipboard.Any();
ClearGreenzoneMenuItem.Enabled =
_currentTasMovie != null && _currentTasMovie.TasStateManager.Any();
GreenzoneICheckSeparator.Visible =
GreenZoneIntegrityCheckMenuItem.Visible =
2014-10-17 17:58:48 +00:00
VersionInfo.DeveloperBuild;
}
private void DeselectMenuItem_Click(object sender, EventArgs e)
{
TasView.DeselectAll();
TasView.Refresh();
}
private void SelectAllMenuItem_Click(object sender, EventArgs e)
{
TasView.SelectAll();
TasView.Refresh();
}
private void SelectBetweenMarkersMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
var prevMarker = _currentTasMovie.Markers.PreviousOrCurrent(TasView.LastSelectedIndex.Value);
var nextMarker = _currentTasMovie.Markers.Next(TasView.LastSelectedIndex.Value);
int prev = prevMarker != null ? prevMarker.Frame : 0;
int next = nextMarker != null ? nextMarker.Frame : _currentTasMovie.InputLogLength;
for (int i = prev; i < next; i++)
{
TasView.SelectRow(i, true);
}
}
}
private void ReselectClipboardMenuItem_Click(object sender, EventArgs e)
{
TasView.DeselectAll();
foreach (var item in _tasClipboard)
{
TasView.SelectRow(item.Frame, true);
}
}
private void CopyMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
_tasClipboard.Clear();
var list = TasView.SelectedRows.ToList();
var sb = new StringBuilder();
foreach (var index in list)
2014-10-17 17:58:48 +00:00
{
var input = _currentTasMovie.GetInputState(index);
_tasClipboard.Add(new TasClipboardEntry(index, input));
2014-10-17 17:58:48 +00:00
var lg = _currentTasMovie.LogGeneratorInstance();
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
if (_tasClipboard.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex > Global.Emulator.Frame);
_currentTasMovie.CopyOverInput(TasView.FirstSelectedIndex.Value, _tasClipboard.Select(x => x.ControllerState));
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(TasView.FirstSelectedIndex.Value);
DoAutoRestore();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
}
private void PasteInsertMenuItem_Click(object sender, EventArgs e)
{
if (_tasClipboard.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex > Global.Emulator.Frame);
_currentTasMovie.InsertInput(TasView.FirstSelectedIndex.Value, _tasClipboard.Select(x => x.ControllerState));
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(TasView.FirstSelectedIndex.Value);
DoAutoRestore();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
}
private void CutMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex.Value > Global.Emulator.Frame);
var rollBackFrame = TasView.FirstSelectedIndex.Value;
_tasClipboard.Clear();
var list = TasView.SelectedRows.ToArray();
var sb = new StringBuilder();
for (var i = 0; i < list.Length; i++)
{
var input = _currentTasMovie.GetInputState(i);
_tasClipboard.Add(new TasClipboardEntry(list[i], input));
var lg = _currentTasMovie.LogGeneratorInstance();
lg.SetSource(input);
sb.AppendLine(lg.GenerateLogEntry());
}
Clipboard.SetDataObject(sb.ToString());
_currentTasMovie.RemoveFrames(list);
SetSplicer();
TasView.DeselectAll();
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(rollBackFrame);
DoAutoRestore();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
}
private void ClearMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex > Global.Emulator.Frame);
var rollBackFrame = TasView.FirstSelectedIndex.Value;
foreach (var frame in TasView.SelectedRows)
{
_currentTasMovie.ClearFrame(frame);
}
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(rollBackFrame);
DoAutoRestore();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
}
private void DeleteFramesMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
var needsToRollback = !(TasView.FirstSelectedIndex > Global.Emulator.Frame);
var rollBackFrame = TasView.FirstSelectedIndex.Value;
_tasClipboard.Clear();
_currentTasMovie.RemoveFrames(TasView.SelectedRows.ToArray());
SetSplicer();
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(rollBackFrame);
DoAutoRestore();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
}
private void CloneMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
var framesToInsert = TasView.SelectedRows.ToList();
var insertionFrame = TasView.LastSelectedIndex.Value + 1;
var needsToRollback = !(insertionFrame > Global.Emulator.Frame);
var inputLog = framesToInsert
.Select(frame => _currentTasMovie.GetInputLogEntry(frame))
.ToList();
2014-10-17 17:58:48 +00:00
_currentTasMovie.InsertInput(insertionFrame, inputLog);
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(insertionFrame);
DoAutoRestore();
RefreshDialog();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
}
private void InsertFrameMenuItem_Click(object sender, EventArgs e)
{
var insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0;
var needsToRollback = insertionFrame <= Global.Emulator.Frame;
2014-10-17 17:58:48 +00:00
_currentTasMovie.InsertEmptyFrame(insertionFrame);
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(insertionFrame);
DoAutoRestore();
RefreshDialog();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
private void InsertNumFramesMenuItem_Click(object sender, EventArgs e)
{
var insertionFrame = TasView.SelectedRows.Any() ? TasView.FirstSelectedIndex.Value : 0;
var needsToRollback = insertionFrame <= Global.Emulator.Frame;
2014-10-17 17:58:48 +00:00
var framesPrompt = new FramesPrompt();
var result = framesPrompt.ShowDialog();
if (result == DialogResult.OK)
{
_currentTasMovie.InsertEmptyFrame(insertionFrame, framesPrompt.Frames);
}
if (needsToRollback)
{
GoToLastEmulatedFrameIfNecessary(insertionFrame);
DoAutoRestore();
RefreshDialog();
2014-10-17 17:58:48 +00:00
}
else
{
RefreshDialog();
}
}
private void TruncateMenuItem_Click(object sender, EventArgs e)
{
if (TasView.SelectedRows.Any())
{
2014-10-19 16:36:47 +00:00
var rollbackFrame = TasView.LastSelectedIndex.Value;
2014-10-17 17:58:48 +00:00
var needsToRollback = !(rollbackFrame > Global.Emulator.Frame);
_currentTasMovie.Truncate(rollbackFrame);
if (needsToRollback)
{
GoToFrame(rollbackFrame);
}
else
{
RefreshDialog();
}
}
}
private void SetMarkersMenuItem_Click(object sender, EventArgs e)
{
foreach (var index in TasView.SelectedRows)
2014-10-17 17:58:48 +00:00
{
CallAddMarkerPopUp(index);
}
}
private void RemoveMarkersMenuItem_Click(object sender, EventArgs e)
{
_currentTasMovie.Markers.RemoveAll(m => TasView.SelectedRows.Contains(m.Frame));
RefreshDialog();
}
private void ClearGreenzoneMenuItem_Click(object sender, EventArgs e)
{
_currentTasMovie.ClearGreenzone();
RefreshDialog();
}
private void GreenZzoneIntegrityCheckMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.MainForm.RebootCore();
GlobalWin.MainForm.FrameAdvance();
var frame = Global.Emulator.Frame;
if (_currentTasMovie.TasStateManager.HasState(frame))
{
var state = (byte[])Global.Emulator.SaveStateBinary().Clone();
var greenzone = _currentTasMovie.TasStateManager[frame];
if (!state.SequenceEqual(greenzone))
{
MessageBox.Show("bad data at frame: " + frame);
return;
}
}
MessageBox.Show("Integrity Check passed");
}
#endregion
#region Config
private void ConfigSubMenu_DropDownOpened(object sender, EventArgs e)
{
DrawInputByDraggingMenuItem.Checked = Global.Config.TAStudioDrawInput;
AutopauseAtEndOfMovieMenuItem.Checked = Global.Config.TAStudioAutoPause;
EmptyNewMarkerNotesMenuItem.Checked = Global.Config.TAStudioEmptyMarkers;
RotateMenuItem.ShortcutKeyDisplayString = TasView.RotateHotkeyStr;
}
private void DrawInputByDraggingMenuItem_Click(object sender, EventArgs e)
{
TasView.InputPaintingMode = Global.Config.TAStudioDrawInput ^= true;
}
private void EmptyNewMarkerNotesMenuItem_Click(object sender, EventArgs e)
{
Global.Config.TAStudioEmptyMarkers ^= true;
}
private void AutopauseAtEndMenuItem_Click(object sender, EventArgs e)
{
Global.Config.TAStudioAutoPause ^= true;
}
private void RotateMenuItem_Click(object sender, EventArgs e)
{
TasView.HorizontalOrientation ^= true;
_currentTasMovie.FlagChanges();
2014-10-17 17:58:48 +00:00
}
#endregion
#region Metadata
private void HeaderMenuItem_Click(object sender, EventArgs e)
{
new MovieHeaderEditor(_currentTasMovie) { Owner = GlobalWin.MainForm }.Show();
2014-10-17 17:58:48 +00:00
UpdateChangesIndicator();
}
private void GreenzoneSettingsMenuItem_Click(object sender, EventArgs e)
{
new GreenzoneSettingsForm(_currentTasMovie.TasStateManager.Settings) { Owner = GlobalWin.MainForm }.Show();
2014-10-17 17:58:48 +00:00
UpdateChangesIndicator();
}
private void CommentsMenuItem_Click(object sender, EventArgs e)
{
var form = new EditCommentsForm();
form.GetMovie(_currentTasMovie);
form.ShowDialog();
}
private void SubtitlesMenuItem_Click(object sender, EventArgs e)
{
var form = new EditSubtitlesForm { ReadOnly = false };
form.GetMovie(Global.MovieSession.Movie);
form.ShowDialog();
}
private void DefaultStateSettingsMenuItem_Click(object sender, EventArgs e)
{
new DefaultGreenzoneSettings().ShowDialog();
}
2014-10-17 17:58:48 +00:00
#endregion
#region Settings Menu
private void SettingsSubMenu_DropDownOpened(object sender, EventArgs e)
{
SaveWindowPositionMenuItem.Checked = Global.Config.TAStudioSettings.SaveWindowPosition;
AutoloadMenuItem.Checked = Global.Config.AutoloadTAStudio;
AutoloadProjectMenuItem.Checked = Global.Config.AutoloadTAStudioProject;
AlwaysOnTopMenuItem.Checked = Global.Config.TAStudioSettings.TopMost;
FloatingWindowMenuItem.Checked = Global.Config.TAStudioSettings.FloatingWindow;
}
private void AutoloadMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoloadTAStudio ^= true;
}
private void AutoloadProjectMenuItem_Click(object sender, EventArgs e)
{
Global.Config.AutoloadTAStudioProject ^= true;
}
private void SaveWindowPositionMenuItem_Click(object sender, EventArgs e)
{
Global.Config.TAStudioSettings.SaveWindowPosition ^= true;
}
private void AlwaysOnTopMenuItem_Click(object sender, EventArgs e)
{
Global.Config.TAStudioSettings.TopMost ^= true;
}
private void FloatingWindowMenuItem_Click(object sender, EventArgs e)
{
Global.Config.TAStudioSettings.FloatingWindow ^= true;
RefreshFloatingWindowControl();
}
private void RestoreDefaultSettingsMenuItem_Click(object sender, EventArgs e)
{
Size = new Size(_defaultWidth, _defaultHeight);
Global.Config.TAStudioSettings.SaveWindowPosition = true;
Global.Config.TAStudioSettings.TopMost = false;
Global.Config.TAStudioSettings.FloatingWindow = false;
RefreshFloatingWindowControl();
}
#endregion
#region Columns
private void ColumnsSubMenu_DropDownOpened(object sender, EventArgs e)
{
ColumnsSubMenu.DropDownItems.Clear();
var columns = TasView.AllColumns
.Where(x => !string.IsNullOrWhiteSpace(x.Text))
.Where(x => x.Name != "FrameColumn");
foreach (var column in columns)
{
var dummyColumnObject = column;
var menuItem = new ToolStripMenuItem
{
Text = column.Text,
Checked = column.Visible
};
menuItem.Click += (o, ev) =>
{
dummyColumnObject.Visible ^= true;
TasView.AllColumns.ColumnsChanged();
_currentTasMovie.FlagChanges();
2014-10-17 17:58:48 +00:00
TasView.Refresh();
};
ColumnsSubMenu.DropDownItems.Add(menuItem);
}
ColumnsSubMenu.DropDownItems.Add(new ToolStripSeparator());
var defaults = new ToolStripMenuItem
{
Name = "RestoreDefaultColumnConfiguration",
Text = "Restore defaults"
};
defaults.Click += (o, ev) =>
{
TasView.AllColumns.Clear();
SetUpColumns();
TasView.Refresh();
_currentTasMovie.FlagChanges();
};
ColumnsSubMenu.DropDownItems.Add(defaults);
2014-10-17 17:58:48 +00:00
}
#endregion
}
}