BizHawk/BizHawk.Client.EmuHawk/movie/RecordMovie.cs

222 lines
5.8 KiB
C#
Raw Normal View History

using System;
using System.IO;
using System.Windows.Forms;
using System.Linq;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using BizHawk.Client.Common;
using BizHawk.Client.Common.MovieConversionExtensions;
namespace BizHawk.Client.EmuHawk
{
// TODO - Allow relative paths in record TextBox
public partial class RecordMovie : Form
{
private readonly MainForm _mainForm;
private readonly Config _config;
private readonly GameInfo _game;
2019-11-02 16:05:01 +00:00
private readonly IEmulator _emulator;
private readonly IMovieSession _movieSession;
public RecordMovie(
MainForm mainForm,
Config config,
GameInfo game,
IEmulator core,
IMovieSession movieSession)
{
_mainForm = mainForm;
_config = config;
_game = game;
2019-11-02 16:05:01 +00:00
_emulator = core;
_movieSession = movieSession;
InitializeComponent();
2019-11-02 16:05:01 +00:00
if (!_emulator.HasSavestates())
{
StartFromCombo.Items.Remove(
StartFromCombo.Items
.OfType<object>()
.First(i => i.ToString()
.ToLower() == "now"));
}
2019-11-02 16:05:01 +00:00
if (!_emulator.HasSaveRam())
{
StartFromCombo.Items.Remove(
StartFromCombo.Items
.OfType<object>()
.First(i => i.ToString()
.ToLower() == "saveram"));
}
}
private string MakePath()
{
var path = RecordBox.Text;
if (!string.IsNullOrWhiteSpace(path))
{
if (path.LastIndexOf(Path.DirectorySeparatorChar) == -1)
{
if (path[0] != Path.DirectorySeparatorChar)
{
path = path.Insert(0, Path.DirectorySeparatorChar.ToString());
}
path = PathManager.MakeAbsolutePath(_config.PathEntries.MoviesPathFragment, null) + path;
if (!MovieService.MovieExtensions.Contains(Path.GetExtension(path)))
{
// If no valid movie extension, add movie extension
2019-03-18 14:06:37 +00:00
path += $".{MovieService.DefaultExtension}";
}
}
}
return path;
}
private void Ok_Click(object sender, EventArgs e)
{
var path = MakePath();
if (!string.IsNullOrWhiteSpace(path))
{
var test = new FileInfo(path);
if (test.Exists)
{
2019-03-18 14:06:37 +00:00
var result = MessageBox.Show($"{path} already exists, overwrite?", "Confirm overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
2013-04-15 02:14:14 +00:00
if (result == DialogResult.Cancel)
{
return;
}
}
2014-06-14 00:46:41 +00:00
var movieToRecord = MovieService.Get(path);
var fileInfo = new FileInfo(path);
if (!fileInfo.Exists)
{
Directory.CreateDirectory(fileInfo.DirectoryName);
}
2019-11-02 16:05:01 +00:00
if (StartFromCombo.SelectedItem.ToString() == "Now" && _emulator.HasSavestates())
{
2019-11-02 16:05:01 +00:00
var core = _emulator.AsStatable();
movieToRecord.StartsFromSavestate = true;
movieToRecord.StartsFromSaveRam = false;
2014-06-12 20:42:46 +00:00
if (core.BinarySaveStatesPreferred)
2014-06-20 00:39:46 +00:00
{
movieToRecord.BinarySavestate = (byte[])core.SaveStateBinary().Clone();
2014-06-20 00:39:46 +00:00
}
else
{
2019-11-02 16:05:01 +00:00
using var sw = new StringWriter();
core.SaveStateText(sw);
movieToRecord.TextSavestate = sw.ToString();
2014-06-20 00:39:46 +00:00
}
2014-10-27 01:14:47 +00:00
// TODO: do we want to support optionally not saving this?
2019-11-02 16:05:01 +00:00
movieToRecord.SavestateFramebuffer = new int[0];
if (_emulator.HasVideoProvider())
2014-10-27 01:14:47 +00:00
{
2019-11-02 16:05:01 +00:00
movieToRecord.SavestateFramebuffer = (int[])_emulator.AsVideoProvider().GetVideoBuffer().Clone();
2014-10-27 01:14:47 +00:00
}
}
2019-11-02 16:05:01 +00:00
else if (StartFromCombo.SelectedItem.ToString() == "SaveRam" && _emulator.HasSaveRam())
{
2019-11-02 16:05:01 +00:00
var core = _emulator.AsSaveRam();
movieToRecord.StartsFromSavestate = false;
movieToRecord.StartsFromSaveRam = true;
movieToRecord.SaveRam = core.CloneSaveRam();
}
movieToRecord.PopulateWithDefaultHeaderValues(AuthorBox.Text);
movieToRecord.Save();
_mainForm.StartNewMovie(movieToRecord, true);
_config.UseDefaultAuthor = DefaultAuthorCheckBox.Checked;
if (DefaultAuthorCheckBox.Checked)
2012-10-20 13:30:32 +00:00
{
_config.DefaultAuthor = AuthorBox.Text;
2012-10-20 13:30:32 +00:00
}
2013-04-15 02:14:14 +00:00
Close();
}
else
2012-10-20 13:30:32 +00:00
{
MessageBox.Show("Please select a movie to record", "File selection error", MessageBoxButtons.OK, MessageBoxIcon.Error);
2012-10-20 13:30:32 +00:00
}
}
private void Cancel_Click(object sender, EventArgs e)
{
2013-04-15 02:14:14 +00:00
Close();
}
private void BrowseBtn_Click(object sender, EventArgs e)
2019-11-02 16:05:01 +00:00
{
string movieFolderPath = PathManager.MakeAbsolutePath(_config.PathEntries.MoviesPathFragment, null);
// Create movie folder if it doesn't already exist
try
{
if (!Directory.Exists(movieFolderPath))
{
Directory.CreateDirectory(movieFolderPath);
}
}
catch (Exception movieDirException)
2016-01-22 03:22:26 +00:00
{
2019-11-02 16:05:01 +00:00
if (movieDirException is IOException
|| movieDirException is UnauthorizedAccessException)
2016-01-22 03:22:26 +00:00
{
//TO DO : Pass error to user?
}
else throw;
}
2019-11-02 04:29:09 +00:00
using var sfd = new SaveFileDialog
{
InitialDirectory = movieFolderPath,
DefaultExt = $".{_movieSession.Movie.PreferredExtension}",
FileName = RecordBox.Text,
OverwritePrompt = false,
Filter = $"Movie Files (*.{_movieSession.Movie.PreferredExtension})|*.{_movieSession.Movie.PreferredExtension}|All Files|*.*"
};
var result = sfd.ShowHawkDialog();
2013-12-24 23:32:43 +00:00
if (result == DialogResult.OK
&& !string.IsNullOrWhiteSpace(sfd.FileName))
{
RecordBox.Text = sfd.FileName;
}
}
private void RecordMovie_Load(object sender, EventArgs e)
{
RecordBox.Text = PathManager.FilesystemSafeName(_game);
StartFromCombo.SelectedIndex = 0;
DefaultAuthorCheckBox.Checked = _config.UseDefaultAuthor;
if (_config.UseDefaultAuthor)
{
AuthorBox.Text = _config.DefaultAuthor;
}
}
private void RecordBox_DragEnter(object sender, DragEventArgs e)
{
e.Set(DragDropEffects.Copy);
}
private void RecordBox_DragDrop(object sender, DragEventArgs e)
{
var filePaths = (string[])e.Data.GetData(DataFormats.FileDrop);
RecordBox.Text = filePaths[0];
}
}
}