BizHawk/BizHawk.MultiClient/RecordMovie.cs

146 lines
4.2 KiB
C#

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;
using System.IO;
namespace BizHawk.MultiClient
{
public partial class RecordMovie : Form
{
//Allow relative paths in record textbox
//Hook up RecordFrom box
//PAL vs NTSC when appropriate (by SystemID)
//Other platform specific header lines
Movie MovieToRecord;
public RecordMovie()
{
InitializeComponent();
}
private string MakePath()
{
if (RecordBox.Text.Length == 0)
return "";
string path = RecordBox.Text;
int x = path.LastIndexOf('\\');
if (path.LastIndexOf('\\') == -1)
{
if (path[0] != '\\')
path = path.Insert(0, "\\");
path = PathManager.MakeAbsolutePath(Global.Config.MoviesPath, "") + path;
if (path[path.Length - 4] != '.') //If no file extension, add .tas
path += ".tas";
return path;
}
else
return path;
}
private void OK_Click(object sender, EventArgs e)
{
string path = MakePath();
if (path.Length > 0)
{
MovieToRecord = new Movie(path, MOVIEMODE.RECORD);
//Header
MovieToRecord.Header.SetHeaderLine(MovieHeader.AUTHOR, AuthorBox.Text);
MovieToRecord.Header.SetHeaderLine(MovieHeader.EMULATIONVERSION, MainForm.EMUVERSION);
MovieToRecord.Header.SetHeaderLine(MovieHeader.MOVIEVERSION, MovieHeader.MovieVersion);
MovieToRecord.Header.SetHeaderLine(MovieHeader.GUID, MovieHeader.MakeGUID());
MovieToRecord.Header.SetHeaderLine(MovieHeader.PLATFORM, Global.Emulator.SystemId);
if (Global.Game != null)
MovieToRecord.Header.SetHeaderLine(MovieHeader.GAMENAME, PathManager.FilesystemSafeName(Global.Game));
else
MovieToRecord.Header.SetHeaderLine(MovieHeader.GAMENAME, "NULL");
if (StartFromCombo.SelectedItem.ToString() == "Now")
{
MovieToRecord.SetStartsFromSavestate(true);
var temppath = path + ".tmp";
var writer = new StreamWriter(temppath);
Global.Emulator.SaveStateText(writer);
writer.Close();
var file = new FileInfo(temppath);
using (StreamReader sr = file.OpenText())
{
string str = "";
while ((str = sr.ReadLine()) != null)
{
if (str == "")
{
continue;
}
else
MovieToRecord.Header.Comments.Add(str);
}
}
file.Delete();
}
Global.MainForm.StartNewMovie(MovieToRecord, true);
Global.Config.UseDefaultAuthor = DefaultAuthorCheckBox.Checked;
if (DefaultAuthorCheckBox.Checked)
Global.Config.DefaultAuthor = AuthorBox.Text;
this.Close();
}
else
MessageBox.Show("Please select a movie to record", "File selection error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void Cancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.MoviesPath, "");
sfd.DefaultExt = ".tas";
sfd.FileName = PathManager.FilesystemSafeName(Global.Game);
sfd.Filter = "Movie files (*.tas)|*.tas";
Global.Sound.StopSound();
var result = sfd.ShowDialog();
Global.Sound.StartSound();
if (result == DialogResult.OK)
{
RecordBox.Text = sfd.FileName;
}
}
private void RecordMovie_Load(object sender, EventArgs e)
{
StartFromCombo.SelectedIndex = 0;
DefaultAuthorCheckBox.Checked = Global.Config.UseDefaultAuthor;
if (Global.Config.UseDefaultAuthor)
AuthorBox.Text = Global.Config.DefaultAuthor;
//TODO: populate combo with savestate slots that currently exist
}
private void RecordBox_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
}
private void RecordBox_DragDrop(object sender, DragEventArgs e)
{
string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
RecordBox.Text = filePaths[0];
}
}
}