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 x264Panel x264PanelFunctions = new x264Panel();
\r
33 QueryGenerator queryGen = new QueryGenerator();
\r
35 // Globals: Mainly used for tracking.
\r
36 private frmQueue queueWindow;
\r
37 private frmGenPreview vlcpreview;
\r
38 private frmPreview qtpreview;
\r
39 private string lastAction;
\r
40 public int maxWidth;
\r
41 public int maxHeight;
\r
44 // Applicaiton Startup ************************************************
\r
46 #region Application Startup
\r
50 // Load the splash screen in this thread
\r
51 Form splash = new frmSplashScreen();
\r
54 //Create a label that can be updated from the parent thread.
\r
55 Label lblStatus = new Label();
\r
56 lblStatus.Size = new Size(250, 20);
\r
57 lblStatus.Location = new Point(10, 280);
\r
58 splash.Controls.Add(lblStatus);
\r
59 InitializeComponent();
\r
61 // Update the users config file with the CLI version data.
\r
62 lblStatus.Text = "Setting Version Data ...";
\r
63 Application.DoEvents();
\r
64 ArrayList x = hb_common_func.getCliVersionData();
\r
65 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
66 Properties.Settings.Default.hb_version = x[0].ToString();
\r
68 // show the form, but leave disabled until preloading is complete then show the main form
\r
69 this.Enabled = false;
\r
71 Application.DoEvents(); // Forces frmMain to draw
\r
73 // update the status
\r
74 if (Properties.Settings.Default.updateStatus == "Checked")
\r
76 lblStatus.Text = "Checking for updates ...";
\r
77 Application.DoEvents();
\r
78 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
79 updateCheckThread.Start();
\r
82 // Setup the GUI components
\r
83 lblStatus.Text = "Setting up the GUI ...";
\r
84 Application.DoEvents();
\r
85 x264PanelFunctions.reset2Defaults(this); // Initialize all the x264 widgets to their default values
\r
86 loadPresetPanel(); // Load the Preset Panel
\r
87 treeView_presets.ExpandAll();
\r
88 lbl_encode.Text = "";
\r
89 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
90 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
91 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
93 // Load the user's default settings or Normal Preset
\r
94 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
96 // Ok, so, we've selected a preset. Now we want to load it.
\r
97 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
99 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
100 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
104 //Ok, Reset all the H264 widgets before changing the preset
\r
105 x264PanelFunctions.reset2Defaults(this);
\r
107 // Send the query from the file to the Query Parser class, then load the preset
\r
108 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
109 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
111 // The x264 widgets will need updated, so do this now:
\r
112 x264PanelFunctions.X264_StandardizeOptString(this);
\r
113 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
117 loadNormalPreset();
\r
120 loadNormalPreset();
\r
122 // Enabled GUI tooltip's if Required
\r
123 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
124 ToolTip.Active = true;
\r
127 lblStatus.Text = "Loading Complete!";
\r
128 Application.DoEvents();
\r
131 this.Enabled = true;
\r
140 // Startup Functions
\r
141 private delegate void updateStatusChanger();
\r
142 private void startupUpdateCheck()
\r
146 if (InvokeRequired)
\r
148 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
152 Boolean update = hb_common_func.updateCheck(false);
\r
155 frmUpdater updateWindow = new frmUpdater();
\r
156 updateWindow.Show();
\r
159 catch (Exception) { /* Do Nothing*/ }
\r
161 private void queueRecovery()
\r
163 if (hb_common_func.check_queue_recovery())
\r
165 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
167 if (result == DialogResult.Yes)
\r
168 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
171 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
172 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
173 if (File.Exists(queuePath))
\r
174 File.Delete(queuePath);
\r
181 // Encoding Events for setting up the GUI
\r
182 private void events()
\r
184 // Handle Window Resize
\r
185 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
186 this.Resize += new EventHandler(frmMain_Resize);
\r
188 // Handle Encode Start
\r
189 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
190 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
191 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
193 private void encodeStarted(object sender, EventArgs e)
\r
195 setLastAction("encode");
\r
196 setEncodeStarted();
\r
198 private void encodeEnded(object sender, EventArgs e)
\r
200 setEncodeFinished();
\r
202 private void encodePaused(object sender, EventArgs e)
\r
204 setEncodeFinished();
\r
208 // User Interface Menus / Tool Strips *********************************
\r
211 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
215 private void mnu_exit_Click(object sender, EventArgs e)
\r
217 Application.Exit();
\r
222 private void mnu_encode_Click(object sender, EventArgs e)
\r
224 queueWindow.setQueue();
\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 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
424 Properties.Settings.Default.Save();
\r
425 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
428 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
430 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
432 if (e.Button == MouseButtons.Right)
\r
433 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
434 else if (e.Button == MouseButtons.Left)
\r
436 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
438 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
443 treeView_presets.Select();
\r
445 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
449 private void selectPreset()
\r
451 if (treeView_presets.SelectedNode != null)
\r
453 // Ok, so, we've selected a preset. Now we want to load it.
\r
454 string presetName = treeView_presets.SelectedNode.Text;
\r
455 if (presetHandler.getPreset(presetName) != null)
\r
457 string query = presetHandler.getPreset(presetName).Query;
\r
458 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
462 //Ok, Reset all the H264 widgets before changing the preset
\r
463 x264PanelFunctions.reset2Defaults(this);
\r
465 // Send the query from the file to the Query Parser class
\r
466 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
468 // Now load the preset
\r
469 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
471 // The x264 widgets will need updated, so do this now:
\r
472 x264PanelFunctions.X264_StandardizeOptString(this);
\r
473 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
478 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
480 if (e.KeyCode == Keys.Delete)
\r
482 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
483 if (result == DialogResult.Yes)
\r
485 if (treeView_presets.SelectedNode != null)
\r
486 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
488 // Remember each nodes expanded status so we can reload it
\r
489 List<Boolean> nodeStatus = new List<Boolean>();
\r
490 foreach (TreeNode node in treeView_presets.Nodes)
\r
491 nodeStatus.Add(node.IsExpanded);
\r
493 // Now reload the preset panel
\r
496 // And finally, re-expand any of the nodes if required
\r
498 foreach (TreeNode node in treeView_presets.Nodes)
\r
508 private List<Boolean> saveTreeViewState()
\r
510 // Remember each nodes expanded status so we can reload it
\r
511 List<Boolean> nodeStatus = new List<Boolean>();
\r
512 foreach (TreeNode node in treeView_presets.Nodes)
\r
514 nodeStatus.Add(node.IsExpanded);
\r
515 foreach (TreeNode subNode in node.Nodes)
\r
516 nodeStatus.Add(node.IsExpanded);
\r
520 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
522 // And finally, re-expand any of the nodes if required
\r
524 foreach (TreeNode node in treeView_presets.Nodes)
\r
529 foreach (TreeNode subNode in node.Nodes)
\r
538 private void loadNormalPreset()
\r
540 treeView_presets.Nodes.Find("Normal", true);
\r
542 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
544 foreach (TreeNode node in treenode.Nodes)
\r
546 if (node.Text.Equals("Normal"))
\r
547 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
554 private void btn_source_Click(object sender, EventArgs e)
\r
556 if (Properties.Settings.Default.drive_detection == "Checked")
\r
558 mnu_dvd_drive.Visible = true;
\r
559 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
560 driveInfoThread.Start();
\r
563 mnu_dvd_drive.Visible = false;
\r
565 private void btn_start_Click(object sender, EventArgs e)
\r
567 if (btn_start.Text == "Stop")
\r
569 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
571 if (result == DialogResult.Yes)
\r
574 encodeQueue.pauseEncode();
\r
576 // Kill the current process.
\r
577 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
578 Process HandBrakeCLI;
\r
579 if (aProc.Length > 0)
\r
581 HandBrakeCLI = aProc[0];
\r
582 HandBrakeCLI.Kill();
\r
586 setEncodeFinished();
\r
591 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
593 // Set the last action to encode.
\r
594 // This is used for tracking which file to load in the activity window
\r
595 lastAction = "encode";
\r
597 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
599 if (encodeQueue.count() == 0)
\r
601 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
602 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
604 queueWindow.setQueue();
\r
605 if (encodeQueue.count() > 1)
\r
606 queueWindow.Show();
\r
608 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
609 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
612 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
613 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
617 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
619 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
620 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
623 String query = queryGen.GenerateTheQuery(this);
\r
624 if (rtf_query.Text != "")
\r
625 query = rtf_query.Text;
\r
627 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
628 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
630 queueWindow.setQueue();
\r
631 queueWindow.Show();
\r
634 private void btn_showQueue_Click(object sender, EventArgs e)
\r
636 queueWindow.setQueue();
\r
637 queueWindow.Show();
\r
639 private void mnu_vlcpreview_Click(object sender, EventArgs e)
\r
641 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
642 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
645 if (vlcpreview == null)
\r
647 vlcpreview = new frmGenPreview(this);
\r
650 else if (vlcpreview.IsDisposed)
\r
652 vlcpreview = new frmGenPreview(this);
\r
656 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
659 private void mnu_qtpreview_Click(object sender, EventArgs e)
\r
661 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
662 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
665 if (qtpreview == null)
\r
667 qtpreview = new frmPreview(this);
\r
670 else if (qtpreview.IsDisposed)
\r
672 qtpreview = new frmPreview(this);
\r
676 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
679 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
681 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
683 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
684 ActivityWindow.Show();
\r
688 #region System Tray Icon
\r
689 private void frmMain_Resize(object sender, EventArgs e)
\r
691 if (FormWindowState.Minimized == this.WindowState)
\r
693 notifyIcon.Visible = true;
\r
694 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
695 notifyIcon.ShowBalloonTip(500);
\r
698 else if (FormWindowState.Normal == this.WindowState)
\r
699 notifyIcon.Visible = false;
\r
701 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
703 this.Visible = true;
\r
705 this.WindowState = FormWindowState.Normal;
\r
706 notifyIcon.Visible = false;
\r
708 private void btn_restore_Click(object sender, EventArgs e)
\r
710 this.Visible = true;
\r
712 this.WindowState = FormWindowState.Normal;
\r
713 notifyIcon.Visible = false;
\r
717 #region Tab Control
\r
720 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
722 // Enable the creation of chapter markers.
\r
723 Check_ChapterMarkers.Enabled = true;
\r
725 // Set the last action to scan.
\r
726 // This is used for tracking which file to load in the activity window
\r
727 lastAction = "scan";
\r
730 text_source.Text = "";
\r
732 DVD_Open.ShowDialog();
\r
733 filename = DVD_Open.SelectedPath;
\r
735 if (filename.StartsWith("\\"))
\r
736 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
739 if (filename != "")
\r
741 setupGUIforScan(filename);
\r
742 startScan(filename);
\r
745 text_source.Text = "Click 'Source' to continue";
\r
748 private void btn_file_source_Click(object sender, EventArgs e)
\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
755 text_source.Text = "";
\r
757 ISO_Open.ShowDialog();
\r
758 filename = ISO_Open.FileName;
\r
760 if (filename.StartsWith("\\"))
\r
761 MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
764 if (filename != "")
\r
766 setupGUIforScan(filename);
\r
767 startScan(filename);
\r
770 text_source.Text = "Click 'Source' to continue";
\r
773 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
775 // Enable the creation of chapter markers.
\r
776 Check_ChapterMarkers.Enabled = true;
\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
782 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
784 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
785 String filename = path[0];
\r
786 setupGUIforScan(filename);
\r
787 startScan(filename);
\r
790 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
791 if (drp_dvdtitle.Items.Count == 0)
\r
792 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
794 lbl_encode.Text = "";
\r
796 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
798 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
799 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
801 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
803 // Reset some values on the form
\r
804 lbl_Aspect.Text = "Select a Title";
\r
805 //lbl_RecomendedCrop.Text = "Select a Title";
\r
806 drop_chapterStart.Items.Clear();
\r
807 drop_chapterFinish.Items.Clear();
\r
809 // If the dropdown is set to automatic nothing else needs to be done.
\r
810 // Otheriwse if its not, title data has to be loased from parsing.
\r
811 if (drp_dvdtitle.Text != "Automatic")
\r
813 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
815 // Set the Aspect Ratio
\r
816 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
817 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
818 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
820 // Set the Recommended Cropping values
\r
821 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
822 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
823 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
824 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
826 // Populate the Start chapter Dropdown
\r
827 drop_chapterStart.Items.Clear();
\r
828 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
829 if (drop_chapterStart.Items.Count > 0)
\r
830 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
832 // Populate the Final Chapter Dropdown
\r
833 drop_chapterFinish.Items.Clear();
\r
834 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
835 if (drop_chapterFinish.Items.Count > 0)
\r
836 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
838 // Populate the Audio Channels Dropdown
\r
839 drp_track1Audio.Items.Clear();
\r
840 drp_track1Audio.Items.Add("Automatic");
\r
841 drp_track1Audio.Items.Add("None");
\r
842 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
843 drp_track1Audio.SelectedIndex = 0;
\r
845 // Populate the Subtitles dropdown
\r
846 drp_subtitle.Items.Clear();
\r
847 drp_subtitle.Items.Add("None");
\r
848 drp_subtitle.Items.Add("Autoselect");
\r
849 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
850 if (drp_subtitle.Items.Count > 0)
\r
851 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
855 // Run the autoName & chapterNaming functions
\r
856 if (Properties.Settings.Default.autoNaming == "Checked")
\r
857 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
859 data_chpt.Rows.Clear();
\r
860 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
861 if (chapterGridView != null)
\r
862 data_chpt = chapterGridView;
\r
864 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
865 data_chpt.Columns[0].Width = 166;
\r
866 data_chpt.Columns[0].Width = 165;
\r
868 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
870 int c_start, c_end;
\r
872 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
873 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
875 int.TryParse(drop_chapterStart.Text, out c_start);
\r
876 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
880 if (c_start > c_end)
\r
881 drop_chapterFinish.Text = c_start.ToString();
\r
884 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
886 // Run the Autonaming function
\r
887 if (Properties.Settings.Default.autoNaming == "Checked")
\r
888 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
891 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
893 int c_start, c_end;
\r
895 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
896 drop_chapterStart.SelectedIndex = 1;
\r
898 int.TryParse(drop_chapterStart.Text, out c_start);
\r
899 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
903 if (c_end < c_start)
\r
904 drop_chapterFinish.Text = c_start.ToString();
\r
907 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
909 // Run the Autonaming function
\r
910 if (Properties.Settings.Default.autoNaming == "Checked")
\r
911 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
913 // Add more rows to the Chapter menu if needed.
\r
914 if (Check_ChapterMarkers.Checked)
\r
916 int i = data_chpt.Rows.Count, finish = 0;
\r
918 if (drop_chapterFinish.Text != "Auto")
\r
919 int.TryParse(drop_chapterFinish.Text, out finish);
\r
923 int n = data_chpt.Rows.Add();
\r
924 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
925 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
926 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
927 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
934 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
936 // This removes the file extension from the filename box on the save file dialog.
\r
937 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
938 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
940 // Show the dialog and set the main form file path
\r
941 if (drop_format.SelectedIndex.Equals(0))
\r
942 DVD_Save.FilterIndex = 1;
\r
943 else if (drop_format.SelectedIndex.Equals(1))
\r
944 DVD_Save.FilterIndex = 2;
\r
945 else if (drop_format.SelectedIndex.Equals(2))
\r
946 DVD_Save.FilterIndex = 3;
\r
947 else if (drop_format.SelectedIndex.Equals(3))
\r
948 DVD_Save.FilterIndex = 4;
\r
949 else if (drop_format.SelectedIndex.Equals(4))
\r
950 DVD_Save.FilterIndex = 5;
\r
952 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
954 if (DVD_Save.FileName.StartsWith("\\"))
\r
955 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
958 setAudioByContainer(DVD_Save.FileName);
\r
959 text_destination.Text = DVD_Save.FileName;
\r
961 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
962 if (Check_ChapterMarkers.Checked)
\r
963 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
967 private void text_destination_TextChanged(object sender, EventArgs e)
\r
969 setAudioByContainer(text_destination.Text);
\r
970 setVideoByContainer(text_destination.Text);
\r
971 string path = text_destination.Text;
\r
972 if (path.EndsWith(".mp4"))
\r
973 drop_format.SelectedIndex = 0;
\r
974 else if (path.EndsWith(".m4v"))
\r
975 drop_format.SelectedIndex = 1;
\r
976 else if (path.EndsWith(".mkv"))
\r
977 drop_format.SelectedIndex = 2;
\r
978 else if (path.EndsWith(".avi"))
\r
979 drop_format.SelectedIndex = 3;
\r
980 else if (path.EndsWith(".ogm"))
\r
981 drop_format.SelectedIndex = 4;
\r
986 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
988 if (drop_format.SelectedIndex == 0)
\r
989 setExtension(".mp4");
\r
990 else if (drop_format.SelectedIndex == 1)
\r
991 setExtension(".m4v");
\r
992 else if (drop_format.SelectedIndex == 2)
\r
993 setExtension(".mkv");
\r
994 else if (drop_format.SelectedIndex == 3)
\r
995 setExtension(".avi");
\r
996 else if (drop_format.SelectedIndex == 4)
\r
997 setExtension(".ogm");
\r
999 private void setExtension(string newExtension)
\r
1001 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1002 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1003 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1004 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1005 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1009 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1011 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1013 check_largeFile.Enabled = true;
\r
1014 check_optimiseMP4.Enabled = true;
\r
1015 check_iPodAtom.Enabled = true;
\r
1019 check_largeFile.Enabled = false;
\r
1020 check_optimiseMP4.Enabled = false;
\r
1021 check_iPodAtom.Enabled = false;
\r
1022 check_largeFile.Checked = false;
\r
1023 check_optimiseMP4.Checked = false;
\r
1024 check_iPodAtom.Checked = false;
\r
1027 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1028 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1030 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1031 check_turbo.Enabled = true;
\r
1033 h264Tab.Enabled = true;
\r
1034 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1035 check_iPodAtom.Enabled = true;
\r
1037 check_iPodAtom.Enabled = false;
\r
1041 check_turbo.CheckState = CheckState.Unchecked;
\r
1042 check_turbo.Enabled = false;
\r
1043 h264Tab.Enabled = false;
\r
1044 rtf_x264Query.Text = "";
\r
1045 check_iPodAtom.Enabled = false;
\r
1046 check_iPodAtom.Checked = false;
\r
1050 private void text_bitrate_TextChanged(object sender, EventArgs e)
\r
1052 text_filesize.Text = "";
\r
1053 slider_videoQuality.Value = 0;
\r
1054 SliderValue.Text = "0%";
\r
1055 check_2PassEncode.Enabled = true;
\r
1057 private void text_filesize_TextChanged(object sender, EventArgs e)
\r
1059 text_bitrate.Text = "";
\r
1060 slider_videoQuality.Value = 0;
\r
1061 SliderValue.Text = "0%";
\r
1062 check_2PassEncode.Enabled = true;
\r
1064 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1066 SliderValue.Text = slider_videoQuality.Value + "%";
\r
1067 text_bitrate.Text = "";
\r
1068 text_filesize.Text = "";
\r
1069 check_2PassEncode.Enabled = false;
\r
1070 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1072 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1074 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1076 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1077 check_turbo.Enabled = true;
\r
1081 check_turbo.Enabled = false;
\r
1082 check_turbo.CheckState = CheckState.Unchecked;
\r
1087 private void text_width_TextChanged(object sender, EventArgs e)
\r
1089 if (text_width.Text == "")
\r
1090 text_width.BackColor = Color.White;
\r
1092 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
1095 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1098 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1100 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1102 if (drp_anamorphic.Text == "None")
\r
1104 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1106 text_height.Text = height.ToString();
\r
1111 private void text_height_TextChanged(object sender, EventArgs e)
\r
1113 if (text_height.Text == "")
\r
1114 text_height.BackColor = Color.White;
\r
1116 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1119 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1121 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1123 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1125 text_left.Enabled = true;
\r
1126 text_right.Enabled = true;
\r
1127 text_top.Enabled = true;
\r
1128 text_bottom.Enabled = true;
\r
1129 if (selectedTitle != null)
\r
1131 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1132 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1133 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1134 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1138 text_left.Text = "0";
\r
1139 text_right.Text = "0";
\r
1140 text_top.Text = "0";
\r
1141 text_bottom.Text = "0";
\r
1144 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1146 text_left.Enabled = false;
\r
1147 text_right.Enabled = false;
\r
1148 text_top.Enabled = false;
\r
1149 text_bottom.Enabled = false;
\r
1151 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1153 if (drp_anamorphic.SelectedIndex == 1)
\r
1155 text_height.BackColor = Color.LightGray;
\r
1156 text_width.BackColor = Color.LightGray;
\r
1157 text_height.Text = "";
\r
1158 text_width.Text = "";
\r
1159 text_height.Enabled = false;
\r
1160 text_width.Enabled = false;
\r
1163 if (drp_anamorphic.SelectedIndex == 2)
\r
1165 text_height.Text = "";
\r
1166 text_height.Enabled = false;
\r
1167 text_height.BackColor = Color.LightGray;
\r
1169 text_width.Enabled = true;
\r
1170 text_width.BackColor = Color.White;
\r
1173 if (drp_anamorphic.SelectedIndex == 0)
\r
1175 text_height.BackColor = Color.White;
\r
1176 text_width.BackColor = Color.White;
\r
1177 text_height.Enabled = true;
\r
1178 text_width.Enabled = true;
\r
1183 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1185 if (ctl_decomb.getDropValue != "Off")
\r
1186 if (ctl_deinterlace.getDropValue != "None")
\r
1187 ctl_deinterlace.setOption("None");
\r
1189 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1191 if (ctl_detelecine.getDropValue != "None")
\r
1192 if (ctl_decomb.getDropValue != "Off")
\r
1193 ctl_decomb.setOption("Off");
\r
1195 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1197 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1201 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1203 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1205 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1206 lv_audioList.Select();
\r
1209 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1211 if (drp_audenc_1.Text == "AC3")
\r
1213 drp_audmix_1.Enabled = false;
\r
1214 drp_audbit_1.Enabled = false;
\r
1215 drp_audsr_1.Enabled = false;
\r
1217 drp_audmix_1.SelectedIndex = 0;
\r
1218 drp_audbit_1.SelectedIndex = 0;
\r
1219 drp_audsr_1.SelectedIndex = 0;
\r
1223 drp_audmix_1.Enabled = true;
\r
1224 drp_audbit_1.Enabled = true;
\r
1225 drp_audsr_1.Enabled = true;
\r
1227 drp_audmix_1.Text = "Automatic";
\r
1228 drp_audbit_1.Text = "160";
\r
1229 drp_audsr_1.Text = "Auto";
\r
1232 if (drp_audenc_1.Text == "AAC")
\r
1234 setMixDownAllOptions(drp_audmix_1);
\r
1235 setBitrateSelections160(drp_audbit_1);
\r
1239 setMixDownNotAAC(drp_audmix_1);
\r
1240 setBitrateSelections320(drp_audbit_1);
\r
1243 // Update an item in the Audio list if required.
\r
1244 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1246 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1247 lv_audioList.Select();
\r
1250 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1252 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1253 setBitrateSelections384(drp_audbit_1);
\r
1254 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1255 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1257 // Update an item in the Audio list if required.
\r
1258 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1260 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1261 lv_audioList.Select();
\r
1264 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1266 // Update an item in the Audio list if required.
\r
1267 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1269 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1270 lv_audioList.Select();
\r
1273 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1275 // Update an item in the Audio list if required.
\r
1276 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1278 if (drp_audenc_1.Text == "AC3")
\r
1279 drp_audbit_1.Text = "Auto";
\r
1280 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1281 lv_audioList.Select();
\r
1284 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1287 if (tb_drc.Value == 0) value = 0;
\r
1289 value = ((tb_drc.Value-1) / 10.0) + 1;
\r
1291 lbl_drc.Text = value.ToString();
\r
1293 // Update an item in the Audio list if required.
\r
1294 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1296 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1297 lv_audioList.Select();
\r
1301 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1303 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1304 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1305 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1306 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1307 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1308 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1309 newTrack.SubItems.Add(lbl_drc.Text);
\r
1311 // Select the newly added track and select the control
\r
1312 lv_audioList.Items.Add(newTrack);
\r
1313 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1314 lv_audioList.Select();
\r
1316 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1318 removeAudioTrack();
\r
1320 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1322 if (lv_audioList.SelectedIndices.Count != 0)
\r
1324 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1325 int index = item.Index;
\r
1328 if (lv_audioList.Items.Count > index && index >= 0)
\r
1330 lv_audioList.Items.Remove(item);
\r
1331 lv_audioList.Items.Insert(index, item);
\r
1332 item.Selected = true;
\r
1333 lv_audioList.Focus();
\r
1337 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1339 if (lv_audioList.SelectedIndices.Count != 0)
\r
1341 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1342 int index = item.Index;
\r
1345 if (index < lv_audioList.Items.Count)
\r
1347 lv_audioList.Items.Remove(item);
\r
1348 lv_audioList.Items.Insert(index, item);
\r
1349 item.Selected = true;
\r
1350 lv_audioList.Focus();
\r
1356 private void audioList_remove_Click(object sender, EventArgs e)
\r
1358 removeAudioTrack();
\r
1360 private void removeAudioTrack()
\r
1362 // Remove the Item and reselect the control if the following conditions are met.
\r
1363 if (lv_audioList.SelectedItems.Count != 0)
\r
1365 // Record the current selected index.
\r
1366 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1368 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1370 // Now reslect the correct item and give focus to the audio list.
\r
1371 if (lv_audioList.Items.Count != 0)
\r
1373 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1374 lv_audioList.Items[currentPosition].Selected = true;
\r
1375 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1376 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1378 lv_audioList.Select();
\r
1383 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1385 // Set the dropdown controls based on the selected item in the Audio List.
\r
1386 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1388 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1389 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1390 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1391 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1392 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1393 double drcValue; int drcCalculated;
\r
1394 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1395 if (drcValue == 0) drcCalculated = 0;
\r
1397 drcValue = ((drcValue * 10)+1) -10;
\r
1398 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1399 tb_drc.Value = drcCalculated;
\r
1403 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1405 if (drp_subtitle.Text.Contains("None"))
\r
1407 check_forced.Enabled = false;
\r
1408 check_forced.Checked = false;
\r
1411 check_forced.Enabled = true;
\r
1414 // Chapter Marker Tab
\r
1415 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1417 if (Check_ChapterMarkers.Checked)
\r
1419 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1420 data_chpt.Rows.Clear();
\r
1421 data_chpt.Enabled = true;
\r
1422 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1423 if (chapterGridView != null)
\r
1424 data_chpt = chapterGridView;
\r
1428 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1429 data_chpt.Rows.Clear();
\r
1430 data_chpt.Enabled = false;
\r
1435 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1437 x264PanelFunctions.on_x264_WidgetChange("ref", this);
\r
1439 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
1441 x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);
\r
1443 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1445 x264PanelFunctions.on_x264_WidgetChange("bframes", this);
\r
1447 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
1449 x264PanelFunctions.on_x264_WidgetChange("direct", this);
\r
1451 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
1453 x264PanelFunctions.on_x264_WidgetChange("weightb", this);
\r
1455 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
1457 x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);
\r
1459 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
1461 x264PanelFunctions.on_x264_WidgetChange("me", this);
\r
1463 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
1465 x264PanelFunctions.on_x264_WidgetChange("merange", this);
\r
1467 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
1469 x264PanelFunctions.on_x264_WidgetChange("subq", this);
\r
1471 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
1473 x264PanelFunctions.on_x264_WidgetChange("analyse", this);
\r
1475 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
1477 x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);
\r
1479 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
1481 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1484 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
1486 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1489 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
1491 x264PanelFunctions.on_x264_WidgetChange("trellis", this);
\r
1493 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
1495 x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);
\r
1497 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
1499 x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);
\r
1502 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
1505 x264PanelFunctions.on_x264_WidgetChange("cabac", this);
\r
1508 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1510 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1512 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");
\r
1513 x264PanelFunctions.X264_StandardizeOptString(this);
\r
1514 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
1516 if (rtf_x264Query.Text == string.Empty)
\r
1517 x264PanelFunctions.reset2Defaults(this);
\r
1520 private void btn_reset_Click(object sender, EventArgs e)
\r
1522 rtf_x264Query.Text = "";
\r
1523 x264PanelFunctions.reset2Defaults(this);
\r
1526 // Query Editor Tab
\r
1527 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1529 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1531 private void btn_clear_Click(object sender, EventArgs e)
\r
1533 rtf_query.Clear();
\r
1537 // MainWindow Components, Actions and Functions ***********************
\r
1539 #region Source Scan
\r
1540 private void setupGUIforScan(String filename)
\r
1542 text_source.Text = filename;
\r
1544 foreach (Control ctrl in Controls)
\r
1546 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1547 ctrl.Enabled = false;
\r
1549 lbl_encode.Visible = true;
\r
1550 lbl_encode.Text = "Scanning ...";
\r
1551 gb_source.Text = "Source: Scanning ...";
\r
1552 btn_source.Enabled = false;
\r
1553 btn_start.Enabled = false;
\r
1554 btn_showQueue.Enabled = false;
\r
1555 btn_add2Queue.Enabled = false;
\r
1556 tb_preview.Enabled = false;
\r
1557 mnu_killCLI.Visible = true;
\r
1559 private void startScan(String filename)
\r
1563 lbl_encode.Visible = true;
\r
1564 lbl_encode.Text = "Scanning...";
\r
1565 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1567 catch (Exception exc)
\r
1569 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1572 private void scanProcess(object state)
\r
1576 string inputFile = (string)state;
\r
1577 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1578 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1580 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1581 if (File.Exists(dvdInfoPath))
\r
1582 File.Delete(dvdInfoPath);
\r
1584 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1586 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1587 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1589 using (hbproc = Process.Start(hbParseDvd))
\r
1591 hbproc.WaitForExit();
\r
1594 if (!File.Exists(dvdInfoPath))
\r
1596 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1599 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1601 thisDVD = Parsing.DVD.Parse(sr);
\r
1606 updateUIafterScan();
\r
1608 catch (Exception exc)
\r
1610 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1614 private void updateUIafterScan()
\r
1618 if (InvokeRequired)
\r
1620 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1624 // Setup some GUI components
\r
1625 drp_dvdtitle.Items.Clear();
\r
1626 if (thisDVD.Titles.Count != 0)
\r
1627 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1628 drp_dvdtitle.Text = "Automatic";
\r
1629 drop_chapterFinish.Text = "Auto";
\r
1630 drop_chapterStart.Text = "Auto";
\r
1632 // Now select the longest title
\r
1633 if (thisDVD.Titles.Count != 0)
\r
1634 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1636 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1637 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1638 Check_ChapterMarkers.Enabled = true;
\r
1641 Check_ChapterMarkers.Enabled = false;
\r
1642 Check_ChapterMarkers.Checked = false;
\r
1643 data_chpt.Rows.Clear();
\r
1646 // If no titles were found, Display an error message
\r
1647 if (drp_dvdtitle.Items.Count == 0)
\r
1648 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
1650 // Enable the GUI components and enable any disabled components
\r
1653 catch (Exception exc)
\r
1655 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1660 private void enableGUI()
\r
1664 if (InvokeRequired)
\r
1666 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1668 lbl_encode.Text = "Scan Completed";
\r
1669 gb_source.Text = "Source";
\r
1670 foreach (Control ctrl in Controls)
\r
1671 ctrl.Enabled = true;
\r
1672 btn_start.Enabled = true;
\r
1673 btn_showQueue.Enabled = true;
\r
1674 btn_add2Queue.Enabled = true;
\r
1675 tb_preview.Enabled = true;
\r
1676 btn_source.Enabled = true;
\r
1677 mnu_killCLI.Visible = false;
\r
1679 catch (Exception exc)
\r
1681 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1684 private static void killCLI()
\r
1686 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1687 // hbproc.kill/close just won't do the trick.
\r
1690 string AppName = "HandBrakeCLI";
\r
1692 AppName = AppName.ToUpper();
\r
1694 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1695 foreach (System.Diagnostics.Process proces in prs)
\r
1697 if (proces.ProcessName.ToUpper() == AppName)
\r
1700 if (!proces.HasExited)
\r
1705 catch (Exception ex)
\r
1707 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
1712 #region DVD Drive Detection
\r
1713 // Source Button Drive Detection
\r
1714 private delegate void ProgressUpdateHandler();
\r
1715 private void getDriveInfoThread()
\r
1719 if (InvokeRequired)
\r
1721 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1725 Boolean foundDrive = false;
\r
1726 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1727 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1729 if (curDrive.DriveType == DriveType.CDRom)
\r
1731 if (curDrive.IsReady)
\r
1733 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1734 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1736 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1738 foundDrive = true;
\r
1744 if (foundDrive == false)
\r
1745 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1749 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1754 #region Audio Panel Code Helpers
\r
1755 private void setAudioByContainer(String path)
\r
1759 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1761 oldval = drp_audenc_1.Text;
\r
1762 drp_audenc_1.Items.Clear();
\r
1763 drp_audenc_1.Items.Add("AAC");
\r
1764 drp_audenc_1.Items.Add("AC3");
\r
1765 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1766 drp_audenc_1.SelectedIndex = 0;
\r
1769 else if (path.EndsWith(".avi"))
\r
1771 oldval = drp_audenc_1.Text;
\r
1772 drp_audenc_1.Items.Clear();
\r
1773 drp_audenc_1.Items.Add("MP3");
\r
1774 drp_audenc_1.Items.Add("AC3");
\r
1775 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1776 drp_audenc_1.SelectedIndex = 0;
\r
1779 else if (path.EndsWith(".ogm"))
\r
1781 drp_audenc_1.Items.Clear();
\r
1782 drp_audenc_1.Items.Add("Vorbis");
\r
1783 drp_audenc_1.SelectedIndex = 0;
\r
1786 else if (path.EndsWith(".mkv"))
\r
1788 drp_audenc_1.Items.Clear();
\r
1789 drp_audenc_1.Items.Add("AAC");
\r
1790 drp_audenc_1.Items.Add("MP3");
\r
1791 drp_audenc_1.Items.Add("AC3");
\r
1792 drp_audenc_1.Items.Add("Vorbis");
\r
1793 if (drp_audenc_1.Text == string.Empty)
\r
1794 drp_audenc_1.SelectedIndex = 0;
\r
1797 // Make sure the table is updated with new audio codecs
\r
1798 foreach (ListViewItem row in lv_audioList.Items)
\r
1800 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1801 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1804 private void setVideoByContainer(String path)
\r
1808 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1810 oldval = drp_videoEncoder.Text;
\r
1811 drp_videoEncoder.Items.Clear();
\r
1812 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1813 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1814 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1815 if (oldval == "VP3 (Theora)")
\r
1816 drp_videoEncoder.SelectedIndex = 2;
\r
1818 drp_videoEncoder.Text = oldval;
\r
1821 else if (path.EndsWith(".avi"))
\r
1823 oldval = drp_videoEncoder.Text;
\r
1824 drp_videoEncoder.Items.Clear();
\r
1825 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1826 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1827 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1828 if (oldval == "VP3 (Theora)")
\r
1829 drp_videoEncoder.SelectedIndex = 2;
\r
1831 drp_videoEncoder.Text = oldval;
\r
1833 else if (path.EndsWith(".ogm"))
\r
1835 oldval = drp_videoEncoder.Text;
\r
1836 drp_videoEncoder.Items.Clear();
\r
1837 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1838 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1839 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1840 if (oldval == "H.264 (x264)")
\r
1841 drp_videoEncoder.SelectedIndex = 2;
\r
1843 drp_videoEncoder.Text = oldval;
\r
1845 else if (path.EndsWith(".mkv"))
\r
1847 oldval = drp_videoEncoder.Text;
\r
1848 drp_videoEncoder.Items.Clear();
\r
1849 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1850 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1851 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1852 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1853 drp_videoEncoder.Text = oldval;
\r
1856 private void setBitrateSelections384(ComboBox dropDown)
\r
1858 dropDown.Items.Clear();
\r
1859 dropDown.Items.Add("32");
\r
1860 dropDown.Items.Add("40");
\r
1861 dropDown.Items.Add("48");
\r
1862 dropDown.Items.Add("56");
\r
1863 dropDown.Items.Add("64");
\r
1864 dropDown.Items.Add("80");
\r
1865 dropDown.Items.Add("86");
\r
1866 dropDown.Items.Add("112");
\r
1867 dropDown.Items.Add("128");
\r
1868 dropDown.Items.Add("160");
\r
1869 dropDown.Items.Add("192");
\r
1870 dropDown.Items.Add("224");
\r
1871 dropDown.Items.Add("256");
\r
1872 dropDown.Items.Add("320");
\r
1873 dropDown.Items.Add("384");
\r
1875 private void setBitrateSelections320(ComboBox dropDown)
\r
1877 dropDown.Items.Clear();
\r
1878 dropDown.Items.Add("32");
\r
1879 dropDown.Items.Add("40");
\r
1880 dropDown.Items.Add("48");
\r
1881 dropDown.Items.Add("56");
\r
1882 dropDown.Items.Add("64");
\r
1883 dropDown.Items.Add("80");
\r
1884 dropDown.Items.Add("86");
\r
1885 dropDown.Items.Add("112");
\r
1886 dropDown.Items.Add("128");
\r
1887 dropDown.Items.Add("160");
\r
1888 dropDown.Items.Add("192");
\r
1889 dropDown.Items.Add("224");
\r
1890 dropDown.Items.Add("256");
\r
1891 dropDown.Items.Add("320");
\r
1893 private void setBitrateSelections160(ComboBox dropDown)
\r
1895 dropDown.Items.Clear();
\r
1896 dropDown.Items.Add("32");
\r
1897 dropDown.Items.Add("40");
\r
1898 dropDown.Items.Add("48");
\r
1899 dropDown.Items.Add("56");
\r
1900 dropDown.Items.Add("64");
\r
1901 dropDown.Items.Add("80");
\r
1902 dropDown.Items.Add("86");
\r
1903 dropDown.Items.Add("112");
\r
1904 dropDown.Items.Add("128");
\r
1905 dropDown.Items.Add("160");
\r
1907 private void setMixDownAllOptions(ComboBox dropdown)
\r
1909 dropdown.Items.Clear();
\r
1910 dropdown.Items.Add("Automatic");
\r
1911 dropdown.Items.Add("Mono");
\r
1912 dropdown.Items.Add("Stereo");
\r
1913 dropdown.Items.Add("Dolby Surround");
\r
1914 dropdown.Items.Add("Dolby Pro Logic II");
\r
1915 dropdown.Items.Add("6 Channel Discrete");
\r
1917 private void setMixDownNotAAC(ComboBox dropdown)
\r
1919 dropdown.Items.Clear();
\r
1920 dropdown.Items.Add("Automatic");
\r
1921 dropdown.Items.Add("Stereo");
\r
1922 dropdown.Items.Add("Dolby Surround");
\r
1923 dropdown.Items.Add("Dolby Pro Logic II");
\r
1927 #region Public Methods
\r
1930 /// Setup the GUI for Encoding or finished Encoding.
\r
1931 /// 1 = Encode Running
\r
1932 /// 0 = Encode Finished.
\r
1934 public void setEncodeFinished()
\r
1938 if (InvokeRequired)
\r
1940 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1944 lbl_encode.Text = "Encoding Finished";
\r
1945 btn_start.Text = "Start";
\r
1946 btn_start.ToolTipText = "Start the encoding process";
\r
1947 btn_start.Image = Properties.Resources.Play;
\r
1949 // If the window is minimized, display the notification in a popup.
\r
1950 if (FormWindowState.Minimized == this.WindowState)
\r
1952 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1953 notifyIcon.ShowBalloonTip(500);
\r
1956 catch (Exception exc)
\r
1958 MessageBox.Show(exc.ToString());
\r
1961 public void setEncodeStarted()
\r
1965 if (InvokeRequired)
\r
1967 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1971 lbl_encode.Visible = true;
\r
1972 lbl_encode.Text = "Encoding in Progress";
\r
1973 btn_start.Text = "Stop";
\r
1974 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
1975 btn_start.Image = Properties.Resources.stop;
\r
1977 catch (Exception exc)
\r
1979 MessageBox.Show(exc.ToString());
\r
1984 /// Action can be "encode" or "scan"
\r
1985 /// Set the last action varible in the main window.
\r
1986 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1988 /// <param name="last">String</param>
\r
1989 public void setLastAction(string last)
\r
1991 this.lastAction = last;
\r
1995 /// DVD parseing. Pass in a parsed DVD.
\r
1997 /// <param name="dvd"></param>
\r
1998 public void setStreamReader(Parsing.DVD dvd)
\r
2000 this.thisDVD = dvd;
\r
2004 /// Reload the preset panel display
\r
2006 public void loadPresetPanel()
\r
2008 presetHandler.loadPresetData();
\r
2010 treeView_presets.Nodes.Clear();
\r
2012 List<Presets.Preset> presetNameList;
\r
2013 List<string> presetNames;
\r
2014 TreeNode preset_treeview;
\r
2016 TreeNode rootNode = new TreeNode();
\r
2017 TreeNode rootNodeTwo = new TreeNode();
\r
2018 TreeNode childNode;
\r
2019 int workingLevel = 0;
\r
2020 string previousCategory = String.Empty;
\r
2021 string currentCategory = String.Empty;
\r
2023 presetNameList = presetHandler.getBuildInPresets();
\r
2024 if (presetNameList.Count != 0)
\r
2026 foreach (Presets.Preset preset in presetNameList)
\r
2028 // Handle Root Nodes
\r
2030 // First Case - No presets have been read yet so setup the root category
\r
2031 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2033 rootNode = new TreeNode(preset.Category);
\r
2034 workingLevel = preset.Level;
\r
2035 currentCategory = preset.Category;
\r
2036 previousCategory = preset.Category;
\r
2039 // Second Case - This is the first sub child node.
\r
2040 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2042 rootNodeTwo = new TreeNode(preset.Category);
\r
2043 workingLevel = preset.Level;
\r
2044 currentCategory = preset.Category;
\r
2045 rootNode.Nodes.Add(rootNodeTwo);
\r
2048 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2049 if (preset.Level == 1 && workingLevel == 2)
\r
2051 workingLevel = preset.Level;
\r
2052 currentCategory = preset.Category;
\r
2055 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2056 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2058 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2060 rootNode = new TreeNode(preset.Category);
\r
2061 workingLevel = preset.Level;
\r
2062 currentCategory = preset.Category;
\r
2063 previousCategory = preset.Category;
\r
2066 // Handle Child Nodes
\r
2067 // Add First level child nodes to the current root node
\r
2068 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2070 childNode = new TreeNode(preset.Name);
\r
2071 rootNode.Nodes.Add(childNode);
\r
2074 // Add Second level child nodes to the current sub root node
\r
2075 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2077 childNode = new TreeNode(preset.Name);
\r
2078 rootNodeTwo.Nodes.Add(childNode);
\r
2082 // Add the final root node which does not get added above.
\r
2083 treeView_presets.Nodes.Add(rootNode);
\r
2087 presetNames = presetHandler.getUserPresetNames();
\r
2088 foreach (string preset in presetNames)
\r
2090 preset_treeview = new TreeNode(preset);
\r
2091 preset_treeview.ForeColor = Color.Black;
\r
2093 // Now Fill Out List View with Items
\r
2094 treeView_presets.Nodes.Add(preset_treeview);
\r
2101 // This is the END of the road ------------------------------------------------------------------------------
\r