OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / Subtitles.cs
index 56edcc8..f8c38cd 100644 (file)
 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
-        }\r
+            LangMap = Main.mapLanguages();\r
+            foreach (string key in LangMap.Keys)\r
+                srt_lang.Items.Add(key);\r
 \r
-        private int fileContainer;\r
-        public void setContainer(int value)\r
-        {\r
-            fileContainer = value;\r
-            Boolean trigger = false;\r
-            if (fileContainer != 2)\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
+            srt_charcode.SelectedIndex = 28;\r
+            srt_lang.SelectedIndex = 40;\r
         }\r
 \r
-\r
-\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
-\r
-            if (check_burned.Checked)\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 (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
-                if (!drp_subtitleTracks.Text.Contains("Text"))\r
-                {\r
-                    burnedVal = "Yes";\r
-                    setNoBurned();\r
-                }\r
-            }\r
-\r
-            if (check_default.Checked)\r
-            {\r
-                defaultSub = "Yes";\r
-                setNoDefault();\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
-            Boolean addTrack = true;\r
-            if (fileContainer == 0 || fileContainer == 1)\r
+            if (_fileContainer == 0) // MP4 and M4V file extension\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
-                                            "More than one vobsub is not supported in mp4... Your first vobsub track will now be used.",\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
+            if (_fileContainer == 0 && !drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
+                burnedVal = "Yes";  // MP4 must have bitmap subs burned in.\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
+            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
-                lv_subList.Items.Add(newTrack);\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
+            if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\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_burned.Checked) // Make sure we only have 1 burned track\r
-                    setNoBurned();\r
+                ListViewItem item = lv_subList.SelectedItems[0];\r
+                int index = item.Index;\r
+                index--;\r
 \r
-                lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_burned.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 check_default_CheckedChanged(object sender, EventArgs e)\r
+        private void mnu_movedown_Click(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.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 (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
@@ -212,26 +322,99 @@ namespace Handbrake.Controls
 \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
+                    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
-}\r
+}
\ No newline at end of file