OSDN Git Service

remove crf flag and all uses of it
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / Subtitles.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.IO;\r
4 using System.Windows.Forms;\r
5 using Handbrake.Functions;\r
6 \r
7 namespace Handbrake.Controls\r
8 {\r
9     public partial class Subtitles : UserControl\r
10     {\r
11         readonly IDictionary<string, string> LangMap = new Dictionary<string, string>();\r
12         List<SubtitleInfo> SubList = new List<SubtitleInfo>();\r
13         private int _fileContainer;\r
14 \r
15         public Subtitles()\r
16         {\r
17             InitializeComponent();\r
18 \r
19             LangMap = Main.mapLanguages();\r
20             foreach (string key in LangMap.Keys)\r
21                 srt_lang.Items.Add(key);\r
22 \r
23             srt_charcode.SelectedIndex = 28;\r
24             srt_lang.SelectedIndex = 40;\r
25         }\r
26 \r
27         // Primary Controls\r
28         private void btn_addSubTrack_Click(object sender, EventArgs e)\r
29         {\r
30             // Logic\r
31             string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";\r
32             string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";\r
33             string burnedVal = check_burned.CheckState == CheckState.Checked && (!drp_subtitleTracks.Text.Contains("Text")) ? "Yes" : "No";\r
34             string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";\r
35             int srtOffsetMs = 0;\r
36 \r
37             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
38             {\r
39                 burnedVal = "No";\r
40                 forcedVal = "No";\r
41                 srtPath = openFileDialog.FileName;\r
42                 srtFile = Path.GetFileName(openFileDialog.FileName);\r
43                 srtLangVal = srt_lang.SelectedItem.ToString();\r
44                 srtCode = srt_charcode.SelectedItem.ToString();\r
45                 srtOffsetMs = (int)srt_offset.Value;\r
46             }\r
47 \r
48             if (_fileContainer == 0) // MP4 and M4V file extension\r
49             {\r
50                 // Make sure we only have 1 bitmap track.\r
51                 if (drp_subtitleTracks.SelectedItem != null && drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
52                 {\r
53                     foreach (ListViewItem item in lv_subList.Items)\r
54                     {\r
55                         if (item.SubItems[0].Text.Contains("Bitmap"))\r
56                         {\r
57                             MessageBox.Show(this, "More than one vobsub is not supported in mp4... Your first vobsub track will now be used.",\r
58                                             "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
59                             return;\r
60                         }\r
61                     }\r
62                 }\r
63             }\r
64 \r
65             if (defaultSub == "Yes") SetNoDefault();\r
66             if (burnedVal == "Yes") SetNoBurned();\r
67 \r
68             if (_fileContainer == 0 && !drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
69                 burnedVal = "Yes";  // MP4 must have bitmap subs burned in.\r
70 \r
71             string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
72                                ? srtLangVal + " (" + srtFile + ")"\r
73                                : drp_subtitleTracks.SelectedItem.ToString();\r
74 \r
75 \r
76             SubtitleInfo track = new SubtitleInfo\r
77                                      {\r
78                                          Track = trackName,\r
79                                          Forced = forcedVal,\r
80                                          Burned = burnedVal,\r
81                                          Default = defaultSub,\r
82                                          SrtLang = srtLangVal,\r
83                                          SrtCharCode = srtCode,\r
84                                          SrtOffset = srtOffsetMs,\r
85                                          SrtPath = srtPath,\r
86                                          SrtFileName = srtFile\r
87                                      };\r
88 \r
89             lv_subList.Items.Add(track.ListView);\r
90             SubList.Add(track);\r
91 \r
92         }\r
93         private void btn_srtAdd_Click(object sender, EventArgs e)\r
94         {\r
95             if (openFileDialog.ShowDialog() != DialogResult.OK)\r
96                 return;\r
97             drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
98             drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
99         }\r
100         private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
101         {\r
102             RemoveTrack();\r
103         }\r
104 \r
105         // Secondary Controls\r
106         private void lb_subList_SelectedIndexChanged(object sender, EventArgs e)\r
107         {\r
108             // Set the dropdown controls based on the selected item in the List.\r
109             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
110             {\r
111                 SubtitleInfo track = SubList[lv_subList.SelectedIndices[0]];\r
112 \r
113                 int c = 0;\r
114                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))  // We have an SRT\r
115                 {\r
116                     foreach (var item in drp_subtitleTracks.Items)\r
117                     {\r
118                         if (item.ToString() == track.SrtFileName)\r
119                             drp_subtitleTracks.SelectedIndex = c;\r
120                         c++;\r
121                     }\r
122                     srt_lang.SelectedItem = track.SrtLang;\r
123                     srt_offset.Value = track.SrtOffset;\r
124                     srt_charcode.SelectedItem = track.SrtCharCode;\r
125                     check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
126                     SubGroupBox.Text = "Selected Track: " + track.Track;\r
127                 }\r
128                 else  // We have Bitmap/CC\r
129                 {\r
130                     foreach (var item in drp_subtitleTracks.Items)\r
131                     {\r
132                         if (item.ToString() == track.Track)\r
133                             drp_subtitleTracks.SelectedIndex = c;\r
134                         c++;\r
135                     }\r
136                     check_forced.CheckState = track.Forced == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
137                     check_burned.CheckState = track.Burned == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
138                     check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
139                     SubGroupBox.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
140                 }\r
141             }\r
142             else\r
143                 SubGroupBox.Text = "Selected Track: None (Click \"Add\" to add another track to the list)";\r
144         }\r
145 \r
146         // Bitmap / CC / SRT Controls\r
147         private void drp_subtitleTracks_SelectedIndexChanged(object sender, EventArgs e)\r
148         {\r
149             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
150             {\r
151                 check_forced.Enabled = false;\r
152                 check_burned.Enabled = false;\r
153                 srt_lang.Enabled = true;\r
154                 srt_charcode.Enabled = true;\r
155                 srt_offset.Enabled = true;\r
156             }\r
157             else\r
158             {\r
159                 check_forced.Enabled = true;\r
160                 check_burned.Enabled = true;\r
161                 srt_lang.Enabled = false;\r
162                 srt_charcode.Enabled = false;\r
163                 srt_offset.Enabled = false;\r
164             }\r
165             // Update an item in the  list if required.\r
166             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
167 \r
168             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = drp_subtitleTracks.SelectedItem.ToString();\r
169             lv_subList.Select();\r
170 \r
171             SubList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
172         }\r
173         private void check_forced_CheckedChanged(object sender, EventArgs e)\r
174         {\r
175             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
176 \r
177             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";\r
178             lv_subList.Select();\r
179 \r
180             SubList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
181         }\r
182         private void check_burned_CheckedChanged(object sender, EventArgs e)\r
183         {\r
184             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
185 \r
186             if (check_burned.Checked) // Make sure we only have 1 burned track\r
187                 SetNoBurned();\r
188 \r
189             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";\r
190             lv_subList.Select();\r
191 \r
192             SubList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
193         }\r
194         private void check_default_CheckedChanged(object sender, EventArgs e)\r
195         {\r
196             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
197 \r
198             if (check_default.Checked) // Make sure we only have 1 default track\r
199                 SetNoDefault();\r
200 \r
201             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";\r
202             lv_subList.Select();\r
203 \r
204             SubList[lv_subList.SelectedIndices[0]].Default = check_default.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo>\r
205         }\r
206         private void srt_offset_ValueChanged(object sender, EventArgs e)\r
207         {\r
208             // Update an item in the  list if required.\r
209             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)\r
210                 return;\r
211 \r
212             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
213             lv_subList.Select();\r
214 \r
215             SubList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value; // Update SubList List<SubtitleInfo>\r
216         }\r
217         private void srt_charcode_SelectedIndexChanged(object sender, EventArgs e)\r
218         {\r
219             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
220 \r
221             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();\r
222             lv_subList.Select();\r
223 \r
224             SubList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
225         }\r
226         private void srt_lang_SelectedIndexChanged(object sender, EventArgs e)\r
227         {\r
228             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
229 \r
230             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();\r
231             lv_subList.Select();\r
232 \r
233             SubList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
234         }\r
235 \r
236         // Right Click Menu\r
237         private void mnu_moveup_Click(object sender, EventArgs e)\r
238         {\r
239             if (lv_subList.SelectedIndices.Count != 0)\r
240             {\r
241                 ListViewItem item = lv_subList.SelectedItems[0];\r
242                 int index = item.Index;\r
243                 index--;\r
244 \r
245                 if (lv_subList.Items.Count > index && index >= 0)\r
246                 {\r
247                     lv_subList.Items.Remove(item);\r
248                     lv_subList.Items.Insert(index, item);\r
249                     item.Selected = true;\r
250                     lv_subList.Focus();\r
251                 }\r
252             }\r
253         }\r
254         private void mnu_movedown_Click(object sender, EventArgs e)\r
255         {\r
256             if (lv_subList.SelectedIndices.Count != 0)\r
257             {\r
258                 ListViewItem item = lv_subList.SelectedItems[0];\r
259                 int index = item.Index;\r
260                 index++;\r
261 \r
262                 if (index < lv_subList.Items.Count)\r
263                 {\r
264                     lv_subList.Items.Remove(item);\r
265                     lv_subList.Items.Insert(index, item);\r
266                     item.Selected = true;\r
267                     lv_subList.Focus();\r
268                 }\r
269             }\r
270         }\r
271         private void mnu_remove_Click(object sender, EventArgs e)\r
272         {\r
273             RemoveTrack();\r
274         }\r
275 \r
276         // Functions\r
277         private void SetNoDefault()\r
278         {\r
279             int c = 0;\r
280             foreach (ListViewItem item in lv_subList.Items)\r
281             {\r
282                 if (item.SubItems[3].Text == "Yes")\r
283                 {\r
284                     item.SubItems[3].Text = "No";\r
285                     SubList[c].Default = "No";\r
286                 }\r
287                 c++;\r
288             }\r
289         }\r
290         private void SetNoBurned()\r
291         {\r
292             int c = 0;\r
293             foreach (ListViewItem item in lv_subList.Items)\r
294             {\r
295                 if (item.SubItems[2].Text == "Yes")\r
296                 {\r
297                     item.SubItems[2].Text = "No";\r
298                     SubList[c].Burned = "No";\r
299                 }\r
300                 c++;\r
301             }\r
302         }\r
303         private void RemoveTrack()\r
304         {\r
305             // Remove the Item and reselect the control if the following conditions are met.\r
306             if (lv_subList.SelectedItems.Count != 0)\r
307             {\r
308                 // Record the current selected index.\r
309                 int currentPosition = lv_subList.SelectedIndices[0];\r
310                 int selectedInd = lv_subList.SelectedIndices[0];\r
311 \r
312                 lv_subList.Items.RemoveAt(selectedInd);\r
313                 SubList.RemoveAt(selectedInd);\r
314 \r
315                 // Now reslect the correct item and give focus to the list.\r
316                 if (lv_subList.Items.Count != 0)\r
317                 {\r
318                     if (currentPosition <= (lv_subList.Items.Count - 1))\r
319                         lv_subList.Items[currentPosition].Selected = true;\r
320                     else if (currentPosition > (lv_subList.Items.Count - 1))\r
321                         lv_subList.Items[lv_subList.Items.Count - 1].Selected = true;\r
322 \r
323                     lv_subList.Select();\r
324                 }\r
325             }\r
326         }\r
327 \r
328         // Public Functions\r
329         public void Clear()\r
330         {\r
331             lv_subList.Items.Clear();\r
332         }\r
333         public void SmartClear()\r
334         {\r
335             /* Smart clear will only remove subtitle tracks that do not have an equivlent \r
336               for the new source / title which the user has selected. */\r
337             throw new NotImplementedException();\r
338         }\r
339         public Boolean RequiresM4V()\r
340         {\r
341             foreach (ListViewItem item in lv_subList.Items)\r
342             {\r
343                 if (item.SubItems.Count != 5)\r
344                     return true;\r
345 \r
346                 if (item.SubItems[1].Text.Contains("(Text)"))\r
347                     return true;\r
348             }\r
349             return false;\r
350         }\r
351         public void SetSubtitleTrackAuto()\r
352         {\r
353             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
354             if (Properties.Settings.Default.NativeLanguage != "Any")\r
355             {\r
356                 if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
357                 {\r
358                     int i = 0;\r
359                     foreach (object item in drp_subtitleTracks.Items)\r
360                     {\r
361                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
362                             drp_subtitleTracks.SelectedIndex = i;\r
363 \r
364                         i++;\r
365                     }\r
366 \r
367                     btn_addSubTrack_Click(this, new EventArgs());\r
368                 }\r
369             }\r
370         }\r
371         public void SetContainer(int value)\r
372         {\r
373             _fileContainer = value;\r
374             Boolean trigger = false;\r
375             if (_fileContainer != 1)\r
376                 foreach (ListViewItem item in lv_subList.Items)\r
377                 {\r
378                     if (item.SubItems[1].Text.Contains("Bitmap"))\r
379                     {\r
380                         if (trigger)\r
381                             lv_subList.Items.Remove(item);\r
382                         trigger = true;\r
383                     }\r
384                 }\r
385         }\r
386         public List<SubtitleInfo> GetSubtitleInfoList()\r
387         {\r
388             return SubList;\r
389         }\r
390     }\r
391 \r
392     public class SubtitleInfo\r
393     {\r
394         public string Track { get; set; }\r
395         public string Forced { get; set; }\r
396         public string Burned { get; set; }\r
397         public string Default { get; set; }\r
398         public string SrtLang { get; set; }\r
399         public string SrtCharCode { get; set; }\r
400         public int SrtOffset { get; set; }\r
401         public string SrtPath { get; set; }\r
402         public string SrtFileName { get; set; }\r
403 \r
404         public ListViewItem ListView\r
405         {\r
406             get\r
407             {\r
408                 ListViewItem listTrack = new ListViewItem(Track);\r
409                 listTrack.SubItems.Add(Forced);\r
410                 listTrack.SubItems.Add(Burned);\r
411                 listTrack.SubItems.Add(Default);\r
412                 listTrack.SubItems.Add(SrtLang);\r
413                 listTrack.SubItems.Add(SrtCharCode);\r
414                 listTrack.SubItems.Add(SrtOffset.ToString());\r
415                 return listTrack;\r
416             }\r
417         }\r
418     }\r
419 }