using System;\r
+using System.Collections.Generic;\r
+using System.IO;\r
using System.Windows.Forms;\r
+using Handbrake.Functions;\r
\r
namespace Handbrake.Controls\r
{\r
public partial class Subtitles : UserControl\r
{\r
-\r
- // TODO\r
- // - Right click menu for adding/removal of tracks.\r
- // - Multi-select for removal.\r
+ readonly IDictionary<string, string> LangMap = new Dictionary<string, string>();\r
+ List<SubtitleInfo> SubList = new List<SubtitleInfo>();\r
+ private int _fileContainer;\r
\r
public Subtitles()\r
{\r
InitializeComponent();\r
+\r
+ LangMap = Main.mapLanguages();\r
+ foreach (string key in LangMap.Keys)\r
+ srt_lang.Items.Add(key);\r
+\r
+ srt_charcode.SelectedIndex = 28;\r
+ srt_lang.SelectedIndex = 40;\r
}\r
- public int setContainer { get; set; }\r
\r
- // Controls\r
+ // Primary Controls\r
private void btn_addSubTrack_Click(object sender, EventArgs e)\r
{\r
- string forcedVal = "No";\r
- string burnedVal = "No";\r
- string defaultSub = "No";\r
-\r
- if (check_forced.Checked)\r
- forcedVal = "Yes";\r
+ // Logic\r
+ string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";\r
+ string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";\r
+ string burnedVal = check_burned.CheckState == CheckState.Checked && (!drp_subtitleTracks.Text.Contains("Text")) ? "Yes" : "No";\r
+ string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";\r
+ int srtOffsetMs = 0;\r
\r
- if (check_burned.Checked)\r
+ if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
{\r
- if (!drp_subtitleTracks.Text.Contains("Text"))\r
- {\r
- burnedVal = "Yes";\r
- setNoBurned();\r
- }\r
+ burnedVal = "No";\r
+ forcedVal = "No";\r
+ srtPath = openFileDialog.FileName;\r
+ srtFile = Path.GetFileName(openFileDialog.FileName);\r
+ srtLangVal = srt_lang.SelectedItem.ToString();\r
+ srtCode = srt_charcode.SelectedItem.ToString();\r
+ srtOffsetMs = (int)srt_offset.Value;\r
}\r
\r
- if (check_default.Checked)\r
+ if (_fileContainer == 0) // MP4 and M4V file extension\r
{\r
- defaultSub = "Yes";\r
- setNoDefault();\r
- }\r
-\r
- Boolean addTrack = true;\r
- if (setContainer == 0 || setContainer == 1)\r
- {\r
- burnedVal = "Yes"; // MP4 must have bitmap subs burned in.\r
-\r
// Make sure we only have 1 bitmap track.\r
- if (drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
+ if (drp_subtitleTracks.SelectedItem != null && drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
+ {\r
foreach (ListViewItem item in lv_subList.Items)\r
{\r
- if (item.SubItems[1].Text.Contains("Bitmap"))\r
+ if (item.SubItems[0].Text.Contains("Bitmap"))\r
{\r
- MessageBox.Show(this,\r
- "MP4 files can only have 1 bitmap track. If you wish to have multiple bitmap tracks you should consider using MKV if suitable.",\r
+ MessageBox.Show(this, "More than one vobsub is not supported in mp4... Your first vobsub track will now be used.",\r
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
- addTrack = false;\r
+ return;\r
}\r
}\r
+ }\r
}\r
\r
- // Add the track if allowed.\r
- if (addTrack)\r
- {\r
- ListViewItem newTrack = new ListViewItem(getNewID().ToString());\r
+ if (defaultSub == "Yes") SetNoDefault();\r
+ if (burnedVal == "Yes") SetNoBurned();\r
\r
- newTrack.SubItems.Add(drp_subtitleTracks.SelectedItem.ToString());\r
- newTrack.SubItems.Add(forcedVal);\r
- newTrack.SubItems.Add(burnedVal);\r
- newTrack.SubItems.Add(defaultSub);\r
+ if (_fileContainer == 0 && !drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
+ burnedVal = "Yes"; // MP4 must have bitmap subs burned in.\r
\r
- lv_subList.Items.Add(newTrack);\r
- }\r
+ string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
+ ? srtLangVal + " (" + srtFile + ")"\r
+ : drp_subtitleTracks.SelectedItem.ToString();\r
+\r
+\r
+ SubtitleInfo track = new SubtitleInfo\r
+ {\r
+ Track = trackName,\r
+ Forced = forcedVal,\r
+ Burned = burnedVal,\r
+ Default = defaultSub,\r
+ SrtLang = srtLangVal,\r
+ SrtCharCode = srtCode,\r
+ SrtOffset = srtOffsetMs,\r
+ SrtPath = srtPath,\r
+ SrtFileName = srtFile\r
+ };\r
+\r
+ lv_subList.Items.Add(track.ListView);\r
+ SubList.Add(track);\r
+\r
+ }\r
+ private void btn_srtAdd_Click(object sender, EventArgs e)\r
+ {\r
+ if (openFileDialog.ShowDialog() != DialogResult.OK)\r
+ return;\r
+ drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
+ drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
}\r
private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
{\r
- removeTrack();\r
+ RemoveTrack();\r
}\r
+\r
+ // Secondary Controls\r
private void lb_subList_SelectedIndexChanged(object sender, EventArgs e)\r
{\r
// Set the dropdown controls based on the selected item in the List.\r
if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
{\r
- // Reset the checkboxes\r
- check_forced.CheckState = CheckState.Unchecked;\r
- check_burned.CheckState = CheckState.Unchecked;\r
- check_default.CheckState = CheckState.Unchecked;\r
+ SubtitleInfo track = SubList[lv_subList.SelectedIndices[0]];\r
\r
- // Setup the controls\r
int c = 0;\r
- foreach (var item in drp_subtitleTracks.Items)\r
+ if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt")) // We have an SRT\r
{\r
- if (item.ToString() == lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text)\r
- drp_subtitleTracks.SelectedIndex = c;\r
- c++;\r
+ foreach (var item in drp_subtitleTracks.Items)\r
+ {\r
+ if (item.ToString() == track.SrtFileName)\r
+ drp_subtitleTracks.SelectedIndex = c;\r
+ c++;\r
+ }\r
+ srt_lang.SelectedItem = track.SrtLang;\r
+ srt_offset.Value = track.SrtOffset;\r
+ srt_charcode.SelectedItem = track.SrtCharCode;\r
+ check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
+ SubGroupBox.Text = "Selected Track: " + track.Track;\r
+ }\r
+ else // We have Bitmap/CC\r
+ {\r
+ foreach (var item in drp_subtitleTracks.Items)\r
+ {\r
+ if (item.ToString() == track.Track)\r
+ drp_subtitleTracks.SelectedIndex = c;\r
+ c++;\r
+ }\r
+ check_forced.CheckState = track.Forced == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
+ check_burned.CheckState = track.Burned == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
+ check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
+ SubGroupBox.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
}\r
- drp_subtitleTracks.SelectedItem = lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1];\r
-\r
- if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text == "Yes")\r
- check_forced.CheckState = CheckState.Checked;\r
-\r
- if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text == "Yes")\r
- check_burned.CheckState = CheckState.Checked;\r
-\r
- if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text == "Yes")\r
- check_default.CheckState = CheckState.Checked;\r
-\r
- AudioTrackGroup.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
}\r
else\r
- AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
+ SubGroupBox.Text = "Selected Track: None (Click \"Add\" to add another track to the list)";\r
}\r
\r
+ // Bitmap / CC / SRT Controls\r
private void drp_subtitleTracks_SelectedIndexChanged(object sender, EventArgs e)\r
{\r
- // Update an item in the list if required.\r
- if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
+ if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
+ {\r
+ check_forced.Enabled = false;\r
+ check_burned.Enabled = false;\r
+ srt_lang.Enabled = true;\r
+ srt_charcode.Enabled = true;\r
+ srt_offset.Enabled = true;\r
+ }\r
+ else\r
{\r
- lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = drp_subtitleTracks.SelectedItem.ToString();\r
- lv_subList.Select();\r
+ check_forced.Enabled = true;\r
+ check_burned.Enabled = true;\r
+ srt_lang.Enabled = false;\r
+ srt_charcode.Enabled = false;\r
+ srt_offset.Enabled = false;\r
}\r
+ // Update an item in the list if required.\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = drp_subtitleTracks.SelectedItem.ToString();\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
}\r
private void check_forced_CheckedChanged(object sender, EventArgs e)\r
{\r
- // Update an item in the list if required.\r
- if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
- {\r
- lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_forced.Checked ? "Yes" : "No";\r
- lv_subList.Select();\r
- }\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
}\r
private void check_burned_CheckedChanged(object sender, EventArgs e)\r
{\r
- // Update an item in the list if required.\r
- if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
- {\r
- if (check_burned.Checked) // Make sure we only have 1 burned track\r
- setNoBurned();\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
\r
- lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_burned.Checked ? "Yes" : "No";\r
- lv_subList.Select();\r
- }\r
+ if (check_burned.Checked) // Make sure we only have 1 burned track\r
+ SetNoBurned();\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
}\r
private void check_default_CheckedChanged(object sender, EventArgs e)\r
{\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
+\r
+ if (check_default.Checked) // Make sure we only have 1 default track\r
+ SetNoDefault();\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].Default = check_default.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo>\r
+ }\r
+ private void srt_offset_ValueChanged(object sender, EventArgs e)\r
+ {\r
// Update an item in the list if required.\r
- if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)\r
+ return;\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value; // Update SubList List<SubtitleInfo>\r
+ }\r
+ private void srt_charcode_SelectedIndexChanged(object sender, EventArgs e)\r
+ {\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+ }\r
+ private void srt_lang_SelectedIndexChanged(object sender, EventArgs e)\r
+ {\r
+ if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
+\r
+ lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();\r
+ lv_subList.Select();\r
+\r
+ SubList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+ }\r
+\r
+ // Right Click Menu\r
+ private void mnu_moveup_Click(object sender, EventArgs e)\r
+ {\r
+ if (lv_subList.SelectedIndices.Count != 0)\r
{\r
- if (check_default.Checked) // Make sure we only have 1 default track\r
- setNoDefault();\r
+ ListViewItem item = lv_subList.SelectedItems[0];\r
+ int index = item.Index;\r
+ index--;\r
\r
- lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = check_default.Checked ? "Yes" : "No";\r
- lv_subList.Select();\r
+ if (lv_subList.Items.Count > index && index >= 0)\r
+ {\r
+ lv_subList.Items.Remove(item);\r
+ lv_subList.Items.Insert(index, item);\r
+ item.Selected = true;\r
+ lv_subList.Focus();\r
+ }\r
}\r
}\r
+ private void mnu_movedown_Click(object sender, EventArgs e)\r
+ {\r
+ if (lv_subList.SelectedIndices.Count != 0)\r
+ {\r
+ ListViewItem item = lv_subList.SelectedItems[0];\r
+ int index = item.Index;\r
+ index++;\r
+\r
+ if (index < lv_subList.Items.Count)\r
+ {\r
+ lv_subList.Items.Remove(item);\r
+ lv_subList.Items.Insert(index, item);\r
+ item.Selected = true;\r
+ lv_subList.Focus();\r
+ }\r
+ }\r
+ }\r
+ private void mnu_remove_Click(object sender, EventArgs e)\r
+ {\r
+ RemoveTrack();\r
+ }\r
\r
// Functions\r
- private void setNoDefault()\r
+ private void SetNoDefault()\r
{\r
+ int c = 0;\r
foreach (ListViewItem item in lv_subList.Items)\r
{\r
- if (item.SubItems[4].Text == "Yes")\r
- item.SubItems[4].Text = "No";\r
+ if (item.SubItems[3].Text == "Yes")\r
+ {\r
+ item.SubItems[3].Text = "No";\r
+ SubList[c].Default = "No";\r
+ }\r
+ c++;\r
}\r
}\r
- private void setNoBurned()\r
+ private void SetNoBurned()\r
{\r
+ int c = 0;\r
foreach (ListViewItem item in lv_subList.Items)\r
{\r
- if (item.SubItems[3].Text == "Yes")\r
- item.SubItems[3].Text = "No";\r
+ if (item.SubItems[2].Text == "Yes")\r
+ {\r
+ item.SubItems[2].Text = "No";\r
+ SubList[c].Burned = "No";\r
+ }\r
+ c++;\r
}\r
}\r
- private void removeTrack()\r
+ private void RemoveTrack()\r
{\r
// Remove the Item and reselect the control if the following conditions are met.\r
if (lv_subList.SelectedItems.Count != 0)\r
{\r
// Record the current selected index.\r
int currentPosition = lv_subList.SelectedIndices[0];\r
+ int selectedInd = lv_subList.SelectedIndices[0];\r
\r
- lv_subList.Items.RemoveAt(lv_subList.SelectedIndices[0]);\r
+ lv_subList.Items.RemoveAt(selectedInd);\r
+ SubList.RemoveAt(selectedInd);\r
\r
// Now reslect the correct item and give focus to the list.\r
if (lv_subList.Items.Count != 0)\r
\r
lv_subList.Select();\r
}\r
-\r
- // Regenerate the ID numers\r
- reGenerateListIDs();\r
}\r
}\r
\r
- // Helper Functions\r
- private int getNewID()\r
+ // Public Functions\r
+ public void Clear()\r
+ {\r
+ lv_subList.Items.Clear();\r
+ SubList.Clear();\r
+ }\r
+ public void SmartClear()\r
{\r
- return lv_subList.Items.Count + 1;\r
+ /* Smart clear will only remove subtitle tracks that do not have an equivlent \r
+ for the new source / title which the user has selected. */\r
+ throw new NotImplementedException();\r
}\r
- private void reGenerateListIDs()\r
+ public Boolean RequiresM4V()\r
{\r
- int i = 1;\r
foreach (ListViewItem item in lv_subList.Items)\r
{\r
- item.SubItems[0].Text = i.ToString();\r
- i++;\r
+ if (item.SubItems.Count != 5)\r
+ return true;\r
+\r
+ if (item.SubItems[1].Text.Contains("(Text)"))\r
+ return true;\r
}\r
+ return false;\r
}\r
+ public void SetSubtitleTrackAuto()\r
+ {\r
+ // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
+ if (Properties.Settings.Default.NativeLanguage != "Any")\r
+ {\r
+ if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
+ {\r
+ int i = 0;\r
+ foreach (object item in drp_subtitleTracks.Items)\r
+ {\r
+ if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
+ drp_subtitleTracks.SelectedIndex = i;\r
+\r
+ i++;\r
+ }\r
\r
- }\r
-}\r
+ btn_addSubTrack_Click(this, new EventArgs());\r
+ }\r
+ }\r
+ }\r
+ public void SetContainer(int value)\r
+ {\r
+ _fileContainer = value;\r
+ Boolean trigger = false;\r
+ if (_fileContainer != 1)\r
+ foreach (ListViewItem item in lv_subList.Items)\r
+ {\r
+ if (item.SubItems[1].Text.Contains("Bitmap"))\r
+ {\r
+ if (trigger)\r
+ lv_subList.Items.Remove(item);\r
+ trigger = true;\r
+ }\r
+ }\r
+ }\r
+ public List<SubtitleInfo> GetSubtitleInfoList()\r
+ {\r
+ return SubList;\r
+ }\r
+ }\r
+\r
+ public class SubtitleInfo\r
+ {\r
+ public string Track { get; set; }\r
+ public string Forced { get; set; }\r
+ public string Burned { get; set; }\r
+ public string Default { get; set; }\r
+ public string SrtLang { get; set; }\r
+ public string SrtCharCode { get; set; }\r
+ public int SrtOffset { get; set; }\r
+ public string SrtPath { get; set; }\r
+ public string SrtFileName { get; set; }\r
+\r
+ public ListViewItem ListView\r
+ {\r
+ get\r
+ {\r
+ ListViewItem listTrack = new ListViewItem(Track);\r
+ listTrack.SubItems.Add(Forced);\r
+ listTrack.SubItems.Add(Burned);\r
+ listTrack.SubItems.Add(Default);\r
+ listTrack.SubItems.Add(SrtLang);\r
+ listTrack.SubItems.Add(SrtCharCode);\r
+ listTrack.SubItems.Add(SrtOffset.ToString());\r
+ return listTrack;\r
+ }\r
+ }\r
+ }\r
+}
\ No newline at end of file