3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.Functions;
\r
19 public partial class frmMain : Form
\r
21 // Objects which may be used by one or more other objects
\r
22 private delegate void UpdateWindowHandler();
\r
23 Main hb_common_func = new Main();
\r
24 Encode encodeHandler = new Encode();
\r
25 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
26 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
27 Parsing.Title selectedTitle;
\r
28 Parsing.DVD thisDVD;
\r
30 // Objects belonging to this window only
\r
31 PresetLoader presetLoader = new PresetLoader();
\r
32 QueryGenerator queryGen = new QueryGenerator();
\r
34 // Globals: Mainly used for tracking.
\r
35 private frmQueue queueWindow;
\r
36 private frmPreview qtpreview;
\r
37 private string lastAction;
\r
38 public int maxWidth;
\r
39 public int maxHeight;
\r
42 // Applicaiton Startup ************************************************
\r
44 #region Application Startup
\r
48 // Load the splash screen in this thread
\r
49 Form splash = new frmSplashScreen();
\r
52 //Create a label that can be updated from the parent thread.
\r
53 Label lblStatus = new Label();
\r
54 lblStatus.Size = new Size(250, 20);
\r
55 lblStatus.Location = new Point(10, 280);
\r
56 splash.Controls.Add(lblStatus);
\r
57 InitializeComponent();
\r
59 // Update the users config file with the CLI version data.
\r
60 lblStatus.Text = "Setting Version Data ...";
\r
61 Application.DoEvents();
\r
62 ArrayList x = hb_common_func.getCliVersionData();
\r
63 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
64 Properties.Settings.Default.hb_version = x[0].ToString();
\r
66 // show the form, but leave disabled until preloading is complete then show the main form
\r
67 this.Enabled = false;
\r
69 Application.DoEvents(); // Forces frmMain to draw
\r
71 // update the status
\r
72 if (Properties.Settings.Default.updateStatus == "Checked")
\r
74 lblStatus.Text = "Checking for updates ...";
\r
75 Application.DoEvents();
\r
76 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
77 updateCheckThread.Start();
\r
80 // Setup the GUI components
\r
81 lblStatus.Text = "Setting up the GUI ...";
\r
82 Application.DoEvents();
\r
83 x264Panel.reset2Defaults(); // Initialize all the x264 widgets to their default values
\r
84 loadPresetPanel(); // Load the Preset Panel
\r
85 treeView_presets.ExpandAll();
\r
86 lbl_encode.Text = "";
\r
87 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
88 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
89 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
91 // Load the user's default settings or Normal Preset
\r
92 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
94 // Ok, so, we've selected a preset. Now we want to load it.
\r
95 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
97 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
98 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
102 //Ok, Reset all the H264 widgets before changing the preset
\r
103 x264Panel.reset2Defaults();
\r
105 // Send the query from the file to the Query Parser class, then load the preset
\r
106 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
107 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
109 // The x264 widgets will need updated, so do this now:
\r
110 x264Panel.X264_StandardizeOptString();
\r
111 x264Panel.X264_SetCurrentSettingsInPanel();
\r
115 loadNormalPreset();
\r
118 loadNormalPreset();
\r
120 // Enabled GUI tooltip's if Required
\r
121 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
123 x264Panel.setToolTipActive(true);
\r
124 ToolTip.Active = true;
\r
128 lblStatus.Text = "Loading Complete!";
\r
129 Application.DoEvents();
\r
132 this.Enabled = true;
\r
141 // Startup Functions
\r
142 private delegate void updateStatusChanger();
\r
143 private void startupUpdateCheck()
\r
147 if (InvokeRequired)
\r
149 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
153 Boolean update = hb_common_func.updateCheck(false);
\r
156 frmUpdater updateWindow = new frmUpdater();
\r
157 updateWindow.Show();
\r
160 catch (Exception) { /* Do Nothing*/ }
\r
162 private void queueRecovery()
\r
164 if (hb_common_func.check_queue_recovery())
\r
166 DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
168 if (result == DialogResult.Yes)
\r
169 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
172 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
173 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
174 if (File.Exists(queuePath))
\r
175 File.Delete(queuePath);
\r
182 // Encoding Events for setting up the GUI
\r
183 private void events()
\r
185 // Handle Window Resize
\r
186 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
187 this.Resize += new EventHandler(frmMain_Resize);
\r
189 // Handle Encode Start
\r
190 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
191 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
192 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
194 private void encodeStarted(object sender, EventArgs e)
\r
196 setLastAction("encode");
\r
197 setEncodeStarted();
\r
199 private void encodeEnded(object sender, EventArgs e)
\r
201 setEncodeFinished();
\r
203 private void encodePaused(object sender, EventArgs e)
\r
205 setEncodeFinished();
\r
209 // User Interface Menus / Tool Strips *********************************
\r
212 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
216 private void mnu_exit_Click(object sender, EventArgs e)
\r
218 Application.Exit();
\r
223 private void mnu_encode_Click(object sender, EventArgs e)
\r
225 queueWindow.setQueue();
\r
226 queueWindow.Show();
\r
228 private void mnu_encodeLog_Click(object sender, EventArgs e)
\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 + "\\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);
\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 private void mnu_qptest_Click(object sender, EventArgs e)
\r
331 QueryParserTester qptest = new QueryParserTester();
\r
337 // Right Click Menu Code
\r
338 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
340 treeView_presets.ExpandAll();
\r
342 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
344 treeView_presets.CollapseAll();
\r
346 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
348 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
349 if (result == DialogResult.Yes)
\r
350 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
351 else if (result == DialogResult.No)
\r
352 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
354 private void pmnu_delete_click(object sender, EventArgs e)
\r
356 if (treeView_presets.SelectedNode != null)
\r
358 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
360 // Remember each nodes expanded status so we can reload it
\r
361 List<Boolean> nodeStatus = saveTreeViewState();
\r
363 // Now reload the preset panel
\r
366 // Now reload the TreeView states
\r
367 loadTreeViewStates(nodeStatus);
\r
369 treeView_presets.Select();
\r
371 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
373 // Make sure that the save menu is always disabled by default
\r
374 pmnu_saveChanges.Enabled = false;
\r
376 // Now enable the save menu if the selected preset is a user preset
\r
377 if (treeView_presets.SelectedNode != null)
\r
379 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
381 pmnu_saveChanges.Enabled = true;
\r
384 treeView_presets.Select();
\r
387 // Presets Management
\r
388 private void btn_addPreset_Click(object sender, EventArgs e)
\r
390 // Remember each nodes expanded status so we can reload it
\r
391 List<Boolean> nodeStatus = saveTreeViewState();
\r
392 nodeStatus.Add(true);
\r
394 // Now add the new preset
\r
395 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
396 preset.ShowDialog();
\r
398 // Now reload the TreeView states
\r
399 loadTreeViewStates(nodeStatus);
\r
401 private void btn_removePreset_Click(object sender, EventArgs e)
\r
403 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
404 if (result == DialogResult.Yes)
\r
406 if (treeView_presets.SelectedNode != null)
\r
407 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
409 // Remember each nodes expanded status so we can reload it
\r
410 List<Boolean> nodeStatus = saveTreeViewState();
\r
412 // Now reload the preset panel
\r
415 // Now reload the TreeView states
\r
416 loadTreeViewStates(nodeStatus);
\r
418 treeView_presets.Select();
\r
420 private void btn_setDefault_Click(object sender, EventArgs e)
\r
422 if (treeView_presets.SelectedNode != null)
\r
424 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
425 Properties.Settings.Default.Save();
\r
426 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
429 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
431 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
433 if (e.Button == MouseButtons.Right)
\r
434 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
435 else if (e.Button == MouseButtons.Left)
\r
437 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
439 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
444 treeView_presets.Select();
\r
446 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
450 private void selectPreset()
\r
452 if (treeView_presets.SelectedNode != null)
\r
454 // Ok, so, we've selected a preset. Now we want to load it.
\r
455 string presetName = treeView_presets.SelectedNode.Text;
\r
456 if (presetHandler.getPreset(presetName) != null)
\r
458 string query = presetHandler.getPreset(presetName).Query;
\r
459 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
463 //Ok, Reset all the H264 widgets before changing the preset
\r
464 x264Panel.reset2Defaults();
\r
466 // Send the query from the file to the Query Parser class
\r
467 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
469 // Now load the preset
\r
470 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
472 // The x264 widgets will need updated, so do this now:
\r
473 x264Panel.X264_StandardizeOptString();
\r
474 x264Panel.X264_SetCurrentSettingsInPanel();
\r
479 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
481 if (e.KeyCode == Keys.Delete)
\r
483 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
484 if (result == DialogResult.Yes)
\r
486 if (treeView_presets.SelectedNode != null)
\r
487 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
489 // Remember each nodes expanded status so we can reload it
\r
490 List<Boolean> nodeStatus = new List<Boolean>();
\r
491 foreach (TreeNode node in treeView_presets.Nodes)
\r
492 nodeStatus.Add(node.IsExpanded);
\r
494 // Now reload the preset panel
\r
497 // And finally, re-expand any of the nodes if required
\r
499 foreach (TreeNode node in treeView_presets.Nodes)
\r
509 private List<Boolean> saveTreeViewState()
\r
511 // Remember each nodes expanded status so we can reload it
\r
512 List<Boolean> nodeStatus = new List<Boolean>();
\r
513 foreach (TreeNode node in treeView_presets.Nodes)
\r
515 nodeStatus.Add(node.IsExpanded);
\r
516 foreach (TreeNode subNode in node.Nodes)
\r
517 nodeStatus.Add(node.IsExpanded);
\r
521 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
523 // And finally, re-expand any of the nodes if required
\r
525 foreach (TreeNode node in treeView_presets.Nodes)
\r
530 foreach (TreeNode subNode in node.Nodes)
\r
539 private void loadNormalPreset()
\r
541 treeView_presets.Nodes.Find("Normal", true);
\r
543 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
545 foreach (TreeNode node in treenode.Nodes)
\r
547 if (node.Text.Equals("Normal"))
\r
548 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
555 private void btn_source_Click(object sender, EventArgs e)
\r
557 if (Properties.Settings.Default.drive_detection == "Checked")
\r
559 mnu_dvd_drive.Visible = true;
\r
560 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
561 driveInfoThread.Start();
\r
564 mnu_dvd_drive.Visible = false;
\r
566 private void btn_start_Click(object sender, EventArgs e)
\r
568 if (btn_start.Text == "Stop")
\r
570 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
572 if (result == DialogResult.Yes)
\r
575 encodeQueue.pauseEncode();
\r
577 // Kill the current process.
\r
578 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
579 Process HandBrakeCLI;
\r
580 if (aProc.Length > 0)
\r
582 HandBrakeCLI = aProc[0];
\r
583 HandBrakeCLI.Kill();
\r
587 setEncodeFinished();
\r
592 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
594 // Set the last action to encode.
\r
595 // This is used for tracking which file to load in the activity window
\r
596 lastAction = "encode";
\r
598 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
600 if (encodeQueue.count() == 0)
\r
602 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
603 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
605 queueWindow.setQueue();
\r
606 if (encodeQueue.count() > 1)
\r
607 queueWindow.Show();
\r
609 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
610 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
613 else 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
618 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
620 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
621 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
624 String query = queryGen.GenerateTheQuery(this);
\r
625 if (rtf_query.Text != "")
\r
626 query = rtf_query.Text;
\r
628 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
629 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
631 queueWindow.setQueue();
\r
632 queueWindow.Show();
\r
635 private void btn_showQueue_Click(object sender, EventArgs e)
\r
637 queueWindow.setQueue();
\r
638 queueWindow.Show();
\r
640 private void tb_preview_Click(object sender, EventArgs e)
\r
642 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
643 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
646 if (qtpreview == null)
\r
648 qtpreview = new frmPreview(this);
\r
651 else if (qtpreview.IsDisposed)
\r
653 qtpreview = new frmPreview(this);
\r
657 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
660 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
662 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
664 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
665 ActivityWindow.Show();
\r
669 #region System Tray Icon
\r
670 private void frmMain_Resize(object sender, EventArgs e)
\r
672 if (FormWindowState.Minimized == this.WindowState)
\r
674 notifyIcon.Visible = true;
\r
675 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
676 notifyIcon.ShowBalloonTip(500);
\r
679 else if (FormWindowState.Normal == this.WindowState)
\r
680 notifyIcon.Visible = false;
\r
682 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
684 this.Visible = true;
\r
686 this.WindowState = FormWindowState.Normal;
\r
687 notifyIcon.Visible = false;
\r
689 private void btn_restore_Click(object sender, EventArgs e)
\r
691 this.Visible = true;
\r
693 this.WindowState = FormWindowState.Normal;
\r
694 notifyIcon.Visible = false;
\r
698 #region Tab Control
\r
701 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
703 // Enable the creation of chapter markers.
\r
704 Check_ChapterMarkers.Enabled = true;
\r
706 // Set the last action to scan.
\r
707 // This is used for tracking which file to load in the activity window
\r
708 lastAction = "scan";
\r
709 text_source.Text = "";
\r
711 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
713 String filename = DVD_Open.SelectedPath;
\r
715 if (filename.StartsWith("\\"))
\r
716 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
720 if (filename != "")
\r
722 setupGUIforScan(filename);
\r
723 startScan(filename);
\r
726 text_source.Text = "Click 'Source' to continue";
\r
730 text_source.Text = "Click 'Source' to continue";
\r
732 private void btn_file_source_Click(object sender, EventArgs e)
\r
734 // Set the last action to scan.
\r
735 // This is used for tracking which file to load in the activity window
\r
736 lastAction = "scan";
\r
737 text_source.Text = "";
\r
739 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
741 String filename = ISO_Open.FileName;
\r
742 if (filename.StartsWith("\\"))
\r
744 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
745 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
748 if (filename != "")
\r
750 setupGUIforScan(filename);
\r
751 startScan(filename);
\r
754 text_source.Text = "Click 'Source' to continue";
\r
758 text_source.Text = "Click 'Source' to continue";
\r
760 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
762 // Enable the creation of chapter markers.
\r
763 Check_ChapterMarkers.Enabled = true;
\r
765 // Set the last action to scan.
\r
766 // This is used for tracking which file to load in the activity window
\r
767 lastAction = "scan";
\r
769 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
771 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
772 String filename = path[0];
\r
773 setupGUIforScan(filename);
\r
774 startScan(filename);
\r
777 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
778 if (drp_dvdtitle.Items.Count == 0)
\r
779 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
781 lbl_encode.Text = "";
\r
783 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
785 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
786 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
788 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
790 // Reset some values on the form
\r
791 lbl_Aspect.Text = "Select a Title";
\r
792 //lbl_RecomendedCrop.Text = "Select a Title";
\r
793 drop_chapterStart.Items.Clear();
\r
794 drop_chapterFinish.Items.Clear();
\r
796 // If the dropdown is set to automatic nothing else needs to be done.
\r
797 // Otheriwse if its not, title data has to be loased from parsing.
\r
798 if (drp_dvdtitle.Text != "Automatic")
\r
800 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
802 // Set the Aspect Ratio
\r
803 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
804 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
805 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
807 // Set the Recommended Cropping values
\r
808 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
809 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
810 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
811 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
813 // Populate the Start chapter Dropdown
\r
814 drop_chapterStart.Items.Clear();
\r
815 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
816 if (drop_chapterStart.Items.Count > 0)
\r
817 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
819 // Populate the Final Chapter Dropdown
\r
820 drop_chapterFinish.Items.Clear();
\r
821 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
822 if (drop_chapterFinish.Items.Count > 0)
\r
823 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
825 // Populate the Audio Channels Dropdown
\r
826 drp_track1Audio.Items.Clear();
\r
827 drp_track1Audio.Items.Add("Automatic");
\r
828 drp_track1Audio.Items.Add("None");
\r
829 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
830 drp_track1Audio.SelectedIndex = 0;
\r
832 // Populate the Subtitles dropdown
\r
833 drp_subtitle.Items.Clear();
\r
834 drp_subtitle.Items.Add("None");
\r
835 drp_subtitle.Items.Add("Autoselect");
\r
836 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
837 if (drp_subtitle.Items.Count > 0)
\r
838 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
842 // Run the autoName & chapterNaming functions
\r
843 if (Properties.Settings.Default.autoNaming == "Checked")
\r
844 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
846 data_chpt.Rows.Clear();
\r
847 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
848 if (chapterGridView != null)
\r
849 data_chpt = chapterGridView;
\r
851 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
852 data_chpt.Columns[0].Width = 166;
\r
853 data_chpt.Columns[0].Width = 165;
\r
855 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
857 int c_start, c_end;
\r
859 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
860 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
862 int.TryParse(drop_chapterStart.Text, out c_start);
\r
863 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
867 if (c_start > c_end)
\r
868 drop_chapterFinish.Text = c_start.ToString();
\r
871 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
873 // Run the Autonaming function
\r
874 if (Properties.Settings.Default.autoNaming == "Checked")
\r
875 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
878 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
880 int c_start, c_end;
\r
882 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
883 drop_chapterStart.SelectedIndex = 1;
\r
885 int.TryParse(drop_chapterStart.Text, out c_start);
\r
886 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
890 if (c_end < c_start)
\r
891 drop_chapterFinish.Text = c_start.ToString();
\r
894 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
896 // Run the Autonaming function
\r
897 if (Properties.Settings.Default.autoNaming == "Checked")
\r
898 text_destination.Text = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
900 // Add more rows to the Chapter menu if needed.
\r
901 if (Check_ChapterMarkers.Checked)
\r
903 int i = data_chpt.Rows.Count, finish = 0;
\r
905 if (drop_chapterFinish.Text != "Auto")
\r
906 int.TryParse(drop_chapterFinish.Text, out finish);
\r
910 int n = data_chpt.Rows.Add();
\r
911 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
912 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
913 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
914 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
921 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
923 // This removes the file extension from the filename box on the save file dialog.
\r
924 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
925 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
927 // Show the dialog and set the main form file path
\r
928 if (drop_format.SelectedIndex.Equals(0))
\r
929 DVD_Save.FilterIndex = 1;
\r
930 else if (drop_format.SelectedIndex.Equals(1))
\r
931 DVD_Save.FilterIndex = 2;
\r
932 else if (drop_format.SelectedIndex.Equals(2))
\r
933 DVD_Save.FilterIndex = 3;
\r
934 else if (drop_format.SelectedIndex.Equals(3))
\r
935 DVD_Save.FilterIndex = 4;
\r
936 else if (drop_format.SelectedIndex.Equals(4))
\r
937 DVD_Save.FilterIndex = 5;
\r
939 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
941 if (DVD_Save.FileName.StartsWith("\\"))
\r
942 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
945 setAudioByContainer(DVD_Save.FileName);
\r
946 text_destination.Text = DVD_Save.FileName;
\r
948 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
949 if (Check_ChapterMarkers.Checked)
\r
950 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
954 private void text_destination_TextChanged(object sender, EventArgs e)
\r
956 string path = text_destination.Text;
\r
957 if (path.EndsWith(".mp4"))
\r
958 drop_format.SelectedIndex = 0;
\r
959 else if (path.EndsWith(".m4v"))
\r
960 drop_format.SelectedIndex = 1;
\r
961 else if (path.EndsWith(".mkv"))
\r
962 drop_format.SelectedIndex = 2;
\r
963 else if (path.EndsWith(".avi"))
\r
964 drop_format.SelectedIndex = 3;
\r
965 else if (path.EndsWith(".ogm"))
\r
966 drop_format.SelectedIndex = 4;
\r
971 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
973 if (drop_format.SelectedIndex == 0)
\r
974 setExtension(".mp4");
\r
975 else if (drop_format.SelectedIndex == 1)
\r
976 setExtension(".m4v");
\r
977 else if (drop_format.SelectedIndex == 2)
\r
978 setExtension(".mkv");
\r
979 else if (drop_format.SelectedIndex == 3)
\r
980 setExtension(".avi");
\r
981 else if (drop_format.SelectedIndex == 4)
\r
982 setExtension(".ogm");
\r
984 setAudioByContainer(drop_format.Text);
\r
985 setVideoByContainer(drop_format.Text);
\r
987 private void setExtension(string newExtension)
\r
989 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
990 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
991 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
992 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
993 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
997 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
999 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1001 check_largeFile.Enabled = true;
\r
1002 check_optimiseMP4.Enabled = true;
\r
1003 check_iPodAtom.Enabled = true;
\r
1007 check_largeFile.Enabled = false;
\r
1008 check_optimiseMP4.Enabled = false;
\r
1009 check_iPodAtom.Enabled = false;
\r
1010 check_largeFile.Checked = false;
\r
1011 check_optimiseMP4.Checked = false;
\r
1012 check_iPodAtom.Checked = false;
\r
1015 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1016 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1018 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1019 check_turbo.Enabled = true;
\r
1021 h264Tab.Enabled = true;
\r
1022 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1023 check_iPodAtom.Enabled = true;
\r
1025 check_iPodAtom.Enabled = false;
\r
1029 check_turbo.CheckState = CheckState.Unchecked;
\r
1030 check_turbo.Enabled = false;
\r
1031 h264Tab.Enabled = false;
\r
1032 x264Panel.x264Query = "";
\r
1033 check_iPodAtom.Enabled = false;
\r
1034 check_iPodAtom.Checked = false;
\r
1037 // Setup the CQ Slider
\r
1038 switch (drp_videoEncoder.Text)
\r
1040 case "MPEG-4 (FFmpeg)":
\r
1041 slider_videoQuality.Minimum = 1;
\r
1042 slider_videoQuality.Maximum = 31;
\r
1043 slider_videoQuality.Value = 1;
\r
1044 SliderValue.Text = "0% QP: 31.00";
\r
1046 case "MPEG-4 (XviD)":
\r
1047 slider_videoQuality.Minimum = 1;
\r
1048 slider_videoQuality.Maximum = 31;
\r
1049 slider_videoQuality.Value = 1;
\r
1050 SliderValue.Text = "0% QP: 31.00";
\r
1052 case "H.264 (x264)":
\r
1053 slider_videoQuality.Minimum = 0;
\r
1054 slider_videoQuality.Value = 0;
\r
1055 slider_videoQuality.TickFrequency = 1;
\r
1056 SliderValue.Text = "0% RF: 51.00";
\r
1057 String step = Properties.Settings.Default.x264cqstep;
\r
1061 slider_videoQuality.Maximum = 255;
\r
1064 slider_videoQuality.Maximum = 204;
\r
1067 slider_videoQuality.Maximum = 155;
\r
1070 slider_videoQuality.Maximum = 102;
\r
1073 slider_videoQuality.Maximum = 51;
\r
1076 slider_videoQuality.Maximum = 51;
\r
1080 case "VP3 (Theora)":
\r
1081 slider_videoQuality.Minimum = 0;
\r
1082 slider_videoQuality.Maximum = 63;
\r
1083 slider_videoQuality.Value = 0;
\r
1084 SliderValue.Text = "0% QP: 0.00";
\r
1088 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1090 switch (drp_videoEncoder.Text)
\r
1092 case "MPEG-4 (FFmpeg)":
\r
1093 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1094 double max = slider_videoQuality.Maximum;
\r
1095 double min = slider_videoQuality.Minimum;
\r
1096 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1097 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1099 case "MPEG-4 (XviD)":
\r
1100 rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1101 max = slider_videoQuality.Maximum;
\r
1102 min = slider_videoQuality.Minimum;
\r
1103 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1104 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1106 case "H.264 (x264)":
\r
1108 double.TryParse(Properties.Settings.Default.x264cqstep, out divided);
\r
1109 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1110 max = slider_videoQuality.Maximum * divided;
\r
1111 min = slider_videoQuality.Minimum;
\r
1112 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1113 rfValue = Math.Round(rfValue, 2);
\r
1114 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1116 case "VP3 (Theora)":
\r
1117 rfValue = slider_videoQuality.Value;
\r
1118 double value = rfValue / 63;
\r
1119 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1123 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1125 text_bitrate.Enabled = false;
\r
1126 text_filesize.Enabled = true;
\r
1127 slider_videoQuality.Enabled = false;
\r
1129 check_2PassEncode.Enabled = true;
\r
1131 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1133 text_bitrate.Enabled = true;
\r
1134 text_filesize.Enabled = false;
\r
1135 slider_videoQuality.Enabled = false;
\r
1137 check_2PassEncode.Enabled = true;
\r
1139 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1141 text_bitrate.Enabled = false;
\r
1142 text_filesize.Enabled = false;
\r
1143 slider_videoQuality.Enabled = true;
\r
1145 check_2PassEncode.Enabled = false;
\r
1146 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1148 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1150 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1152 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1153 check_turbo.Enabled = true;
\r
1157 check_turbo.Enabled = false;
\r
1158 check_turbo.CheckState = CheckState.Unchecked;
\r
1163 private void text_width_TextChanged(object sender, EventArgs e)
\r
1165 if (text_width.Text == "")
\r
1166 text_width.BackColor = Color.White;
\r
1168 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
1171 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1174 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1176 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1178 if (drp_anamorphic.Text == "None")
\r
1180 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1182 text_height.Text = height.ToString();
\r
1187 private void text_height_TextChanged(object sender, EventArgs e)
\r
1189 if (text_height.Text == "")
\r
1190 text_height.BackColor = Color.White;
\r
1192 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1195 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1197 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1199 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1201 text_left.Enabled = true;
\r
1202 text_right.Enabled = true;
\r
1203 text_top.Enabled = true;
\r
1204 text_bottom.Enabled = true;
\r
1205 if (selectedTitle != null)
\r
1207 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1208 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1209 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1210 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1214 text_left.Text = "0";
\r
1215 text_right.Text = "0";
\r
1216 text_top.Text = "0";
\r
1217 text_bottom.Text = "0";
\r
1220 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1222 text_left.Enabled = false;
\r
1223 text_right.Enabled = false;
\r
1224 text_top.Enabled = false;
\r
1225 text_bottom.Enabled = false;
\r
1227 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1229 if (drp_anamorphic.SelectedIndex == 1)
\r
1231 text_height.BackColor = Color.LightGray;
\r
1232 text_width.BackColor = Color.LightGray;
\r
1233 text_height.Text = "";
\r
1234 text_width.Text = "";
\r
1235 text_height.Enabled = false;
\r
1236 text_width.Enabled = false;
\r
1239 if (drp_anamorphic.SelectedIndex == 2)
\r
1241 text_height.Text = "";
\r
1242 text_height.Enabled = false;
\r
1243 text_height.BackColor = Color.LightGray;
\r
1245 text_width.Enabled = true;
\r
1246 text_width.BackColor = Color.White;
\r
1249 if (drp_anamorphic.SelectedIndex == 0)
\r
1251 text_height.BackColor = Color.White;
\r
1252 text_width.BackColor = Color.White;
\r
1253 text_height.Enabled = true;
\r
1254 text_width.Enabled = true;
\r
1259 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1261 if (ctl_decomb.getDropValue != "Off")
\r
1262 if (ctl_deinterlace.getDropValue != "None")
\r
1263 ctl_deinterlace.setOption("None");
\r
1265 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1267 if (ctl_detelecine.getDropValue != "None")
\r
1268 if (ctl_decomb.getDropValue != "Off")
\r
1269 ctl_decomb.setOption("Off");
\r
1271 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1273 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1277 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1279 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1281 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1282 lv_audioList.Select();
\r
1285 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1287 if (drp_audenc_1.Text == "AC3")
\r
1289 drp_audmix_1.Enabled = false;
\r
1290 drp_audbit_1.Enabled = false;
\r
1291 drp_audsr_1.Enabled = false;
\r
1293 drp_audmix_1.SelectedIndex = 0;
\r
1294 drp_audbit_1.SelectedIndex = 0;
\r
1295 drp_audsr_1.SelectedIndex = 0;
\r
1299 drp_audmix_1.Enabled = true;
\r
1300 drp_audbit_1.Enabled = true;
\r
1301 drp_audsr_1.Enabled = true;
\r
1303 drp_audmix_1.Text = "Automatic";
\r
1304 drp_audbit_1.Text = "160";
\r
1305 drp_audsr_1.Text = "Auto";
\r
1308 if (drp_audenc_1.Text == "AAC")
\r
1310 setMixDownAllOptions(drp_audmix_1);
\r
1311 setBitrateSelections160(drp_audbit_1);
\r
1315 setMixDownNotAAC(drp_audmix_1);
\r
1316 setBitrateSelections320(drp_audbit_1);
\r
1319 // Update an item in the Audio list if required.
\r
1320 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1322 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1323 lv_audioList.Select();
\r
1326 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1328 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1329 setBitrateSelections384(drp_audbit_1);
\r
1330 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1331 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1333 // Update an item in the Audio list if required.
\r
1334 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1336 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1337 lv_audioList.Select();
\r
1340 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1342 // Update an item in the Audio list if required.
\r
1343 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1345 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1346 lv_audioList.Select();
\r
1349 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1351 // Update an item in the Audio list if required.
\r
1352 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1354 if (drp_audenc_1.Text == "AC3")
\r
1355 drp_audbit_1.Text = "Auto";
\r
1356 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1357 lv_audioList.Select();
\r
1360 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1363 if (tb_drc.Value == 0) value = 0;
\r
1365 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1367 lbl_drc.Text = value.ToString();
\r
1369 // Update an item in the Audio list if required.
\r
1370 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1372 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1373 lv_audioList.Select();
\r
1377 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1379 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1380 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1381 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1382 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1383 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1384 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1385 newTrack.SubItems.Add(lbl_drc.Text);
\r
1387 // Select the newly added track and select the control
\r
1388 lv_audioList.Items.Add(newTrack);
\r
1389 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1390 lv_audioList.Select();
\r
1392 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1394 removeAudioTrack();
\r
1396 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1398 if (lv_audioList.SelectedIndices.Count != 0)
\r
1400 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1401 int index = item.Index;
\r
1404 if (lv_audioList.Items.Count > index && index >= 0)
\r
1406 lv_audioList.Items.Remove(item);
\r
1407 lv_audioList.Items.Insert(index, item);
\r
1408 item.Selected = true;
\r
1409 lv_audioList.Focus();
\r
1413 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1415 if (lv_audioList.SelectedIndices.Count != 0)
\r
1417 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1418 int index = item.Index;
\r
1421 if (index < lv_audioList.Items.Count)
\r
1423 lv_audioList.Items.Remove(item);
\r
1424 lv_audioList.Items.Insert(index, item);
\r
1425 item.Selected = true;
\r
1426 lv_audioList.Focus();
\r
1431 private void audioList_remove_Click(object sender, EventArgs e)
\r
1433 removeAudioTrack();
\r
1435 private void removeAudioTrack()
\r
1437 // Remove the Item and reselect the control if the following conditions are met.
\r
1438 if (lv_audioList.SelectedItems.Count != 0)
\r
1440 // Record the current selected index.
\r
1441 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1443 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1445 // Now reslect the correct item and give focus to the audio list.
\r
1446 if (lv_audioList.Items.Count != 0)
\r
1448 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1449 lv_audioList.Items[currentPosition].Selected = true;
\r
1450 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1451 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1453 lv_audioList.Select();
\r
1457 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1459 // Set the dropdown controls based on the selected item in the Audio List.
\r
1460 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1462 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1463 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1464 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1465 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1466 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1467 double drcValue; int drcCalculated;
\r
1468 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1469 if (drcValue == 0) drcCalculated = 0;
\r
1471 drcValue = ((drcValue * 10) + 1) - 10;
\r
1472 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1473 tb_drc.Value = drcCalculated;
\r
1477 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1479 if (drp_subtitle.Text.Contains("None"))
\r
1481 check_forced.Enabled = false;
\r
1482 check_forced.Checked = false;
\r
1485 check_forced.Enabled = true;
\r
1488 // Chapter Marker Tab
\r
1489 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1491 if (Check_ChapterMarkers.Checked)
\r
1493 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1494 data_chpt.Rows.Clear();
\r
1495 data_chpt.Enabled = true;
\r
1496 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1497 if (chapterGridView != null)
\r
1498 data_chpt = chapterGridView;
\r
1502 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1503 data_chpt.Rows.Clear();
\r
1504 data_chpt.Enabled = false;
\r
1508 // Query Editor Tab
\r
1509 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1511 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1513 private void btn_clear_Click(object sender, EventArgs e)
\r
1515 rtf_query.Clear();
\r
1519 // MainWindow Components, Actions and Functions ***********************
\r
1521 #region Source Scan
\r
1522 private void setupGUIforScan(String filename)
\r
1524 text_source.Text = filename;
\r
1526 foreach (Control ctrl in Controls)
\r
1528 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1529 ctrl.Enabled = false;
\r
1531 lbl_encode.Visible = true;
\r
1532 lbl_encode.Text = "Scanning ...";
\r
1533 gb_source.Text = "Source: Scanning ...";
\r
1534 btn_source.Enabled = false;
\r
1535 btn_start.Enabled = false;
\r
1536 btn_showQueue.Enabled = false;
\r
1537 btn_add2Queue.Enabled = false;
\r
1538 tb_preview.Enabled = false;
\r
1539 mnu_killCLI.Visible = true;
\r
1541 private void startScan(String filename)
\r
1545 lbl_encode.Visible = true;
\r
1546 lbl_encode.Text = "Scanning...";
\r
1547 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1549 catch (Exception exc)
\r
1551 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1554 private void scanProcess(object state)
\r
1558 string inputFile = (string)state;
\r
1559 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1560 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1562 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1563 if (File.Exists(dvdInfoPath))
\r
1564 File.Delete(dvdInfoPath);
\r
1566 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1568 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine);
\r
1569 hbParseDvd.WindowStyle = ProcessWindowStyle.Hidden;
\r
1571 using (hbproc = Process.Start(hbParseDvd))
\r
1573 hbproc.WaitForExit();
\r
1576 if (!File.Exists(dvdInfoPath))
\r
1578 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1581 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1583 thisDVD = Parsing.DVD.Parse(sr);
\r
1588 updateUIafterScan();
\r
1590 catch (Exception exc)
\r
1592 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1596 private void updateUIafterScan()
\r
1600 if (InvokeRequired)
\r
1602 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1606 // Setup some GUI components
\r
1607 drp_dvdtitle.Items.Clear();
\r
1608 if (thisDVD.Titles.Count != 0)
\r
1609 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1610 drp_dvdtitle.Text = "Automatic";
\r
1611 drop_chapterFinish.Text = "Auto";
\r
1612 drop_chapterStart.Text = "Auto";
\r
1614 // Now select the longest title
\r
1615 if (thisDVD.Titles.Count != 0)
\r
1616 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1618 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1619 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1620 Check_ChapterMarkers.Enabled = true;
\r
1623 Check_ChapterMarkers.Enabled = false;
\r
1624 Check_ChapterMarkers.Checked = false;
\r
1625 data_chpt.Rows.Clear();
\r
1628 // If no titles were found, Display an error message
\r
1629 if (drp_dvdtitle.Items.Count == 0)
\r
1630 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
1632 // Enable the GUI components and enable any disabled components
\r
1635 catch (Exception exc)
\r
1637 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1642 private void enableGUI()
\r
1646 if (InvokeRequired)
\r
1648 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1650 lbl_encode.Text = "Scan Completed";
\r
1651 gb_source.Text = "Source";
\r
1652 foreach (Control ctrl in Controls)
\r
1653 ctrl.Enabled = true;
\r
1654 btn_start.Enabled = true;
\r
1655 btn_showQueue.Enabled = true;
\r
1656 btn_add2Queue.Enabled = true;
\r
1657 tb_preview.Enabled = true;
\r
1658 btn_source.Enabled = true;
\r
1659 mnu_killCLI.Visible = false;
\r
1661 catch (Exception exc)
\r
1663 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1666 private static void killCLI()
\r
1668 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1669 // hbproc.kill/close just won't do the trick.
\r
1672 string AppName = "HandBrakeCLI";
\r
1674 AppName = AppName.ToUpper();
\r
1676 System.Diagnostics.Process[] prs = Process.GetProcesses();
\r
1677 foreach (System.Diagnostics.Process proces in prs)
\r
1679 if (proces.ProcessName.ToUpper() == AppName)
\r
1682 if (!proces.HasExited)
\r
1687 catch (Exception ex)
\r
1689 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
1694 #region DVD Drive Detection
\r
1695 // Source Button Drive Detection
\r
1696 private delegate void ProgressUpdateHandler();
\r
1697 private void getDriveInfoThread()
\r
1701 if (InvokeRequired)
\r
1703 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1707 Boolean foundDrive = false;
\r
1708 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1709 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1711 if (curDrive.DriveType == DriveType.CDRom)
\r
1713 if (curDrive.IsReady)
\r
1715 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1716 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1718 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1720 foundDrive = true;
\r
1726 if (foundDrive == false)
\r
1727 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1731 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1736 #region Audio Panel Code Helpers
\r
1737 private void setAudioByContainer(String path)
\r
1741 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1743 oldval = drp_audenc_1.Text;
\r
1744 drp_audenc_1.Items.Clear();
\r
1745 drp_audenc_1.Items.Add("AAC");
\r
1746 drp_audenc_1.Items.Add("AC3");
\r
1747 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1748 drp_audenc_1.SelectedIndex = 0;
\r
1751 else if (path.Contains("AVI"))
\r
1753 oldval = drp_audenc_1.Text;
\r
1754 drp_audenc_1.Items.Clear();
\r
1755 drp_audenc_1.Items.Add("MP3");
\r
1756 drp_audenc_1.Items.Add("AC3");
\r
1757 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1758 drp_audenc_1.SelectedIndex = 0;
\r
1761 else if (path.Contains("OGM"))
\r
1763 drp_audenc_1.Items.Clear();
\r
1764 drp_audenc_1.Items.Add("Vorbis");
\r
1765 drp_audenc_1.SelectedIndex = 0;
\r
1768 else if (path.Contains("MKV"))
\r
1770 drp_audenc_1.Items.Clear();
\r
1771 drp_audenc_1.Items.Add("AAC");
\r
1772 drp_audenc_1.Items.Add("MP3");
\r
1773 drp_audenc_1.Items.Add("AC3");
\r
1774 drp_audenc_1.Items.Add("Vorbis");
\r
1775 if (drp_audenc_1.Text == string.Empty)
\r
1776 drp_audenc_1.SelectedIndex = 0;
\r
1779 // Make sure the table is updated with new audio codecs
\r
1780 foreach (ListViewItem row in lv_audioList.Items)
\r
1782 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1783 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1786 private void setVideoByContainer(String path)
\r
1790 if ((path.Contains("MP3")) || (path.Contains("M4V")))
\r
1792 oldval = drp_videoEncoder.Text;
\r
1793 drp_videoEncoder.Items.Clear();
\r
1794 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1795 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1796 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1797 if (oldval == "VP3 (Theora)")
\r
1798 drp_videoEncoder.SelectedIndex = 2;
\r
1800 drp_videoEncoder.Text = oldval;
\r
1803 else if (path.Contains("AVI"))
\r
1805 oldval = drp_videoEncoder.Text;
\r
1806 drp_videoEncoder.Items.Clear();
\r
1807 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1808 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1809 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1810 if (oldval == "VP3 (Theora)")
\r
1811 drp_videoEncoder.SelectedIndex = 2;
\r
1813 drp_videoEncoder.Text = oldval;
\r
1815 else if (path.Contains("OGM"))
\r
1817 oldval = drp_videoEncoder.Text;
\r
1818 drp_videoEncoder.Items.Clear();
\r
1819 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1820 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1821 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1822 if (oldval == "H.264 (x264)")
\r
1823 drp_videoEncoder.SelectedIndex = 2;
\r
1825 drp_videoEncoder.Text = oldval;
\r
1827 else if (path.Contains("MKV"))
\r
1829 oldval = drp_videoEncoder.Text;
\r
1830 drp_videoEncoder.Items.Clear();
\r
1831 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1832 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1833 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1834 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1835 drp_videoEncoder.Text = oldval;
\r
1838 private void setBitrateSelections384(ComboBox dropDown)
\r
1840 dropDown.Items.Clear();
\r
1841 dropDown.Items.Add("32");
\r
1842 dropDown.Items.Add("40");
\r
1843 dropDown.Items.Add("48");
\r
1844 dropDown.Items.Add("56");
\r
1845 dropDown.Items.Add("64");
\r
1846 dropDown.Items.Add("80");
\r
1847 dropDown.Items.Add("86");
\r
1848 dropDown.Items.Add("112");
\r
1849 dropDown.Items.Add("128");
\r
1850 dropDown.Items.Add("160");
\r
1851 dropDown.Items.Add("192");
\r
1852 dropDown.Items.Add("224");
\r
1853 dropDown.Items.Add("256");
\r
1854 dropDown.Items.Add("320");
\r
1855 dropDown.Items.Add("384");
\r
1857 private void setBitrateSelections320(ComboBox dropDown)
\r
1859 dropDown.Items.Clear();
\r
1860 dropDown.Items.Add("32");
\r
1861 dropDown.Items.Add("40");
\r
1862 dropDown.Items.Add("48");
\r
1863 dropDown.Items.Add("56");
\r
1864 dropDown.Items.Add("64");
\r
1865 dropDown.Items.Add("80");
\r
1866 dropDown.Items.Add("86");
\r
1867 dropDown.Items.Add("112");
\r
1868 dropDown.Items.Add("128");
\r
1869 dropDown.Items.Add("160");
\r
1870 dropDown.Items.Add("192");
\r
1871 dropDown.Items.Add("224");
\r
1872 dropDown.Items.Add("256");
\r
1873 dropDown.Items.Add("320");
\r
1875 private void setBitrateSelections160(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
1889 private void setMixDownAllOptions(ComboBox dropdown)
\r
1891 dropdown.Items.Clear();
\r
1892 dropdown.Items.Add("Automatic");
\r
1893 dropdown.Items.Add("Mono");
\r
1894 dropdown.Items.Add("Stereo");
\r
1895 dropdown.Items.Add("Dolby Surround");
\r
1896 dropdown.Items.Add("Dolby Pro Logic II");
\r
1897 dropdown.Items.Add("6 Channel Discrete");
\r
1899 private void setMixDownNotAAC(ComboBox dropdown)
\r
1901 dropdown.Items.Clear();
\r
1902 dropdown.Items.Add("Automatic");
\r
1903 dropdown.Items.Add("Stereo");
\r
1904 dropdown.Items.Add("Dolby Surround");
\r
1905 dropdown.Items.Add("Dolby Pro Logic II");
\r
1909 #region Public Methods
\r
1912 /// Setup the GUI for Encoding or finished Encoding.
\r
1913 /// 1 = Encode Running
\r
1914 /// 0 = Encode Finished.
\r
1916 public void setEncodeFinished()
\r
1920 if (InvokeRequired)
\r
1922 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1926 lbl_encode.Text = "Encoding Finished";
\r
1927 btn_start.Text = "Start";
\r
1928 btn_start.ToolTipText = "Start the encoding process";
\r
1929 btn_start.Image = Properties.Resources.Play;
\r
1931 // If the window is minimized, display the notification in a popup.
\r
1932 if (FormWindowState.Minimized == this.WindowState)
\r
1934 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1935 notifyIcon.ShowBalloonTip(500);
\r
1938 catch (Exception exc)
\r
1940 MessageBox.Show(exc.ToString());
\r
1943 public void setEncodeStarted()
\r
1947 if (InvokeRequired)
\r
1949 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1953 lbl_encode.Visible = true;
\r
1954 lbl_encode.Text = "Encoding in Progress";
\r
1955 btn_start.Text = "Stop";
\r
1956 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
1957 btn_start.Image = Properties.Resources.stop;
\r
1959 catch (Exception exc)
\r
1961 MessageBox.Show(exc.ToString());
\r
1966 /// Action can be "encode" or "scan"
\r
1967 /// Set the last action varible in the main window.
\r
1968 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1970 /// <param name="last">String</param>
\r
1971 public void setLastAction(string last)
\r
1973 this.lastAction = last;
\r
1977 /// DVD parseing. Pass in a parsed DVD.
\r
1979 /// <param name="dvd"></param>
\r
1980 public void setStreamReader(Parsing.DVD dvd)
\r
1982 this.thisDVD = dvd;
\r
1986 /// Reload the preset panel display
\r
1988 public void loadPresetPanel()
\r
1990 presetHandler.loadPresetData();
\r
1992 treeView_presets.Nodes.Clear();
\r
1994 List<Presets.Preset> presetNameList;
\r
1995 List<string> presetNames;
\r
1996 TreeNode preset_treeview;
\r
1998 TreeNode rootNode = new TreeNode();
\r
1999 TreeNode rootNodeTwo = new TreeNode();
\r
2000 TreeNode childNode;
\r
2001 int workingLevel = 0;
\r
2002 string previousCategory = String.Empty;
\r
2003 string currentCategory = String.Empty;
\r
2005 presetNameList = presetHandler.getBuildInPresets();
\r
2006 if (presetNameList.Count != 0)
\r
2008 foreach (Presets.Preset preset in presetNameList)
\r
2010 // Handle Root Nodes
\r
2012 // First Case - No presets have been read yet so setup the root category
\r
2013 if (preset.Level == 1 && currentCategory == String.Empty)
\r
2015 rootNode = new TreeNode(preset.Category);
\r
2016 workingLevel = preset.Level;
\r
2017 currentCategory = preset.Category;
\r
2018 previousCategory = preset.Category;
\r
2021 // Second Case - This is the first sub child node.
\r
2022 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2024 rootNodeTwo = new TreeNode(preset.Category);
\r
2025 workingLevel = preset.Level;
\r
2026 currentCategory = preset.Category;
\r
2027 rootNode.Nodes.Add(rootNodeTwo);
\r
2030 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2031 if (preset.Level == 1 && workingLevel == 2)
\r
2033 workingLevel = preset.Level;
\r
2034 currentCategory = preset.Category;
\r
2037 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2038 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2040 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2042 rootNode = new TreeNode(preset.Category);
\r
2043 workingLevel = preset.Level;
\r
2044 currentCategory = preset.Category;
\r
2045 previousCategory = preset.Category;
\r
2048 // Handle Child Nodes
\r
2049 // Add First level child nodes to the current root node
\r
2050 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2052 childNode = new TreeNode(preset.Name);
\r
2053 rootNode.Nodes.Add(childNode);
\r
2056 // Add Second level child nodes to the current sub root node
\r
2057 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2059 childNode = new TreeNode(preset.Name);
\r
2060 rootNodeTwo.Nodes.Add(childNode);
\r
2064 // Add the final root node which does not get added above.
\r
2065 treeView_presets.Nodes.Add(rootNode);
\r
2069 presetNames = presetHandler.getUserPresetNames();
\r
2070 foreach (string preset in presetNames)
\r
2072 preset_treeview = new TreeNode(preset);
\r
2073 preset_treeview.ForeColor = Color.Black;
\r
2075 // Now Fill Out List View with Items
\r
2076 treeView_presets.Nodes.Add(preset_treeview);
\r
2082 // This is the END of the road ------------------------------------------------------------------------------
\r