3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.Functions;
\r
19 public partial class frmMain : Form
\r
21 // Objects which may be used by one or more other objects
\r
22 private delegate void UpdateWindowHandler();
\r
23 Main hb_common_func = new Main();
\r
24 Encode encodeHandler = new Encode();
\r
25 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
26 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
27 Parsing.Title selectedTitle;
\r
28 Parsing.DVD thisDVD;
\r
30 // Objects belonging to this window only
\r
31 PresetLoader presetLoader = new PresetLoader();
\r
32 QueryGenerator queryGen = new QueryGenerator();
\r
34 // Globals: Mainly used for tracking.
\r
35 private frmQueue queueWindow;
\r
36 private frmPreview qtpreview;
\r
37 private string lastAction;
\r
38 public int maxWidth;
\r
39 public int maxHeight;
\r
42 // Applicaiton Startup ************************************************
\r
44 #region Application Startup
\r
48 // Load the splash screen in this thread
\r
49 Form splash = new frmSplashScreen();
\r
52 //Create a label that can be updated from the parent thread.
\r
53 Label lblStatus = new Label();
\r
54 lblStatus.Size = new Size(250, 20);
\r
55 lblStatus.Location = new Point(10, 280);
\r
56 splash.Controls.Add(lblStatus);
\r
57 InitializeComponent();
\r
59 // Update the users config file with the CLI version data.
\r
60 lblStatus.Text = "Setting Version Data ...";
\r
61 Application.DoEvents();
\r
62 ArrayList x = hb_common_func.getCliVersionData();
\r
63 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
64 Properties.Settings.Default.hb_version = x[0].ToString();
\r
66 // show the form, but leave disabled until preloading is complete then show the main form
\r
67 this.Enabled = false;
\r
69 Application.DoEvents(); // Forces frmMain to draw
\r
71 // update the status
\r
72 if (Properties.Settings.Default.updateStatus == "Checked")
\r
74 lblStatus.Text = "Checking for updates ...";
\r
75 Application.DoEvents();
\r
76 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
77 updateCheckThread.Start();
\r
80 // Setup the GUI components
\r
81 lblStatus.Text = "Setting up the GUI ...";
\r
82 Application.DoEvents();
\r
83 x264Panel.reset2Defaults(); // Initialize all the x264 widgets to their default values
\r
84 loadPresetPanel(); // Load the Preset Panel
\r
85 treeView_presets.ExpandAll();
\r
86 lbl_encode.Text = "";
\r
87 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
88 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
89 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
91 // Load the user's default settings or Normal Preset
\r
92 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
94 // Ok, so, we've selected a preset. Now we want to load it.
\r
95 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
97 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
98 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
102 //Ok, Reset all the H264 widgets before changing the preset
\r
103 x264Panel.reset2Defaults();
\r
105 // Send the query from the file to the Query Parser class, then load the preset
\r
106 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
107 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
109 // The x264 widgets will need updated, so do this now:
\r
110 x264Panel.X264_StandardizeOptString();
\r
111 x264Panel.X264_SetCurrentSettingsInPanel();
\r
115 loadNormalPreset();
\r
118 loadNormalPreset();
\r
120 // Enabled GUI tooltip's if Required
\r
121 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
123 x264Panel.setToolTipActive(true);
\r
124 ToolTip.Active = true;
\r
128 lblStatus.Text = "Loading Complete!";
\r
129 Application.DoEvents();
\r
132 this.Enabled = true;
\r
141 // Startup Functions
\r
142 private delegate void updateStatusChanger();
\r
143 private void startupUpdateCheck()
\r
147 if (InvokeRequired)
\r
149 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
153 Boolean update = hb_common_func.updateCheck(false);
\r
156 frmUpdater updateWindow = new frmUpdater();
\r
157 updateWindow.Show();
\r
160 catch (Exception) { /* Do Nothing*/ }
\r
162 private void queueRecovery()
\r
164 if (hb_common_func.check_queue_recovery())
\r
166 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
168 if (result == DialogResult.Yes)
\r
169 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
172 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
173 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
174 if (File.Exists(queuePath))
\r
175 File.Delete(queuePath);
\r
182 // Encoding Events for setting up the GUI
\r
183 private void events()
\r
185 // Handle Window Resize
\r
186 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
187 this.Resize += new EventHandler(frmMain_Resize);
\r
189 // Handle Encode Start
\r
190 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
191 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
192 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
194 private void encodeStarted(object sender, EventArgs e)
\r
196 setLastAction("encode");
\r
197 setEncodeStarted();
\r
199 private void encodeEnded(object sender, EventArgs e)
\r
201 setEncodeFinished();
\r
203 private void encodePaused(object sender, EventArgs e)
\r
205 setEncodeFinished();
\r
209 // User Interface Menus / Tool Strips *********************************
\r
212 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
216 private void mnu_exit_Click(object sender, EventArgs e)
\r
218 Application.Exit();
\r
223 private void mnu_encode_Click(object sender, EventArgs e)
\r
225 queueWindow.setQueue();
\r
226 queueWindow.Show();
\r
228 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
231 if (lastAction == "scan")
\r
232 file = "dvdinfo.dat";
\r
234 file = "hb_encode_log.dat";
\r
236 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
237 dvdInfoWindow.Show();
\r
239 private void mnu_options_Click(object sender, EventArgs e)
\r
241 Form Options = new frmOptions();
\r
242 Options.ShowDialog();
\r
246 #region Presets Menu
\r
247 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
249 presetHandler.updateBuiltInPresets();
\r
251 if (treeView_presets.Nodes.Count == 0)
\r
252 MessageBox.Show("Unable to load the presets.xml file. Please select \"Update Built-in Presets\" from the Presets Menu \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
254 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
256 treeView_presets.ExpandAll();
\r
258 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
260 // Empty the preset file
\r
261 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
262 if (File.Exists(presetsFile))
\r
263 File.Delete(presetsFile);
\r
267 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
271 catch (Exception exc)
\r
273 MessageBox.Show("An error has occured during the preset removal process.\n If you are using Windows Vista, you may need to run under Administrator Mode to complete this task. \n" + exc);
\r
276 // Reload the preset panel
\r
279 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
281 loadNormalPreset();
\r
283 private void btn_new_preset_Click(object sender, EventArgs e)
\r
285 // Remember each nodes expanded status so we can reload it
\r
286 List<Boolean> nodeStatus = saveTreeViewState();
\r
287 nodeStatus.Add(true);
\r
289 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
290 preset.ShowDialog();
\r
292 // Now reload the TreeView states
\r
293 loadTreeViewStates(nodeStatus);
\r
298 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
300 Process.Start("http://forum.handbrake.fr/");
\r
302 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
304 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
306 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
308 Process.Start("http://handbrake.fr");
\r
310 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
312 Boolean update = hb_common_func.updateCheck(true);
\r
313 if (update == true)
\r
315 frmUpdater updateWindow = new frmUpdater();
\r
316 updateWindow.Show();
\r
319 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
321 private void mnu_about_Click(object sender, EventArgs e)
\r
323 Form About = new frmAbout();
\r
324 About.ShowDialog();
\r
329 private void mnu_qptest_Click(object sender, EventArgs e)
\r
331 QueryParserTester qptest = new QueryParserTester();
\r
337 // Right Click Menu Code
\r
338 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
340 treeView_presets.ExpandAll();
\r
342 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
344 treeView_presets.CollapseAll();
\r
346 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
348 DialogResult result = MessageBox.Show("Do you wish to include picture settings when updating the preset: " + treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
\r
349 if (result == DialogResult.Yes)
\r
350 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
351 else if (result == DialogResult.No)
\r
352 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
354 private void pmnu_delete_click(object sender, EventArgs e)
\r
356 if (treeView_presets.SelectedNode != null)
\r
358 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
360 // Remember each nodes expanded status so we can reload it
\r
361 List<Boolean> nodeStatus = saveTreeViewState();
\r
363 // Now reload the preset panel
\r
366 // Now reload the TreeView states
\r
367 loadTreeViewStates(nodeStatus);
\r
369 treeView_presets.Select();
\r
371 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
373 // Make sure that the save menu is always disabled by default
\r
374 pmnu_saveChanges.Enabled = false;
\r
376 // Now enable the save menu if the selected preset is a user preset
\r
377 if (treeView_presets.SelectedNode != null)
\r
379 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
381 pmnu_saveChanges.Enabled = true;
\r
384 treeView_presets.Select();
\r
387 // Presets Management
\r
388 private void btn_addPreset_Click(object sender, EventArgs e)
\r
390 // Remember each nodes expanded status so we can reload it
\r
391 List<Boolean> nodeStatus = saveTreeViewState();
\r
392 nodeStatus.Add(true);
\r
394 // Now add the new preset
\r
395 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
396 preset.ShowDialog();
\r
398 // Now reload the TreeView states
\r
399 loadTreeViewStates(nodeStatus);
\r
401 private void btn_removePreset_Click(object sender, EventArgs e)
\r
403 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
404 if (result == DialogResult.Yes)
\r
406 if (treeView_presets.SelectedNode != null)
\r
407 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
409 // Remember each nodes expanded status so we can reload it
\r
410 List<Boolean> nodeStatus = saveTreeViewState();
\r
412 // Now reload the preset panel
\r
415 // Now reload the TreeView states
\r
416 loadTreeViewStates(nodeStatus);
\r
418 treeView_presets.Select();
\r
420 private void btn_setDefault_Click(object sender, EventArgs e)
\r
422 if (treeView_presets.SelectedNode != null)
\r
424 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
425 if (result == DialogResult.Yes)
\r
427 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
428 Properties.Settings.Default.Save();
\r
429 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
433 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
435 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
437 if (e.Button == MouseButtons.Right)
\r
438 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
439 else if (e.Button == MouseButtons.Left)
\r
441 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
443 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
448 treeView_presets.Select();
\r
450 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
454 private void selectPreset()
\r
456 if (treeView_presets.SelectedNode != null)
\r
458 // Ok, so, we've selected a preset. Now we want to load it.
\r
459 string presetName = treeView_presets.SelectedNode.Text;
\r
460 if (presetHandler.getPreset(presetName) != null)
\r
462 string query = presetHandler.getPreset(presetName).Query;
\r
463 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
467 //Ok, Reset all the H264 widgets before changing the preset
\r
468 x264Panel.reset2Defaults();
\r
470 // Send the query from the file to the Query Parser class
\r
471 Functions.QueryParser presetQuery = QueryParser.Parse(query);
\r
473 // Now load the preset
\r
474 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
476 // The x264 widgets will need updated, so do this now:
\r
477 x264Panel.X264_StandardizeOptString();
\r
478 x264Panel.X264_SetCurrentSettingsInPanel();
\r
480 if (maxWidth != 0 && maxHeight != 0)
\r
481 lbl_max.Text = "Max Width / Height";
\r
482 else if (maxWidth != 0)
\r
483 lbl_max.Text = "Max Width";
\r
490 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
492 if (e.KeyCode == Keys.Delete)
\r
494 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
495 if (result == DialogResult.Yes)
\r
497 if (treeView_presets.SelectedNode != null)
\r
498 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
500 // Remember each nodes expanded status so we can reload it
\r
501 List<Boolean> nodeStatus = new List<Boolean>();
\r
502 foreach (TreeNode node in treeView_presets.Nodes)
\r
503 nodeStatus.Add(node.IsExpanded);
\r
505 // Now reload the preset panel
\r
508 // And finally, re-expand any of the nodes if required
\r
510 foreach (TreeNode node in treeView_presets.Nodes)
\r
520 private List<Boolean> saveTreeViewState()
\r
522 // Remember each nodes expanded status so we can reload it
\r
523 List<Boolean> nodeStatus = new List<Boolean>();
\r
524 foreach (TreeNode node in treeView_presets.Nodes)
\r
526 nodeStatus.Add(node.IsExpanded);
\r
527 foreach (TreeNode subNode in node.Nodes)
\r
528 nodeStatus.Add(node.IsExpanded);
\r
532 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
534 // And finally, re-expand any of the nodes if required
\r
536 foreach (TreeNode node in treeView_presets.Nodes)
\r
541 foreach (TreeNode subNode in node.Nodes)
\r
550 private void loadNormalPreset()
\r
552 treeView_presets.Nodes.Find("Normal", true);
\r
554 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
556 foreach (TreeNode node in treenode.Nodes)
\r
558 if (node.Text.Equals("Normal"))
\r
559 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
566 private void btn_source_Click(object sender, EventArgs e)
\r
568 if (Properties.Settings.Default.drive_detection == "Checked")
\r
570 mnu_dvd_drive.Visible = true;
\r
571 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
572 driveInfoThread.Start();
\r
575 mnu_dvd_drive.Visible = false;
\r
577 private void btn_start_Click(object sender, EventArgs e)
\r
579 if (btn_start.Text == "Stop")
\r
581 DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode? Please note that this may break the encoded file. \nTo safely cancel your encode, press ctrl-c on your keyboard in the CLI window. This *may* allow you to preview your encoded content.", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
583 if (result == DialogResult.Yes)
\r
586 encodeQueue.pauseEncode();
\r
588 // Kill the current process.
\r
589 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
590 Process HandBrakeCLI;
\r
591 if (aProc.Length > 0)
\r
593 HandBrakeCLI = aProc[0];
\r
594 HandBrakeCLI.Kill();
\r
598 setEncodeFinished();
\r
603 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
605 // Set the last action to encode.
\r
606 // This is used for tracking which file to load in the activity window
\r
607 lastAction = "encode";
\r
609 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
611 if (encodeQueue.count() == 0)
\r
613 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
614 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
616 queueWindow.setQueue();
\r
617 if (encodeQueue.count() > 1)
\r
618 queueWindow.Show(false);
\r
620 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
621 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
624 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
625 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
629 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
631 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
632 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
635 String query = queryGen.GenerateTheQuery(this);
\r
636 if (rtf_query.Text != "")
\r
637 query = rtf_query.Text;
\r
639 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
640 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
642 queueWindow.Show();
\r
645 private void btn_showQueue_Click(object sender, EventArgs e)
\r
647 queueWindow.Show();
\r
649 private void tb_preview_Click(object sender, EventArgs e)
\r
651 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
652 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
655 if (qtpreview == null)
\r
657 qtpreview = new frmPreview(this);
\r
660 else if (qtpreview.IsDisposed)
\r
662 qtpreview = new frmPreview(this);
\r
666 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
669 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
671 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
673 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
674 ActivityWindow.Show();
\r
678 #region System Tray Icon
\r
679 private void frmMain_Resize(object sender, EventArgs e)
\r
681 if (FormWindowState.Minimized == this.WindowState)
\r
683 notifyIcon.Visible = true;
\r
684 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
685 notifyIcon.ShowBalloonTip(500);
\r
688 else if (FormWindowState.Normal == this.WindowState)
\r
689 notifyIcon.Visible = false;
\r
691 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
693 this.Visible = true;
\r
695 this.WindowState = FormWindowState.Normal;
\r
696 notifyIcon.Visible = false;
\r
698 private void btn_restore_Click(object sender, EventArgs e)
\r
700 this.Visible = true;
\r
702 this.WindowState = FormWindowState.Normal;
\r
703 notifyIcon.Visible = false;
\r
707 #region Tab Control
\r
710 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
712 // Enable the creation of chapter markers.
\r
713 Check_ChapterMarkers.Enabled = true;
\r
715 // Set the last action to scan.
\r
716 // This is used for tracking which file to load in the activity window
\r
717 lastAction = "scan";
\r
718 text_source.Text = "";
\r
720 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
722 String filename = DVD_Open.SelectedPath;
\r
724 if (filename.StartsWith("\\"))
\r
725 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
729 if (filename != "")
\r
731 setupGUIforScan(filename);
\r
732 startScan(filename);
\r
735 text_source.Text = "Click 'Source' to continue";
\r
739 text_source.Text = "Click 'Source' to continue";
\r
741 private void btn_file_source_Click(object sender, EventArgs e)
\r
743 // Set the last action to scan.
\r
744 // This is used for tracking which file to load in the activity window
\r
745 lastAction = "scan";
\r
746 text_source.Text = "";
\r
748 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
750 String filename = ISO_Open.FileName;
\r
751 if (filename.StartsWith("\\"))
\r
753 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
754 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
757 if (filename != "")
\r
759 setupGUIforScan(filename);
\r
760 startScan(filename);
\r
763 text_source.Text = "Click 'Source' to continue";
\r
767 text_source.Text = "Click 'Source' to continue";
\r
769 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
771 // Enable the creation of chapter markers.
\r
772 Check_ChapterMarkers.Enabled = true;
\r
774 // Set the last action to scan.
\r
775 // This is used for tracking which file to load in the activity window
\r
776 lastAction = "scan";
\r
778 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
780 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
781 String filename = path[0];
\r
782 setupGUIforScan(filename);
\r
783 startScan(filename);
\r
786 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
787 if (drp_dvdtitle.Items.Count == 0)
\r
788 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
790 lbl_encode.Text = "";
\r
792 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
794 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
795 MessageBox.Show("There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
\r
797 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
799 // Reset some values on the form
\r
800 lbl_Aspect.Text = "Select a Title";
\r
801 //lbl_RecomendedCrop.Text = "Select a Title";
\r
802 drop_chapterStart.Items.Clear();
\r
803 drop_chapterFinish.Items.Clear();
\r
805 // If the dropdown is set to automatic nothing else needs to be done.
\r
806 // Otheriwse if its not, title data has to be loased from parsing.
\r
807 if (drp_dvdtitle.Text != "Automatic")
\r
809 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
811 // Set the Aspect Ratio
\r
812 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
813 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
814 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
816 // Set the Recommended Cropping values
\r
817 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
818 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
819 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
820 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
822 // Populate the Start chapter Dropdown
\r
823 drop_chapterStart.Items.Clear();
\r
824 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
825 if (drop_chapterStart.Items.Count > 0)
\r
826 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
828 // Populate the Final Chapter Dropdown
\r
829 drop_chapterFinish.Items.Clear();
\r
830 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
831 if (drop_chapterFinish.Items.Count > 0)
\r
832 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
834 // Populate the Audio Channels Dropdown
\r
835 drp_track1Audio.Items.Clear();
\r
836 drp_track1Audio.Items.Add("Automatic");
\r
837 drp_track1Audio.Items.Add("None");
\r
838 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
839 drp_track1Audio.SelectedIndex = 0;
\r
841 // Populate the Subtitles dropdown
\r
842 drp_subtitle.Items.Clear();
\r
843 drp_subtitle.Items.Add("None");
\r
844 drp_subtitle.Items.Add("Autoselect");
\r
845 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
846 if (drp_subtitle.Items.Count > 0)
\r
847 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
851 // Run the autoName & chapterNaming functions
\r
852 if (Properties.Settings.Default.autoNaming == "Checked")
\r
854 string autoPath = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
855 if (autoPath != null)
\r
856 text_destination.Text = autoPath;
\r
858 MessageBox.Show("You currently have automatic file naming enabled for the destination box, but you do not have a default direcotry set. You should set this in the program options (see Tools Menu)","Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
861 data_chpt.Rows.Clear();
\r
862 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
863 if (chapterGridView != null)
\r
864 data_chpt = chapterGridView;
\r
866 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
867 data_chpt.Columns[0].Width = 166;
\r
868 data_chpt.Columns[0].Width = 165;
\r
870 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
872 int c_start, c_end;
\r
874 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
875 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
877 int.TryParse(drop_chapterStart.Text, out c_start);
\r
878 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
882 if (c_start > c_end)
\r
883 drop_chapterFinish.Text = c_start.ToString();
\r
886 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
888 // Run the Autonaming function
\r
889 if (Properties.Settings.Default.autoNaming == "Checked")
\r
890 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
893 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
895 int c_start, c_end;
\r
897 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
898 drop_chapterStart.SelectedIndex = 1;
\r
900 int.TryParse(drop_chapterStart.Text, out c_start);
\r
901 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
905 if (c_end < c_start)
\r
906 drop_chapterFinish.Text = c_start.ToString();
\r
909 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
911 // Run the Autonaming function
\r
912 if (Properties.Settings.Default.autoNaming == "Checked")
\r
913 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
915 // Add more rows to the Chapter menu if needed.
\r
916 if (Check_ChapterMarkers.Checked)
\r
918 int i = data_chpt.Rows.Count, finish = 0;
\r
920 if (drop_chapterFinish.Text != "Auto")
\r
921 int.TryParse(drop_chapterFinish.Text, out finish);
\r
925 int n = data_chpt.Rows.Add();
\r
926 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
927 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
928 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
929 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
936 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
938 // This removes the file extension from the filename box on the save file dialog.
\r
939 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
940 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
942 // Show the dialog and set the main form file path
\r
943 if (drop_format.SelectedIndex.Equals(0))
\r
944 DVD_Save.FilterIndex = 1;
\r
945 else if (drop_format.SelectedIndex.Equals(1))
\r
946 DVD_Save.FilterIndex = 2;
\r
947 else if (drop_format.SelectedIndex.Equals(2))
\r
948 DVD_Save.FilterIndex = 3;
\r
949 else if (drop_format.SelectedIndex.Equals(3))
\r
950 DVD_Save.FilterIndex = 4;
\r
951 else if (drop_format.SelectedIndex.Equals(4))
\r
952 DVD_Save.FilterIndex = 5;
\r
954 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
956 if (DVD_Save.FileName.StartsWith("\\"))
\r
957 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
960 setAudioByContainer(DVD_Save.FileName);
\r
961 text_destination.Text = DVD_Save.FileName;
\r
963 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
964 if (Check_ChapterMarkers.Checked)
\r
965 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
969 private void text_destination_TextChanged(object sender, EventArgs e)
\r
971 string path = text_destination.Text;
\r
972 if (path.EndsWith(".mp4"))
\r
973 drop_format.SelectedIndex = 0;
\r
974 else if (path.EndsWith(".m4v"))
\r
975 drop_format.SelectedIndex = 1;
\r
976 else if (path.EndsWith(".mkv"))
\r
977 drop_format.SelectedIndex = 2;
\r
978 else if (path.EndsWith(".avi"))
\r
979 drop_format.SelectedIndex = 3;
\r
980 else if (path.EndsWith(".ogm"))
\r
981 drop_format.SelectedIndex = 4;
\r
986 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
988 if (drop_format.SelectedIndex == 0)
\r
989 setExtension(".mp4");
\r
990 else if (drop_format.SelectedIndex == 1)
\r
991 setExtension(".m4v");
\r
992 else if (drop_format.SelectedIndex == 2)
\r
993 setExtension(".mkv");
\r
994 else if (drop_format.SelectedIndex == 3)
\r
995 setExtension(".avi");
\r
996 else if (drop_format.SelectedIndex == 4)
\r
997 setExtension(".ogm");
\r
999 setAudioByContainer(drop_format.Text);
\r
1000 setVideoByContainer(drop_format.Text);
\r
1002 private void setExtension(string newExtension)
\r
1004 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1005 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1006 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1007 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1008 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1012 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1014 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1016 check_largeFile.Enabled = true;
\r
1017 check_optimiseMP4.Enabled = true;
\r
1018 check_iPodAtom.Enabled = true;
\r
1022 check_largeFile.Enabled = false;
\r
1023 check_optimiseMP4.Enabled = false;
\r
1024 check_iPodAtom.Enabled = false;
\r
1025 check_largeFile.Checked = false;
\r
1026 check_optimiseMP4.Checked = false;
\r
1027 check_iPodAtom.Checked = false;
\r
1030 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1031 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1033 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1034 check_turbo.Enabled = true;
\r
1036 h264Tab.Enabled = true;
\r
1037 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1038 check_iPodAtom.Enabled = true;
\r
1040 check_iPodAtom.Enabled = false;
\r
1044 check_turbo.CheckState = CheckState.Unchecked;
\r
1045 check_turbo.Enabled = false;
\r
1046 h264Tab.Enabled = false;
\r
1047 x264Panel.x264Query = "";
\r
1048 check_iPodAtom.Enabled = false;
\r
1049 check_iPodAtom.Checked = false;
\r
1052 // Setup the CQ Slider
\r
1053 switch (drp_videoEncoder.Text)
\r
1055 case "MPEG-4 (FFmpeg)":
\r
1056 slider_videoQuality.Minimum = 1;
\r
1057 slider_videoQuality.Maximum = 31;
\r
1058 slider_videoQuality.Value = 1;
\r
1059 SliderValue.Text = "0% QP: 31.00";
\r
1061 case "MPEG-4 (XviD)":
\r
1062 slider_videoQuality.Minimum = 1;
\r
1063 slider_videoQuality.Maximum = 31;
\r
1064 slider_videoQuality.Value = 1;
\r
1065 SliderValue.Text = "0% QP: 31.00";
\r
1067 case "H.264 (x264)":
\r
1068 slider_videoQuality.Minimum = 0;
\r
1069 slider_videoQuality.Value = 0;
\r
1070 slider_videoQuality.TickFrequency = 1;
\r
1071 SliderValue.Text = "0% RF: 51.00";
\r
1072 String step = Properties.Settings.Default.x264cqstep;
\r
1076 slider_videoQuality.Maximum = 255;
\r
1079 slider_videoQuality.Maximum = 204;
\r
1082 slider_videoQuality.Maximum = 155;
\r
1085 slider_videoQuality.Maximum = 102;
\r
1088 slider_videoQuality.Maximum = 51;
\r
1091 slider_videoQuality.Maximum = 51;
\r
1095 case "VP3 (Theora)":
\r
1096 slider_videoQuality.Minimum = 0;
\r
1097 slider_videoQuality.Maximum = 63;
\r
1098 slider_videoQuality.Value = 0;
\r
1099 SliderValue.Text = "0% QP: 0.00";
\r
1103 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1105 switch (drp_videoEncoder.Text)
\r
1107 case "MPEG-4 (FFmpeg)":
\r
1108 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1109 double max = slider_videoQuality.Maximum;
\r
1110 double min = slider_videoQuality.Minimum;
\r
1111 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1112 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1114 case "MPEG-4 (XviD)":
\r
1115 rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1116 max = slider_videoQuality.Maximum;
\r
1117 min = slider_videoQuality.Minimum;
\r
1118 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1119 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1121 case "H.264 (x264)":
\r
1123 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1124 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1125 System.Globalization.NumberStyles.Number,
\r
1128 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1129 max = slider_videoQuality.Maximum * divided;
\r
1130 min = slider_videoQuality.Minimum;
\r
1131 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1132 rfValue = Math.Round(rfValue, 2);
\r
1133 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1135 case "VP3 (Theora)":
\r
1136 rfValue = slider_videoQuality.Value;
\r
1137 double value = rfValue / 63;
\r
1138 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1142 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1144 text_bitrate.Enabled = false;
\r
1145 text_filesize.Enabled = true;
\r
1146 slider_videoQuality.Enabled = false;
\r
1148 check_2PassEncode.Enabled = true;
\r
1150 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1152 text_bitrate.Enabled = true;
\r
1153 text_filesize.Enabled = false;
\r
1154 slider_videoQuality.Enabled = false;
\r
1156 check_2PassEncode.Enabled = true;
\r
1158 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1160 text_bitrate.Enabled = false;
\r
1161 text_filesize.Enabled = false;
\r
1162 slider_videoQuality.Enabled = true;
\r
1164 check_2PassEncode.Enabled = false;
\r
1165 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1167 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1169 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1171 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1172 check_turbo.Enabled = true;
\r
1176 check_turbo.Enabled = false;
\r
1177 check_turbo.CheckState = CheckState.Unchecked;
\r
1182 private void text_width_TextChanged(object sender, EventArgs e)
\r
1184 if (text_width.Text == "")
\r
1185 text_width.BackColor = Color.White;
\r
1187 maxWidth = 0; maxHeight = 0; // Reset max width so that it's not using the MaxWidth -X. Quick hack to allow -X for preset usage.
\r
1188 lbl_max.Text = "";
\r
1191 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1194 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1196 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1198 if (drp_anamorphic.Text == "None")
\r
1200 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1202 text_height.Text = height.ToString();
\r
1207 private void text_height_TextChanged(object sender, EventArgs e)
\r
1209 if (text_height.Text == "")
\r
1210 text_height.BackColor = Color.White;
\r
1212 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1213 if (maxWidth != 0)
\r
1214 lbl_max.Text = "Max Width";
\r
1216 lbl_max.Text = "";
\r
1219 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1221 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1223 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1225 text_left.Enabled = true;
\r
1226 text_right.Enabled = true;
\r
1227 text_top.Enabled = true;
\r
1228 text_bottom.Enabled = true;
\r
1229 if (selectedTitle != null)
\r
1231 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1232 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1233 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1234 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1238 text_left.Text = "0";
\r
1239 text_right.Text = "0";
\r
1240 text_top.Text = "0";
\r
1241 text_bottom.Text = "0";
\r
1244 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1246 text_left.Enabled = false;
\r
1247 text_right.Enabled = false;
\r
1248 text_top.Enabled = false;
\r
1249 text_bottom.Enabled = false;
\r
1251 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1253 if (drp_anamorphic.SelectedIndex == 1)
\r
1255 text_height.BackColor = Color.LightGray;
\r
1256 text_width.BackColor = Color.LightGray;
\r
1257 text_height.Text = "";
\r
1258 text_width.Text = "";
\r
1259 text_height.Enabled = false;
\r
1260 text_width.Enabled = false;
\r
1263 if (drp_anamorphic.SelectedIndex == 2)
\r
1265 text_height.Text = "";
\r
1266 text_height.Enabled = false;
\r
1267 text_height.BackColor = Color.LightGray;
\r
1269 text_width.Enabled = true;
\r
1270 text_width.BackColor = Color.White;
\r
1273 if (drp_anamorphic.SelectedIndex == 0)
\r
1275 text_height.BackColor = Color.White;
\r
1276 text_width.BackColor = Color.White;
\r
1277 text_height.Enabled = true;
\r
1278 text_width.Enabled = true;
\r
1283 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1285 if (ctl_decomb.getDropValue != "Off")
\r
1286 if (ctl_deinterlace.getDropValue != "None")
\r
1287 ctl_deinterlace.setOption("None");
\r
1289 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1291 if (ctl_detelecine.getDropValue != "None")
\r
1292 if (ctl_decomb.getDropValue != "Off")
\r
1293 ctl_decomb.setOption("Off");
\r
1295 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1297 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1301 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1303 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1305 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1306 lv_audioList.Select();
\r
1309 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1311 if (drp_audenc_1.Text == "AC3")
\r
1313 drp_audmix_1.Enabled = false;
\r
1314 drp_audbit_1.Enabled = false;
\r
1315 drp_audsr_1.Enabled = false;
\r
1317 drp_audmix_1.SelectedIndex = 0;
\r
1318 drp_audbit_1.SelectedIndex = 0;
\r
1319 drp_audsr_1.SelectedIndex = 0;
\r
1323 drp_audmix_1.Enabled = true;
\r
1324 drp_audbit_1.Enabled = true;
\r
1325 drp_audsr_1.Enabled = true;
\r
1327 drp_audmix_1.Text = "Automatic";
\r
1328 drp_audbit_1.Text = "160";
\r
1329 drp_audsr_1.Text = "Auto";
\r
1332 if (drp_audenc_1.Text == "AAC")
\r
1334 setMixDownAllOptions(drp_audmix_1);
\r
1335 setBitrateSelections160(drp_audbit_1);
\r
1339 setMixDownNotAAC(drp_audmix_1);
\r
1340 setBitrateSelections320(drp_audbit_1);
\r
1343 // Update an item in the Audio list if required.
\r
1344 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1346 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1347 lv_audioList.Select();
\r
1350 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1352 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1353 setBitrateSelections384(drp_audbit_1);
\r
1354 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1355 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1357 // Update an item in the Audio list if required.
\r
1358 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1360 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1361 lv_audioList.Select();
\r
1364 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1366 // Update an item in the Audio list if required.
\r
1367 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1369 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1370 lv_audioList.Select();
\r
1373 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1375 // Update an item in the Audio list if required.
\r
1376 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1378 if (drp_audenc_1.Text == "AC3")
\r
1379 drp_audbit_1.Text = "Auto";
\r
1380 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1381 lv_audioList.Select();
\r
1384 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1387 if (tb_drc.Value == 0) value = 0;
\r
1389 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1391 lbl_drc.Text = value.ToString();
\r
1393 // Update an item in the Audio list if required.
\r
1394 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1396 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1397 lv_audioList.Select();
\r
1401 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1403 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1404 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1405 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1406 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1407 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1408 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1409 newTrack.SubItems.Add(lbl_drc.Text);
\r
1411 // Select the newly added track and select the control
\r
1412 lv_audioList.Items.Add(newTrack);
\r
1413 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1414 lv_audioList.Select();
\r
1416 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1418 removeAudioTrack();
\r
1420 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1422 if (lv_audioList.SelectedIndices.Count != 0)
\r
1424 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1425 int index = item.Index;
\r
1428 if (lv_audioList.Items.Count > index && index >= 0)
\r
1430 lv_audioList.Items.Remove(item);
\r
1431 lv_audioList.Items.Insert(index, item);
\r
1432 item.Selected = true;
\r
1433 lv_audioList.Focus();
\r
1437 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1439 if (lv_audioList.SelectedIndices.Count != 0)
\r
1441 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1442 int index = item.Index;
\r
1445 if (index < lv_audioList.Items.Count)
\r
1447 lv_audioList.Items.Remove(item);
\r
1448 lv_audioList.Items.Insert(index, item);
\r
1449 item.Selected = true;
\r
1450 lv_audioList.Focus();
\r
1455 private void audioList_remove_Click(object sender, EventArgs e)
\r
1457 removeAudioTrack();
\r
1459 private void removeAudioTrack()
\r
1461 // Remove the Item and reselect the control if the following conditions are met.
\r
1462 if (lv_audioList.SelectedItems.Count != 0)
\r
1464 // Record the current selected index.
\r
1465 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1467 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1469 // Now reslect the correct item and give focus to the audio list.
\r
1470 if (lv_audioList.Items.Count != 0)
\r
1472 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1473 lv_audioList.Items[currentPosition].Selected = true;
\r
1474 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1475 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1477 lv_audioList.Select();
\r
1481 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1483 // Set the dropdown controls based on the selected item in the Audio List.
\r
1484 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1486 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1487 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1488 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1489 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1490 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1491 double drcValue; int drcCalculated;
\r
1492 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1493 if (drcValue == 0) drcCalculated = 0;
\r
1495 drcValue = ((drcValue * 10) + 1) - 10;
\r
1496 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1497 tb_drc.Value = drcCalculated;
\r
1501 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1503 if (drp_subtitle.Text.Contains("None"))
\r
1505 check_forced.Enabled = false;
\r
1506 check_forced.Checked = false;
\r
1509 check_forced.Enabled = true;
\r
1512 // Chapter Marker Tab
\r
1513 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1515 if (Check_ChapterMarkers.Checked)
\r
1517 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1518 data_chpt.Rows.Clear();
\r
1519 data_chpt.Enabled = true;
\r
1520 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1521 if (chapterGridView != null)
\r
1522 data_chpt = chapterGridView;
\r
1526 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1527 data_chpt.Rows.Clear();
\r
1528 data_chpt.Enabled = false;
\r
1532 // Query Editor Tab
\r
1533 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1535 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1537 private void btn_clear_Click(object sender, EventArgs e)
\r
1539 rtf_query.Clear();
\r
1543 // MainWindow Components, Actions and Functions ***********************
\r
1545 #region Source Scan
\r
1546 private void setupGUIforScan(String filename)
\r
1548 text_source.Text = filename;
\r
1550 foreach (Control ctrl in Controls)
\r
1552 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1553 ctrl.Enabled = false;
\r
1555 lbl_encode.Visible = true;
\r
1556 lbl_encode.Text = "Scanning ...";
\r
1557 gb_source.Text = "Source: Scanning ...";
\r
1558 btn_source.Enabled = false;
\r
1559 btn_start.Enabled = false;
\r
1560 btn_showQueue.Enabled = false;
\r
1561 btn_add2Queue.Enabled = false;
\r
1562 tb_preview.Enabled = false;
\r
1563 mnu_killCLI.Visible = true;
\r
1565 private void startScan(String filename)
\r
1569 lbl_encode.Visible = true;
\r
1570 lbl_encode.Text = "Scanning...";
\r
1571 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1573 catch (Exception exc)
\r
1575 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1578 private void scanProcess(object state)
\r
1582 string inputFile = (string)state;
\r
1583 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1584 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1586 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1587 if (File.Exists(dvdInfoPath))
\r
1588 File.Delete(dvdInfoPath);
\r
1590 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1592 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1593 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1595 using (hbproc = Process.Start(hbParseDvd))
\r
1597 hbproc.WaitForExit();
\r
1600 if (!File.Exists(dvdInfoPath))
\r
1602 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1605 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1607 thisDVD = Parsing.DVD.Parse(sr);
\r
1612 updateUIafterScan();
\r
1614 catch (Exception exc)
\r
1616 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1620 private void updateUIafterScan()
\r
1624 if (InvokeRequired)
\r
1626 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1630 // Setup some GUI components
\r
1631 drp_dvdtitle.Items.Clear();
\r
1632 if (thisDVD.Titles.Count != 0)
\r
1633 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1634 drp_dvdtitle.Text = "Automatic";
\r
1635 drop_chapterFinish.Text = "Auto";
\r
1636 drop_chapterStart.Text = "Auto";
\r
1638 // Now select the longest title
\r
1639 if (thisDVD.Titles.Count != 0)
\r
1640 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1642 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1643 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1644 Check_ChapterMarkers.Enabled = true;
\r
1647 Check_ChapterMarkers.Enabled = false;
\r
1648 Check_ChapterMarkers.Checked = false;
\r
1649 data_chpt.Rows.Clear();
\r
1652 // If no titles were found, Display an error message
\r
1653 if (drp_dvdtitle.Items.Count == 0)
\r
1654 MessageBox.Show("No Title(s) found. Please make sure you have selected a valid, non-copy protected source.\nYour Source may be copy protected, badly mastered or a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
1656 // Enable the GUI components and enable any disabled components
\r
1659 catch (Exception exc)
\r
1661 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1666 private void enableGUI()
\r
1670 if (InvokeRequired)
\r
1672 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1674 lbl_encode.Text = "Scan Completed";
\r
1675 gb_source.Text = "Source";
\r
1676 foreach (Control ctrl in Controls)
\r
1677 ctrl.Enabled = true;
\r
1678 btn_start.Enabled = true;
\r
1679 btn_showQueue.Enabled = true;
\r
1680 btn_add2Queue.Enabled = true;
\r
1681 tb_preview.Enabled = true;
\r
1682 btn_source.Enabled = true;
\r
1683 mnu_killCLI.Visible = false;
\r
1685 catch (Exception exc)
\r
1687 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1690 private static void killCLI()
\r
1692 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1693 // hbproc.kill/close just won't do the trick.
\r
1696 string AppName = "HandBrakeCLI";
\r
1698 AppName = AppName.ToUpper();
\r
1700 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1701 foreach (System.Diagnostics.Process proces in prs)
\r
1703 if (proces.ProcessName.ToUpper() == AppName)
\r
1706 if (!proces.HasExited)
\r
1711 catch (Exception ex)
\r
1713 MessageBox.Show("Unable to kill HandBrakeCLI.exe \nYou may need to manually kill HandBrakeCLI.exe using the Windows Task Manager if it does not close automatically within the next few minutes. \n\nError Information: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1718 #region DVD Drive Detection
\r
1719 // Source Button Drive Detection
\r
1720 private delegate void ProgressUpdateHandler();
\r
1721 private void getDriveInfoThread()
\r
1725 if (InvokeRequired)
\r
1727 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1731 Boolean foundDrive = false;
\r
1732 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1733 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1735 if (curDrive.DriveType == DriveType.CDRom)
\r
1737 if (curDrive.IsReady)
\r
1739 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1741 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1742 foundDrive = true;
\r
1750 if (foundDrive == false)
\r
1751 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1755 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1760 #region Audio Panel Code Helpers
\r
1761 private void setAudioByContainer(String path)
\r
1765 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1767 oldval = drp_audenc_1.Text;
\r
1768 drp_audenc_1.Items.Clear();
\r
1769 drp_audenc_1.Items.Add("AAC");
\r
1770 drp_audenc_1.Items.Add("AC3");
\r
1771 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1772 drp_audenc_1.SelectedIndex = 0;
\r
1775 else if (path.Contains("AVI"))
\r
1777 oldval = drp_audenc_1.Text;
\r
1778 drp_audenc_1.Items.Clear();
\r
1779 drp_audenc_1.Items.Add("MP3");
\r
1780 drp_audenc_1.Items.Add("AC3");
\r
1781 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1782 drp_audenc_1.SelectedIndex = 0;
\r
1785 else if (path.Contains("OGM"))
\r
1787 drp_audenc_1.Items.Clear();
\r
1788 drp_audenc_1.Items.Add("Vorbis");
\r
1789 drp_audenc_1.SelectedIndex = 0;
\r
1792 else if (path.Contains("MKV"))
\r
1794 drp_audenc_1.Items.Clear();
\r
1795 drp_audenc_1.Items.Add("AAC");
\r
1796 drp_audenc_1.Items.Add("MP3");
\r
1797 drp_audenc_1.Items.Add("AC3");
\r
1798 drp_audenc_1.Items.Add("Vorbis");
\r
1799 if (drp_audenc_1.Text == string.Empty)
\r
1800 drp_audenc_1.SelectedIndex = 0;
\r
1803 // Make sure the table is updated with new audio codecs
\r
1804 foreach (ListViewItem row in lv_audioList.Items)
\r
1806 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1807 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1810 private void setVideoByContainer(String path)
\r
1814 if ((path.Contains("MP3")) || (path.Contains("M4V")))
\r
1816 oldval = drp_videoEncoder.Text;
\r
1817 drp_videoEncoder.Items.Clear();
\r
1818 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1819 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1820 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1821 if (oldval == "VP3 (Theora)")
\r
1822 drp_videoEncoder.SelectedIndex = 2;
\r
1824 drp_videoEncoder.Text = oldval;
\r
1827 else if (path.Contains("AVI"))
\r
1829 oldval = drp_videoEncoder.Text;
\r
1830 drp_videoEncoder.Items.Clear();
\r
1831 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1832 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1833 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1834 if (oldval == "VP3 (Theora)")
\r
1835 drp_videoEncoder.SelectedIndex = 2;
\r
1837 drp_videoEncoder.Text = oldval;
\r
1839 else if (path.Contains("OGM"))
\r
1841 oldval = drp_videoEncoder.Text;
\r
1842 drp_videoEncoder.Items.Clear();
\r
1843 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1844 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1845 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1846 if (oldval == "H.264 (x264)")
\r
1847 drp_videoEncoder.SelectedIndex = 2;
\r
1849 drp_videoEncoder.Text = oldval;
\r
1851 else if (path.Contains("MKV"))
\r
1853 oldval = drp_videoEncoder.Text;
\r
1854 drp_videoEncoder.Items.Clear();
\r
1855 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1856 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1857 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1858 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1859 drp_videoEncoder.Text = oldval;
\r
1862 private void setBitrateSelections384(ComboBox dropDown)
\r
1864 dropDown.Items.Clear();
\r
1865 dropDown.Items.Add("32");
\r
1866 dropDown.Items.Add("40");
\r
1867 dropDown.Items.Add("48");
\r
1868 dropDown.Items.Add("56");
\r
1869 dropDown.Items.Add("64");
\r
1870 dropDown.Items.Add("80");
\r
1871 dropDown.Items.Add("86");
\r
1872 dropDown.Items.Add("112");
\r
1873 dropDown.Items.Add("128");
\r
1874 dropDown.Items.Add("160");
\r
1875 dropDown.Items.Add("192");
\r
1876 dropDown.Items.Add("224");
\r
1877 dropDown.Items.Add("256");
\r
1878 dropDown.Items.Add("320");
\r
1879 dropDown.Items.Add("384");
\r
1881 private void setBitrateSelections320(ComboBox dropDown)
\r
1883 dropDown.Items.Clear();
\r
1884 dropDown.Items.Add("32");
\r
1885 dropDown.Items.Add("40");
\r
1886 dropDown.Items.Add("48");
\r
1887 dropDown.Items.Add("56");
\r
1888 dropDown.Items.Add("64");
\r
1889 dropDown.Items.Add("80");
\r
1890 dropDown.Items.Add("86");
\r
1891 dropDown.Items.Add("112");
\r
1892 dropDown.Items.Add("128");
\r
1893 dropDown.Items.Add("160");
\r
1894 dropDown.Items.Add("192");
\r
1895 dropDown.Items.Add("224");
\r
1896 dropDown.Items.Add("256");
\r
1897 dropDown.Items.Add("320");
\r
1899 private void setBitrateSelections160(ComboBox dropDown)
\r
1901 dropDown.Items.Clear();
\r
1902 dropDown.Items.Add("32");
\r
1903 dropDown.Items.Add("40");
\r
1904 dropDown.Items.Add("48");
\r
1905 dropDown.Items.Add("56");
\r
1906 dropDown.Items.Add("64");
\r
1907 dropDown.Items.Add("80");
\r
1908 dropDown.Items.Add("86");
\r
1909 dropDown.Items.Add("112");
\r
1910 dropDown.Items.Add("128");
\r
1911 dropDown.Items.Add("160");
\r
1913 private void setMixDownAllOptions(ComboBox dropdown)
\r
1915 dropdown.Items.Clear();
\r
1916 dropdown.Items.Add("Automatic");
\r
1917 dropdown.Items.Add("Mono");
\r
1918 dropdown.Items.Add("Stereo");
\r
1919 dropdown.Items.Add("Dolby Surround");
\r
1920 dropdown.Items.Add("Dolby Pro Logic II");
\r
1921 dropdown.Items.Add("6 Channel Discrete");
\r
1923 private void setMixDownNotAAC(ComboBox dropdown)
\r
1925 dropdown.Items.Clear();
\r
1926 dropdown.Items.Add("Automatic");
\r
1927 dropdown.Items.Add("Stereo");
\r
1928 dropdown.Items.Add("Dolby Surround");
\r
1929 dropdown.Items.Add("Dolby Pro Logic II");
\r
1933 #region Public Methods
\r
1936 /// Setup the GUI for Encoding or finished Encoding.
\r
1937 /// 1 = Encode Running
\r
1938 /// 0 = Encode Finished.
\r
1940 public void setEncodeFinished()
\r
1944 if (InvokeRequired)
\r
1946 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1950 lbl_encode.Text = "Encoding Finished";
\r
1951 btn_start.Text = "Start";
\r
1952 btn_start.ToolTipText = "Start the encoding process";
\r
1953 btn_start.Image = Properties.Resources.Play;
\r
1955 // If the window is minimized, display the notification in a popup.
\r
1956 if (FormWindowState.Minimized == this.WindowState)
\r
1958 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1959 notifyIcon.ShowBalloonTip(500);
\r
1962 catch (Exception exc)
\r
1964 MessageBox.Show(exc.ToString());
\r
1967 public void setEncodeStarted()
\r
1971 if (InvokeRequired)
\r
1973 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1977 lbl_encode.Visible = true;
\r
1978 lbl_encode.Text = "Encoding in Progress";
\r
1979 btn_start.Text = "Stop";
\r
1980 btn_start.ToolTipText = "Stop the encoding process. \nWarning: This may break your file. Press ctrl-c in the CLI window if you wish it to exit cleanly.";
\r
1981 btn_start.Image = Properties.Resources.stop;
\r
1983 catch (Exception exc)
\r
1985 MessageBox.Show(exc.ToString());
\r
1990 /// Action can be "encode" or "scan"
\r
1991 /// Set the last action varible in the main window.
\r
1992 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1994 /// <param name="last">String</param>
\r
1995 public void setLastAction(string last)
\r
1997 this.lastAction = last;
\r
2001 /// DVD parseing. Pass in a parsed DVD.
\r
2003 /// <param name="dvd"></param>
\r
2004 public void setStreamReader(Parsing.DVD dvd)
\r
2006 this.thisDVD = dvd;
\r
2010 /// Reload the preset panel display
\r
2012 public void loadPresetPanel()
\r
2014 presetHandler.loadPresetData();
\r
2016 treeView_presets.Nodes.Clear();
\r
2018 List<Presets.Preset> presetNameList;
\r
2019 List<string> presetNames;
\r
2020 TreeNode preset_treeview;
\r
2022 TreeNode rootNode = new TreeNode();
\r
2023 TreeNode rootNodeTwo = new TreeNode();
\r
2024 TreeNode childNode;
\r
2025 int workingLevel = 0;
\r
2026 string previousCategory = String.Empty;
\r
2027 string currentCategory = String.Empty;
\r
2029 presetNameList = presetHandler.getBuildInPresets();
\r
2030 if (presetNameList.Count != 0)
\r
2032 foreach (Presets.Preset preset in presetNameList)
\r
2034 // Handle Root Nodes
\r
2036 // First Case - No presets have been read yet so setup the root category
\r
2037 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2039 rootNode = new TreeNode(preset.Category);
\r
2040 workingLevel = preset.Level;
\r
2041 currentCategory = preset.Category;
\r
2042 previousCategory = preset.Category;
\r
2045 // Second Case - This is the first sub child node.
\r
2046 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2048 rootNodeTwo = new TreeNode(preset.Category);
\r
2049 workingLevel = preset.Level;
\r
2050 currentCategory = preset.Category;
\r
2051 rootNode.Nodes.Add(rootNodeTwo);
\r
2054 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2055 if (preset.Level == 1 && workingLevel == 2)
\r
2057 workingLevel = preset.Level;
\r
2058 currentCategory = preset.Category;
\r
2061 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2062 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2064 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2066 rootNode = new TreeNode(preset.Category);
\r
2067 workingLevel = preset.Level;
\r
2068 currentCategory = preset.Category;
\r
2069 previousCategory = preset.Category;
\r
2072 // Handle Child Nodes
\r
2073 // Add First level child nodes to the current root node
\r
2074 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2076 childNode = new TreeNode(preset.Name);
\r
2077 rootNode.Nodes.Add(childNode);
\r
2080 // Add Second level child nodes to the current sub root node
\r
2081 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2083 childNode = new TreeNode(preset.Name);
\r
2084 rootNodeTwo.Nodes.Add(childNode);
\r
2088 // Add the final root node which does not get added above.
\r
2089 treeView_presets.Nodes.Add(rootNode);
\r
2093 presetNames = presetHandler.getUserPresetNames();
\r
2094 foreach (string preset in presetNames)
\r
2096 preset_treeview = new TreeNode(preset);
\r
2097 preset_treeview.ForeColor = Color.Black;
\r
2099 // Now Fill Out List View with Items
\r
2100 treeView_presets.Nodes.Add(preset_treeview);
\r
2107 // This is the END of the road ------------------------------------------------------------------------------
\r