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
20 public partial class frmMain : Form
\r
22 // Objects which may be used by one or more other objects
\r
23 private delegate void UpdateWindowHandler();
\r
24 Main hb_common_func = new Main();
\r
25 Encode encodeHandler = new Encode();
\r
26 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
27 PresetsHandler presetHandler = new PresetsHandler();
\r
28 Parsing.Title selectedTitle;
\r
29 Parsing.DVD thisDVD;
\r
31 // Objects belonging to this window only
\r
32 PresetLoader presetLoader = new PresetLoader();
\r
33 QueryGenerator queryGen = new QueryGenerator();
\r
35 // Globals: Mainly used for tracking.
\r
36 private frmQueue queueWindow;
\r
37 private frmPreview qtpreview;
\r
38 private string lastAction;
\r
39 public int maxWidth;
\r
40 public int maxHeight;
\r
43 // Applicaiton Startup ************************************************
\r
45 #region Application Startup
\r
49 // Load the splash screen in this thread
\r
50 Form splash = new frmSplashScreen();
\r
53 //Create a label that can be updated from the parent thread.
\r
54 Label lblStatus = new Label {Size = new Size(250, 20), Location = new Point(10, 280)};
\r
55 splash.Controls.Add(lblStatus);
\r
56 InitializeComponent();
\r
58 // Update the users config file with the CLI version data.
\r
59 lblStatus.Text = "Setting Version Data ...";
\r
60 Application.DoEvents();
\r
61 ArrayList x = hb_common_func.getCliVersionData();
\r
62 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
63 Properties.Settings.Default.hb_version = x[0].ToString();
\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 // update the status
\r
71 if (Properties.Settings.Default.updateStatus == "Checked")
\r
73 lblStatus.Text = "Checking for updates ...";
\r
74 Application.DoEvents();
\r
75 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
76 updateCheckThread.Start();
\r
79 // Setup the GUI components
\r
80 lblStatus.Text = "Setting up the GUI ...";
\r
81 Application.DoEvents();
\r
82 x264Panel.reset2Defaults(); // Initialize all the x264 widgets to their default values
\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 // 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 / Finish / Pause
\r
190 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
191 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
192 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
194 // Handle a file being draged onto the GUI.
\r
195 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
196 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
199 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
201 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
202 e.Effect = DragDropEffects.All;
\r
204 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
206 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
207 if (fileList != null)
\r
209 if (fileList[0].StartsWith("\\"))
\r
210 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
213 if (fileList[0] != "")
\r
215 setupGUIforScan(fileList[0]);
\r
216 startScan(fileList[0]);
\r
219 text_source.Text = "Click 'Source' to continue";
\r
223 private void encodeStarted(object sender, EventArgs e)
\r
225 setLastAction("encode");
\r
226 setEncodeStarted();
\r
228 private void encodeEnded(object sender, EventArgs e)
\r
230 setEncodeFinished();
\r
232 private void encodePaused(object sender, EventArgs e)
\r
234 setEncodeFinished();
\r
238 // User Interface Menus / Tool Strips *********************************
\r
241 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
245 private void mnu_exit_Click(object sender, EventArgs e)
\r
247 Application.Exit();
\r
252 private void mnu_encode_Click(object sender, EventArgs e)
\r
254 queueWindow.Show();
\r
256 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
259 file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
261 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
262 dvdInfoWindow.Show();
\r
264 private void mnu_options_Click(object sender, EventArgs e)
\r
266 Form Options = new frmOptions();
\r
267 Options.ShowDialog();
\r
271 #region Presets Menu
\r
272 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
274 presetHandler.updateBuiltInPresets();
\r
276 if (treeView_presets.Nodes.Count == 0)
\r
277 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
279 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
281 treeView_presets.ExpandAll();
\r
283 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
285 // Empty the preset file
\r
286 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
287 if (File.Exists(presetsFile))
\r
288 File.Delete(presetsFile);
\r
292 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
296 catch (Exception exc)
\r
298 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
301 // Reload the preset panel
\r
304 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
306 loadNormalPreset();
\r
308 private void btn_new_preset_Click(object sender, EventArgs e)
\r
310 // Remember each nodes expanded status so we can reload it
\r
311 List<Boolean> nodeStatus = saveTreeViewState();
\r
312 nodeStatus.Add(true);
\r
314 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
315 preset.ShowDialog();
\r
317 // Now reload the TreeView states
\r
318 loadTreeViewStates(nodeStatus);
\r
323 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
325 Process.Start("http://forum.handbrake.fr/");
\r
327 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
329 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
331 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
333 Process.Start("http://handbrake.fr");
\r
335 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
337 Boolean update = hb_common_func.updateCheck(true);
\r
340 frmUpdater updateWindow = new frmUpdater();
\r
341 updateWindow.Show();
\r
344 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
346 private void mnu_about_Click(object sender, EventArgs e)
\r
348 Form About = new frmAbout();
\r
349 About.ShowDialog();
\r
354 private void mnu_qptest_Click(object sender, EventArgs e)
\r
356 QueryParserTester qptest = new QueryParserTester();
\r
362 // Right Click Menu Code
\r
363 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
365 treeView_presets.ExpandAll();
\r
367 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
369 treeView_presets.CollapseAll();
\r
371 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
373 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
374 if (result == DialogResult.Yes)
\r
375 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
376 else if (result == DialogResult.No)
\r
377 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
379 private void pmnu_delete_click(object sender, EventArgs e)
\r
381 if (treeView_presets.SelectedNode != null)
\r
383 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
385 // Remember each nodes expanded status so we can reload it
\r
386 List<Boolean> nodeStatus = saveTreeViewState();
\r
388 // Now reload the preset panel
\r
391 // Now reload the TreeView states
\r
392 loadTreeViewStates(nodeStatus);
\r
394 treeView_presets.Select();
\r
396 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
398 // Make sure that the save menu is always disabled by default
\r
399 pmnu_saveChanges.Enabled = false;
\r
401 // Now enable the save menu if the selected preset is a user preset
\r
402 if (treeView_presets.SelectedNode != null)
\r
404 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
406 pmnu_saveChanges.Enabled = true;
\r
409 treeView_presets.Select();
\r
412 // Presets Management
\r
413 private void btn_addPreset_Click(object sender, EventArgs e)
\r
415 // Remember each nodes expanded status so we can reload it
\r
416 List<Boolean> nodeStatus = saveTreeViewState();
\r
417 nodeStatus.Add(true);
\r
419 // Now add the new preset
\r
420 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
421 preset.ShowDialog();
\r
423 // Now reload the TreeView states
\r
424 loadTreeViewStates(nodeStatus);
\r
426 private void btn_removePreset_Click(object sender, EventArgs e)
\r
428 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
429 if (result == DialogResult.Yes)
\r
431 if (treeView_presets.SelectedNode != null)
\r
432 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
434 // Remember each nodes expanded status so we can reload it
\r
435 List<Boolean> nodeStatus = saveTreeViewState();
\r
437 // Now reload the preset panel
\r
440 // Now reload the TreeView states
\r
441 loadTreeViewStates(nodeStatus);
\r
443 treeView_presets.Select();
\r
445 private void btn_setDefault_Click(object sender, EventArgs e)
\r
447 if (treeView_presets.SelectedNode != null)
\r
449 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
450 if (result == DialogResult.Yes)
\r
452 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
453 Properties.Settings.Default.Save();
\r
454 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
458 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
460 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
462 if (e.Button == MouseButtons.Right)
\r
463 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
464 else if (e.Button == MouseButtons.Left)
\r
466 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
468 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
473 treeView_presets.Select();
\r
475 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
479 private void selectPreset()
\r
481 if (treeView_presets.SelectedNode != null)
\r
483 // Ok, so, we've selected a preset. Now we want to load it.
\r
484 string presetName = treeView_presets.SelectedNode.Text;
\r
485 if (presetHandler.getPreset(presetName) != null)
\r
487 string query = presetHandler.getPreset(presetName).Query;
\r
488 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
492 //Ok, Reset all the H264 widgets before changing the preset
\r
493 x264Panel.reset2Defaults();
\r
495 // Send the query from the file to the Query Parser class
\r
496 QueryParser presetQuery = QueryParser.Parse(query);
\r
498 // Now load the preset
\r
499 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
501 // The x264 widgets will need updated, so do this now:
\r
502 x264Panel.X264_StandardizeOptString();
\r
503 x264Panel.X264_SetCurrentSettingsInPanel();
\r
505 if (maxWidth != 0 && maxHeight != 0)
\r
506 lbl_max.Text = "Max Width / Height";
\r
507 else if (maxWidth != 0)
\r
508 lbl_max.Text = "Max Width";
\r
515 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
517 if (e.KeyCode == Keys.Delete)
\r
519 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
520 if (result == DialogResult.Yes)
\r
522 if (treeView_presets.SelectedNode != null)
\r
523 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
525 // Remember each nodes expanded status so we can reload it
\r
526 List<Boolean> nodeStatus = new List<Boolean>();
\r
527 foreach (TreeNode node in treeView_presets.Nodes)
\r
528 nodeStatus.Add(node.IsExpanded);
\r
530 // Now reload the preset panel
\r
533 // And finally, re-expand any of the nodes if required
\r
535 foreach (TreeNode node in treeView_presets.Nodes)
\r
545 private List<Boolean> saveTreeViewState()
\r
547 // Remember each nodes expanded status so we can reload it
\r
548 List<Boolean> nodeStatus = new List<Boolean>();
\r
549 foreach (TreeNode node in treeView_presets.Nodes)
\r
551 nodeStatus.Add(node.IsExpanded);
\r
552 foreach (TreeNode subNode in node.Nodes)
\r
553 nodeStatus.Add(node.IsExpanded);
\r
557 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
559 // And finally, re-expand any of the nodes if required
\r
561 foreach (TreeNode node in treeView_presets.Nodes)
\r
566 foreach (TreeNode subNode in node.Nodes)
\r
575 private void loadNormalPreset()
\r
577 treeView_presets.Nodes.Find("Normal", true);
\r
579 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
581 foreach (TreeNode node in treenode.Nodes)
\r
583 if (node.Text.Equals("Normal"))
\r
584 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
591 private void btn_source_Click(object sender, EventArgs e)
\r
593 if (Properties.Settings.Default.drive_detection == "Checked")
\r
595 mnu_dvd_drive.Visible = true;
\r
596 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
597 driveInfoThread.Start();
\r
600 mnu_dvd_drive.Visible = false;
\r
602 private void btn_start_Click(object sender, EventArgs e)
\r
604 if (btn_start.Text == "Stop")
\r
606 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
608 if (result == DialogResult.Yes)
\r
611 encodeQueue.pauseEncode();
\r
613 // Kill the current process.
\r
614 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
615 Process HandBrakeCLI;
\r
616 if (aProc.Length > 0)
\r
618 HandBrakeCLI = aProc[0];
\r
619 HandBrakeCLI.Kill();
\r
623 setEncodeFinished();
\r
628 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
630 // Set the last action to encode.
\r
631 // This is used for tracking which file to load in the activity window
\r
632 lastAction = "encode";
\r
634 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
636 if (encodeQueue.count() == 0)
\r
638 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
639 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
641 queueWindow.setQueue();
\r
642 if (encodeQueue.count() > 1)
\r
643 queueWindow.Show(false);
\r
645 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
646 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
649 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
650 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
654 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
656 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
657 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
660 String query = queryGen.GenerateTheQuery(this);
\r
661 if (rtf_query.Text != "")
\r
662 query = rtf_query.Text;
\r
665 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
667 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
668 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
669 if (result == DialogResult.Yes)
\r
670 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
674 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
676 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
677 queueWindow.Show();
\r
680 private void btn_showQueue_Click(object sender, EventArgs e)
\r
682 queueWindow.Show();
\r
684 private void tb_preview_Click(object sender, EventArgs e)
\r
686 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
687 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
690 if (qtpreview == null)
\r
692 qtpreview = new frmPreview(this);
\r
695 else if (qtpreview.IsDisposed)
\r
697 qtpreview = new frmPreview(this);
\r
701 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
704 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
706 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
708 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
709 ActivityWindow.Show();
\r
713 #region System Tray Icon
\r
714 private void frmMain_Resize(object sender, EventArgs e)
\r
716 if (FormWindowState.Minimized == this.WindowState)
\r
718 notifyIcon.Visible = true;
\r
719 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
720 notifyIcon.ShowBalloonTip(500);
\r
723 else if (FormWindowState.Normal == this.WindowState)
\r
724 notifyIcon.Visible = false;
\r
726 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
728 this.Visible = true;
\r
730 this.WindowState = FormWindowState.Normal;
\r
731 notifyIcon.Visible = false;
\r
733 private void btn_restore_Click(object sender, EventArgs e)
\r
735 this.Visible = true;
\r
737 this.WindowState = FormWindowState.Normal;
\r
738 notifyIcon.Visible = false;
\r
742 #region Tab Control
\r
745 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
747 // Enable the creation of chapter markers.
\r
748 Check_ChapterMarkers.Enabled = true;
\r
750 // Set the last action to scan.
\r
751 // This is used for tracking which file to load in the activity window
\r
752 lastAction = "scan";
\r
753 text_source.Text = "";
\r
755 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
757 String filename = DVD_Open.SelectedPath;
\r
759 if (filename.StartsWith("\\"))
\r
760 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 if (Path.HasExtension(text_destination.Text))
\r
976 DVD_Save.FileName = Path.Combine(Path.GetDirectoryName(text_destination.Text), Path.GetFileNameWithoutExtension(text_destination.Text));
\r
978 // Show the dialog and set the main form file path
\r
979 if (drop_format.SelectedIndex.Equals(0))
\r
980 DVD_Save.FilterIndex = 1;
\r
981 else if (drop_format.SelectedIndex.Equals(1))
\r
982 DVD_Save.FilterIndex = 2;
\r
983 else if (drop_format.SelectedIndex.Equals(2))
\r
984 DVD_Save.FilterIndex = 3;
\r
985 else if (drop_format.SelectedIndex.Equals(3))
\r
986 DVD_Save.FilterIndex = 4;
\r
987 else if (drop_format.SelectedIndex.Equals(4))
\r
988 DVD_Save.FilterIndex = 5;
\r
990 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
992 if (DVD_Save.FileName.StartsWith("\\"))
\r
993 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
996 setAudioByContainer(DVD_Save.FileName);
\r
997 text_destination.Text = DVD_Save.FileName;
\r
999 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
1000 if (Check_ChapterMarkers.Checked)
\r
1001 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
1005 private void text_destination_TextChanged(object sender, EventArgs e)
\r
1007 string path = text_destination.Text;
\r
1008 if (path.EndsWith(".mp4"))
\r
1009 drop_format.SelectedIndex = 0;
\r
1010 else if (path.EndsWith(".m4v"))
\r
1011 drop_format.SelectedIndex = 1;
\r
1012 else if (path.EndsWith(".mkv"))
\r
1013 drop_format.SelectedIndex = 2;
\r
1014 else if (path.EndsWith(".avi"))
\r
1015 drop_format.SelectedIndex = 3;
\r
1016 else if (path.EndsWith(".ogm"))
\r
1017 drop_format.SelectedIndex = 4;
\r
1021 // Output Settings
\r
1022 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
1024 if (drop_format.SelectedIndex == 0)
\r
1025 setExtension(".mp4");
\r
1026 else if (drop_format.SelectedIndex == 1)
\r
1027 setExtension(".m4v");
\r
1028 else if (drop_format.SelectedIndex == 2)
\r
1029 setExtension(".mkv");
\r
1030 else if (drop_format.SelectedIndex == 3)
\r
1031 setExtension(".avi");
\r
1032 else if (drop_format.SelectedIndex == 4)
\r
1033 setExtension(".ogm");
\r
1035 setAudioByContainer(drop_format.Text);
\r
1036 setVideoByContainer(drop_format.Text);
\r
1038 private void setExtension(string newExtension)
\r
1040 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1041 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1042 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1043 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1044 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1048 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1050 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1052 check_largeFile.Enabled = true;
\r
1053 check_optimiseMP4.Enabled = true;
\r
1054 check_iPodAtom.Enabled = true;
\r
1058 check_largeFile.Enabled = false;
\r
1059 check_optimiseMP4.Enabled = false;
\r
1060 check_iPodAtom.Enabled = false;
\r
1061 check_largeFile.Checked = false;
\r
1062 check_optimiseMP4.Checked = false;
\r
1063 check_iPodAtom.Checked = false;
\r
1066 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1067 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1069 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1070 check_turbo.Enabled = true;
\r
1072 h264Tab.Enabled = true;
\r
1073 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1074 check_iPodAtom.Enabled = true;
\r
1076 check_iPodAtom.Enabled = false;
\r
1080 check_turbo.CheckState = CheckState.Unchecked;
\r
1081 check_turbo.Enabled = false;
\r
1082 h264Tab.Enabled = false;
\r
1083 x264Panel.x264Query = "";
\r
1084 check_iPodAtom.Enabled = false;
\r
1085 check_iPodAtom.Checked = false;
\r
1088 // Setup the CQ Slider
\r
1089 switch (drp_videoEncoder.Text)
\r
1091 case "MPEG-4 (FFmpeg)":
\r
1092 slider_videoQuality.Minimum = 1;
\r
1093 slider_videoQuality.Maximum = 31;
\r
1094 slider_videoQuality.Value = 1;
\r
1095 SliderValue.Text = "0% QP: 31.00";
\r
1097 case "MPEG-4 (XviD)":
\r
1098 slider_videoQuality.Minimum = 1;
\r
1099 slider_videoQuality.Maximum = 31;
\r
1100 slider_videoQuality.Value = 1;
\r
1101 SliderValue.Text = "0% QP: 31.00";
\r
1103 case "H.264 (x264)":
\r
1104 slider_videoQuality.Minimum = 0;
\r
1105 slider_videoQuality.Value = 0;
\r
1106 slider_videoQuality.TickFrequency = 1;
\r
1107 SliderValue.Text = "0% RF: 51.00";
\r
1108 String step = Properties.Settings.Default.x264cqstep;
\r
1112 slider_videoQuality.Maximum = 255;
\r
1115 slider_videoQuality.Maximum = 204;
\r
1118 slider_videoQuality.Maximum = 155;
\r
1121 slider_videoQuality.Maximum = 102;
\r
1124 slider_videoQuality.Maximum = 51;
\r
1127 slider_videoQuality.Maximum = 51;
\r
1131 case "VP3 (Theora)":
\r
1132 slider_videoQuality.Minimum = 0;
\r
1133 slider_videoQuality.Maximum = 63;
\r
1134 slider_videoQuality.Value = 0;
\r
1135 SliderValue.Text = "0% QP: 0.00";
\r
1139 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1141 switch (drp_videoEncoder.Text)
\r
1143 case "MPEG-4 (FFmpeg)":
\r
1144 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1145 double max = slider_videoQuality.Maximum;
\r
1146 double min = slider_videoQuality.Minimum;
\r
1147 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1148 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1150 case "MPEG-4 (XviD)":
\r
1151 rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1152 max = slider_videoQuality.Maximum;
\r
1153 min = slider_videoQuality.Minimum;
\r
1154 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)
\r
1629 {WindowStyle = ProcessWindowStyle.Hidden};
\r
1631 using (hbproc = Process.Start(hbParseDvd))
\r
1633 hbproc.WaitForExit();
\r
1636 if (!File.Exists(dvdInfoPath))
\r
1638 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1641 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1643 thisDVD = Parsing.DVD.Parse(sr);
\r
1648 updateUIafterScan();
\r
1650 catch (Exception exc)
\r
1652 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1656 private void updateUIafterScan()
\r
1660 if (InvokeRequired)
\r
1662 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1666 // Setup some GUI components
\r
1667 drp_dvdtitle.Items.Clear();
\r
1668 if (thisDVD.Titles.Count != 0)
\r
1669 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1670 drp_dvdtitle.Text = "Automatic";
\r
1671 drop_chapterFinish.Text = "Auto";
\r
1672 drop_chapterStart.Text = "Auto";
\r
1674 // Now select the longest title
\r
1675 if (thisDVD.Titles.Count != 0)
\r
1676 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1678 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1679 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1680 Check_ChapterMarkers.Enabled = true;
\r
1683 Check_ChapterMarkers.Enabled = false;
\r
1684 Check_ChapterMarkers.Checked = false;
\r
1685 data_chpt.Rows.Clear();
\r
1688 // If no titles were found, Display an error message
\r
1689 if (drp_dvdtitle.Items.Count == 0)
\r
1690 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
1692 // Enable the GUI components and enable any disabled components
\r
1695 catch (Exception exc)
\r
1697 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1702 private void enableGUI()
\r
1706 if (InvokeRequired)
\r
1708 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1710 lbl_encode.Text = "Scan Completed";
\r
1711 gb_source.Text = "Source";
\r
1712 foreach (Control ctrl in Controls)
\r
1713 ctrl.Enabled = true;
\r
1714 btn_start.Enabled = true;
\r
1715 btn_showQueue.Enabled = true;
\r
1716 btn_add2Queue.Enabled = true;
\r
1717 tb_preview.Enabled = true;
\r
1718 btn_source.Enabled = true;
\r
1719 mnu_killCLI.Visible = false;
\r
1721 catch (Exception exc)
\r
1723 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1726 private static void killCLI()
\r
1728 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1729 // hbproc.kill/close just won't do the trick.
\r
1732 string AppName = "HandBrakeCLI";
\r
1734 AppName = AppName.ToUpper();
\r
1736 Process[] prs = Process.GetProcesses();
\r
1737 foreach (Process proces in prs)
\r
1739 if (proces.ProcessName.ToUpper() == AppName)
\r
1742 if (!proces.HasExited)
\r
1747 catch (Exception ex)
\r
1749 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
1754 #region DVD Drive Detection
\r
1755 // Source Button Drive Detection
\r
1756 private delegate void ProgressUpdateHandler();
\r
1757 private void getDriveInfoThread()
\r
1761 if (InvokeRequired)
\r
1763 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1767 Boolean foundDrive = false;
\r
1768 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1769 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1771 if (curDrive.DriveType == DriveType.CDRom)
\r
1773 if (curDrive.IsReady)
\r
1775 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1777 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1778 foundDrive = true;
\r
1786 if (foundDrive == false)
\r
1787 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1791 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1796 #region Audio Panel Code Helpers
\r
1797 private void setAudioByContainer(String path)
\r
1801 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1803 oldval = drp_audenc_1.Text;
\r
1804 drp_audenc_1.Items.Clear();
\r
1805 drp_audenc_1.Items.Add("AAC");
\r
1806 drp_audenc_1.Items.Add("AC3");
\r
1807 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1808 drp_audenc_1.SelectedIndex = 0;
\r
1811 else if (path.Contains("AVI"))
\r
1813 oldval = drp_audenc_1.Text;
\r
1814 drp_audenc_1.Items.Clear();
\r
1815 drp_audenc_1.Items.Add("MP3");
\r
1816 drp_audenc_1.Items.Add("AC3");
\r
1817 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1818 drp_audenc_1.SelectedIndex = 0;
\r
1821 else if (path.Contains("OGM"))
\r
1823 drp_audenc_1.Items.Clear();
\r
1824 drp_audenc_1.Items.Add("Vorbis");
\r
1825 drp_audenc_1.SelectedIndex = 0;
\r
1828 else if (path.Contains("MKV"))
\r
1830 drp_audenc_1.Items.Clear();
\r
1831 drp_audenc_1.Items.Add("AAC");
\r
1832 drp_audenc_1.Items.Add("MP3");
\r
1833 drp_audenc_1.Items.Add("AC3");
\r
1834 drp_audenc_1.Items.Add("Vorbis");
\r
1835 if (drp_audenc_1.Text == string.Empty)
\r
1836 drp_audenc_1.SelectedIndex = 0;
\r
1839 // Make sure the table is updated with new audio codecs
\r
1840 foreach (ListViewItem row in lv_audioList.Items)
\r
1842 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1843 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1846 private void setVideoByContainer(String path)
\r
1850 if ((path.Contains("MP3")) || (path.Contains("M4V")))
\r
1852 oldval = drp_videoEncoder.Text;
\r
1853 drp_videoEncoder.Items.Clear();
\r
1854 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1855 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1856 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1857 if (oldval == "VP3 (Theora)")
\r
1858 drp_videoEncoder.SelectedIndex = 2;
\r
1860 drp_videoEncoder.Text = oldval;
\r
1863 else if (path.Contains("AVI"))
\r
1865 oldval = drp_videoEncoder.Text;
\r
1866 drp_videoEncoder.Items.Clear();
\r
1867 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1868 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1869 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1870 if (oldval == "VP3 (Theora)")
\r
1871 drp_videoEncoder.SelectedIndex = 2;
\r
1873 drp_videoEncoder.Text = oldval;
\r
1875 else if (path.Contains("OGM"))
\r
1877 oldval = drp_videoEncoder.Text;
\r
1878 drp_videoEncoder.Items.Clear();
\r
1879 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1880 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1881 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1882 if (oldval == "H.264 (x264)")
\r
1883 drp_videoEncoder.SelectedIndex = 2;
\r
1885 drp_videoEncoder.Text = oldval;
\r
1887 else if (path.Contains("MKV"))
\r
1889 oldval = drp_videoEncoder.Text;
\r
1890 drp_videoEncoder.Items.Clear();
\r
1891 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1892 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1893 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1894 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1895 drp_videoEncoder.Text = oldval;
\r
1898 private static void setBitrateSelections384(ComboBox dropDown)
\r
1900 dropDown.Items.Clear();
\r
1901 dropDown.Items.Add("32");
\r
1902 dropDown.Items.Add("40");
\r
1903 dropDown.Items.Add("48");
\r
1904 dropDown.Items.Add("56");
\r
1905 dropDown.Items.Add("64");
\r
1906 dropDown.Items.Add("80");
\r
1907 dropDown.Items.Add("86");
\r
1908 dropDown.Items.Add("112");
\r
1909 dropDown.Items.Add("128");
\r
1910 dropDown.Items.Add("160");
\r
1911 dropDown.Items.Add("192");
\r
1912 dropDown.Items.Add("224");
\r
1913 dropDown.Items.Add("256");
\r
1914 dropDown.Items.Add("320");
\r
1915 dropDown.Items.Add("384");
\r
1917 private static void setBitrateSelections320(ComboBox dropDown)
\r
1919 dropDown.Items.Clear();
\r
1920 dropDown.Items.Add("32");
\r
1921 dropDown.Items.Add("40");
\r
1922 dropDown.Items.Add("48");
\r
1923 dropDown.Items.Add("56");
\r
1924 dropDown.Items.Add("64");
\r
1925 dropDown.Items.Add("80");
\r
1926 dropDown.Items.Add("86");
\r
1927 dropDown.Items.Add("112");
\r
1928 dropDown.Items.Add("128");
\r
1929 dropDown.Items.Add("160");
\r
1930 dropDown.Items.Add("192");
\r
1931 dropDown.Items.Add("224");
\r
1932 dropDown.Items.Add("256");
\r
1933 dropDown.Items.Add("320");
\r
1935 private static void setBitrateSelections160(ComboBox dropDown)
\r
1937 dropDown.Items.Clear();
\r
1938 dropDown.Items.Add("32");
\r
1939 dropDown.Items.Add("40");
\r
1940 dropDown.Items.Add("48");
\r
1941 dropDown.Items.Add("56");
\r
1942 dropDown.Items.Add("64");
\r
1943 dropDown.Items.Add("80");
\r
1944 dropDown.Items.Add("86");
\r
1945 dropDown.Items.Add("112");
\r
1946 dropDown.Items.Add("128");
\r
1947 dropDown.Items.Add("160");
\r
1949 private static void setMixDownAllOptions(ComboBox dropdown)
\r
1951 dropdown.Items.Clear();
\r
1952 dropdown.Items.Add("Automatic");
\r
1953 dropdown.Items.Add("Mono");
\r
1954 dropdown.Items.Add("Stereo");
\r
1955 dropdown.Items.Add("Dolby Surround");
\r
1956 dropdown.Items.Add("Dolby Pro Logic II");
\r
1957 dropdown.Items.Add("6 Channel Discrete");
\r
1959 private static void setMixDownNotAAC(ComboBox dropdown)
\r
1961 dropdown.Items.Clear();
\r
1962 dropdown.Items.Add("Automatic");
\r
1963 dropdown.Items.Add("Stereo");
\r
1964 dropdown.Items.Add("Dolby Surround");
\r
1965 dropdown.Items.Add("Dolby Pro Logic II");
\r
1969 #region Public Methods
\r
1972 /// Setup the GUI for Encoding or finished Encoding.
\r
1973 /// 1 = Encode Running
\r
1974 /// 0 = Encode Finished.
\r
1976 public void setEncodeFinished()
\r
1980 if (InvokeRequired)
\r
1982 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1986 lbl_encode.Text = "Encoding Finished";
\r
1987 btn_start.Text = "Start";
\r
1988 btn_start.ToolTipText = "Start the encoding process";
\r
1989 btn_start.Image = Properties.Resources.Play;
\r
1991 // If the window is minimized, display the notification in a popup.
\r
1992 if (FormWindowState.Minimized == this.WindowState)
\r
1994 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1995 notifyIcon.ShowBalloonTip(500);
\r
1998 catch (Exception exc)
\r
2000 MessageBox.Show(exc.ToString());
\r
2003 public void setEncodeStarted()
\r
2007 if (InvokeRequired)
\r
2009 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
2013 lbl_encode.Visible = true;
\r
2014 lbl_encode.Text = "Encoding in Progress";
\r
2015 btn_start.Text = "Stop";
\r
2016 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
2017 btn_start.Image = Properties.Resources.stop;
\r
2019 catch (Exception exc)
\r
2021 MessageBox.Show(exc.ToString());
\r
2026 /// Action can be "encode" or "scan"
\r
2027 /// Set the last action varible in the main window.
\r
2028 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
2030 /// <param name="last">String</param>
\r
2031 public void setLastAction(string last)
\r
2033 this.lastAction = last;
\r
2037 /// DVD parseing. Pass in a parsed DVD.
\r
2039 /// <param name="dvd"></param>
\r
2040 public void setStreamReader(Parsing.DVD dvd)
\r
2042 this.thisDVD = dvd;
\r
2046 /// Reload the preset panel display
\r
2048 public void loadPresetPanel()
\r
2050 presetHandler.loadPresetData();
\r
2051 treeView_presets.Nodes.Clear();
\r
2053 TreeNode preset_treeview;
\r
2054 TreeNode rootNode = new TreeNode();
\r
2055 TreeNode rootNodeTwo = new TreeNode();
\r
2056 TreeNode childNode;
\r
2057 int workingLevel = 0;
\r
2058 string previousCategory = String.Empty, currentCategory = String.Empty;
\r
2060 List<Preset> presetNameList = presetHandler.getBuildInPresets();
\r
2061 if (presetNameList.Count != 0)
\r
2063 foreach (Preset preset in presetNameList)
\r
2065 // Handle Root Nodes
\r
2067 // First Case - No presets have been read yet so setup the root category
\r
2068 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2070 rootNode = new TreeNode(preset.Category);
\r
2071 workingLevel = preset.Level;
\r
2072 currentCategory = preset.Category;
\r
2073 previousCategory = preset.Category;
\r
2076 // Second Case - This is the first sub child node.
\r
2077 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2079 rootNodeTwo = new TreeNode(preset.Category);
\r
2080 workingLevel = preset.Level;
\r
2081 currentCategory = preset.Category;
\r
2082 rootNode.Nodes.Add(rootNodeTwo);
\r
2085 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2086 if (preset.Level == 1 && workingLevel == 2)
\r
2088 workingLevel = preset.Level;
\r
2089 currentCategory = preset.Category;
\r
2092 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2093 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2095 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2097 rootNode = new TreeNode(preset.Category);
\r
2098 workingLevel = preset.Level;
\r
2099 currentCategory = preset.Category;
\r
2100 previousCategory = preset.Category;
\r
2103 // Handle Child Nodes
\r
2104 // Add First level child nodes to the current root node
\r
2105 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2107 childNode = new TreeNode(preset.Name);
\r
2108 rootNode.Nodes.Add(childNode);
\r
2111 // Add Second level child nodes to the current sub root node
\r
2112 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2114 childNode = new TreeNode(preset.Name);
\r
2115 rootNodeTwo.Nodes.Add(childNode);
\r
2119 // Add the final root node which does not get added above.
\r
2120 treeView_presets.Nodes.Add(rootNode);
\r
2124 List<string> presetNames = presetHandler.getUserPresetNames();
\r
2125 foreach (string preset in presetNames)
\r
2127 preset_treeview = new TreeNode(preset) {ForeColor = Color.Black};
\r
2129 // Now Fill Out List View with Items
\r
2130 treeView_presets.Nodes.Add(preset_treeview);
\r
2138 /// If the queue is being processed, prompt the user to confirm application close.
\r
2140 /// <param name="e"></param>
\r
2141 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2143 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2144 if ((encodeQueue.isEncoding) && (!encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
2146 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
2147 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2148 if (result == DialogResult.No)
\r
2151 base.OnFormClosing(e);
\r
2154 // This is the END of the road ------------------------------------------------------------------------------
\r