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
18 public partial class frmMain : Form
\r
20 // Objects which may be used by one or more other objects
\r
21 private delegate void UpdateWindowHandler();
\r
22 Functions.Main hb_common_func = new Functions.Main();
\r
23 Functions.Encode encodeHandler = new Functions.Encode();
\r
24 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
25 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
26 Parsing.Title selectedTitle;
\r
27 Parsing.DVD thisDVD;
\r
29 // Objects belonging to this window only
\r
30 PresetLoader presetLoader = new PresetLoader();
\r
31 x264Panel x264PanelFunctions = new x264Panel();
\r
32 QueryGenerator queryGen = new QueryGenerator();
\r
34 // Globals: Mainly used for tracking.
\r
35 private frmQueue queueWindow;
\r
36 private frmGenPreview vlcpreview;
\r
37 private frmPreview qtpreview;
\r
38 private string lastAction = null;
\r
39 public int maxWidth = 0;
\r
40 public int maxHeight = 0;
\r
45 // Applicaiton Startup ************************************************
\r
47 #region Application Startup
\r
51 // Load the splash screen in this thread
\r
52 Form splash = new frmSplashScreen();
\r
55 //Create a label that can be updated from the parent thread.
\r
56 Label lblStatus = new Label();
\r
57 lblStatus.Size = new Size(250, 20);
\r
58 lblStatus.Location = new Point(10, 280);
\r
59 splash.Controls.Add(lblStatus);
\r
60 InitializeComponent();
\r
62 // Update the users config file with the CLI version data.
\r
63 lblStatus.Text = "Setting Version Data ...";
\r
64 Application.DoEvents();
\r
65 ArrayList x = hb_common_func.getCliVersionData();
\r
66 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
67 Properties.Settings.Default.hb_version = x[0].ToString();
\r
69 // show the form, but leave disabled until preloading is complete then show the main form
\r
70 this.Enabled = false;
\r
72 Application.DoEvents(); // Forces frmMain to draw
\r
74 // update the status
\r
75 if (Properties.Settings.Default.updateStatus == "Checked")
\r
77 lblStatus.Text = "Checking for updates ...";
\r
78 Application.DoEvents();
\r
79 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
80 updateCheckThread.Start();
\r
83 // Setup the GUI components
\r
84 lblStatus.Text = "Setting up the GUI ...";
\r
85 Application.DoEvents();
\r
86 x264PanelFunctions.reset2Defaults(this); // Initialize all the x264 widgets to their default values
\r
87 loadPresetPanel(); // Load the Preset Panel
\r
88 treeView_presets.ExpandAll();
\r
89 lbl_encode.Text = "";
\r
90 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
91 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
92 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
94 // Load the user's default settings or Normal Preset
\r
95 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
97 // Ok, so, we've selected a preset. Now we want to load it.
\r
98 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
100 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
101 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
105 //Ok, Reset all the H264 widgets before changing the preset
\r
106 x264PanelFunctions.reset2Defaults(this);
\r
108 // Send the query from the file to the Query Parser class, then load the preset
\r
109 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
110 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
112 // The x264 widgets will need updated, so do this now:
\r
113 x264PanelFunctions.X264_StandardizeOptString(this);
\r
114 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
118 loadNormalPreset();
\r
121 loadNormalPreset();
\r
123 // Enabled GUI tooltip's if Required
\r
124 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
125 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 (this.InvokeRequired)
\r
149 this.BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
153 Boolean update = hb_common_func.updateCheck(false);
\r
154 if (update == true)
\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() == true)
\r
166 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
168 if (result == DialogResult.Yes)
\r
169 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
172 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
173 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
174 if (File.Exists(queuePath))
\r
175 File.Delete(queuePath);
\r
182 // Encoding Events for setting up the GUI
\r
183 private void events()
\r
185 // Handle Window Resize
\r
186 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
187 this.Resize += new EventHandler(frmMain_Resize);
\r
189 // Handle Encode Start
\r
190 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
191 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
192 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
194 private void encodeStarted(object sender, EventArgs e)
\r
196 setLastAction("encode");
\r
197 setEncodeStarted();
\r
199 private void encodeEnded(object sender, EventArgs e)
\r
201 setEncodeFinished();
\r
203 private void encodePaused(object sender, EventArgs e)
\r
205 setEncodeFinished();
\r
209 // User Interface Menus / Tool Strips *********************************
\r
212 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
216 private void mnu_exit_Click(object sender, EventArgs e)
\r
218 Application.Exit();
\r
223 private void mnu_encode_Click(object sender, EventArgs e)
\r
225 queueWindow.setQueue();
\r
226 queueWindow.Show();
\r
228 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
230 String file = String.Empty;
\r
231 if (lastAction == "scan")
\r
232 file = "dvdinfo.dat";
\r
234 file = "hb_encode_log.dat";
\r
236 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
237 dvdInfoWindow.Show();
\r
239 private void mnu_options_Click(object sender, EventArgs e)
\r
241 Form Options = new frmOptions();
\r
242 Options.ShowDialog();
\r
246 #region Presets Menu
\r
247 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
249 presetHandler.updateBuiltInPresets();
\r
251 if (treeView_presets.Nodes.Count == 0)
\r
252 MessageBox.Show("Unable to load the presets.xml file. Please select \"Update Built-in Presets\" from the Presets Menu \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
254 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
256 treeView_presets.ExpandAll();
\r
258 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
260 // Empty the preset file
\r
261 string presetsFile = Application.StartupPath.ToString() + "\\presets.xml";
\r
262 if (File.Exists(presetsFile))
\r
263 File.Delete(presetsFile);
\r
267 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
271 catch (Exception exc)
\r
273 MessageBox.Show("An error has occured during the preset removal process.\n If you are using Windows Vista, you may need to run under Administrator Mode to complete this task. \n" + exc.ToString());
\r
276 // Reload the preset panel
\r
279 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
281 loadNormalPreset();
\r
283 private void btn_new_preset_Click(object sender, EventArgs e)
\r
285 // Remember each nodes expanded status so we can reload it
\r
286 List<Boolean> nodeStatus = saveTreeViewState();
\r
287 nodeStatus.Add(true);
\r
289 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
290 preset.ShowDialog();
\r
292 // Now reload the TreeView states
\r
293 loadTreeViewStates(nodeStatus);
\r
298 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
300 Process.Start("http://forum.handbrake.fr/");
\r
302 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
304 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
306 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
308 Process.Start("http://handbrake.fr");
\r
310 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
312 Boolean update = hb_common_func.updateCheck(true);
\r
313 if (update == true)
\r
315 frmUpdater updateWindow = new frmUpdater();
\r
316 updateWindow.Show();
\r
319 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
321 private void mnu_about_Click(object sender, EventArgs e)
\r
323 Form About = new frmAbout();
\r
324 About.ShowDialog();
\r
329 // Right Click Menu Code
\r
330 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
332 treeView_presets.ExpandAll();
\r
334 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
336 treeView_presets.CollapseAll();
\r
338 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
340 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
341 if (result == DialogResult.Yes)
\r
342 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
343 else if (result == DialogResult.No)
\r
344 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
346 private void pmnu_delete_click(object sender, EventArgs e)
\r
348 if (treeView_presets.SelectedNode != null)
\r
350 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
352 // Remember each nodes expanded status so we can reload it
\r
353 List<Boolean> nodeStatus = saveTreeViewState();
\r
355 // Now reload the preset panel
\r
358 // Now reload the TreeView states
\r
359 loadTreeViewStates(nodeStatus);
\r
361 treeView_presets.Select();
\r
363 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
365 // Make sure that the save menu is always disabled by default
\r
366 pmnu_saveChanges.Enabled = false;
\r
368 // Now enable the save menu if the selected preset is a user preset
\r
369 if (treeView_presets.SelectedNode != null)
\r
371 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
373 pmnu_saveChanges.Enabled = true;
\r
376 treeView_presets.Select();
\r
379 // Presets Management
\r
380 private void btn_addPreset_Click(object sender, EventArgs e)
\r
382 // Remember each nodes expanded status so we can reload it
\r
383 List<Boolean> nodeStatus = saveTreeViewState();
\r
384 nodeStatus.Add(true);
\r
386 // Now add the new preset
\r
387 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
388 preset.ShowDialog();
\r
390 // Now reload the TreeView states
\r
391 loadTreeViewStates(nodeStatus);
\r
393 private void btn_removePreset_Click(object sender, EventArgs e)
\r
395 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
396 if (result == DialogResult.Yes)
\r
398 if (treeView_presets.SelectedNode != null)
\r
399 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
401 // Remember each nodes expanded status so we can reload it
\r
402 List<Boolean> nodeStatus = saveTreeViewState();
\r
404 // Now reload the preset panel
\r
407 // Now reload the TreeView states
\r
408 loadTreeViewStates(nodeStatus);
\r
410 treeView_presets.Select();
\r
412 private void btn_setDefault_Click(object sender, EventArgs e)
\r
414 if (treeView_presets.SelectedNode != null)
\r
416 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
417 Properties.Settings.Default.Save();
\r
418 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
421 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
423 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
425 if (e.Button == MouseButtons.Right)
\r
426 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
427 else if (e.Button == MouseButtons.Left)
\r
429 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
433 treeView_presets.Select();
\r
435 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
439 private void selectPreset()
\r
441 if (treeView_presets.SelectedNode != null)
\r
443 // Ok, so, we've selected a preset. Now we want to load it.
\r
444 string presetName = treeView_presets.SelectedNode.Text;
\r
445 if (presetHandler.getPreset(presetName) != null)
\r
447 string query = presetHandler.getPreset(presetName).Query;
\r
448 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
452 //Ok, Reset all the H264 widgets before changing the preset
\r
453 x264PanelFunctions.reset2Defaults(this);
\r
455 // Send the query from the file to the Query Parser class
\r
456 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
458 // Now load the preset
\r
459 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
461 // The x264 widgets will need updated, so do this now:
\r
462 x264PanelFunctions.X264_StandardizeOptString(this);
\r
463 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
468 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
470 if (e.KeyCode == Keys.Delete)
\r
472 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
473 if (result == DialogResult.Yes)
\r
475 if (treeView_presets.SelectedNode != null)
\r
476 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
478 // Remember each nodes expanded status so we can reload it
\r
479 List<Boolean> nodeStatus = new List<Boolean>();
\r
480 foreach (TreeNode node in treeView_presets.Nodes)
\r
481 nodeStatus.Add(node.IsExpanded);
\r
483 // Now reload the preset panel
\r
486 // And finally, re-expand any of the nodes if required
\r
488 foreach (TreeNode node in treeView_presets.Nodes)
\r
490 if (nodeStatus[i] == true)
\r
498 private List<Boolean> saveTreeViewState()
\r
500 // Remember each nodes expanded status so we can reload it
\r
501 List<Boolean> nodeStatus = new List<Boolean>();
\r
502 foreach (TreeNode node in treeView_presets.Nodes)
\r
504 nodeStatus.Add(node.IsExpanded);
\r
505 foreach (TreeNode subNode in node.Nodes)
\r
506 nodeStatus.Add(node.IsExpanded);
\r
510 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
512 // And finally, re-expand any of the nodes if required
\r
514 foreach (TreeNode node in treeView_presets.Nodes)
\r
516 if (nodeStatus[i] == true)
\r
519 foreach (TreeNode subNode in node.Nodes)
\r
521 if (nodeStatus[i] == true)
\r
528 private void loadNormalPreset()
\r
530 treeView_presets.Nodes.Find("Normal", true);
\r
532 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
534 foreach (TreeNode node in treenode.Nodes)
\r
536 if (node.Text.ToString().Equals("Normal"))
\r
537 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
544 private void btn_source_Click(object sender, EventArgs e)
\r
546 if (Properties.Settings.Default.drive_detection == "Checked")
\r
548 mnu_dvd_drive.Visible = true;
\r
549 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
550 driveInfoThread.Start();
\r
553 mnu_dvd_drive.Visible = false;
\r
555 private void btn_start_Click(object sender, EventArgs e)
\r
557 if (btn_start.Text == "Stop")
\r
559 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
561 if (result == DialogResult.Yes)
\r
564 encodeQueue.pauseEncode();
\r
566 // Kill the current process.
\r
567 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
568 Process HandBrakeCLI;
\r
569 if (aProc.Length > 0)
\r
571 HandBrakeCLI = aProc[0];
\r
572 HandBrakeCLI.Kill();
\r
576 setEncodeFinished();
\r
581 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
583 // Set the last action to encode.
\r
584 // This is used for tracking which file to load in the activity window
\r
585 lastAction = "encode";
\r
588 if (rtf_query.Text != "")
\r
589 query = rtf_query.Text;
\r
591 query = queryGen.GenerateTheQuery(this);
\r
593 if (encodeQueue.count() == 0)
\r
595 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
596 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
598 queueWindow.setQueue();
\r
599 if (encodeQueue.count() > 1)
\r
600 queueWindow.Show();
\r
602 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
603 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
606 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
607 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
611 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
613 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
614 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
617 String query = queryGen.GenerateTheQuery(this);
\r
618 if (rtf_query.Text != "")
\r
619 query = rtf_query.Text;
\r
621 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
622 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
624 queueWindow.setQueue();
\r
625 queueWindow.Show();
\r
628 private void btn_showQueue_Click(object sender, EventArgs e)
\r
630 queueWindow.setQueue();
\r
631 queueWindow.Show();
\r
633 private void mnu_vlcpreview_Click(object sender, EventArgs e)
\r
635 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
636 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
639 if (vlcpreview == null)
\r
641 vlcpreview = new frmGenPreview(this);
\r
644 else if (vlcpreview.IsDisposed)
\r
646 vlcpreview = new frmGenPreview(this);
\r
650 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
653 private void mnu_qtpreview_Click(object sender, EventArgs e)
\r
655 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
656 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
659 if (qtpreview == null)
\r
661 qtpreview = new frmPreview(this);
\r
664 else if (qtpreview.IsDisposed)
\r
666 qtpreview = new frmPreview(this);
\r
670 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
673 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
677 String file = String.Empty;
\r
678 if (lastAction == "scan")
\r
679 file = "dvdinfo.dat";
\r
681 file = "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 if (lbl_encode.Text != "")
\r
695 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
697 notifyIcon.BalloonTipText = "Not Encoding";
\r
698 notifyIcon.ShowBalloonTip(500);
\r
701 else if (FormWindowState.Normal == this.WindowState)
\r
702 notifyIcon.Visible = false;
\r
704 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
706 this.Visible = true;
\r
708 this.WindowState = FormWindowState.Normal;
\r
709 notifyIcon.Visible = false;
\r
711 private void btn_restore_Click(object sender, EventArgs e)
\r
713 this.Visible = true;
\r
715 this.WindowState = FormWindowState.Normal;
\r
716 notifyIcon.Visible = false;
\r
720 #region Tab Control
\r
723 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
725 // Enable the creation of chapter markers.
\r
726 Check_ChapterMarkers.Enabled = true;
\r
728 // Set the last action to scan.
\r
729 // This is used for tracking which file to load in the activity window
\r
730 lastAction = "scan";
\r
732 String filename = "";
\r
733 text_source.Text = "";
\r
735 DVD_Open.ShowDialog();
\r
736 filename = DVD_Open.SelectedPath;
\r
738 if (filename.StartsWith("\\"))
\r
739 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
742 if (filename != "")
\r
744 setupGUIforScan(filename);
\r
745 startScan(filename);
\r
748 text_source.Text = "Click 'Source' to continue";
\r
751 private void btn_file_source_Click(object sender, EventArgs e)
\r
753 // Set the last action to scan.
\r
754 // This is used for tracking which file to load in the activity window
\r
755 lastAction = "scan";
\r
757 String filename = "";
\r
758 text_source.Text = "";
\r
760 ISO_Open.ShowDialog();
\r
761 filename = ISO_Open.FileName;
\r
763 if (filename.StartsWith("\\"))
\r
764 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
767 if (filename != "")
\r
769 setupGUIforScan(filename);
\r
770 startScan(filename);
\r
773 text_source.Text = "Click 'Source' to continue";
\r
776 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
778 // Enable the creation of chapter markers.
\r
779 Check_ChapterMarkers.Enabled = true;
\r
781 // Set the last action to scan.
\r
782 // This is used for tracking which file to load in the activity window
\r
783 lastAction = "scan";
\r
785 String filename = "";
\r
786 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
788 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
789 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
801 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
803 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
804 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
806 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
808 // Reset some values on the form
\r
809 lbl_Aspect.Text = "Select a Title";
\r
810 //lbl_RecomendedCrop.Text = "Select a Title";
\r
811 drop_chapterStart.Items.Clear();
\r
812 drop_chapterFinish.Items.Clear();
\r
814 // If the dropdown is set to automatic nothing else needs to be done.
\r
815 // Otheriwse if its not, title data has to be loased from parsing.
\r
816 if (drp_dvdtitle.Text != "Automatic")
\r
818 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
820 // Set the Aspect Ratio
\r
821 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
822 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
823 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
825 // Set the Recommended Cropping values
\r
826 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
827 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
828 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
829 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
831 // Populate the Start chapter Dropdown
\r
832 drop_chapterStart.Items.Clear();
\r
833 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
834 if (drop_chapterStart.Items.Count > 0)
\r
835 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
837 // Populate the Final Chapter Dropdown
\r
838 drop_chapterFinish.Items.Clear();
\r
839 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
840 if (drop_chapterFinish.Items.Count > 0)
\r
841 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
843 // Populate the Audio Channels Dropdown
\r
844 drp_track1Audio.Items.Clear();
\r
845 drp_track1Audio.Items.Add("Automatic");
\r
846 drp_track1Audio.Items.Add("None");
\r
847 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
848 drp_track1Audio.SelectedIndex = 0;
\r
850 // Populate the Subtitles dropdown
\r
851 drp_subtitle.Items.Clear();
\r
852 drp_subtitle.Items.Add("None");
\r
853 drp_subtitle.Items.Add("Autoselect");
\r
854 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
855 if (drp_subtitle.Items.Count > 0)
\r
856 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
860 // Run the autoName & chapterNaming functions
\r
861 if (Properties.Settings.Default.autoNaming == "Checked")
\r
862 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
864 data_chpt.Rows.Clear();
\r
865 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
866 if (chapterGridView != null)
\r
867 data_chpt = chapterGridView;
\r
869 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
870 data_chpt.Columns[0].Width = 166;
\r
871 data_chpt.Columns[0].Width = 165;
\r
873 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
875 int c_start, c_end = 1;
\r
877 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
878 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
880 int.TryParse(drop_chapterStart.Text, out c_start);
\r
881 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
885 if (c_start > c_end)
\r
886 drop_chapterFinish.Text = c_start.ToString();
\r
889 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
891 // Run the Autonaming function
\r
892 if (Properties.Settings.Default.autoNaming == "Checked")
\r
893 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
896 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
898 int c_start, c_end = 1;
\r
900 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
901 drop_chapterStart.SelectedIndex = 1;
\r
903 int.TryParse(drop_chapterStart.Text, out c_start);
\r
904 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
908 if (c_end < c_start)
\r
909 drop_chapterFinish.Text = c_start.ToString();
\r
912 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
914 // Run the Autonaming function
\r
915 if (Properties.Settings.Default.autoNaming == "Checked")
\r
916 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
918 // Add more rows to the Chapter menu if needed.
\r
919 if (Check_ChapterMarkers.Checked)
\r
921 int i = data_chpt.Rows.Count, finish = 0;
\r
923 if (drop_chapterFinish.Text != "Auto")
\r
924 int.TryParse(drop_chapterFinish.Text, out finish);
\r
928 int n = data_chpt.Rows.Add();
\r
929 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
930 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
931 data_chpt.Rows[n].Cells[0].ValueType = typeof (int);
\r
932 data_chpt.Rows[n].Cells[1].ValueType = typeof (string);
\r
939 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
941 // This removes the file extension from the filename box on the save file dialog.
\r
942 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
943 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
945 // Show the dialog and set the main form file path
\r
946 if (drop_format.SelectedIndex.Equals(0))
\r
947 DVD_Save.FilterIndex = 1;
\r
948 else if (drop_format.SelectedIndex.Equals(1))
\r
949 DVD_Save.FilterIndex = 2;
\r
950 else if (drop_format.SelectedIndex.Equals(2))
\r
951 DVD_Save.FilterIndex = 3;
\r
952 else if (drop_format.SelectedIndex.Equals(3))
\r
953 DVD_Save.FilterIndex = 4;
\r
954 else if (drop_format.SelectedIndex.Equals(4))
\r
955 DVD_Save.FilterIndex = 5;
\r
957 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
959 if (DVD_Save.FileName.StartsWith("\\"))
\r
960 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
963 setAudioByContainer(DVD_Save.FileName);
\r
964 text_destination.Text = DVD_Save.FileName;
\r
966 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
967 if (Check_ChapterMarkers.Checked)
\r
968 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
972 private void text_destination_TextChanged(object sender, EventArgs e)
\r
974 setAudioByContainer(text_destination.Text);
\r
975 setVideoByContainer(text_destination.Text);
\r
976 string path = text_destination.Text;
\r
977 if (path.EndsWith(".mp4"))
\r
978 drop_format.SelectedIndex = 0;
\r
979 else if (path.EndsWith(".m4v"))
\r
980 drop_format.SelectedIndex = 1;
\r
981 else if (path.EndsWith(".mkv"))
\r
982 drop_format.SelectedIndex = 2;
\r
983 else if (path.EndsWith(".avi"))
\r
984 drop_format.SelectedIndex = 3;
\r
985 else if (path.EndsWith(".ogm"))
\r
986 drop_format.SelectedIndex = 4;
\r
991 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
993 if (drop_format.SelectedIndex == 0)
\r
994 setExtension(".mp4");
\r
995 else if (drop_format.SelectedIndex == 1)
\r
996 setExtension(".m4v");
\r
997 else if (drop_format.SelectedIndex == 2)
\r
998 setExtension(".mkv");
\r
999 else if (drop_format.SelectedIndex == 3)
\r
1000 setExtension(".avi");
\r
1001 else if (drop_format.SelectedIndex == 4)
\r
1002 setExtension(".ogm");
\r
1004 private void setExtension(string newExtension)
\r
1006 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1007 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1008 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1009 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1010 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1014 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1016 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1018 check_largeFile.Enabled = true;
\r
1019 check_optimiseMP4.Enabled = true;
\r
1020 check_iPodAtom.Enabled = true;
\r
1024 check_largeFile.Enabled = false;
\r
1025 check_optimiseMP4.Enabled = false;
\r
1026 check_iPodAtom.Enabled = false;
\r
1027 check_largeFile.Checked = false;
\r
1028 check_optimiseMP4.Checked = false;
\r
1029 check_iPodAtom.Checked = false;
\r
1032 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1033 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1035 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1036 check_turbo.Enabled = true;
\r
1038 h264Tab.Enabled = true;
\r
1039 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1040 check_iPodAtom.Enabled = true;
\r
1042 check_iPodAtom.Enabled = false;
\r
1043 if (!drp_anamorphic.Items.Contains("Loose"))
\r
1044 drp_anamorphic.Items.Add("Loose");
\r
1048 check_turbo.CheckState = CheckState.Unchecked;
\r
1049 check_turbo.Enabled = false;
\r
1050 h264Tab.Enabled = false;
\r
1051 rtf_x264Query.Text = "";
\r
1052 check_iPodAtom.Enabled = false;
\r
1053 check_iPodAtom.Checked = false;
\r
1054 if (drp_anamorphic.Items.Count == 3)
\r
1055 drp_anamorphic.Items.RemoveAt(2);
\r
1059 private void text_bitrate_TextChanged(object sender, EventArgs e)
\r
1061 text_filesize.Text = "";
\r
1062 slider_videoQuality.Value = 0;
\r
1063 SliderValue.Text = "0%";
\r
1064 check_2PassEncode.Enabled = true;
\r
1066 private void text_filesize_TextChanged(object sender, EventArgs e)
\r
1068 text_bitrate.Text = "";
\r
1069 slider_videoQuality.Value = 0;
\r
1070 SliderValue.Text = "0%";
\r
1071 check_2PassEncode.Enabled = true;
\r
1073 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1075 SliderValue.Text = slider_videoQuality.Value.ToString() + "%";
\r
1076 text_bitrate.Text = "";
\r
1077 text_filesize.Text = "";
\r
1078 check_2PassEncode.Enabled = false;
\r
1079 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1081 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1083 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1085 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1086 check_turbo.Enabled = true;
\r
1090 check_turbo.Enabled = false;
\r
1091 check_turbo.CheckState = CheckState.Unchecked;
\r
1096 private void text_width_TextChanged(object sender, EventArgs e)
\r
1098 if (text_width.Text == "")
\r
1099 text_width.BackColor = Color.White;
\r
1101 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
1104 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1105 if (parsed != false)
\r
1107 if ((width % 16) != 0)
\r
1108 text_width.BackColor = Color.LightCoral;
\r
1110 text_width.BackColor = Color.LightGreen;
\r
1113 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1115 if (drp_anamorphic.Text == "None")
\r
1117 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1119 text_height.Text = height.ToString();
\r
1124 private void text_height_TextChanged(object sender, EventArgs e)
\r
1126 if (text_height.Text == "")
\r
1127 text_height.BackColor = Color.White;
\r
1129 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1132 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1133 if (parsed != false)
\r
1135 if ((height % 16) != 0)
\r
1136 text_height.BackColor = Color.LightCoral;
\r
1138 text_height.BackColor = Color.LightGreen;
\r
1141 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1143 text_left.Enabled = true;
\r
1144 text_right.Enabled = true;
\r
1145 text_top.Enabled = true;
\r
1146 text_bottom.Enabled = true;
\r
1147 if (selectedTitle != null)
\r
1149 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1150 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1151 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1152 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1156 text_left.Text = "0";
\r
1157 text_right.Text = "0";
\r
1158 text_top.Text = "0";
\r
1159 text_bottom.Text = "0";
\r
1162 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1164 text_left.Enabled = false;
\r
1165 text_right.Enabled = false;
\r
1166 text_top.Enabled = false;
\r
1167 text_bottom.Enabled = false;
\r
1169 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1171 if (drp_anamorphic.SelectedIndex == 1)
\r
1173 text_height.BackColor = Color.LightGray;
\r
1174 text_width.BackColor = Color.LightGray;
\r
1175 text_height.Text = "";
\r
1176 text_width.Text = "";
\r
1177 text_height.Enabled = false;
\r
1178 text_width.Enabled = false;
\r
1181 if (drp_anamorphic.SelectedIndex == 2)
\r
1183 text_height.Text = "";
\r
1184 text_height.Enabled = false;
\r
1185 text_height.BackColor = Color.LightGray;
\r
1187 text_width.Enabled = true;
\r
1188 text_width.BackColor = Color.White;
\r
1191 if (drp_anamorphic.SelectedIndex == 0)
\r
1193 text_height.BackColor = Color.White;
\r
1194 text_width.BackColor = Color.White;
\r
1195 text_height.Enabled = true;
\r
1196 text_width.Enabled = true;
\r
1199 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1201 if (slider_deblock.Value == 4)
\r
1202 lbl_deblockVal.Text = "Off";
\r
1204 lbl_deblockVal.Text = slider_deblock.Value.ToString();
\r
1208 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1210 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1212 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1213 lv_audioList.Select();
\r
1216 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1218 if (drp_audenc_1.Text == "AC3")
\r
1220 drp_audmix_1.Enabled = false;
\r
1221 drp_audbit_1.Enabled = false;
\r
1222 drp_audsr_1.Enabled = false;
\r
1224 drp_audmix_1.SelectedIndex = 0;
\r
1225 drp_audbit_1.SelectedIndex = 0;
\r
1226 drp_audsr_1.SelectedIndex = 0;
\r
1230 drp_audmix_1.Enabled = true;
\r
1231 drp_audbit_1.Enabled = true;
\r
1232 drp_audsr_1.Enabled = true;
\r
1234 drp_audmix_1.Text = "Automatic";
\r
1235 drp_audbit_1.Text = "160";
\r
1236 drp_audsr_1.Text = "Auto";
\r
1239 if (drp_audenc_1.Text == "AAC")
\r
1241 setMixDownAllOptions(drp_audmix_1);
\r
1242 setBitrateSelections160(drp_audbit_1);
\r
1246 setMixDownNotAAC(drp_audmix_1);
\r
1247 setBitrateSelections320(drp_audbit_1);
\r
1250 // Update an item in the Audio list if required.
\r
1251 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1253 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1254 lv_audioList.Select();
\r
1257 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1259 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1260 setBitrateSelections384(drp_audbit_1);
\r
1261 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1262 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1264 // Update an item in the Audio list if required.
\r
1265 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1267 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1268 lv_audioList.Select();
\r
1271 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1273 // Update an item in the Audio list if required.
\r
1274 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1276 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1277 lv_audioList.Select();
\r
1280 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1282 // Update an item in the Audio list if required.
\r
1283 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1285 if (drp_audenc_1.Text == "AC3")
\r
1286 drp_audbit_1.Text = "Auto";
\r
1287 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1288 lv_audioList.Select();
\r
1291 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1293 double value = (tb_drc.Value / 10.0) + 1;
\r
1294 lbl_drc.Text = value.ToString();
\r
1296 // Update an item in the Audio list if required.
\r
1297 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1299 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1300 lv_audioList.Select();
\r
1304 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1306 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1307 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1308 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1309 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1310 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1311 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1312 newTrack.SubItems.Add(lbl_drc.Text);
\r
1314 // Select the newly added track and select the control
\r
1315 lv_audioList.Items.Add(newTrack);
\r
1316 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1317 lv_audioList.Select();
\r
1319 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1321 removeAudioTrack();
\r
1323 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1325 if (lv_audioList.SelectedIndices.Count != 0)
\r
1327 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1328 int index = item.Index;
\r
1331 if (lv_audioList.Items.Count > index && index >= 0)
\r
1333 lv_audioList.Items.Remove(item);
\r
1334 lv_audioList.Items.Insert(index, item);
\r
1335 item.Selected = true;
\r
1336 lv_audioList.Focus();
\r
1340 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1342 if (lv_audioList.SelectedIndices.Count != 0)
\r
1344 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1345 int index = item.Index;
\r
1348 if (index < lv_audioList.Items.Count)
\r
1350 lv_audioList.Items.Remove(item);
\r
1351 lv_audioList.Items.Insert(index, item);
\r
1352 item.Selected = true;
\r
1353 lv_audioList.Focus();
\r
1359 private void audioList_remove_Click(object sender, EventArgs e)
\r
1361 removeAudioTrack();
\r
1363 private void removeAudioTrack()
\r
1365 // Remove the Item and reselect the control if the following conditions are met.
\r
1366 if (lv_audioList.SelectedItems.Count != 0)
\r
1368 // Record the current selected index.
\r
1369 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1371 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1373 // Now reslect the correct item and give focus to the audio list.
\r
1374 if (lv_audioList.Items.Count != 0)
\r
1376 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1377 lv_audioList.Items[currentPosition].Selected = true;
\r
1378 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1379 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1381 lv_audioList.Select();
\r
1386 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1388 // Set the dropdown controls based on the selected item in the Audio List.
\r
1389 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1391 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1392 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1393 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1394 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1395 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1396 double drcValue = 0; int drcCalculated = 0;
\r
1397 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1398 drcValue = (drcValue * 10) - 10;
\r
1399 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1400 tb_drc.Value = drcCalculated;
\r
1404 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1406 if (drp_subtitle.Text.Contains("None"))
\r
1408 check_forced.Enabled = false;
\r
1409 check_forced.Checked = false;
\r
1412 check_forced.Enabled = true;
\r
1415 // Chapter Marker Tab
\r
1416 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1418 if (Check_ChapterMarkers.Checked)
\r
1420 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1421 data_chpt.Rows.Clear();
\r
1422 data_chpt.Enabled = true;
\r
1423 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1424 if (chapterGridView != null)
\r
1425 data_chpt = chapterGridView;
\r
1429 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1430 data_chpt.Rows.Clear();
\r
1431 data_chpt.Enabled = false;
\r
1436 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1438 x264PanelFunctions.on_x264_WidgetChange("ref", this);
\r
1440 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
1442 x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);
\r
1444 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1446 x264PanelFunctions.on_x264_WidgetChange("bframes", this);
\r
1448 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
1450 x264PanelFunctions.on_x264_WidgetChange("direct", this);
\r
1452 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
1454 x264PanelFunctions.on_x264_WidgetChange("weightb", this);
\r
1456 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
1458 x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);
\r
1460 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
1462 x264PanelFunctions.on_x264_WidgetChange("me", this);
\r
1464 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
1466 x264PanelFunctions.on_x264_WidgetChange("merange", this);
\r
1468 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
1470 x264PanelFunctions.on_x264_WidgetChange("subq", this);
\r
1472 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
1474 x264PanelFunctions.on_x264_WidgetChange("analyse", this);
\r
1476 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
1478 x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);
\r
1480 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
1482 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1485 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
1487 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1490 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
1492 x264PanelFunctions.on_x264_WidgetChange("trellis", this);
\r
1494 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
1496 x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);
\r
1498 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
1500 x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);
\r
1503 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
1506 x264PanelFunctions.on_x264_WidgetChange("cabac", this);
\r
1509 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1511 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1513 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");
\r
1514 x264PanelFunctions.X264_StandardizeOptString(this);
\r
1515 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
1517 if (rtf_x264Query.Text == string.Empty)
\r
1518 x264PanelFunctions.reset2Defaults(this);
\r
1521 private void btn_reset_Click(object sender, EventArgs e)
\r
1523 rtf_x264Query.Text = "";
\r
1524 x264PanelFunctions.reset2Defaults(this);
\r
1527 // Query Editor Tab
\r
1528 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1530 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1532 private void btn_clear_Click(object sender, EventArgs e)
\r
1534 rtf_query.Clear();
\r
1538 // MainWindow Components, Actions and Functions ***********************
\r
1540 #region Source Scan
\r
1541 private void setupGUIforScan(String filename)
\r
1543 text_source.Text = filename;
\r
1545 foreach (Control ctrl in Controls)
\r
1547 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1548 ctrl.Enabled = false;
\r
1550 lbl_encode.Visible = true;
\r
1551 lbl_encode.Text = "Scanning ...";
\r
1552 gb_source.Text = "Source: Scanning ...";
\r
1553 btn_source.Enabled = false;
\r
1554 btn_start.Enabled = false;
\r
1555 btn_showQueue.Enabled = false;
\r
1556 btn_add2Queue.Enabled = false;
\r
1557 tb_preview.Enabled = false;
\r
1558 mnu_killCLI.Visible = true;
\r
1561 private void startScan(String filename)
\r
1565 lbl_encode.Visible = true;
\r
1566 lbl_encode.Text = "Scanning...";
\r
1567 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1569 catch (Exception exc)
\r
1571 MessageBox.Show("frmMain.cs - startScan " + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1574 private void scanProcess(object state)
\r
1578 string inputFile = (string)state;
\r
1579 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1580 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1582 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1583 if (File.Exists(dvdInfoPath))
\r
1584 File.Delete(dvdInfoPath);
\r
1586 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1588 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1589 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1591 using (hbproc = Process.Start(hbParseDvd))
\r
1593 hbproc.WaitForExit();
\r
1596 if (!File.Exists(dvdInfoPath))
\r
1598 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1601 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1603 thisDVD = Parsing.DVD.Parse(sr);
\r
1608 updateUIafterScan();
\r
1610 catch (Exception exc)
\r
1612 MessageBox.Show("frmMain.cs - scanProcess() " + exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1616 private void updateUIafterScan()
\r
1620 if (InvokeRequired)
\r
1622 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1626 // Setup some GUI components
\r
1627 drp_dvdtitle.Items.Clear();
\r
1628 if (thisDVD.Titles.Count != 0)
\r
1629 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1630 drp_dvdtitle.Text = "Automatic";
\r
1631 drop_chapterFinish.Text = "Auto";
\r
1632 drop_chapterStart.Text = "Auto";
\r
1634 // Now select the longest title
\r
1635 if (thisDVD.Titles.Count != 0)
\r
1636 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1638 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1639 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1640 Check_ChapterMarkers.Enabled = true;
\r
1643 Check_ChapterMarkers.Enabled = false;
\r
1644 Check_ChapterMarkers.Checked = false;
\r
1645 data_chpt.Rows.Clear();
\r
1648 // If no titles were found, Display an error message
\r
1649 if (drp_dvdtitle.Items.Count == 0)
\r
1650 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
1652 // Enable the GUI components and enable any disabled components
\r
1655 catch (Exception exc)
\r
1657 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1662 private void enableGUI()
\r
1666 if (InvokeRequired)
\r
1668 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1670 lbl_encode.Text = "Scan Completed";
\r
1671 gb_source.Text = "Source";
\r
1672 foreach (Control ctrl in Controls)
\r
1673 ctrl.Enabled = true;
\r
1674 btn_start.Enabled = true;
\r
1675 btn_showQueue.Enabled = true;
\r
1676 btn_add2Queue.Enabled = true;
\r
1677 tb_preview.Enabled = true;
\r
1678 btn_source.Enabled = true;
\r
1679 mnu_killCLI.Visible = false;
\r
1681 catch (Exception exc)
\r
1683 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1687 private static void killCLI()
\r
1689 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1690 // hbproc.kill/close just won't do the trick.
\r
1693 string AppName = "HandBrakeCLI";
\r
1695 AppName = AppName.ToUpper();
\r
1697 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1698 foreach (System.Diagnostics.Process proces in prs)
\r
1700 if (proces.ProcessName.ToUpper() == AppName)
\r
1703 if (!proces.HasExited)
\r
1708 catch (Exception ex)
\r
1710 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
1715 #region DVD Drive Detection
\r
1716 // Source Button Drive Detection
\r
1717 private delegate void ProgressUpdateHandler();
\r
1718 private void getDriveInfoThread()
\r
1722 if (this.InvokeRequired)
\r
1724 this.BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1728 Boolean foundDrive = false;
\r
1729 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1730 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1732 if (curDrive.DriveType == DriveType.CDRom)
\r
1734 if (curDrive.IsReady)
\r
1736 if (File.Exists(curDrive.RootDirectory.ToString() + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1737 mnu_dvd_drive.Text = curDrive.RootDirectory.ToString() + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1739 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1741 foundDrive = true;
\r
1747 if (foundDrive == false)
\r
1748 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1752 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1757 #region Audio Panel Code Helpers
\r
1758 private void setAudioByContainer(String path)
\r
1760 string oldval = "";
\r
1762 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1764 oldval = drp_audenc_1.Text;
\r
1765 drp_audenc_1.Items.Clear();
\r
1766 drp_audenc_1.Items.Add("AAC");
\r
1767 drp_audenc_1.Items.Add("AC3");
\r
1768 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1769 drp_audenc_1.SelectedIndex = 0;
\r
1772 else if (path.EndsWith(".avi"))
\r
1774 oldval = drp_audenc_1.Text;
\r
1775 drp_audenc_1.Items.Clear();
\r
1776 drp_audenc_1.Items.Add("MP3");
\r
1777 drp_audenc_1.Items.Add("AC3");
\r
1778 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1779 drp_audenc_1.SelectedIndex = 0;
\r
1782 else if (path.EndsWith(".ogm"))
\r
1784 drp_audenc_1.Items.Clear();
\r
1785 drp_audenc_1.Items.Add("Vorbis");
\r
1786 drp_audenc_1.SelectedIndex = 0;
\r
1789 else if (path.EndsWith(".mkv"))
\r
1791 drp_audenc_1.Items.Clear();
\r
1792 drp_audenc_1.Items.Add("AAC");
\r
1793 drp_audenc_1.Items.Add("MP3");
\r
1794 drp_audenc_1.Items.Add("AC3");
\r
1795 drp_audenc_1.Items.Add("Vorbis");
\r
1796 if (drp_audenc_1.Text == string.Empty)
\r
1797 drp_audenc_1.SelectedIndex = 0;
\r
1800 private void setVideoByContainer(String path)
\r
1802 string oldval = "";
\r
1804 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1806 oldval = drp_videoEncoder.Text;
\r
1807 drp_videoEncoder.Items.Clear();
\r
1808 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1809 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1810 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1811 if (oldval == "VP3 (Theora)")
\r
1812 drp_videoEncoder.SelectedIndex = 2;
\r
1814 drp_videoEncoder.Text = oldval;
\r
1817 else if (path.EndsWith(".avi"))
\r
1819 oldval = drp_videoEncoder.Text;
\r
1820 drp_videoEncoder.Items.Clear();
\r
1821 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1822 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1823 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1824 if (oldval == "VP3 (Theora)")
\r
1825 drp_videoEncoder.SelectedIndex = 2;
\r
1827 drp_videoEncoder.Text = oldval;
\r
1829 else if (path.EndsWith(".ogm"))
\r
1831 oldval = drp_videoEncoder.Text;
\r
1832 drp_videoEncoder.Items.Clear();
\r
1833 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1834 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1835 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1836 if (oldval == "H.264 (x264)")
\r
1837 drp_videoEncoder.SelectedIndex = 2;
\r
1839 drp_videoEncoder.Text = oldval;
\r
1841 else if (path.EndsWith(".mkv"))
\r
1843 oldval = drp_videoEncoder.Text;
\r
1844 drp_videoEncoder.Items.Clear();
\r
1845 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1846 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1847 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1848 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1849 drp_videoEncoder.Text = oldval;
\r
1852 private void setBitrateSelections384(ComboBox dropDown)
\r
1854 dropDown.Items.Clear();
\r
1855 dropDown.Items.Add("32");
\r
1856 dropDown.Items.Add("40");
\r
1857 dropDown.Items.Add("48");
\r
1858 dropDown.Items.Add("56");
\r
1859 dropDown.Items.Add("64");
\r
1860 dropDown.Items.Add("80");
\r
1861 dropDown.Items.Add("86");
\r
1862 dropDown.Items.Add("112");
\r
1863 dropDown.Items.Add("128");
\r
1864 dropDown.Items.Add("160");
\r
1865 dropDown.Items.Add("192");
\r
1866 dropDown.Items.Add("224");
\r
1867 dropDown.Items.Add("256");
\r
1868 dropDown.Items.Add("320");
\r
1869 dropDown.Items.Add("384");
\r
1871 private void setBitrateSelections320(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
1889 private void setBitrateSelections160(ComboBox dropDown)
\r
1891 dropDown.Items.Clear();
\r
1892 dropDown.Items.Add("32");
\r
1893 dropDown.Items.Add("40");
\r
1894 dropDown.Items.Add("48");
\r
1895 dropDown.Items.Add("56");
\r
1896 dropDown.Items.Add("64");
\r
1897 dropDown.Items.Add("80");
\r
1898 dropDown.Items.Add("86");
\r
1899 dropDown.Items.Add("112");
\r
1900 dropDown.Items.Add("128");
\r
1901 dropDown.Items.Add("160");
\r
1903 private void setMixDownAllOptions(ComboBox dropdown)
\r
1905 dropdown.Items.Clear();
\r
1906 dropdown.Items.Add("Automatic");
\r
1907 dropdown.Items.Add("Mono");
\r
1908 dropdown.Items.Add("Stereo");
\r
1909 dropdown.Items.Add("Dolby Surround");
\r
1910 dropdown.Items.Add("Dolby Pro Logic II");
\r
1911 dropdown.Items.Add("6 Channel Discrete");
\r
1913 private void setMixDownNotAAC(ComboBox dropdown)
\r
1915 dropdown.Items.Clear();
\r
1916 dropdown.Items.Add("Automatic");
\r
1917 dropdown.Items.Add("Stereo");
\r
1918 dropdown.Items.Add("Dolby Surround");
\r
1919 dropdown.Items.Add("Dolby Pro Logic II");
\r
1921 private void audioEncoderChange(ComboBox audenc, ComboBox audMix, ComboBox audbit, ComboBox audsr)
\r
1923 if (audenc.Text == "AC3")
\r
1925 audMix.Enabled = false;
\r
1926 audbit.Enabled = false;
\r
1927 audsr.Enabled = false;
\r
1929 audMix.Text = "Automatic";
\r
1930 audbit.Text = "160";
\r
1931 audsr.Text = "Auto";
\r
1935 // Just make sure not to re-enable the following boxes if the track above is none
\r
1936 /* if (drp_track2Audio.Text != "None")
\r
1938 audMix.Enabled = true;
\r
1939 audbit.Enabled = true;
\r
1940 audsr.Enabled = true;
\r
1942 audMix.Text = "Automatic";
\r
1943 audbit.Text = "160";
\r
1944 audsr.Text = "Auto";
\r
1950 #region Public Methods
\r
1953 /// Setup the GUI for Encoding or finished Encoding.
\r
1954 /// 1 = Encode Running
\r
1955 /// 0 = Encode Finished.
\r
1957 /// <param name="i">Int</param>
\r
1958 public void setEncodeFinished()
\r
1962 if (this.InvokeRequired)
\r
1964 this.BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1968 lbl_encode.Text = "Encoding Finished";
\r
1969 btn_start.Text = "Start";
\r
1970 btn_start.ToolTipText = "Start the encoding process";
\r
1971 btn_start.Image = Properties.Resources.Play;
\r
1973 // If the window is minimized, display the notification in a popup.
\r
1974 if (FormWindowState.Minimized == this.WindowState)
\r
1976 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1977 notifyIcon.ShowBalloonTip(500);
\r
1981 catch (Exception exc)
\r
1983 MessageBox.Show(exc.ToString());
\r
1986 public void setEncodeStarted()
\r
1990 if (this.InvokeRequired)
\r
1992 this.BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1996 lbl_encode.Visible = true;
\r
1997 lbl_encode.Text = "Encoding in Progress";
\r
1998 btn_start.Text = "Stop";
\r
1999 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
2000 btn_start.Image = Properties.Resources.stop;
\r
2002 catch (Exception exc)
\r
2004 MessageBox.Show(exc.ToString());
\r
2009 /// Action can be "encode" or "scan"
\r
2010 /// Set the last action varible in the main window.
\r
2011 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
2013 /// <param name="last">String</param>
\r
2014 public void setLastAction(string last)
\r
2016 this.lastAction = last;
\r
2020 /// DVD parseing. Pass in a parsed DVD.
\r
2022 /// <param name="dvd"></param>
\r
2023 public void setStreamReader(Parsing.DVD dvd)
\r
2025 this.thisDVD = dvd;
\r
2029 /// Reload the preset panel display
\r
2031 public void loadPresetPanel()
\r
2033 presetHandler.loadPresetData();
\r
2035 treeView_presets.Nodes.Clear();
\r
2037 List<Presets.Preset> presetNameList = new List<Presets.Preset>();
\r
2038 List<string> presetNames = new List<string>();
\r
2039 TreeNode preset_treeview = new TreeNode();
\r
2041 TreeNode rootNode = new TreeNode();
\r
2042 TreeNode rootNodeTwo = new TreeNode();
\r
2043 TreeNode childNode = new TreeNode();
\r
2044 int workingLevel = 0;
\r
2045 string previousCategory = String.Empty;
\r
2046 string currentCategory = String.Empty;
\r
2048 presetNameList = presetHandler.getBuildInPresets();
\r
2049 if (presetNameList.Count != 0)
\r
2051 foreach (Presets.Preset preset in presetNameList)
\r
2053 // Handle Root Nodes
\r
2055 // First Case - No presets have been read yet so setup the root category
\r
2056 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2058 rootNode = new TreeNode(preset.Category);
\r
2059 workingLevel = preset.Level;
\r
2060 currentCategory = preset.Category;
\r
2061 previousCategory = preset.Category;
\r
2064 // Second Case - This is the first sub child node.
\r
2065 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2067 rootNodeTwo = new TreeNode(preset.Category);
\r
2068 workingLevel = preset.Level;
\r
2069 currentCategory = preset.Category;
\r
2070 rootNode.Nodes.Add(rootNodeTwo);
\r
2073 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2074 if (preset.Level == 1 && workingLevel == 2)
\r
2076 workingLevel = preset.Level;
\r
2077 currentCategory = preset.Category;
\r
2080 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2081 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2083 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2085 rootNode = new TreeNode(preset.Category);
\r
2086 workingLevel = preset.Level;
\r
2087 currentCategory = preset.Category;
\r
2088 previousCategory = preset.Category;
\r
2091 // Handle Child Nodes
\r
2092 // Add First level child nodes to the current root node
\r
2093 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2095 childNode = new TreeNode(preset.Name);
\r
2096 rootNode.Nodes.Add(childNode);
\r
2099 // Add Second level child nodes to the current sub root node
\r
2100 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2102 childNode = new TreeNode(preset.Name);
\r
2103 rootNodeTwo.Nodes.Add(childNode);
\r
2107 // Add the final root node which does not get added above.
\r
2108 treeView_presets.Nodes.Add(rootNode);
\r
2112 presetNames = presetHandler.getUserPresetNames();
\r
2113 foreach (string preset in presetNames)
\r
2115 preset_treeview = new TreeNode(preset);
\r
2116 preset_treeview.ForeColor = Color.Black;
\r
2118 // Now Fill Out List View with Items
\r
2119 treeView_presets.Nodes.Add(preset_treeview);
\r
2125 // This is the END of the road ------------------------------------------------------------------------------
\r