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
16 using Handbrake.Presets;
\r
17 using Handbrake.Queue;
\r
18 using Handbrake.Parsing;
\r
22 public partial class frmMain : Form
\r
24 // Objects which may be used by one or more other objects
\r
25 Main hb_common_func = new Main();
\r
26 Encode encodeHandler = new Encode();
\r
27 QueueHandler encodeQueue = new QueueHandler();
\r
28 PresetsHandler presetHandler = new PresetsHandler();
\r
29 QueryGenerator queryGen = new QueryGenerator();
\r
31 // Globals: Mainly used for tracking.
\r
32 Title selectedTitle;
\r
35 private frmQueue queueWindow;
\r
36 private frmPreview qtpreview;
\r
37 private Form splash;
\r
38 private string lastAction;
\r
39 public int maxWidth;
\r
40 public int maxHeight;
\r
43 private delegate void UpdateWindowHandler();
\r
44 private delegate void updateStatusChanger();
\r
46 // Applicaiton Startup ************************************************
\r
48 #region Application Startup
\r
52 // Load and setup the splash screen in this thread
\r
53 splash = new frmSplashScreen();
\r
55 Label lblStatus = new Label { Size = new Size(250, 20), Location = new Point(10, 280) };
\r
56 splash.Controls.Add(lblStatus);
\r
58 InitializeComponent();
\r
60 // Update the users config file with the CLI version data.
\r
61 lblStatus.Text = "Setting Version Data ...";
\r
62 Application.DoEvents();
\r
63 hb_common_func.setCliVersionData();
\r
65 // Show the form, but leave disabled until preloading is complete then show the main form
\r
66 this.Enabled = false;
\r
68 Application.DoEvents(); // Forces frmMain to draw
\r
70 // Check for new versions, if update checking is enabled
\r
71 if (Properties.Settings.Default.updateStatus == "Checked")
\r
73 lblStatus.Text = "Checking for updates ...";
\r
74 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 loadPresetPanel(); // Load the Preset Panel
\r
84 treeView_presets.ExpandAll();
\r
85 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 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
96 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
97 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
101 //Ok, Reset all the H264 widgets before changing the preset
\r
102 x264Panel.reset2Defaults();
\r
104 // Send the query from the file to the Query Parser class, then load the preset
\r
105 QueryParser presetQuery = QueryParser.Parse(query);
\r
106 PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
108 // The x264 widgets will need updated, so do this now:
\r
109 x264Panel.X264_StandardizeOptString();
\r
110 x264Panel.X264_SetCurrentSettingsInPanel();
\r
114 loadNormalPreset();
\r
117 loadNormalPreset();
\r
119 // Enabled GUI tooltip's if Required
\r
120 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
121 ToolTip.Active = true;
\r
124 lblStatus.Text = "Loading Complete!";
\r
125 Application.DoEvents();
\r
128 this.Enabled = true;
\r
137 // Startup Functions
\r
138 private void startupUpdateCheck()
\r
142 if (InvokeRequired)
\r
144 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
148 Boolean update = hb_common_func.updateCheck(false);
\r
151 frmUpdater updateWindow = new frmUpdater();
\r
152 updateWindow.Show();
\r
155 catch (Exception exc)
\r
157 MessageBox.Show(splash, "Unable to perform update check. If this problem persists, you can turn of update checking in the program options. \nError Information: \n\n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
160 private void queueRecovery()
\r
162 if (hb_common_func.check_queue_recovery())
\r
164 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
166 if (result == DialogResult.Yes)
\r
167 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
170 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
171 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
172 if (File.Exists(queuePath))
\r
173 File.Delete(queuePath);
\r
180 // Encoding Events for setting up the GUI
\r
181 private void events()
\r
183 // Handle Window Resize
\r
184 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
185 this.Resize += new EventHandler(frmMain_Resize);
\r
187 // Handle Encode Start / Finish / Pause
\r
188 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
189 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
190 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
192 // Handle a file being draged onto the GUI.
\r
193 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
194 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
197 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
199 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
200 e.Effect = DragDropEffects.All;
\r
202 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
204 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
205 if (fileList != null)
\r
207 if (fileList[0].StartsWith("\\"))
\r
208 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
211 if (fileList[0] != "")
\r
213 setupGUIforScan(fileList[0]);
\r
214 startScan(fileList[0]);
\r
217 text_source.Text = "Click 'Source' to continue";
\r
221 private void encodeStarted(object sender, EventArgs e)
\r
223 lastAction = "encode";
\r
224 setEncodeStarted();
\r
226 private void encodeEnded(object sender, EventArgs e)
\r
228 setEncodeFinished();
\r
230 private void encodePaused(object sender, EventArgs e)
\r
232 setEncodeFinished();
\r
236 // User Interface Menus / Tool Strips *********************************
\r
239 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
243 private void mnu_exit_Click(object sender, EventArgs e)
\r
245 Application.Exit();
\r
250 private void mnu_encode_Click(object sender, EventArgs e)
\r
252 queueWindow.Show();
\r
254 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
257 file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
259 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
260 dvdInfoWindow.Show();
\r
262 private void mnu_options_Click(object sender, EventArgs e)
\r
264 Form Options = new frmOptions();
\r
265 Options.ShowDialog();
\r
269 #region Presets Menu
\r
270 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
272 presetHandler.updateBuiltInPresets();
\r
274 if (treeView_presets.Nodes.Count == 0)
\r
275 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
277 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
279 treeView_presets.ExpandAll();
\r
281 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
283 // Empty the preset file
\r
284 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
285 if (File.Exists(presetsFile))
\r
286 File.Delete(presetsFile);
\r
290 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
294 catch (Exception exc)
\r
296 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
299 // Reload the preset panel
\r
302 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
304 loadNormalPreset();
\r
306 private void btn_new_preset_Click(object sender, EventArgs e)
\r
308 // Remember each nodes expanded status so we can reload it
\r
309 List<Boolean> nodeStatus = saveTreeViewState();
\r
310 nodeStatus.Add(true);
\r
312 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
313 preset.ShowDialog();
\r
315 // Now reload the TreeView states
\r
316 loadTreeViewStates(nodeStatus);
\r
321 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
323 Process.Start("http://forum.handbrake.fr/");
\r
325 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
327 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
329 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
331 Process.Start("http://handbrake.fr");
\r
333 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
335 Boolean update = hb_common_func.updateCheck(true);
\r
338 frmUpdater updateWindow = new frmUpdater();
\r
339 updateWindow.Show();
\r
342 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
344 private void mnu_about_Click(object sender, EventArgs e)
\r
346 Form About = new frmAbout();
\r
347 About.ShowDialog();
\r
352 private void mnu_qptest_Click(object sender, EventArgs e)
\r
354 QueryParserTester qptest = new QueryParserTester();
\r
360 // Right Click Menu Code
\r
361 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
363 treeView_presets.ExpandAll();
\r
365 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
367 treeView_presets.CollapseAll();
\r
369 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
371 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
372 if (result == DialogResult.Yes)
\r
373 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
374 else if (result == DialogResult.No)
\r
375 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
377 private void pmnu_delete_click(object sender, EventArgs e)
\r
379 if (treeView_presets.SelectedNode != null)
\r
381 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
383 // Remember each nodes expanded status so we can reload it
\r
384 List<Boolean> nodeStatus = saveTreeViewState();
\r
386 // Now reload the preset panel
\r
389 // Now reload the TreeView states
\r
390 loadTreeViewStates(nodeStatus);
\r
392 treeView_presets.Select();
\r
394 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
396 // Make sure that the save menu is always disabled by default
\r
397 pmnu_saveChanges.Enabled = false;
\r
399 // Now enable the save menu if the selected preset is a user preset
\r
400 if (treeView_presets.SelectedNode != null)
\r
402 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
404 pmnu_saveChanges.Enabled = true;
\r
407 treeView_presets.Select();
\r
410 // Presets Management
\r
411 private void btn_addPreset_Click(object sender, EventArgs e)
\r
413 // Remember each nodes expanded status so we can reload it
\r
414 List<Boolean> nodeStatus = saveTreeViewState();
\r
415 nodeStatus.Add(true);
\r
417 // Now add the new preset
\r
418 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
419 preset.ShowDialog();
\r
421 // Now reload the TreeView states
\r
422 loadTreeViewStates(nodeStatus);
\r
424 private void btn_removePreset_Click(object sender, EventArgs e)
\r
426 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
427 if (result == DialogResult.Yes)
\r
429 if (treeView_presets.SelectedNode != null)
\r
430 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
432 // Remember each nodes expanded status so we can reload it
\r
433 List<Boolean> nodeStatus = saveTreeViewState();
\r
435 // Now reload the preset panel
\r
438 // Now reload the TreeView states
\r
439 loadTreeViewStates(nodeStatus);
\r
441 treeView_presets.Select();
\r
443 private void btn_setDefault_Click(object sender, EventArgs e)
\r
445 if (treeView_presets.SelectedNode != null)
\r
447 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
448 if (result == DialogResult.Yes)
\r
450 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
451 Properties.Settings.Default.Save();
\r
452 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
456 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
458 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
460 if (e.Button == MouseButtons.Right)
\r
461 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
462 else if (e.Button == MouseButtons.Left)
\r
464 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
466 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
471 treeView_presets.Select();
\r
473 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
477 private void selectPreset()
\r
479 if (treeView_presets.SelectedNode != null)
\r
481 // Ok, so, we've selected a preset. Now we want to load it.
\r
482 string presetName = treeView_presets.SelectedNode.Text;
\r
483 if (presetHandler.getPreset(presetName) != null)
\r
485 string query = presetHandler.getPreset(presetName).Query;
\r
486 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
490 //Ok, Reset all the H264 widgets before changing the preset
\r
491 x264Panel.reset2Defaults();
\r
493 // Send the query from the file to the Query Parser class
\r
494 QueryParser presetQuery = QueryParser.Parse(query);
\r
496 // Now load the preset
\r
497 PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
499 // The x264 widgets will need updated, so do this now:
\r
500 x264Panel.X264_StandardizeOptString();
\r
501 x264Panel.X264_SetCurrentSettingsInPanel();
\r
503 if (maxWidth != 0 && maxHeight != 0)
\r
504 lbl_max.Text = "Max Width / Height";
\r
505 else if (maxWidth != 0)
\r
506 lbl_max.Text = "Max Width";
\r
513 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
515 if (e.KeyCode == Keys.Delete)
\r
517 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
518 if (result == DialogResult.Yes)
\r
520 if (treeView_presets.SelectedNode != null)
\r
521 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
523 // Remember each nodes expanded status so we can reload it
\r
524 List<Boolean> nodeStatus = new List<Boolean>();
\r
525 foreach (TreeNode node in treeView_presets.Nodes)
\r
526 nodeStatus.Add(node.IsExpanded);
\r
528 // Now reload the preset panel
\r
531 // And finally, re-expand any of the nodes if required
\r
533 foreach (TreeNode node in treeView_presets.Nodes)
\r
543 private List<Boolean> saveTreeViewState()
\r
545 // Remember each nodes expanded status so we can reload it
\r
546 List<Boolean> nodeStatus = new List<Boolean>();
\r
547 foreach (TreeNode node in treeView_presets.Nodes)
\r
549 nodeStatus.Add(node.IsExpanded);
\r
550 foreach (TreeNode subNode in node.Nodes)
\r
551 nodeStatus.Add(node.IsExpanded);
\r
555 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
557 // And finally, re-expand any of the nodes if required
\r
559 foreach (TreeNode node in treeView_presets.Nodes)
\r
564 foreach (TreeNode subNode in node.Nodes)
\r
573 private void loadNormalPreset()
\r
575 treeView_presets.Nodes.Find("Normal", true);
\r
577 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
579 foreach (TreeNode node in treenode.Nodes)
\r
581 if (node.Text.Equals("Normal"))
\r
582 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
589 private void btn_source_Click(object sender, EventArgs e)
\r
591 if (Properties.Settings.Default.drive_detection == "Checked")
\r
593 mnu_dvd_drive.Visible = true;
\r
594 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
595 driveInfoThread.Start();
\r
598 mnu_dvd_drive.Visible = false;
\r
600 private void btn_start_Click(object sender, EventArgs e)
\r
602 if (btn_start.Text == "Stop")
\r
604 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
606 if (result == DialogResult.Yes)
\r
609 encodeQueue.pauseEncode();
\r
611 // Kill the current process.
\r
612 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
613 Process HandBrakeCLI;
\r
614 if (aProc.Length > 0)
\r
616 HandBrakeCLI = aProc[0];
\r
617 HandBrakeCLI.Kill();
\r
621 setEncodeFinished();
\r
626 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
628 // Set the last action to encode.
\r
629 // This is used for tracking which file to load in the activity window
\r
630 lastAction = "encode";
\r
632 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
634 if (encodeQueue.count() == 0)
\r
636 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
637 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
639 queueWindow.setQueue();
\r
640 if (encodeQueue.count() > 1)
\r
641 queueWindow.Show(false);
\r
643 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
644 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
647 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
648 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
652 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
654 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
655 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
658 String query = queryGen.GenerateTheQuery(this);
\r
659 if (rtf_query.Text != "")
\r
660 query = rtf_query.Text;
\r
663 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
665 DialogResult result = MessageBox.Show("There is already a queue item for this destination path. \n\n If you continue, the encode will be overwritten. Do you wish to continue?",
\r
666 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
667 if (result == DialogResult.Yes)
\r
668 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
672 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
674 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
675 queueWindow.Show();
\r
678 private void btn_showQueue_Click(object sender, EventArgs e)
\r
680 queueWindow.Show();
\r
682 private void tb_preview_Click(object sender, EventArgs e)
\r
684 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
685 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
688 if (qtpreview == null)
\r
690 qtpreview = new frmPreview(this);
\r
693 else if (qtpreview.IsDisposed)
\r
695 qtpreview = new frmPreview(this);
\r
699 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
702 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
704 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
706 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
707 ActivityWindow.Show();
\r
711 #region System Tray Icon
\r
712 private void frmMain_Resize(object sender, EventArgs e)
\r
714 if (FormWindowState.Minimized == this.WindowState)
\r
716 notifyIcon.Visible = true;
\r
717 if (!encodeQueue.isEncoding)
\r
719 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
720 notifyIcon.ShowBalloonTip(500);
\r
724 else if (FormWindowState.Normal == this.WindowState)
\r
725 notifyIcon.Visible = false;
\r
727 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
729 this.Visible = true;
\r
731 this.WindowState = FormWindowState.Normal;
\r
732 notifyIcon.Visible = false;
\r
734 private void btn_restore_Click(object sender, EventArgs e)
\r
736 this.Visible = true;
\r
738 this.WindowState = FormWindowState.Normal;
\r
739 notifyIcon.Visible = false;
\r
743 #region Tab Control
\r
746 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
748 // Enable the creation of chapter markers.
\r
749 Check_ChapterMarkers.Enabled = true;
\r
751 // Set the last action to scan.
\r
752 // This is used for tracking which file to load in the activity window
\r
753 lastAction = "scan";
\r
754 text_source.Text = "";
\r
756 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
758 String filename = DVD_Open.SelectedPath;
\r
760 if (filename.StartsWith("\\"))
\r
761 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
764 if (filename != "")
\r
766 setupGUIforScan(filename);
\r
767 startScan(filename);
\r
770 text_source.Text = "Click 'Source' to continue";
\r
774 text_source.Text = "Click 'Source' to continue";
\r
776 private void btn_file_source_Click(object sender, EventArgs e)
\r
778 // Set the last action to scan.
\r
779 // This is used for tracking which file to load in the activity window
\r
780 lastAction = "scan";
\r
781 text_source.Text = "";
\r
783 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
785 String filename = ISO_Open.FileName;
\r
786 if (filename.StartsWith("\\"))
\r
788 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
789 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
792 if (filename != "")
\r
794 setupGUIforScan(filename);
\r
795 startScan(filename);
\r
798 text_source.Text = "Click 'Source' to continue";
\r
802 text_source.Text = "Click 'Source' to continue";
\r
804 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
806 // Enable the creation of chapter markers.
\r
807 Check_ChapterMarkers.Enabled = true;
\r
809 // Set the last action to scan.
\r
810 // This is used for tracking which file to load in the activity window
\r
811 lastAction = "scan";
\r
813 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
815 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
816 String filename = path[0];
\r
817 setupGUIforScan(filename);
\r
818 startScan(filename);
\r
821 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
822 if (drp_dvdtitle.Items.Count == 0)
\r
823 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
825 lbl_encode.Text = "";
\r
827 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
829 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
830 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
832 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
834 // Reset some values on the form
\r
835 lbl_Aspect.Text = "Select a Title";
\r
836 //lbl_RecomendedCrop.Text = "Select a Title";
\r
837 drop_chapterStart.Items.Clear();
\r
838 drop_chapterFinish.Items.Clear();
\r
840 // If the dropdown is set to automatic nothing else needs to be done.
\r
841 // Otheriwse if its not, title data has to be loased from parsing.
\r
842 if (drp_dvdtitle.Text != "Automatic")
\r
844 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
846 // Set the Aspect Ratio
\r
847 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
848 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
849 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
851 // Set the Recommended Cropping values
\r
852 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
853 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
854 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
855 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
857 // Populate the Start chapter Dropdown
\r
858 drop_chapterStart.Items.Clear();
\r
859 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
860 if (drop_chapterStart.Items.Count > 0)
\r
861 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
863 // Populate the Final Chapter Dropdown
\r
864 drop_chapterFinish.Items.Clear();
\r
865 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
866 if (drop_chapterFinish.Items.Count > 0)
\r
867 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
869 // Populate the Audio Channels Dropdown
\r
870 drp_track1Audio.Items.Clear();
\r
871 drp_track1Audio.Items.Add("Automatic");
\r
872 drp_track1Audio.Items.Add("None");
\r
873 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
874 drp_track1Audio.SelectedIndex = 0;
\r
876 // Populate the Subtitles dropdown
\r
877 drp_subtitle.Items.Clear();
\r
878 drp_subtitle.Items.Add("None");
\r
879 drp_subtitle.Items.Add("Autoselect");
\r
880 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
881 if (drp_subtitle.Items.Count > 0)
\r
882 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
886 // Run the autoName & chapterNaming functions
\r
887 if (Properties.Settings.Default.autoNaming == "Checked")
\r
889 string autoPath = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
890 if (autoPath != null)
\r
891 text_destination.Text = autoPath;
\r
893 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
896 data_chpt.Rows.Clear();
\r
897 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
898 if (chapterGridView != null)
\r
899 data_chpt = chapterGridView;
\r
901 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
902 data_chpt.Columns[0].Width = 166;
\r
903 data_chpt.Columns[0].Width = 165;
\r
905 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
907 int c_start, c_end;
\r
909 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
910 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
912 int.TryParse(drop_chapterStart.Text, out c_start);
\r
913 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
917 if (c_start > c_end)
\r
918 drop_chapterFinish.Text = c_start.ToString();
\r
921 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
923 // Run the Autonaming function
\r
924 if (Properties.Settings.Default.autoNaming == "Checked")
\r
925 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
928 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
930 int c_start, c_end;
\r
932 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
933 drop_chapterStart.SelectedIndex = 1;
\r
935 int.TryParse(drop_chapterStart.Text, out c_start);
\r
936 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
940 if (c_end < c_start)
\r
941 drop_chapterFinish.Text = c_start.ToString();
\r
944 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
946 // Run the Autonaming function
\r
947 if (Properties.Settings.Default.autoNaming == "Checked")
\r
948 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
950 // Add more rows to the Chapter menu if needed.
\r
951 if (Check_ChapterMarkers.Checked)
\r
953 int i = data_chpt.Rows.Count, finish = 0;
\r
955 if (drop_chapterFinish.Text != "Auto")
\r
956 int.TryParse(drop_chapterFinish.Text, out finish);
\r
960 int n = data_chpt.Rows.Add();
\r
961 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
962 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
963 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
964 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
971 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
973 // This removes the file extension from the filename box on the save file dialog.
\r
974 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
975 DVD_Save.FileName = Path.GetFileNameWithoutExtension(text_destination.Text);
\r
977 if (Path.IsPathRooted(text_destination.Text))
\r
978 DVD_Save.InitialDirectory = Path.GetDirectoryName(text_destination.Text);
\r
980 // Show the dialog and set the main form file path
\r
981 if (drop_format.SelectedIndex.Equals(0))
\r
982 DVD_Save.FilterIndex = 1;
\r
983 else if (drop_format.SelectedIndex.Equals(1))
\r
984 DVD_Save.FilterIndex = 2;
\r
985 else if (drop_format.SelectedIndex.Equals(2))
\r
986 DVD_Save.FilterIndex = 3;
\r
988 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
990 if (DVD_Save.FileName.StartsWith("\\"))
\r
991 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
994 // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames
\r
995 switch (DVD_Save.FilterIndex)
\r
998 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))
\r
999 DVD_Save.FileName += ".mp4";
\r
1002 if (!Path.GetExtension(DVD_Save.FileName).Equals(".m4v", StringComparison.InvariantCultureIgnoreCase))
\r
1003 DVD_Save.FileName += ".m4v";
\r
1006 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))
\r
1007 DVD_Save.FileName += ".mkv";
\r
1013 text_destination.Text = DVD_Save.FileName;
\r
1015 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
1016 if (Check_ChapterMarkers.Checked)
\r
1017 drop_format.SelectedIndex = 1;
\r
1021 private void text_destination_TextChanged(object sender, EventArgs e)
\r
1023 string path = text_destination.Text;
\r
1024 if (path.EndsWith(".mp4"))
\r
1025 drop_format.SelectedIndex = 0;
\r
1026 else if (path.EndsWith(".m4v"))
\r
1027 drop_format.SelectedIndex = 1;
\r
1028 else if (path.EndsWith(".mkv"))
\r
1029 drop_format.SelectedIndex = 2;
\r
1032 // Output Settings
\r
1033 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
1035 if (drop_format.SelectedIndex == 0)
\r
1036 setExtension(".mp4");
\r
1037 else if (drop_format.SelectedIndex == 1)
\r
1038 setExtension(".m4v");
\r
1039 else if (drop_format.SelectedIndex == 2)
\r
1040 setExtension(".mkv");
\r
1042 setAudioByContainer(drop_format.Text);
\r
1043 setVideoByContainer(drop_format.Text);
\r
1045 private void setExtension(string newExtension)
\r
1047 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1048 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1049 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1053 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1055 setContainerOpts();
\r
1057 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1058 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1060 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1061 check_turbo.Enabled = true;
\r
1063 h264Tab.Enabled = true;
\r
1064 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
1065 check_iPodAtom.Enabled = true;
\r
1067 check_iPodAtom.Enabled = false;
\r
1071 check_turbo.CheckState = CheckState.Unchecked;
\r
1072 check_turbo.Enabled = false;
\r
1073 h264Tab.Enabled = false;
\r
1074 x264Panel.x264Query = "";
\r
1075 check_iPodAtom.Enabled = false;
\r
1076 check_iPodAtom.Checked = false;
\r
1079 // Setup the CQ Slider
\r
1080 switch (drp_videoEncoder.Text)
\r
1082 case "MPEG-4 (FFmpeg)":
\r
1083 slider_videoQuality.Minimum = 1;
\r
1084 slider_videoQuality.Maximum = 31;
\r
1085 slider_videoQuality.Value = 1;
\r
1086 SliderValue.Text = "0% QP: 31.00";
\r
1088 case "H.264 (x264)":
\r
1089 slider_videoQuality.Minimum = 0;
\r
1090 slider_videoQuality.Value = 0;
\r
1091 slider_videoQuality.TickFrequency = 1;
\r
1092 SliderValue.Text = "0% RF: 51.00";
\r
1093 String step = Properties.Settings.Default.x264cqstep;
\r
1097 slider_videoQuality.Maximum = 255;
\r
1100 slider_videoQuality.Maximum = 204;
\r
1103 slider_videoQuality.Maximum = 155;
\r
1106 slider_videoQuality.Maximum = 102;
\r
1109 slider_videoQuality.Maximum = 51;
\r
1112 slider_videoQuality.Maximum = 51;
\r
1116 case "VP3 (Theora)":
\r
1117 slider_videoQuality.Minimum = 0;
\r
1118 slider_videoQuality.Maximum = 63;
\r
1119 slider_videoQuality.Value = 0;
\r
1120 SliderValue.Text = "0% QP: 0.00";
\r
1126 /// Set the container format options
\r
1128 public void setContainerOpts()
\r
1130 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1132 check_largeFile.Enabled = true;
\r
1133 check_optimiseMP4.Enabled = true;
\r
1134 check_iPodAtom.Enabled = true;
\r
1138 check_largeFile.Enabled = false;
\r
1139 check_optimiseMP4.Enabled = false;
\r
1140 check_iPodAtom.Enabled = false;
\r
1141 check_largeFile.Checked = false;
\r
1142 check_optimiseMP4.Checked = false;
\r
1143 check_iPodAtom.Checked = false;
\r
1146 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1148 switch (drp_videoEncoder.Text)
\r
1150 case "MPEG-4 (FFmpeg)":
\r
1151 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1152 double max = slider_videoQuality.Maximum;
\r
1153 double min = slider_videoQuality.Minimum;
\r
1154 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1155 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1157 case "H.264 (x264)":
\r
1159 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1160 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1161 System.Globalization.NumberStyles.Number,
\r
1164 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1165 max = slider_videoQuality.Maximum * divided;
\r
1166 min = slider_videoQuality.Minimum;
\r
1167 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1168 rfValue = Math.Round(rfValue, 2);
\r
1169 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1171 case "VP3 (Theora)":
\r
1172 rfValue = slider_videoQuality.Value;
\r
1173 double value = rfValue / 63;
\r
1174 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1178 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1180 text_bitrate.Enabled = false;
\r
1181 text_filesize.Enabled = true;
\r
1182 slider_videoQuality.Enabled = false;
\r
1184 check_2PassEncode.Enabled = true;
\r
1186 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1188 text_bitrate.Enabled = true;
\r
1189 text_filesize.Enabled = false;
\r
1190 slider_videoQuality.Enabled = false;
\r
1192 check_2PassEncode.Enabled = true;
\r
1194 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1196 text_bitrate.Enabled = false;
\r
1197 text_filesize.Enabled = false;
\r
1198 slider_videoQuality.Enabled = true;
\r
1200 check_2PassEncode.Enabled = false;
\r
1201 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1203 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1205 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1207 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1208 check_turbo.Enabled = true;
\r
1212 check_turbo.Enabled = false;
\r
1213 check_turbo.CheckState = CheckState.Unchecked;
\r
1218 private void text_width_TextChanged(object sender, EventArgs e)
\r
1220 if (text_width.Text == "")
\r
1221 text_width.BackColor = Color.White;
\r
1223 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
1224 lbl_max.Text = "";
\r
1227 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1230 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1232 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1234 if (drp_anamorphic.Text == "None")
\r
1236 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1238 text_height.Text = height.ToString();
\r
1243 private void text_height_TextChanged(object sender, EventArgs e)
\r
1245 if (text_height.Text == "")
\r
1246 text_height.BackColor = Color.White;
\r
1248 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1249 if (maxWidth != 0)
\r
1250 lbl_max.Text = "Max Width";
\r
1252 lbl_max.Text = "";
\r
1255 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1257 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1259 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1261 text_left.Enabled = true;
\r
1262 text_right.Enabled = true;
\r
1263 text_top.Enabled = true;
\r
1264 text_bottom.Enabled = true;
\r
1265 if (selectedTitle != null)
\r
1267 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1268 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1269 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1270 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1274 text_left.Text = "0";
\r
1275 text_right.Text = "0";
\r
1276 text_top.Text = "0";
\r
1277 text_bottom.Text = "0";
\r
1280 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1282 text_left.Enabled = false;
\r
1283 text_right.Enabled = false;
\r
1284 text_top.Enabled = false;
\r
1285 text_bottom.Enabled = false;
\r
1287 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1289 if (drp_anamorphic.SelectedIndex == 1)
\r
1291 text_height.BackColor = Color.LightGray;
\r
1292 text_width.BackColor = Color.LightGray;
\r
1293 text_height.Text = "";
\r
1294 text_width.Text = "";
\r
1295 text_height.Enabled = false;
\r
1296 text_width.Enabled = false;
\r
1299 if (drp_anamorphic.SelectedIndex == 2)
\r
1301 text_height.Text = "";
\r
1302 text_height.Enabled = false;
\r
1303 text_height.BackColor = Color.LightGray;
\r
1305 text_width.Enabled = true;
\r
1306 text_width.BackColor = Color.White;
\r
1309 if (drp_anamorphic.SelectedIndex == 0)
\r
1311 text_height.BackColor = Color.White;
\r
1312 text_width.BackColor = Color.White;
\r
1313 text_height.Enabled = true;
\r
1314 text_width.Enabled = true;
\r
1319 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1321 if (ctl_decomb.getDropValue != "Off")
\r
1322 if (ctl_deinterlace.getDropValue != "None")
\r
1323 ctl_deinterlace.setOption("None");
\r
1325 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1327 if (ctl_detelecine.getDropValue != "None")
\r
1328 if (ctl_decomb.getDropValue != "Off")
\r
1329 ctl_decomb.setOption("Off");
\r
1331 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1333 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1337 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1339 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1341 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1342 lv_audioList.Select();
\r
1345 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1347 if (drp_audenc_1.Text == "AC3")
\r
1349 drp_audmix_1.Enabled = false;
\r
1350 drp_audbit_1.Enabled = false;
\r
1351 drp_audsr_1.Enabled = false;
\r
1353 drp_audmix_1.SelectedIndex = 0;
\r
1354 drp_audbit_1.SelectedIndex = 0;
\r
1355 drp_audsr_1.SelectedIndex = 0;
\r
1359 drp_audmix_1.Enabled = true;
\r
1360 drp_audbit_1.Enabled = true;
\r
1361 drp_audsr_1.Enabled = true;
\r
1363 drp_audmix_1.Text = "Automatic";
\r
1364 drp_audbit_1.Text = "160";
\r
1365 drp_audsr_1.Text = "Auto";
\r
1368 if (drp_audenc_1.Text == "AAC")
\r
1370 setMixDownAllOptions(drp_audmix_1);
\r
1371 setBitrateSelections160(drp_audbit_1);
\r
1375 setMixDownNotAAC(drp_audmix_1);
\r
1376 setBitrateSelections320(drp_audbit_1);
\r
1379 // Update an item in the Audio list if required.
\r
1380 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1382 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1383 lv_audioList.Select();
\r
1386 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1388 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1389 setBitrateSelections384(drp_audbit_1);
\r
1390 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1391 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\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[2].Text = drp_audmix_1.Text;
\r
1397 lv_audioList.Select();
\r
1400 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1402 // Update an item in the Audio list if required.
\r
1403 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1405 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1406 lv_audioList.Select();
\r
1409 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1411 // Update an item in the Audio list if required.
\r
1412 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1414 if (drp_audenc_1.Text == "AC3")
\r
1415 drp_audbit_1.Text = "Auto";
\r
1416 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1417 lv_audioList.Select();
\r
1420 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1423 if (tb_drc.Value == 0) value = 0;
\r
1425 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1427 lbl_drc.Text = value.ToString();
\r
1429 // Update an item in the Audio list if required.
\r
1430 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1432 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1433 lv_audioList.Select();
\r
1437 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1439 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1440 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1441 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1442 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1443 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1444 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1445 newTrack.SubItems.Add(lbl_drc.Text);
\r
1447 // Select the newly added track and select the control
\r
1448 lv_audioList.Items.Add(newTrack);
\r
1449 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1450 lv_audioList.Select();
\r
1452 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1454 removeAudioTrack();
\r
1456 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1458 if (lv_audioList.SelectedIndices.Count != 0)
\r
1460 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1461 int index = item.Index;
\r
1464 if (lv_audioList.Items.Count > index && index >= 0)
\r
1466 lv_audioList.Items.Remove(item);
\r
1467 lv_audioList.Items.Insert(index, item);
\r
1468 item.Selected = true;
\r
1469 lv_audioList.Focus();
\r
1473 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1475 if (lv_audioList.SelectedIndices.Count != 0)
\r
1477 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1478 int index = item.Index;
\r
1481 if (index < lv_audioList.Items.Count)
\r
1483 lv_audioList.Items.Remove(item);
\r
1484 lv_audioList.Items.Insert(index, item);
\r
1485 item.Selected = true;
\r
1486 lv_audioList.Focus();
\r
1491 private void audioList_remove_Click(object sender, EventArgs e)
\r
1493 removeAudioTrack();
\r
1495 private void removeAudioTrack()
\r
1497 // Remove the Item and reselect the control if the following conditions are met.
\r
1498 if (lv_audioList.SelectedItems.Count != 0)
\r
1500 // Record the current selected index.
\r
1501 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1503 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1505 // Now reslect the correct item and give focus to the audio list.
\r
1506 if (lv_audioList.Items.Count != 0)
\r
1508 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1509 lv_audioList.Items[currentPosition].Selected = true;
\r
1510 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1511 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1513 lv_audioList.Select();
\r
1517 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1519 // Set the dropdown controls based on the selected item in the Audio List.
\r
1520 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1522 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1523 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1524 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1525 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1526 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1527 double drcValue; int drcCalculated;
\r
1528 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1529 if (drcValue == 0) drcCalculated = 0;
\r
1531 drcValue = ((drcValue * 10) + 1) - 10;
\r
1532 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1533 tb_drc.Value = drcCalculated;
\r
1537 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1539 if (drp_subtitle.Text.Contains("None"))
\r
1541 check_forced.Enabled = false;
\r
1542 check_forced.Checked = false;
\r
1545 check_forced.Enabled = true;
\r
1548 // Chapter Marker Tab
\r
1549 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1551 if (Check_ChapterMarkers.Checked)
\r
1553 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1554 data_chpt.Rows.Clear();
\r
1555 data_chpt.Enabled = true;
\r
1556 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1557 if (chapterGridView != null)
\r
1558 data_chpt = chapterGridView;
\r
1562 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1563 data_chpt.Rows.Clear();
\r
1564 data_chpt.Enabled = false;
\r
1568 // Query Editor Tab
\r
1569 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1571 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1573 private void btn_clear_Click(object sender, EventArgs e)
\r
1575 rtf_query.Clear();
\r
1579 // MainWindow Components, Actions and Functions ***********************
\r
1581 #region Source Scan
\r
1582 private void setupGUIforScan(String filename)
\r
1584 text_source.Text = filename;
\r
1586 foreach (Control ctrl in Controls)
\r
1588 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1589 ctrl.Enabled = false;
\r
1591 lbl_encode.Visible = true;
\r
1592 lbl_encode.Text = "Scanning ...";
\r
1593 gb_source.Text = "Source: Scanning ...";
\r
1594 btn_source.Enabled = false;
\r
1595 btn_start.Enabled = false;
\r
1596 btn_showQueue.Enabled = false;
\r
1597 btn_add2Queue.Enabled = false;
\r
1598 tb_preview.Enabled = false;
\r
1599 mnu_killCLI.Visible = true;
\r
1601 private void startScan(String filename)
\r
1605 lbl_encode.Visible = true;
\r
1606 lbl_encode.Text = "Scanning...";
\r
1607 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1609 catch (Exception exc)
\r
1611 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1614 private void scanProcess(object state)
\r
1618 string inputFile = (string)state;
\r
1619 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1620 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1622 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1623 if (File.Exists(dvdInfoPath))
\r
1624 File.Delete(dvdInfoPath);
\r
1626 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1628 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
\r
1630 using (hbproc = Process.Start(hbParseDvd))
\r
1632 hbproc.WaitForExit();
\r
1635 if (!File.Exists(dvdInfoPath))
\r
1637 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1640 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1642 thisDVD = Parsing.DVD.Parse(sr);
\r
1647 updateUIafterScan();
\r
1649 catch (Exception exc)
\r
1651 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1655 private void updateUIafterScan()
\r
1659 if (InvokeRequired)
\r
1661 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1665 // Setup some GUI components
\r
1666 drp_dvdtitle.Items.Clear();
\r
1667 if (thisDVD.Titles.Count != 0)
\r
1668 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1669 drp_dvdtitle.Text = "Automatic";
\r
1670 drop_chapterFinish.Text = "Auto";
\r
1671 drop_chapterStart.Text = "Auto";
\r
1673 // Now select the longest title
\r
1674 if (thisDVD.Titles.Count != 0)
\r
1675 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1677 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1678 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1679 Check_ChapterMarkers.Enabled = true;
\r
1682 Check_ChapterMarkers.Enabled = false;
\r
1683 Check_ChapterMarkers.Checked = false;
\r
1684 data_chpt.Rows.Clear();
\r
1687 // If no titles were found, Display an error message
\r
1688 if (drp_dvdtitle.Items.Count == 0)
\r
1689 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
1691 // Enable the GUI components and enable any disabled components
\r
1694 catch (Exception exc)
\r
1696 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1701 private void enableGUI()
\r
1705 if (InvokeRequired)
\r
1707 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1709 lbl_encode.Text = "Scan Completed";
\r
1710 gb_source.Text = "Source";
\r
1711 foreach (Control ctrl in Controls)
\r
1712 ctrl.Enabled = true;
\r
1713 btn_start.Enabled = true;
\r
1714 btn_showQueue.Enabled = true;
\r
1715 btn_add2Queue.Enabled = true;
\r
1716 tb_preview.Enabled = true;
\r
1717 btn_source.Enabled = true;
\r
1718 mnu_killCLI.Visible = false;
\r
1720 catch (Exception exc)
\r
1722 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1725 private static void killCLI()
\r
1727 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1728 // hbproc.kill/close just won't do the trick.
\r
1731 string AppName = "HandBrakeCLI";
\r
1733 AppName = AppName.ToUpper();
\r
1735 Process[] prs = Process.GetProcesses();
\r
1736 foreach (Process proces in prs)
\r
1738 if (proces.ProcessName.ToUpper() == AppName)
\r
1741 if (!proces.HasExited)
\r
1746 catch (Exception ex)
\r
1748 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
1755 /// Set the GUI to it's finished encoding state.
\r
1757 private void setEncodeFinished()
\r
1761 if (InvokeRequired)
\r
1763 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1767 lbl_encode.Text = "Encoding Finished";
\r
1768 btn_start.Text = "Start";
\r
1769 btn_start.ToolTipText = "Start the encoding process";
\r
1770 btn_start.Image = Properties.Resources.Play;
\r
1772 // If the window is minimized, display the notification in a popup.
\r
1773 if (FormWindowState.Minimized == this.WindowState)
\r
1775 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1776 notifyIcon.ShowBalloonTip(500);
\r
1779 catch (Exception exc)
\r
1781 MessageBox.Show(exc.ToString());
\r
1786 /// Set the GUI to it's started encoding state.
\r
1788 private void setEncodeStarted()
\r
1792 if (InvokeRequired)
\r
1794 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1798 lbl_encode.Visible = true;
\r
1799 lbl_encode.Text = "Encoding in Progress";
\r
1800 btn_start.Text = "Stop";
\r
1801 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
1802 btn_start.Image = Properties.Resources.stop;
\r
1804 catch (Exception exc)
\r
1806 MessageBox.Show(exc.ToString());
\r
1811 #region DVD Drive Detection
\r
1812 // Source Button Drive Detection
\r
1813 private delegate void ProgressUpdateHandler();
\r
1814 private void getDriveInfoThread()
\r
1818 if (InvokeRequired)
\r
1820 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1824 Boolean foundDrive = false;
\r
1825 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1826 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1828 if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
\r
1830 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1832 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1833 foundDrive = true;
\r
1839 if (foundDrive == false)
\r
1840 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1844 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1849 #region Audio Panel Code Helpers
\r
1850 private void setAudioByContainer(String path)
\r
1852 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1854 string oldval = drp_audenc_1.Text;
\r
1855 drp_audenc_1.Items.Clear();
\r
1856 drp_audenc_1.Items.Add("AAC");
\r
1857 drp_audenc_1.Items.Add("AC3");
\r
1858 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1859 drp_audenc_1.SelectedIndex = 0;
\r
1862 else if (path.Contains("MKV"))
\r
1864 drp_audenc_1.Items.Clear();
\r
1865 drp_audenc_1.Items.Add("AAC");
\r
1866 drp_audenc_1.Items.Add("MP3");
\r
1867 drp_audenc_1.Items.Add("AC3");
\r
1868 drp_audenc_1.Items.Add("Vorbis");
\r
1869 if (drp_audenc_1.Text == string.Empty)
\r
1870 drp_audenc_1.SelectedIndex = 0;
\r
1873 // Make sure the table is updated with new audio codecs
\r
1874 foreach (ListViewItem row in lv_audioList.Items)
\r
1876 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1877 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1880 private void setVideoByContainer(String path)
\r
1884 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1886 oldval = drp_videoEncoder.Text;
\r
1887 drp_videoEncoder.Items.Clear();
\r
1888 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1889 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1890 if (oldval == "VP3 (Theora)")
\r
1891 drp_videoEncoder.SelectedIndex = 1;
\r
1893 drp_videoEncoder.Text = oldval;
\r
1896 else if (path.Contains("MKV"))
\r
1898 oldval = drp_videoEncoder.Text;
\r
1899 drp_videoEncoder.Items.Clear();
\r
1900 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1901 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1902 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1903 drp_videoEncoder.Text = oldval;
\r
1906 private static void setBitrateSelections384(ComboBox dropDown)
\r
1908 dropDown.Items.Clear();
\r
1909 dropDown.Items.Add("32");
\r
1910 dropDown.Items.Add("40");
\r
1911 dropDown.Items.Add("48");
\r
1912 dropDown.Items.Add("56");
\r
1913 dropDown.Items.Add("64");
\r
1914 dropDown.Items.Add("80");
\r
1915 dropDown.Items.Add("86");
\r
1916 dropDown.Items.Add("112");
\r
1917 dropDown.Items.Add("128");
\r
1918 dropDown.Items.Add("160");
\r
1919 dropDown.Items.Add("192");
\r
1920 dropDown.Items.Add("224");
\r
1921 dropDown.Items.Add("256");
\r
1922 dropDown.Items.Add("320");
\r
1923 dropDown.Items.Add("384");
\r
1925 private static void setBitrateSelections320(ComboBox dropDown)
\r
1927 dropDown.Items.Clear();
\r
1928 dropDown.Items.Add("32");
\r
1929 dropDown.Items.Add("40");
\r
1930 dropDown.Items.Add("48");
\r
1931 dropDown.Items.Add("56");
\r
1932 dropDown.Items.Add("64");
\r
1933 dropDown.Items.Add("80");
\r
1934 dropDown.Items.Add("86");
\r
1935 dropDown.Items.Add("112");
\r
1936 dropDown.Items.Add("128");
\r
1937 dropDown.Items.Add("160");
\r
1938 dropDown.Items.Add("192");
\r
1939 dropDown.Items.Add("224");
\r
1940 dropDown.Items.Add("256");
\r
1941 dropDown.Items.Add("320");
\r
1943 private static void setBitrateSelections160(ComboBox dropDown)
\r
1945 dropDown.Items.Clear();
\r
1946 dropDown.Items.Add("32");
\r
1947 dropDown.Items.Add("40");
\r
1948 dropDown.Items.Add("48");
\r
1949 dropDown.Items.Add("56");
\r
1950 dropDown.Items.Add("64");
\r
1951 dropDown.Items.Add("80");
\r
1952 dropDown.Items.Add("86");
\r
1953 dropDown.Items.Add("112");
\r
1954 dropDown.Items.Add("128");
\r
1955 dropDown.Items.Add("160");
\r
1957 private static void setMixDownAllOptions(ComboBox dropdown)
\r
1959 dropdown.Items.Clear();
\r
1960 dropdown.Items.Add("Automatic");
\r
1961 dropdown.Items.Add("Mono");
\r
1962 dropdown.Items.Add("Stereo");
\r
1963 dropdown.Items.Add("Dolby Surround");
\r
1964 dropdown.Items.Add("Dolby Pro Logic II");
\r
1965 dropdown.Items.Add("6 Channel Discrete");
\r
1967 private static void setMixDownNotAAC(ComboBox dropdown)
\r
1969 dropdown.Items.Clear();
\r
1970 dropdown.Items.Add("Automatic");
\r
1971 dropdown.Items.Add("Stereo");
\r
1972 dropdown.Items.Add("Dolby Surround");
\r
1973 dropdown.Items.Add("Dolby Pro Logic II");
\r
1977 #region Public Methods
\r
1979 /// Reload the preset panel display
\r
1981 public void loadPresetPanel()
\r
1983 presetHandler.loadPresetData();
\r
1984 treeView_presets.Nodes.Clear();
\r
1986 TreeNode preset_treeview;
\r
1987 TreeNode rootNode = new TreeNode();
\r
1988 TreeNode rootNodeTwo = new TreeNode();
\r
1989 TreeNode childNode;
\r
1990 int workingLevel = 0;
\r
1991 string previousCategory = String.Empty, currentCategory = String.Empty;
\r
1993 List<Preset> presetNameList = presetHandler.getBuildInPresets();
\r
1994 if (presetNameList.Count != 0)
\r
1996 foreach (Preset preset in presetNameList)
\r
1998 // Handle Root Nodes
\r
2000 // First Case - No presets have been read yet so setup the root category
\r
2001 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2003 rootNode = new TreeNode(preset.Category);
\r
2004 workingLevel = preset.Level;
\r
2005 currentCategory = preset.Category;
\r
2006 previousCategory = preset.Category;
\r
2009 // Second Case - This is the first sub child node.
\r
2010 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2012 rootNodeTwo = new TreeNode(preset.Category);
\r
2013 workingLevel = preset.Level;
\r
2014 currentCategory = preset.Category;
\r
2015 rootNode.Nodes.Add(rootNodeTwo);
\r
2018 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2019 if (preset.Level == 1 && workingLevel == 2)
\r
2021 workingLevel = preset.Level;
\r
2022 currentCategory = preset.Category;
\r
2025 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2026 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2028 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2030 rootNode = new TreeNode(preset.Category);
\r
2031 workingLevel = preset.Level;
\r
2032 currentCategory = preset.Category;
\r
2033 previousCategory = preset.Category;
\r
2036 // Handle Child Nodes
\r
2037 // Add First level child nodes to the current root node
\r
2038 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2040 childNode = new TreeNode(preset.Name);
\r
2041 rootNode.Nodes.Add(childNode);
\r
2044 // Add Second level child nodes to the current sub root node
\r
2045 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2047 childNode = new TreeNode(preset.Name);
\r
2048 rootNodeTwo.Nodes.Add(childNode);
\r
2052 // Add the final root node which does not get added above.
\r
2053 treeView_presets.Nodes.Add(rootNode);
\r
2057 List<string> presetNames = presetHandler.getUserPresetNames();
\r
2058 foreach (string preset in presetNames)
\r
2060 preset_treeview = new TreeNode(preset) { ForeColor = Color.Black };
\r
2062 // Now Fill Out List View with Items
\r
2063 treeView_presets.Nodes.Add(preset_treeview);
\r
2070 /// If the queue is being processed, prompt the user to confirm application close.
\r
2072 /// <param name="e"></param>
\r
2073 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2075 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2076 if ((encodeQueue.isEncoding) && (!encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
2078 DialogResult result = MessageBox.Show("HandBrake has queue items to process. Closing HandBrake will not stop the current encoding, but will stop processing the queue.\n\nDo you want to close HandBrake?",
\r
2079 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2080 if (result == DialogResult.No)
\r
2083 base.OnFormClosing(e);
\r
2086 // This is the END of the road ------------------------------------------------------------------------------
\r