BizHawk/BizHawk.Client.EmuHawk/movie/EditSubtitlesForm.cs

257 lines
6.5 KiB
C#

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using System.Globalization;
using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk
{
public partial class EditSubtitlesForm : Form
{
public bool ReadOnly { get; set; }
private IMovie _selectedMovie;
public EditSubtitlesForm()
{
InitializeComponent();
}
private void EditSubtitlesForm_Load(object sender, EventArgs e)
{
if (ReadOnly)
{
// Set all columns to read only
for (int i = 0; i < SubGrid.Columns.Count; i++)
{
SubGrid.Columns[i].ReadOnly = true;
}
Text = "View Subtitles";
}
if (SubGrid.Rows.Count > 8)
{
var x = Height + ((SubGrid.Rows.Count - 8) * 21);
Height = x < 600 ? x : 600;
}
}
private void Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void ShowError(int row, int column)
{
var c = SubGrid.Rows[row].Cells[column];
var error = "Unable to parse value: " + c.Value;
var caption = "Parse Error Row " + row + " Column " + column;
MessageBox.Show(error, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void Ok_Click(object sender, EventArgs e)
{
if (!ReadOnly)
{
_selectedMovie.Subtitles.Clear();
for (int i = 0; i < SubGrid.Rows.Count - 1; i++)
{
var s = new Subtitle();
var c = SubGrid.Rows[i].Cells[0];
try { s.Frame = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 0); return; }
c = SubGrid.Rows[i].Cells[1];
try { s.X = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 1); return; }
c = SubGrid.Rows[i].Cells[2];
try { s.Y = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 2); return; }
c = SubGrid.Rows[i].Cells[3];
try { s.Duration = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 3); return; }
c = SubGrid.Rows[i].Cells[4];
try { s.Color = uint.Parse(c.Value.ToString(), NumberStyles.HexNumber); }
catch { ShowError(i, 4); return; }
try { c = SubGrid.Rows[i].Cells[5]; }
catch { ShowError(i, 5); return; }
s.Message = c.Value.ToString();
_selectedMovie.Subtitles.Add(s);
}
_selectedMovie.Save();
}
Close();
}
public void GetMovie(IMovie m)
{
_selectedMovie = m;
var subs = new SubtitleList();
subs.AddRange(m.Subtitles);
for (int x = 0; x < subs.Count; x++)
{
var s = subs[x];
SubGrid.Rows.Add();
var c = SubGrid.Rows[x].Cells[0];
c.Value = s.Frame;
c = SubGrid.Rows[x].Cells[1];
c.Value = s.X;
c = SubGrid.Rows[x].Cells[2];
c.Value = s.Y;
c = SubGrid.Rows[x].Cells[3];
c.Value = s.Duration;
c = SubGrid.Rows[x].Cells[4];
c.Value = string.Format("{0:X8}", s.Color);
c.Style.BackColor = Color.FromArgb((int)s.Color);
c = SubGrid.Rows[x].Cells[5];
c.Value = s.Message;
}
}
private void ChangeRow(Subtitle s, int index)
{
if (index >= SubGrid.Rows.Count)
{
return;
}
var c = SubGrid.Rows[index].Cells[0];
c.Value = s.Frame;
c = SubGrid.Rows[index].Cells[1];
c.Value = s.X;
c = SubGrid.Rows[index].Cells[2];
c.Value = s.Y;
c = SubGrid.Rows[index].Cells[3];
c.Value = s.Duration;
c = SubGrid.Rows[index].Cells[4];
c.Value = string.Format("{0:X8}", s.Color);
c.Style.BackColor = Color.FromArgb((int)s.Color);
c = SubGrid.Rows[index].Cells[5];
c.Value = s.Message;
}
private Subtitle GetRow(int index)
{
if (index >= SubGrid.Rows.Count) return new Subtitle();
var s = new Subtitle();
var c = SubGrid.Rows[index].Cells[0];
// Empty catch because it should default to subtitle default value
try { s.Frame = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[1];
try { s.X = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[2];
try { s.Y = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[3];
try { s.Duration = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[4];
try { s.Color = uint.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[5];
try { s.Message = c.Value.ToString(); }
catch { }
_selectedMovie.Subtitles.Add(s);
return s;
}
private void SubGrid_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (ReadOnly)
{
return;
}
var c = SubGrid.SelectedRows;
if (c.Count == 0)
{
return;
}
var s = new SubtitleMaker {Sub = GetRow(c[0].Index)};
if (s.ShowDialog() == DialogResult.OK)
{
ChangeRow(s.Sub, SubGrid.SelectedRows[0].Index);
}
}
private void Export_Click(object sender, EventArgs e)
{
// Get file to save as
var form = new SaveFileDialog
{
AddExtension = true,
Filter = "SubRip Files (*.srt)|*.srt|All files (*.*)|*.*"
};
var result = form.ShowDialog();
var fileName = form.FileName;
form.Dispose();
if (result != DialogResult.OK)
{
return;
}
// Fetch fps
var system = _selectedMovie.HeaderEntries[HeaderKeys.PLATFORM];
var pal = _selectedMovie.HeaderEntries.ContainsKey(HeaderKeys.PAL)
&& _selectedMovie.HeaderEntries[HeaderKeys.PAL] == "1";
var pfr = new PlatformFrameRates();
double fps = 1;
try
{
fps = pfr[system, pal];
}
catch
{
MessageBox.Show(
"Could not determine movie fps, export failed.",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
// Create string and write to file
var str = _selectedMovie.Subtitles.ToSubRip(fps);
File.WriteAllText(fileName, str);
// Display success
MessageBox.Show(
string.Format("Subtitles succesfully exported to {0}.", fileName),
"Success");
}
private void SubGrid_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
e.Row.Cells["Frame"].Value = 0;
e.Row.Cells["X"].Value = 0;
e.Row.Cells["Y"].Value = 0;
e.Row.Cells["Length"].Value = 0;
e.Row.Cells["DispColor"].Value = "FFFFFFFF";
}
private void ConcatMultilines_CheckedChanged(object sender, EventArgs e)
{
_selectedMovie.Subtitles.ConcatMultilines = ConcatMultilines.Checked;
}
private void AddColorTag_CheckedChanged(object sender, EventArgs e)
{
_selectedMovie.Subtitles.AddColorTag = AddColorTag.Checked;
}
}
}