3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.Functions;
\r
19 public partial class frmMain : Form
\r
21 // Objects which may be used by one or more other objects
\r
22 private delegate void UpdateWindowHandler();
\r
23 Main hb_common_func = new Main();
\r
24 Encode encodeHandler = new Encode();
\r
25 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
26 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
27 Parsing.Title selectedTitle;
\r
28 Parsing.DVD thisDVD;
\r
30 // Objects belonging to this window only
\r
31 PresetLoader presetLoader = new PresetLoader();
\r
32 QueryGenerator queryGen = new QueryGenerator();
\r
34 // Globals: Mainly used for tracking.
\r
35 private frmQueue queueWindow;
\r
36 private frmPreview qtpreview;
\r
37 private string lastAction;
\r
38 public int maxWidth;
\r
39 public int maxHeight;
\r
42 // Applicaiton Startup ************************************************
\r
44 #region Application Startup
\r
48 // Load the splash screen in this thread
\r
49 Form splash = new frmSplashScreen();
\r
52 //Create a label that can be updated from the parent thread.
\r
53 Label lblStatus = new Label();
\r
54 lblStatus.Size = new Size(250, 20);
\r
55 lblStatus.Location = new Point(10, 280);
\r
56 splash.Controls.Add(lblStatus);
\r
57 InitializeComponent();
\r
59 // Update the users config file with the CLI version data.
\r
60 lblStatus.Text = "Setting Version Data ...";
\r
61 Application.DoEvents();
\r
62 ArrayList x = hb_common_func.getCliVersionData();
\r
63 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
64 Properties.Settings.Default.hb_version = x[0].ToString();
\r
66 // show the form, but leave disabled until preloading is complete then show the main form
\r
67 this.Enabled = false;
\r
69 Application.DoEvents(); // Forces frmMain to draw
\r
71 // update the status
\r
72 if (Properties.Settings.Default.updateStatus == "Checked")
\r
74 lblStatus.Text = "Checking for updates ...";
\r
75 Application.DoEvents();
\r
76 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
77 updateCheckThread.Start();
\r
80 // Setup the GUI components
\r
81 lblStatus.Text = "Setting up the GUI ...";
\r
82 Application.DoEvents();
\r
83 x264Panel.reset2Defaults(); // Initialize all the x264 widgets to their default values
\r
84 loadPresetPanel(); // Load the Preset Panel
\r
85 treeView_presets.ExpandAll();
\r
86 lbl_encode.Text = "";
\r
87 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
88 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
89 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
91 // Load the user's default settings or Normal Preset
\r
92 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
94 // Ok, so, we've selected a preset. Now we want to load it.
\r
95 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
97 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
98 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
102 //Ok, Reset all the H264 widgets before changing the preset
\r
103 x264Panel.reset2Defaults();
\r
105 // Send the query from the file to the Query Parser class, then load the preset
\r
106 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
107 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
109 // The x264 widgets will need updated, so do this now:
\r
110 x264Panel.X264_StandardizeOptString();
\r
111 x264Panel.X264_SetCurrentSettingsInPanel();
\r
115 loadNormalPreset();
\r
118 loadNormalPreset();
\r
120 // Enabled GUI tooltip's if Required
\r
121 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
123 x264Panel.setToolTipActive(true);
\r
124 ToolTip.Active = true;
\r
128 lblStatus.Text = "Loading Complete!";
\r
129 Application.DoEvents();
\r
132 this.Enabled = true;
\r
141 // Startup Functions
\r
142 private delegate void updateStatusChanger();
\r
143 private void startupUpdateCheck()
\r
147 if (InvokeRequired)
\r
149 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
153 Boolean update = hb_common_func.updateCheck(false);
\r
156 frmUpdater updateWindow = new frmUpdater();
\r
157 updateWindow.Show();
\r
160 catch (Exception) { /* Do Nothing*/ }
\r
162 private void queueRecovery()
\r
164 if (hb_common_func.check_queue_recovery())
\r
166 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
168 if (result == DialogResult.Yes)
\r
169 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
172 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
173 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
174 if (File.Exists(queuePath))
\r
175 File.Delete(queuePath);
\r
182 // Encoding Events for setting up the GUI
\r
183 private void events()
\r
185 // Handle Window Resize
\r
186 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
187 this.Resize += new EventHandler(frmMain_Resize);
\r
189 // Handle Encode Start
\r
190 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
191 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
192 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
194 private void encodeStarted(object sender, EventArgs e)
\r
196 setLastAction("encode");
\r
197 setEncodeStarted();
\r
199 private void encodeEnded(object sender, EventArgs e)
\r
201 setEncodeFinished();
\r
203 private void encodePaused(object sender, EventArgs e)
\r
205 setEncodeFinished();
\r
209 // User Interface Menus / Tool Strips *********************************
\r
212 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
216 private void mnu_exit_Click(object sender, EventArgs e)
\r
218 Application.Exit();
\r
223 private void mnu_encode_Click(object sender, EventArgs e)
\r
225 queueWindow.Show();
\r
227 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
230 if (lastAction == "scan")
\r
231 file = "dvdinfo.dat";
\r
233 file = "hb_encode_log.dat";
\r
235 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
236 dvdInfoWindow.Show();
\r
238 private void mnu_options_Click(object sender, EventArgs e)
\r
240 Form Options = new frmOptions();
\r
241 Options.ShowDialog();
\r
245 #region Presets Menu
\r
246 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
248 presetHandler.updateBuiltInPresets();
\r
250 if (treeView_presets.Nodes.Count == 0)
\r
251 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
253 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
255 treeView_presets.ExpandAll();
\r
257 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
259 // Empty the preset file
\r
260 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
261 if (File.Exists(presetsFile))
\r
262 File.Delete(presetsFile);
\r
266 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
270 catch (Exception exc)
\r
272 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
275 // Reload the preset panel
\r
278 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
280 loadNormalPreset();
\r
282 private void btn_new_preset_Click(object sender, EventArgs e)
\r
284 // Remember each nodes expanded status so we can reload it
\r
285 List<Boolean> nodeStatus = saveTreeViewState();
\r
286 nodeStatus.Add(true);
\r
288 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
289 preset.ShowDialog();
\r
291 // Now reload the TreeView states
\r
292 loadTreeViewStates(nodeStatus);
\r
297 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
299 Process.Start("http://forum.handbrake.fr/");
\r
301 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
303 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
305 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
307 Process.Start("http://handbrake.fr");
\r
309 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
311 Boolean update = hb_common_func.updateCheck(true);
\r
312 if (update == true)
\r
314 frmUpdater updateWindow = new frmUpdater();
\r
315 updateWindow.Show();
\r
318 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
320 private void mnu_about_Click(object sender, EventArgs e)
\r
322 Form About = new frmAbout();
\r
323 About.ShowDialog();
\r
328 private void mnu_qptest_Click(object sender, EventArgs e)
\r
330 QueryParserTester qptest = new QueryParserTester();
\r
336 // Right Click Menu Code
\r
337 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
339 treeView_presets.ExpandAll();
\r
341 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
343 treeView_presets.CollapseAll();
\r
345 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
347 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
348 if (result == DialogResult.Yes)
\r
349 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
350 else if (result == DialogResult.No)
\r
351 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
353 private void pmnu_delete_click(object sender, EventArgs e)
\r
355 if (treeView_presets.SelectedNode != null)
\r
357 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
359 // Remember each nodes expanded status so we can reload it
\r
360 List<Boolean> nodeStatus = saveTreeViewState();
\r
362 // Now reload the preset panel
\r
365 // Now reload the TreeView states
\r
366 loadTreeViewStates(nodeStatus);
\r
368 treeView_presets.Select();
\r
370 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
372 // Make sure that the save menu is always disabled by default
\r
373 pmnu_saveChanges.Enabled = false;
\r
375 // Now enable the save menu if the selected preset is a user preset
\r
376 if (treeView_presets.SelectedNode != null)
\r
378 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
380 pmnu_saveChanges.Enabled = true;
\r
383 treeView_presets.Select();
\r
386 // Presets Management
\r
387 private void btn_addPreset_Click(object sender, EventArgs e)
\r
389 // Remember each nodes expanded status so we can reload it
\r
390 List<Boolean> nodeStatus = saveTreeViewState();
\r
391 nodeStatus.Add(true);
\r
393 // Now add the new preset
\r
394 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
395 preset.ShowDialog();
\r
397 // Now reload the TreeView states
\r
398 loadTreeViewStates(nodeStatus);
\r
400 private void btn_removePreset_Click(object sender, EventArgs e)
\r
402 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
403 if (result == DialogResult.Yes)
\r
405 if (treeView_presets.SelectedNode != null)
\r
406 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
408 // Remember each nodes expanded status so we can reload it
\r
409 List<Boolean> nodeStatus = saveTreeViewState();
\r
411 // Now reload the preset panel
\r
414 // Now reload the TreeView states
\r
415 loadTreeViewStates(nodeStatus);
\r
417 treeView_presets.Select();
\r
419 private void btn_setDefault_Click(object sender, EventArgs e)
\r
421 if (treeView_presets.SelectedNode != null)
\r
423 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
424 if (result == DialogResult.Yes)
\r
426 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
427 Properties.Settings.Default.Save();
\r
428 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
432 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
434 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
436 if (e.Button == MouseButtons.Right)
\r
437 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
438 else if (e.Button == MouseButtons.Left)
\r
440 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
442 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
447 treeView_presets.Select();
\r
449 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
453 private void selectPreset()
\r
455 if (treeView_presets.SelectedNode != null)
\r
457 // Ok, so, we've selected a preset. Now we want to load it.
\r
458 string presetName = treeView_presets.SelectedNode.Text;
\r
459 if (presetHandler.getPreset(presetName) != null)
\r
461 string query = presetHandler.getPreset(presetName).Query;
\r
462 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
466 //Ok, Reset all the H264 widgets before changing the preset
\r
467 x264Panel.reset2Defaults();
\r
469 // Send the query from the file to the Query Parser class
\r
470 Functions.QueryParser presetQuery = QueryParser.Parse(query);
\r
472 // Now load the preset
\r
473 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
475 // The x264 widgets will need updated, so do this now:
\r
476 x264Panel.X264_StandardizeOptString();
\r
477 x264Panel.X264_SetCurrentSettingsInPanel();
\r
479 if (maxWidth != 0 && maxHeight != 0)
\r
480 lbl_max.Text = "Max Width / Height";
\r
481 else if (maxWidth != 0)
\r
482 lbl_max.Text = "Max Width";
\r
489 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
491 if (e.KeyCode == Keys.Delete)
\r
493 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
494 if (result == DialogResult.Yes)
\r
496 if (treeView_presets.SelectedNode != null)
\r
497 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
499 // Remember each nodes expanded status so we can reload it
\r
500 List<Boolean> nodeStatus = new List<Boolean>();
\r
501 foreach (TreeNode node in treeView_presets.Nodes)
\r
502 nodeStatus.Add(node.IsExpanded);
\r
504 // Now reload the preset panel
\r
507 // And finally, re-expand any of the nodes if required
\r
509 foreach (TreeNode node in treeView_presets.Nodes)
\r
519 private List<Boolean> saveTreeViewState()
\r
521 // Remember each nodes expanded status so we can reload it
\r
522 List<Boolean> nodeStatus = new List<Boolean>();
\r
523 foreach (TreeNode node in treeView_presets.Nodes)
\r
525 nodeStatus.Add(node.IsExpanded);
\r
526 foreach (TreeNode subNode in node.Nodes)
\r
527 nodeStatus.Add(node.IsExpanded);
\r
531 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
533 // And finally, re-expand any of the nodes if required
\r
535 foreach (TreeNode node in treeView_presets.Nodes)
\r
540 foreach (TreeNode subNode in node.Nodes)
\r
549 private void loadNormalPreset()
\r
551 treeView_presets.Nodes.Find("Normal", true);
\r
553 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
555 foreach (TreeNode node in treenode.Nodes)
\r
557 if (node.Text.Equals("Normal"))
\r
558 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
565 private void btn_source_Click(object sender, EventArgs e)
\r
567 if (Properties.Settings.Default.drive_detection == "Checked")
\r
569 mnu_dvd_drive.Visible = true;
\r
570 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
571 driveInfoThread.Start();
\r
574 mnu_dvd_drive.Visible = false;
\r
576 private void btn_start_Click(object sender, EventArgs e)
\r
578 if (btn_start.Text == "Stop")
\r
580 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
582 if (result == DialogResult.Yes)
\r
585 encodeQueue.pauseEncode();
\r
587 // Kill the current process.
\r
588 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
589 Process HandBrakeCLI;
\r
590 if (aProc.Length > 0)
\r
592 HandBrakeCLI = aProc[0];
\r
593 HandBrakeCLI.Kill();
\r
597 setEncodeFinished();
\r
602 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
604 // Set the last action to encode.
\r
605 // This is used for tracking which file to load in the activity window
\r
606 lastAction = "encode";
\r
608 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
610 if (encodeQueue.count() == 0)
\r
612 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
613 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
615 queueWindow.setQueue();
\r
616 if (encodeQueue.count() > 1)
\r
617 queueWindow.Show(false);
\r
619 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
620 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
623 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
624 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
628 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
630 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
631 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
634 String query = queryGen.GenerateTheQuery(this);
\r
635 if (rtf_query.Text != "")
\r
636 query = rtf_query.Text;
\r
639 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
641 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
642 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
643 if (result == DialogResult.Yes)
\r
644 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
647 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
649 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
650 queueWindow.Show();
\r
653 private void btn_showQueue_Click(object sender, EventArgs e)
\r
655 queueWindow.Show();
\r
657 private void tb_preview_Click(object sender, EventArgs e)
\r
659 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
660 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
663 if (qtpreview == null)
\r
665 qtpreview = new frmPreview(this);
\r
668 else if (qtpreview.IsDisposed)
\r
670 qtpreview = new frmPreview(this);
\r
674 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
677 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
679 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
681 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
682 ActivityWindow.Show();
\r
686 #region System Tray Icon
\r
687 private void frmMain_Resize(object sender, EventArgs e)
\r
689 if (FormWindowState.Minimized == this.WindowState)
\r
691 notifyIcon.Visible = true;
\r
692 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
693 notifyIcon.ShowBalloonTip(500);
\r
696 else if (FormWindowState.Normal == this.WindowState)
\r
697 notifyIcon.Visible = false;
\r
699 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
701 this.Visible = true;
\r
703 this.WindowState = FormWindowState.Normal;
\r
704 notifyIcon.Visible = false;
\r
706 private void btn_restore_Click(object sender, EventArgs e)
\r
708 this.Visible = true;
\r
710 this.WindowState = FormWindowState.Normal;
\r
711 notifyIcon.Visible = false;
\r
715 #region Tab Control
\r
718 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
720 // Enable the creation of chapter markers.
\r
721 Check_ChapterMarkers.Enabled = true;
\r
723 // Set the last action to scan.
\r
724 // This is used for tracking which file to load in the activity window
\r
725 lastAction = "scan";
\r
726 text_source.Text = "";
\r
728 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
730 String filename = DVD_Open.SelectedPath;
\r
732 if (filename.StartsWith("\\"))
\r
733 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
737 if (filename != "")
\r
739 setupGUIforScan(filename);
\r
740 startScan(filename);
\r
743 text_source.Text = "Click 'Source' to continue";
\r
747 text_source.Text = "Click 'Source' to continue";
\r
749 private void btn_file_source_Click(object sender, EventArgs e)
\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 (ISO_Open.ShowDialog() == DialogResult.OK)
\r
758 String filename = ISO_Open.FileName;
\r
759 if (filename.StartsWith("\\"))
\r
761 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
762 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
765 if (filename != "")
\r
767 setupGUIforScan(filename);
\r
768 startScan(filename);
\r
771 text_source.Text = "Click 'Source' to continue";
\r
775 text_source.Text = "Click 'Source' to continue";
\r
777 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
779 // Enable the creation of chapter markers.
\r
780 Check_ChapterMarkers.Enabled = true;
\r
782 // Set the last action to scan.
\r
783 // This is used for tracking which file to load in the activity window
\r
784 lastAction = "scan";
\r
786 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
788 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
789 String filename = path[0];
\r
790 setupGUIforScan(filename);
\r
791 startScan(filename);
\r
794 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
795 if (drp_dvdtitle.Items.Count == 0)
\r
796 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
798 lbl_encode.Text = "";
\r
800 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
802 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
803 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
805 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
807 // Reset some values on the form
\r
808 lbl_Aspect.Text = "Select a Title";
\r
809 //lbl_RecomendedCrop.Text = "Select a Title";
\r
810 drop_chapterStart.Items.Clear();
\r
811 drop_chapterFinish.Items.Clear();
\r
813 // If the dropdown is set to automatic nothing else needs to be done.
\r
814 // Otheriwse if its not, title data has to be loased from parsing.
\r
815 if (drp_dvdtitle.Text != "Automatic")
\r
817 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
819 // Set the Aspect Ratio
\r
820 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
821 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
822 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
824 // Set the Recommended Cropping values
\r
825 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
826 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
827 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
828 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
830 // Populate the Start chapter Dropdown
\r
831 drop_chapterStart.Items.Clear();
\r
832 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
833 if (drop_chapterStart.Items.Count > 0)
\r
834 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
836 // Populate the Final Chapter Dropdown
\r
837 drop_chapterFinish.Items.Clear();
\r
838 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
839 if (drop_chapterFinish.Items.Count > 0)
\r
840 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
842 // Populate the Audio Channels Dropdown
\r
843 drp_track1Audio.Items.Clear();
\r
844 drp_track1Audio.Items.Add("Automatic");
\r
845 drp_track1Audio.Items.Add("None");
\r
846 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
847 drp_track1Audio.SelectedIndex = 0;
\r
849 // Populate the Subtitles dropdown
\r
850 drp_subtitle.Items.Clear();
\r
851 drp_subtitle.Items.Add("None");
\r
852 drp_subtitle.Items.Add("Autoselect");
\r
853 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
854 if (drp_subtitle.Items.Count > 0)
\r
855 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
859 // Run the autoName & chapterNaming functions
\r
860 if (Properties.Settings.Default.autoNaming == "Checked")
\r
862 string autoPath = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
863 if (autoPath != null)
\r
864 text_destination.Text = autoPath;
\r
866 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
869 data_chpt.Rows.Clear();
\r
870 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
871 if (chapterGridView != null)
\r
872 data_chpt = chapterGridView;
\r
874 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
875 data_chpt.Columns[0].Width = 166;
\r
876 data_chpt.Columns[0].Width = 165;
\r
878 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
880 int c_start, c_end;
\r
882 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
883 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
885 int.TryParse(drop_chapterStart.Text, out c_start);
\r
886 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
890 if (c_start > c_end)
\r
891 drop_chapterFinish.Text = c_start.ToString();
\r
894 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
896 // Run the Autonaming function
\r
897 if (Properties.Settings.Default.autoNaming == "Checked")
\r
898 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
901 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
903 int c_start, c_end;
\r
905 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
906 drop_chapterStart.SelectedIndex = 1;
\r
908 int.TryParse(drop_chapterStart.Text, out c_start);
\r
909 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
913 if (c_end < c_start)
\r
914 drop_chapterFinish.Text = c_start.ToString();
\r
917 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
919 // Run the Autonaming function
\r
920 if (Properties.Settings.Default.autoNaming == "Checked")
\r
921 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
923 // Add more rows to the Chapter menu if needed.
\r
924 if (Check_ChapterMarkers.Checked)
\r
926 int i = data_chpt.Rows.Count, finish = 0;
\r
928 if (drop_chapterFinish.Text != "Auto")
\r
929 int.TryParse(drop_chapterFinish.Text, out finish);
\r
933 int n = data_chpt.Rows.Add();
\r
934 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
935 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
936 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
937 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
944 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
946 // This removes the file extension from the filename box on the save file dialog.
\r
947 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
948 if (Path.HasExtension(text_destination.Text))
\r
949 DVD_Save.FileName = Path.Combine(Path.GetDirectoryName(text_destination.Text), Path.GetFileNameWithoutExtension(text_destination.Text));
\r
951 // Show the dialog and set the main form file path
\r
952 if (drop_format.SelectedIndex.Equals(0))
\r
953 DVD_Save.FilterIndex = 1;
\r
954 else if (drop_format.SelectedIndex.Equals(1))
\r
955 DVD_Save.FilterIndex = 2;
\r
956 else if (drop_format.SelectedIndex.Equals(2))
\r
957 DVD_Save.FilterIndex = 3;
\r
958 else if (drop_format.SelectedIndex.Equals(3))
\r
959 DVD_Save.FilterIndex = 4;
\r
960 else if (drop_format.SelectedIndex.Equals(4))
\r
961 DVD_Save.FilterIndex = 5;
\r
963 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
965 if (DVD_Save.FileName.StartsWith("\\"))
\r
966 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
969 setAudioByContainer(DVD_Save.FileName);
\r
970 text_destination.Text = DVD_Save.FileName;
\r
972 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
973 if (Check_ChapterMarkers.Checked)
\r
974 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
978 private void text_destination_TextChanged(object sender, EventArgs e)
\r
980 string path = text_destination.Text;
\r
981 if (path.EndsWith(".mp4"))
\r
982 drop_format.SelectedIndex = 0;
\r
983 else if (path.EndsWith(".m4v"))
\r
984 drop_format.SelectedIndex = 1;
\r
985 else if (path.EndsWith(".mkv"))
\r
986 drop_format.SelectedIndex = 2;
\r
987 else if (path.EndsWith(".avi"))
\r
988 drop_format.SelectedIndex = 3;
\r
989 else if (path.EndsWith(".ogm"))
\r
990 drop_format.SelectedIndex = 4;
\r
995 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
997 if (drop_format.SelectedIndex == 0)
\r
998 setExtension(".mp4");
\r
999 else if (drop_format.SelectedIndex == 1)
\r
1000 setExtension(".m4v");
\r
1001 else if (drop_format.SelectedIndex == 2)
\r
1002 setExtension(".mkv");
\r
1003 else if (drop_format.SelectedIndex == 3)
\r
1004 setExtension(".avi");
\r
1005 else if (drop_format.SelectedIndex == 4)
\r
1006 setExtension(".ogm");
\r
1008 setAudioByContainer(drop_format.Text);
\r
1009 setVideoByContainer(drop_format.Text);
\r
1011 private void setExtension(string newExtension)
\r
1013 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1014 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1015 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1016 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1017 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1021 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1023 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1025 check_largeFile.Enabled = true;
\r
1026 check_optimiseMP4.Enabled = true;
\r
1027 check_iPodAtom.Enabled = true;
\r
1031 check_largeFile.Enabled = false;
\r
1032 check_optimiseMP4.Enabled = false;
\r
1033 check_iPodAtom.Enabled = false;
\r
1034 check_largeFile.Checked = false;
\r
1035 check_optimiseMP4.Checked = false;
\r
1036 check_iPodAtom.Checked = false;
\r
1039 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1040 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1042 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1043 check_turbo.Enabled = true;
\r
1045 h264Tab.Enabled = true;
\r
1046 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1047 check_iPodAtom.Enabled = true;
\r
1049 check_iPodAtom.Enabled = false;
\r
1053 check_turbo.CheckState = CheckState.Unchecked;
\r
1054 check_turbo.Enabled = false;
\r
1055 h264Tab.Enabled = false;
\r
1056 x264Panel.x264Query = "";
\r
1057 check_iPodAtom.Enabled = false;
\r
1058 check_iPodAtom.Checked = false;
\r
1061 // Setup the CQ Slider
\r
1062 switch (drp_videoEncoder.Text)
\r
1064 case "MPEG-4 (FFmpeg)":
\r
1065 slider_videoQuality.Minimum = 1;
\r
1066 slider_videoQuality.Maximum = 31;
\r
1067 slider_videoQuality.Value = 1;
\r
1068 SliderValue.Text = "0% QP: 31.00";
\r
1070 case "MPEG-4 (XviD)":
\r
1071 slider_videoQuality.Minimum = 1;
\r
1072 slider_videoQuality.Maximum = 31;
\r
1073 slider_videoQuality.Value = 1;
\r
1074 SliderValue.Text = "0% QP: 31.00";
\r
1076 case "H.264 (x264)":
\r
1077 slider_videoQuality.Minimum = 0;
\r
1078 slider_videoQuality.Value = 0;
\r
1079 slider_videoQuality.TickFrequency = 1;
\r
1080 SliderValue.Text = "0% RF: 51.00";
\r
1081 String step = Properties.Settings.Default.x264cqstep;
\r
1085 slider_videoQuality.Maximum = 255;
\r
1088 slider_videoQuality.Maximum = 204;
\r
1091 slider_videoQuality.Maximum = 155;
\r
1094 slider_videoQuality.Maximum = 102;
\r
1097 slider_videoQuality.Maximum = 51;
\r
1100 slider_videoQuality.Maximum = 51;
\r
1104 case "VP3 (Theora)":
\r
1105 slider_videoQuality.Minimum = 0;
\r
1106 slider_videoQuality.Maximum = 63;
\r
1107 slider_videoQuality.Value = 0;
\r
1108 SliderValue.Text = "0% QP: 0.00";
\r
1112 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1114 switch (drp_videoEncoder.Text)
\r
1116 case "MPEG-4 (FFmpeg)":
\r
1117 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1118 double max = slider_videoQuality.Maximum;
\r
1119 double min = slider_videoQuality.Minimum;
\r
1120 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1121 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1123 case "MPEG-4 (XviD)":
\r
1124 rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1125 max = slider_videoQuality.Maximum;
\r
1126 min = slider_videoQuality.Minimum;
\r
1127 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1128 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1130 case "H.264 (x264)":
\r
1132 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1133 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1134 System.Globalization.NumberStyles.Number,
\r
1137 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1138 max = slider_videoQuality.Maximum * divided;
\r
1139 min = slider_videoQuality.Minimum;
\r
1140 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1141 rfValue = Math.Round(rfValue, 2);
\r
1142 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1144 case "VP3 (Theora)":
\r
1145 rfValue = slider_videoQuality.Value;
\r
1146 double value = rfValue / 63;
\r
1147 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1151 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1153 text_bitrate.Enabled = false;
\r
1154 text_filesize.Enabled = true;
\r
1155 slider_videoQuality.Enabled = false;
\r
1157 check_2PassEncode.Enabled = true;
\r
1159 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1161 text_bitrate.Enabled = true;
\r
1162 text_filesize.Enabled = false;
\r
1163 slider_videoQuality.Enabled = false;
\r
1165 check_2PassEncode.Enabled = true;
\r
1167 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1169 text_bitrate.Enabled = false;
\r
1170 text_filesize.Enabled = false;
\r
1171 slider_videoQuality.Enabled = true;
\r
1173 check_2PassEncode.Enabled = false;
\r
1174 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1176 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1178 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1180 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1181 check_turbo.Enabled = true;
\r
1185 check_turbo.Enabled = false;
\r
1186 check_turbo.CheckState = CheckState.Unchecked;
\r
1191 private void text_width_TextChanged(object sender, EventArgs e)
\r
1193 if (text_width.Text == "")
\r
1194 text_width.BackColor = Color.White;
\r
1196 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
1197 lbl_max.Text = "";
\r
1200 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1203 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1205 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1207 if (drp_anamorphic.Text == "None")
\r
1209 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1211 text_height.Text = height.ToString();
\r
1216 private void text_height_TextChanged(object sender, EventArgs e)
\r
1218 if (text_height.Text == "")
\r
1219 text_height.BackColor = Color.White;
\r
1221 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1222 if (maxWidth != 0)
\r
1223 lbl_max.Text = "Max Width";
\r
1225 lbl_max.Text = "";
\r
1228 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1230 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1232 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1234 text_left.Enabled = true;
\r
1235 text_right.Enabled = true;
\r
1236 text_top.Enabled = true;
\r
1237 text_bottom.Enabled = true;
\r
1238 if (selectedTitle != null)
\r
1240 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1241 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1242 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1243 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1247 text_left.Text = "0";
\r
1248 text_right.Text = "0";
\r
1249 text_top.Text = "0";
\r
1250 text_bottom.Text = "0";
\r
1253 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1255 text_left.Enabled = false;
\r
1256 text_right.Enabled = false;
\r
1257 text_top.Enabled = false;
\r
1258 text_bottom.Enabled = false;
\r
1260 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1262 if (drp_anamorphic.SelectedIndex == 1)
\r
1264 text_height.BackColor = Color.LightGray;
\r
1265 text_width.BackColor = Color.LightGray;
\r
1266 text_height.Text = "";
\r
1267 text_width.Text = "";
\r
1268 text_height.Enabled = false;
\r
1269 text_width.Enabled = false;
\r
1272 if (drp_anamorphic.SelectedIndex == 2)
\r
1274 text_height.Text = "";
\r
1275 text_height.Enabled = false;
\r
1276 text_height.BackColor = Color.LightGray;
\r
1278 text_width.Enabled = true;
\r
1279 text_width.BackColor = Color.White;
\r
1282 if (drp_anamorphic.SelectedIndex == 0)
\r
1284 text_height.BackColor = Color.White;
\r
1285 text_width.BackColor = Color.White;
\r
1286 text_height.Enabled = true;
\r
1287 text_width.Enabled = true;
\r
1292 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1294 if (ctl_decomb.getDropValue != "Off")
\r
1295 if (ctl_deinterlace.getDropValue != "None")
\r
1296 ctl_deinterlace.setOption("None");
\r
1298 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1300 if (ctl_detelecine.getDropValue != "None")
\r
1301 if (ctl_decomb.getDropValue != "Off")
\r
1302 ctl_decomb.setOption("Off");
\r
1304 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1306 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1310 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1312 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1314 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1315 lv_audioList.Select();
\r
1318 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1320 if (drp_audenc_1.Text == "AC3")
\r
1322 drp_audmix_1.Enabled = false;
\r
1323 drp_audbit_1.Enabled = false;
\r
1324 drp_audsr_1.Enabled = false;
\r
1326 drp_audmix_1.SelectedIndex = 0;
\r
1327 drp_audbit_1.SelectedIndex = 0;
\r
1328 drp_audsr_1.SelectedIndex = 0;
\r
1332 drp_audmix_1.Enabled = true;
\r
1333 drp_audbit_1.Enabled = true;
\r
1334 drp_audsr_1.Enabled = true;
\r
1336 drp_audmix_1.Text = "Automatic";
\r
1337 drp_audbit_1.Text = "160";
\r
1338 drp_audsr_1.Text = "Auto";
\r
1341 if (drp_audenc_1.Text == "AAC")
\r
1343 setMixDownAllOptions(drp_audmix_1);
\r
1344 setBitrateSelections160(drp_audbit_1);
\r
1348 setMixDownNotAAC(drp_audmix_1);
\r
1349 setBitrateSelections320(drp_audbit_1);
\r
1352 // Update an item in the Audio list if required.
\r
1353 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1355 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1356 lv_audioList.Select();
\r
1359 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1361 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1362 setBitrateSelections384(drp_audbit_1);
\r
1363 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1364 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1366 // Update an item in the Audio list if required.
\r
1367 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1369 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1370 lv_audioList.Select();
\r
1373 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1375 // Update an item in the Audio list if required.
\r
1376 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1378 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1379 lv_audioList.Select();
\r
1382 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1384 // Update an item in the Audio list if required.
\r
1385 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1387 if (drp_audenc_1.Text == "AC3")
\r
1388 drp_audbit_1.Text = "Auto";
\r
1389 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1390 lv_audioList.Select();
\r
1393 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1396 if (tb_drc.Value == 0) value = 0;
\r
1398 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1400 lbl_drc.Text = value.ToString();
\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[5].Text = lbl_drc.Text;
\r
1406 lv_audioList.Select();
\r
1410 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1412 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1413 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1414 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1415 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1416 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1417 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1418 newTrack.SubItems.Add(lbl_drc.Text);
\r
1420 // Select the newly added track and select the control
\r
1421 lv_audioList.Items.Add(newTrack);
\r
1422 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1423 lv_audioList.Select();
\r
1425 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1427 removeAudioTrack();
\r
1429 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1431 if (lv_audioList.SelectedIndices.Count != 0)
\r
1433 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1434 int index = item.Index;
\r
1437 if (lv_audioList.Items.Count > index && index >= 0)
\r
1439 lv_audioList.Items.Remove(item);
\r
1440 lv_audioList.Items.Insert(index, item);
\r
1441 item.Selected = true;
\r
1442 lv_audioList.Focus();
\r
1446 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1448 if (lv_audioList.SelectedIndices.Count != 0)
\r
1450 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1451 int index = item.Index;
\r
1454 if (index < lv_audioList.Items.Count)
\r
1456 lv_audioList.Items.Remove(item);
\r
1457 lv_audioList.Items.Insert(index, item);
\r
1458 item.Selected = true;
\r
1459 lv_audioList.Focus();
\r
1464 private void audioList_remove_Click(object sender, EventArgs e)
\r
1466 removeAudioTrack();
\r
1468 private void removeAudioTrack()
\r
1470 // Remove the Item and reselect the control if the following conditions are met.
\r
1471 if (lv_audioList.SelectedItems.Count != 0)
\r
1473 // Record the current selected index.
\r
1474 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1476 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1478 // Now reslect the correct item and give focus to the audio list.
\r
1479 if (lv_audioList.Items.Count != 0)
\r
1481 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1482 lv_audioList.Items[currentPosition].Selected = true;
\r
1483 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1484 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1486 lv_audioList.Select();
\r
1490 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1492 // Set the dropdown controls based on the selected item in the Audio List.
\r
1493 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1495 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1496 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1497 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1498 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1499 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1500 double drcValue; int drcCalculated;
\r
1501 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1502 if (drcValue == 0) drcCalculated = 0;
\r
1504 drcValue = ((drcValue * 10) + 1) - 10;
\r
1505 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1506 tb_drc.Value = drcCalculated;
\r
1510 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1512 if (drp_subtitle.Text.Contains("None"))
\r
1514 check_forced.Enabled = false;
\r
1515 check_forced.Checked = false;
\r
1518 check_forced.Enabled = true;
\r
1521 // Chapter Marker Tab
\r
1522 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1524 if (Check_ChapterMarkers.Checked)
\r
1526 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1527 data_chpt.Rows.Clear();
\r
1528 data_chpt.Enabled = true;
\r
1529 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1530 if (chapterGridView != null)
\r
1531 data_chpt = chapterGridView;
\r
1535 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1536 data_chpt.Rows.Clear();
\r
1537 data_chpt.Enabled = false;
\r
1541 // Query Editor Tab
\r
1542 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1544 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1546 private void btn_clear_Click(object sender, EventArgs e)
\r
1548 rtf_query.Clear();
\r
1552 // MainWindow Components, Actions and Functions ***********************
\r
1554 #region Source Scan
\r
1555 private void setupGUIforScan(String filename)
\r
1557 text_source.Text = filename;
\r
1559 foreach (Control ctrl in Controls)
\r
1561 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1562 ctrl.Enabled = false;
\r
1564 lbl_encode.Visible = true;
\r
1565 lbl_encode.Text = "Scanning ...";
\r
1566 gb_source.Text = "Source: Scanning ...";
\r
1567 btn_source.Enabled = false;
\r
1568 btn_start.Enabled = false;
\r
1569 btn_showQueue.Enabled = false;
\r
1570 btn_add2Queue.Enabled = false;
\r
1571 tb_preview.Enabled = false;
\r
1572 mnu_killCLI.Visible = true;
\r
1574 private void startScan(String filename)
\r
1578 lbl_encode.Visible = true;
\r
1579 lbl_encode.Text = "Scanning...";
\r
1580 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1582 catch (Exception exc)
\r
1584 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1587 private void scanProcess(object state)
\r
1591 string inputFile = (string)state;
\r
1592 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1593 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1595 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1596 if (File.Exists(dvdInfoPath))
\r
1597 File.Delete(dvdInfoPath);
\r
1599 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1601 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1602 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1604 using (hbproc = Process.Start(hbParseDvd))
\r
1606 hbproc.WaitForExit();
\r
1609 if (!File.Exists(dvdInfoPath))
\r
1611 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1614 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1616 thisDVD = Parsing.DVD.Parse(sr);
\r
1621 updateUIafterScan();
\r
1623 catch (Exception exc)
\r
1625 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1629 private void updateUIafterScan()
\r
1633 if (InvokeRequired)
\r
1635 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1639 // Setup some GUI components
\r
1640 drp_dvdtitle.Items.Clear();
\r
1641 if (thisDVD.Titles.Count != 0)
\r
1642 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1643 drp_dvdtitle.Text = "Automatic";
\r
1644 drop_chapterFinish.Text = "Auto";
\r
1645 drop_chapterStart.Text = "Auto";
\r
1647 // Now select the longest title
\r
1648 if (thisDVD.Titles.Count != 0)
\r
1649 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1651 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1652 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1653 Check_ChapterMarkers.Enabled = true;
\r
1656 Check_ChapterMarkers.Enabled = false;
\r
1657 Check_ChapterMarkers.Checked = false;
\r
1658 data_chpt.Rows.Clear();
\r
1661 // If no titles were found, Display an error message
\r
1662 if (drp_dvdtitle.Items.Count == 0)
\r
1663 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
1665 // Enable the GUI components and enable any disabled components
\r
1668 catch (Exception exc)
\r
1670 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1675 private void enableGUI()
\r
1679 if (InvokeRequired)
\r
1681 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1683 lbl_encode.Text = "Scan Completed";
\r
1684 gb_source.Text = "Source";
\r
1685 foreach (Control ctrl in Controls)
\r
1686 ctrl.Enabled = true;
\r
1687 btn_start.Enabled = true;
\r
1688 btn_showQueue.Enabled = true;
\r
1689 btn_add2Queue.Enabled = true;
\r
1690 tb_preview.Enabled = true;
\r
1691 btn_source.Enabled = true;
\r
1692 mnu_killCLI.Visible = false;
\r
1694 catch (Exception exc)
\r
1696 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1699 private static void killCLI()
\r
1701 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1702 // hbproc.kill/close just won't do the trick.
\r
1705 string AppName = "HandBrakeCLI";
\r
1707 AppName = AppName.ToUpper();
\r
1709 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1710 foreach (System.Diagnostics.Process proces in prs)
\r
1712 if (proces.ProcessName.ToUpper() == AppName)
\r
1715 if (!proces.HasExited)
\r
1720 catch (Exception ex)
\r
1722 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
1727 #region DVD Drive Detection
\r
1728 // Source Button Drive Detection
\r
1729 private delegate void ProgressUpdateHandler();
\r
1730 private void getDriveInfoThread()
\r
1734 if (InvokeRequired)
\r
1736 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1740 Boolean foundDrive = false;
\r
1741 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1742 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1744 if (curDrive.DriveType == DriveType.CDRom)
\r
1746 if (curDrive.IsReady)
\r
1748 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1750 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1751 foundDrive = true;
\r
1759 if (foundDrive == false)
\r
1760 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1764 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1769 #region Audio Panel Code Helpers
\r
1770 private void setAudioByContainer(String path)
\r
1774 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1776 oldval = drp_audenc_1.Text;
\r
1777 drp_audenc_1.Items.Clear();
\r
1778 drp_audenc_1.Items.Add("AAC");
\r
1779 drp_audenc_1.Items.Add("AC3");
\r
1780 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1781 drp_audenc_1.SelectedIndex = 0;
\r
1784 else if (path.Contains("AVI"))
\r
1786 oldval = drp_audenc_1.Text;
\r
1787 drp_audenc_1.Items.Clear();
\r
1788 drp_audenc_1.Items.Add("MP3");
\r
1789 drp_audenc_1.Items.Add("AC3");
\r
1790 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1791 drp_audenc_1.SelectedIndex = 0;
\r
1794 else if (path.Contains("OGM"))
\r
1796 drp_audenc_1.Items.Clear();
\r
1797 drp_audenc_1.Items.Add("Vorbis");
\r
1798 drp_audenc_1.SelectedIndex = 0;
\r
1801 else if (path.Contains("MKV"))
\r
1803 drp_audenc_1.Items.Clear();
\r
1804 drp_audenc_1.Items.Add("AAC");
\r
1805 drp_audenc_1.Items.Add("MP3");
\r
1806 drp_audenc_1.Items.Add("AC3");
\r
1807 drp_audenc_1.Items.Add("Vorbis");
\r
1808 if (drp_audenc_1.Text == string.Empty)
\r
1809 drp_audenc_1.SelectedIndex = 0;
\r
1812 // Make sure the table is updated with new audio codecs
\r
1813 foreach (ListViewItem row in lv_audioList.Items)
\r
1815 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1816 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1819 private void setVideoByContainer(String path)
\r
1823 if ((path.Contains("MP3")) || (path.Contains("M4V")))
\r
1825 oldval = drp_videoEncoder.Text;
\r
1826 drp_videoEncoder.Items.Clear();
\r
1827 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1828 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1829 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1830 if (oldval == "VP3 (Theora)")
\r
1831 drp_videoEncoder.SelectedIndex = 2;
\r
1833 drp_videoEncoder.Text = oldval;
\r
1836 else if (path.Contains("AVI"))
\r
1838 oldval = drp_videoEncoder.Text;
\r
1839 drp_videoEncoder.Items.Clear();
\r
1840 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1841 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1842 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1843 if (oldval == "VP3 (Theora)")
\r
1844 drp_videoEncoder.SelectedIndex = 2;
\r
1846 drp_videoEncoder.Text = oldval;
\r
1848 else if (path.Contains("OGM"))
\r
1850 oldval = drp_videoEncoder.Text;
\r
1851 drp_videoEncoder.Items.Clear();
\r
1852 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1853 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1854 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1855 if (oldval == "H.264 (x264)")
\r
1856 drp_videoEncoder.SelectedIndex = 2;
\r
1858 drp_videoEncoder.Text = oldval;
\r
1860 else if (path.Contains("MKV"))
\r
1862 oldval = drp_videoEncoder.Text;
\r
1863 drp_videoEncoder.Items.Clear();
\r
1864 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1865 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1866 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1867 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1868 drp_videoEncoder.Text = oldval;
\r
1871 private void setBitrateSelections384(ComboBox dropDown)
\r
1873 dropDown.Items.Clear();
\r
1874 dropDown.Items.Add("32");
\r
1875 dropDown.Items.Add("40");
\r
1876 dropDown.Items.Add("48");
\r
1877 dropDown.Items.Add("56");
\r
1878 dropDown.Items.Add("64");
\r
1879 dropDown.Items.Add("80");
\r
1880 dropDown.Items.Add("86");
\r
1881 dropDown.Items.Add("112");
\r
1882 dropDown.Items.Add("128");
\r
1883 dropDown.Items.Add("160");
\r
1884 dropDown.Items.Add("192");
\r
1885 dropDown.Items.Add("224");
\r
1886 dropDown.Items.Add("256");
\r
1887 dropDown.Items.Add("320");
\r
1888 dropDown.Items.Add("384");
\r
1890 private void setBitrateSelections320(ComboBox dropDown)
\r
1892 dropDown.Items.Clear();
\r
1893 dropDown.Items.Add("32");
\r
1894 dropDown.Items.Add("40");
\r
1895 dropDown.Items.Add("48");
\r
1896 dropDown.Items.Add("56");
\r
1897 dropDown.Items.Add("64");
\r
1898 dropDown.Items.Add("80");
\r
1899 dropDown.Items.Add("86");
\r
1900 dropDown.Items.Add("112");
\r
1901 dropDown.Items.Add("128");
\r
1902 dropDown.Items.Add("160");
\r
1903 dropDown.Items.Add("192");
\r
1904 dropDown.Items.Add("224");
\r
1905 dropDown.Items.Add("256");
\r
1906 dropDown.Items.Add("320");
\r
1908 private void setBitrateSelections160(ComboBox dropDown)
\r
1910 dropDown.Items.Clear();
\r
1911 dropDown.Items.Add("32");
\r
1912 dropDown.Items.Add("40");
\r
1913 dropDown.Items.Add("48");
\r
1914 dropDown.Items.Add("56");
\r
1915 dropDown.Items.Add("64");
\r
1916 dropDown.Items.Add("80");
\r
1917 dropDown.Items.Add("86");
\r
1918 dropDown.Items.Add("112");
\r
1919 dropDown.Items.Add("128");
\r
1920 dropDown.Items.Add("160");
\r
1922 private void setMixDownAllOptions(ComboBox dropdown)
\r
1924 dropdown.Items.Clear();
\r
1925 dropdown.Items.Add("Automatic");
\r
1926 dropdown.Items.Add("Mono");
\r
1927 dropdown.Items.Add("Stereo");
\r
1928 dropdown.Items.Add("Dolby Surround");
\r
1929 dropdown.Items.Add("Dolby Pro Logic II");
\r
1930 dropdown.Items.Add("6 Channel Discrete");
\r
1932 private void setMixDownNotAAC(ComboBox dropdown)
\r
1934 dropdown.Items.Clear();
\r
1935 dropdown.Items.Add("Automatic");
\r
1936 dropdown.Items.Add("Stereo");
\r
1937 dropdown.Items.Add("Dolby Surround");
\r
1938 dropdown.Items.Add("Dolby Pro Logic II");
\r
1942 #region Public Methods
\r
1945 /// Setup the GUI for Encoding or finished Encoding.
\r
1946 /// 1 = Encode Running
\r
1947 /// 0 = Encode Finished.
\r
1949 public void setEncodeFinished()
\r
1953 if (InvokeRequired)
\r
1955 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1959 lbl_encode.Text = "Encoding Finished";
\r
1960 btn_start.Text = "Start";
\r
1961 btn_start.ToolTipText = "Start the encoding process";
\r
1962 btn_start.Image = Properties.Resources.Play;
\r
1964 // If the window is minimized, display the notification in a popup.
\r
1965 if (FormWindowState.Minimized == this.WindowState)
\r
1967 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1968 notifyIcon.ShowBalloonTip(500);
\r
1971 catch (Exception exc)
\r
1973 MessageBox.Show(exc.ToString());
\r
1976 public void setEncodeStarted()
\r
1980 if (InvokeRequired)
\r
1982 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1986 lbl_encode.Visible = true;
\r
1987 lbl_encode.Text = "Encoding in Progress";
\r
1988 btn_start.Text = "Stop";
\r
1989 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
1990 btn_start.Image = Properties.Resources.stop;
\r
1992 catch (Exception exc)
\r
1994 MessageBox.Show(exc.ToString());
\r
1999 /// Action can be "encode" or "scan"
\r
2000 /// Set the last action varible in the main window.
\r
2001 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
2003 /// <param name="last">String</param>
\r
2004 public void setLastAction(string last)
\r
2006 this.lastAction = last;
\r
2010 /// DVD parseing. Pass in a parsed DVD.
\r
2012 /// <param name="dvd"></param>
\r
2013 public void setStreamReader(Parsing.DVD dvd)
\r
2015 this.thisDVD = dvd;
\r
2019 /// Reload the preset panel display
\r
2021 public void loadPresetPanel()
\r
2023 presetHandler.loadPresetData();
\r
2025 treeView_presets.Nodes.Clear();
\r
2027 List<Presets.Preset> presetNameList;
\r
2028 List<string> presetNames;
\r
2029 TreeNode preset_treeview;
\r
2031 TreeNode rootNode = new TreeNode();
\r
2032 TreeNode rootNodeTwo = new TreeNode();
\r
2033 TreeNode childNode;
\r
2034 int workingLevel = 0;
\r
2035 string previousCategory = String.Empty;
\r
2036 string currentCategory = String.Empty;
\r
2038 presetNameList = presetHandler.getBuildInPresets();
\r
2039 if (presetNameList.Count != 0)
\r
2041 foreach (Presets.Preset preset in presetNameList)
\r
2043 // Handle Root Nodes
\r
2045 // First Case - No presets have been read yet so setup the root category
\r
2046 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2048 rootNode = new TreeNode(preset.Category);
\r
2049 workingLevel = preset.Level;
\r
2050 currentCategory = preset.Category;
\r
2051 previousCategory = preset.Category;
\r
2054 // Second Case - This is the first sub child node.
\r
2055 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2057 rootNodeTwo = new TreeNode(preset.Category);
\r
2058 workingLevel = preset.Level;
\r
2059 currentCategory = preset.Category;
\r
2060 rootNode.Nodes.Add(rootNodeTwo);
\r
2063 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2064 if (preset.Level == 1 && workingLevel == 2)
\r
2066 workingLevel = preset.Level;
\r
2067 currentCategory = preset.Category;
\r
2070 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2071 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2073 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2075 rootNode = new TreeNode(preset.Category);
\r
2076 workingLevel = preset.Level;
\r
2077 currentCategory = preset.Category;
\r
2078 previousCategory = preset.Category;
\r
2081 // Handle Child Nodes
\r
2082 // Add First level child nodes to the current root node
\r
2083 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2085 childNode = new TreeNode(preset.Name);
\r
2086 rootNode.Nodes.Add(childNode);
\r
2089 // Add Second level child nodes to the current sub root node
\r
2090 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2092 childNode = new TreeNode(preset.Name);
\r
2093 rootNodeTwo.Nodes.Add(childNode);
\r
2097 // Add the final root node which does not get added above.
\r
2098 treeView_presets.Nodes.Add(rootNode);
\r
2102 presetNames = presetHandler.getUserPresetNames();
\r
2103 foreach (string preset in presetNames)
\r
2105 preset_treeview = new TreeNode(preset);
\r
2106 preset_treeview.ForeColor = Color.Black;
\r
2108 // Now Fill Out List View with Items
\r
2109 treeView_presets.Nodes.Add(preset_treeview);
\r
2117 /// If the queue is being processed, prompt the user to confirm application close.
\r
2119 /// <param name="e"></param>
\r
2120 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2122 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2123 if ((encodeQueue.isEncoding) && (! encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
2125 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
2126 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2127 if (result == DialogResult.No)
\r
2130 base.OnFormClosing(e);
\r
2133 // This is the END of the road ------------------------------------------------------------------------------
\r