3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.Functions;
\r
16 using Handbrake.Presets;
\r
20 public partial class frmMain : Form
\r
22 // Objects which may be used by one or more other objects
\r
23 private delegate void UpdateWindowHandler();
\r
24 Main hb_common_func = new Main();
\r
25 Encode encodeHandler = new Encode();
\r
26 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
27 PresetsHandler presetHandler = new PresetsHandler();
\r
28 Parsing.Title selectedTitle;
\r
29 Parsing.DVD thisDVD;
\r
31 // Objects belonging to this window only
\r
32 PresetLoader presetLoader = new PresetLoader();
\r
33 QueryGenerator queryGen = new QueryGenerator();
\r
35 // Globals: Mainly used for tracking.
\r
36 private frmQueue queueWindow;
\r
37 private frmPreview qtpreview;
\r
38 private string lastAction;
\r
39 public int maxWidth;
\r
40 public int maxHeight;
\r
42 private Form splash;
\r
44 // Applicaiton Startup ************************************************
\r
46 #region Application Startup
\r
50 // Load the splash screen in this thread
\r
51 splash = new frmSplashScreen();
\r
54 //Create a label that can be updated from the parent thread.
\r
55 Label lblStatus = new Label { Size = new Size(250, 20), 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
77 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
78 updateCheckThread.Start();
\r
81 // Setup the GUI components
\r
82 lblStatus.Text = "Setting up the GUI ...";
\r
83 Application.DoEvents();
\r
84 x264Panel.reset2Defaults(); // Initialize all the x264 widgets to their default values
\r
85 loadPresetPanel(); // Load the Preset Panel
\r
86 treeView_presets.ExpandAll();
\r
87 lbl_encode.Text = "";
\r
89 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
90 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
91 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
93 // Load the user's default settings or Normal Preset
\r
94 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
96 // Ok, so, we've selected a preset. Now we want to load it.
\r
97 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
99 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
100 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
104 //Ok, Reset all the H264 widgets before changing the preset
\r
105 x264Panel.reset2Defaults();
\r
107 // Send the query from the file to the Query Parser class, then load the preset
\r
108 QueryParser presetQuery = QueryParser.Parse(query);
\r
109 PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
111 // The x264 widgets will need updated, so do this now:
\r
112 x264Panel.X264_StandardizeOptString();
\r
113 x264Panel.X264_SetCurrentSettingsInPanel();
\r
117 loadNormalPreset();
\r
120 loadNormalPreset();
\r
122 // Enabled GUI tooltip's if Required
\r
123 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
125 x264Panel.setToolTipActive(true);
\r
126 ToolTip.Active = true;
\r
130 lblStatus.Text = "Loading Complete!";
\r
131 Application.DoEvents();
\r
134 this.Enabled = true;
\r
143 // Startup Functions
\r
144 private delegate void updateStatusChanger();
\r
145 private void startupUpdateCheck()
\r
149 if (InvokeRequired)
\r
151 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
155 Boolean update = hb_common_func.updateCheck(false);
\r
158 frmUpdater updateWindow = new frmUpdater();
\r
159 updateWindow.Show();
\r
162 catch (Exception exc)
\r
164 MessageBox.Show(splash, "Unable to perform update check. If this problem persists, you can turn of update checking in the program options. \nError Information: \n\n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
167 private void queueRecovery()
\r
169 if (hb_common_func.check_queue_recovery())
\r
171 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
173 if (result == DialogResult.Yes)
\r
174 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
177 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
178 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
179 if (File.Exists(queuePath))
\r
180 File.Delete(queuePath);
\r
187 // Encoding Events for setting up the GUI
\r
188 private void events()
\r
190 // Handle Window Resize
\r
191 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
192 this.Resize += new EventHandler(frmMain_Resize);
\r
194 // Handle Encode Start / Finish / Pause
\r
195 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
196 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
197 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
199 // Handle a file being draged onto the GUI.
\r
200 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
201 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
204 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
206 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
207 e.Effect = DragDropEffects.All;
\r
209 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
211 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
212 if (fileList != null)
\r
214 if (fileList[0].StartsWith("\\"))
\r
215 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
218 if (fileList[0] != "")
\r
220 setupGUIforScan(fileList[0]);
\r
221 startScan(fileList[0]);
\r
224 text_source.Text = "Click 'Source' to continue";
\r
228 private void encodeStarted(object sender, EventArgs e)
\r
230 setLastAction("encode");
\r
231 setEncodeStarted();
\r
233 private void encodeEnded(object sender, EventArgs e)
\r
235 setEncodeFinished();
\r
237 private void encodePaused(object sender, EventArgs e)
\r
239 setEncodeFinished();
\r
243 // User Interface Menus / Tool Strips *********************************
\r
246 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
250 private void mnu_exit_Click(object sender, EventArgs e)
\r
252 Application.Exit();
\r
257 private void mnu_encode_Click(object sender, EventArgs e)
\r
259 queueWindow.Show();
\r
261 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
264 file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
266 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
267 dvdInfoWindow.Show();
\r
269 private void mnu_options_Click(object sender, EventArgs e)
\r
271 Form Options = new frmOptions();
\r
272 Options.ShowDialog();
\r
276 #region Presets Menu
\r
277 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
279 presetHandler.updateBuiltInPresets();
\r
281 if (treeView_presets.Nodes.Count == 0)
\r
282 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
284 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
286 treeView_presets.ExpandAll();
\r
288 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
290 // Empty the preset file
\r
291 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
292 if (File.Exists(presetsFile))
\r
293 File.Delete(presetsFile);
\r
297 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
301 catch (Exception exc)
\r
303 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
306 // Reload the preset panel
\r
309 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
311 loadNormalPreset();
\r
313 private void btn_new_preset_Click(object sender, EventArgs e)
\r
315 // Remember each nodes expanded status so we can reload it
\r
316 List<Boolean> nodeStatus = saveTreeViewState();
\r
317 nodeStatus.Add(true);
\r
319 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
320 preset.ShowDialog();
\r
322 // Now reload the TreeView states
\r
323 loadTreeViewStates(nodeStatus);
\r
328 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
330 Process.Start("http://forum.handbrake.fr/");
\r
332 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
334 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
336 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
338 Process.Start("http://handbrake.fr");
\r
340 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
342 Boolean update = hb_common_func.updateCheck(true);
\r
345 frmUpdater updateWindow = new frmUpdater();
\r
346 updateWindow.Show();
\r
349 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
351 private void mnu_about_Click(object sender, EventArgs e)
\r
353 Form About = new frmAbout();
\r
354 About.ShowDialog();
\r
359 private void mnu_qptest_Click(object sender, EventArgs e)
\r
361 QueryParserTester qptest = new QueryParserTester();
\r
367 // Right Click Menu Code
\r
368 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
370 treeView_presets.ExpandAll();
\r
372 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
374 treeView_presets.CollapseAll();
\r
376 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
378 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
379 if (result == DialogResult.Yes)
\r
380 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
381 else if (result == DialogResult.No)
\r
382 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
384 private void pmnu_delete_click(object sender, EventArgs e)
\r
386 if (treeView_presets.SelectedNode != null)
\r
388 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
390 // Remember each nodes expanded status so we can reload it
\r
391 List<Boolean> nodeStatus = saveTreeViewState();
\r
393 // Now reload the preset panel
\r
396 // Now reload the TreeView states
\r
397 loadTreeViewStates(nodeStatus);
\r
399 treeView_presets.Select();
\r
401 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
403 // Make sure that the save menu is always disabled by default
\r
404 pmnu_saveChanges.Enabled = false;
\r
406 // Now enable the save menu if the selected preset is a user preset
\r
407 if (treeView_presets.SelectedNode != null)
\r
409 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
411 pmnu_saveChanges.Enabled = true;
\r
414 treeView_presets.Select();
\r
417 // Presets Management
\r
418 private void btn_addPreset_Click(object sender, EventArgs e)
\r
420 // Remember each nodes expanded status so we can reload it
\r
421 List<Boolean> nodeStatus = saveTreeViewState();
\r
422 nodeStatus.Add(true);
\r
424 // Now add the new preset
\r
425 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
426 preset.ShowDialog();
\r
428 // Now reload the TreeView states
\r
429 loadTreeViewStates(nodeStatus);
\r
431 private void btn_removePreset_Click(object sender, EventArgs e)
\r
433 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
434 if (result == DialogResult.Yes)
\r
436 if (treeView_presets.SelectedNode != null)
\r
437 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
439 // Remember each nodes expanded status so we can reload it
\r
440 List<Boolean> nodeStatus = saveTreeViewState();
\r
442 // Now reload the preset panel
\r
445 // Now reload the TreeView states
\r
446 loadTreeViewStates(nodeStatus);
\r
448 treeView_presets.Select();
\r
450 private void btn_setDefault_Click(object sender, EventArgs e)
\r
452 if (treeView_presets.SelectedNode != null)
\r
454 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
455 if (result == DialogResult.Yes)
\r
457 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
458 Properties.Settings.Default.Save();
\r
459 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
463 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
465 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
467 if (e.Button == MouseButtons.Right)
\r
468 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
469 else if (e.Button == MouseButtons.Left)
\r
471 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
473 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
478 treeView_presets.Select();
\r
480 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
484 private void selectPreset()
\r
486 if (treeView_presets.SelectedNode != null)
\r
488 // Ok, so, we've selected a preset. Now we want to load it.
\r
489 string presetName = treeView_presets.SelectedNode.Text;
\r
490 if (presetHandler.getPreset(presetName) != null)
\r
492 string query = presetHandler.getPreset(presetName).Query;
\r
493 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
497 //Ok, Reset all the H264 widgets before changing the preset
\r
498 x264Panel.reset2Defaults();
\r
500 // Send the query from the file to the Query Parser class
\r
501 QueryParser presetQuery = QueryParser.Parse(query);
\r
503 // Now load the preset
\r
504 PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
506 // The x264 widgets will need updated, so do this now:
\r
507 x264Panel.X264_StandardizeOptString();
\r
508 x264Panel.X264_SetCurrentSettingsInPanel();
\r
510 if (maxWidth != 0 && maxHeight != 0)
\r
511 lbl_max.Text = "Max Width / Height";
\r
512 else if (maxWidth != 0)
\r
513 lbl_max.Text = "Max Width";
\r
520 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
522 if (e.KeyCode == Keys.Delete)
\r
524 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
525 if (result == DialogResult.Yes)
\r
527 if (treeView_presets.SelectedNode != null)
\r
528 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
530 // Remember each nodes expanded status so we can reload it
\r
531 List<Boolean> nodeStatus = new List<Boolean>();
\r
532 foreach (TreeNode node in treeView_presets.Nodes)
\r
533 nodeStatus.Add(node.IsExpanded);
\r
535 // Now reload the preset panel
\r
538 // And finally, re-expand any of the nodes if required
\r
540 foreach (TreeNode node in treeView_presets.Nodes)
\r
550 private List<Boolean> saveTreeViewState()
\r
552 // Remember each nodes expanded status so we can reload it
\r
553 List<Boolean> nodeStatus = new List<Boolean>();
\r
554 foreach (TreeNode node in treeView_presets.Nodes)
\r
556 nodeStatus.Add(node.IsExpanded);
\r
557 foreach (TreeNode subNode in node.Nodes)
\r
558 nodeStatus.Add(node.IsExpanded);
\r
562 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
564 // And finally, re-expand any of the nodes if required
\r
566 foreach (TreeNode node in treeView_presets.Nodes)
\r
571 foreach (TreeNode subNode in node.Nodes)
\r
580 private void loadNormalPreset()
\r
582 treeView_presets.Nodes.Find("Normal", true);
\r
584 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
586 foreach (TreeNode node in treenode.Nodes)
\r
588 if (node.Text.Equals("Normal"))
\r
589 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
596 private void btn_source_Click(object sender, EventArgs e)
\r
598 if (Properties.Settings.Default.drive_detection == "Checked")
\r
600 mnu_dvd_drive.Visible = true;
\r
601 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
602 driveInfoThread.Start();
\r
605 mnu_dvd_drive.Visible = false;
\r
607 private void btn_start_Click(object sender, EventArgs e)
\r
609 if (btn_start.Text == "Stop")
\r
611 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
613 if (result == DialogResult.Yes)
\r
616 encodeQueue.pauseEncode();
\r
618 // Kill the current process.
\r
619 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
620 Process HandBrakeCLI;
\r
621 if (aProc.Length > 0)
\r
623 HandBrakeCLI = aProc[0];
\r
624 HandBrakeCLI.Kill();
\r
628 setEncodeFinished();
\r
633 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
635 // Set the last action to encode.
\r
636 // This is used for tracking which file to load in the activity window
\r
637 lastAction = "encode";
\r
639 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
641 if (encodeQueue.count() == 0)
\r
643 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
644 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
646 queueWindow.setQueue();
\r
647 if (encodeQueue.count() > 1)
\r
648 queueWindow.Show(false);
\r
650 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
651 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
654 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
655 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
659 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
661 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
662 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
665 String query = queryGen.GenerateTheQuery(this);
\r
666 if (rtf_query.Text != "")
\r
667 query = rtf_query.Text;
\r
670 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
672 DialogResult result = MessageBox.Show("There is already a queue item for this destination path. \n\n If you continue, the encode will be overwritten. Do you wish to continue?",
\r
673 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
674 if (result == DialogResult.Yes)
\r
675 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
679 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
681 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
682 queueWindow.Show();
\r
685 private void btn_showQueue_Click(object sender, EventArgs e)
\r
687 queueWindow.Show();
\r
689 private void tb_preview_Click(object sender, EventArgs e)
\r
691 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
692 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
695 if (qtpreview == null)
\r
697 qtpreview = new frmPreview(this);
\r
700 else if (qtpreview.IsDisposed)
\r
702 qtpreview = new frmPreview(this);
\r
706 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
709 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
711 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
713 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
714 ActivityWindow.Show();
\r
718 #region System Tray Icon
\r
719 private void frmMain_Resize(object sender, EventArgs e)
\r
721 if (FormWindowState.Minimized == this.WindowState)
\r
723 notifyIcon.Visible = true;
\r
724 if (!encodeQueue.isEncoding)
\r
726 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
727 notifyIcon.ShowBalloonTip(500);
\r
731 else if (FormWindowState.Normal == this.WindowState)
\r
732 notifyIcon.Visible = false;
\r
734 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
736 this.Visible = true;
\r
738 this.WindowState = FormWindowState.Normal;
\r
739 notifyIcon.Visible = false;
\r
741 private void btn_restore_Click(object sender, EventArgs e)
\r
743 this.Visible = true;
\r
745 this.WindowState = FormWindowState.Normal;
\r
746 notifyIcon.Visible = false;
\r
750 #region Tab Control
\r
753 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
755 // Enable the creation of chapter markers.
\r
756 Check_ChapterMarkers.Enabled = true;
\r
758 // Set the last action to scan.
\r
759 // This is used for tracking which file to load in the activity window
\r
760 lastAction = "scan";
\r
761 text_source.Text = "";
\r
763 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
765 String filename = DVD_Open.SelectedPath;
\r
767 if (filename.StartsWith("\\"))
\r
768 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
771 if (filename != "")
\r
773 setupGUIforScan(filename);
\r
774 startScan(filename);
\r
777 text_source.Text = "Click 'Source' to continue";
\r
781 text_source.Text = "Click 'Source' to continue";
\r
783 private void btn_file_source_Click(object sender, EventArgs e)
\r
785 // Set the last action to scan.
\r
786 // This is used for tracking which file to load in the activity window
\r
787 lastAction = "scan";
\r
788 text_source.Text = "";
\r
790 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
792 String filename = ISO_Open.FileName;
\r
793 if (filename.StartsWith("\\"))
\r
795 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
796 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
799 if (filename != "")
\r
801 setupGUIforScan(filename);
\r
802 startScan(filename);
\r
805 text_source.Text = "Click 'Source' to continue";
\r
809 text_source.Text = "Click 'Source' to continue";
\r
811 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
813 // Enable the creation of chapter markers.
\r
814 Check_ChapterMarkers.Enabled = true;
\r
816 // Set the last action to scan.
\r
817 // This is used for tracking which file to load in the activity window
\r
818 lastAction = "scan";
\r
820 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
822 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
823 String filename = path[0];
\r
824 setupGUIforScan(filename);
\r
825 startScan(filename);
\r
828 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
829 if (drp_dvdtitle.Items.Count == 0)
\r
830 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
832 lbl_encode.Text = "";
\r
834 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
836 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
837 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
839 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
841 // Reset some values on the form
\r
842 lbl_Aspect.Text = "Select a Title";
\r
843 //lbl_RecomendedCrop.Text = "Select a Title";
\r
844 drop_chapterStart.Items.Clear();
\r
845 drop_chapterFinish.Items.Clear();
\r
847 // If the dropdown is set to automatic nothing else needs to be done.
\r
848 // Otheriwse if its not, title data has to be loased from parsing.
\r
849 if (drp_dvdtitle.Text != "Automatic")
\r
851 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
853 // Set the Aspect Ratio
\r
854 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
855 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
856 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
858 // Set the Recommended Cropping values
\r
859 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
860 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
861 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
862 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
864 // Populate the Start chapter Dropdown
\r
865 drop_chapterStart.Items.Clear();
\r
866 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
867 if (drop_chapterStart.Items.Count > 0)
\r
868 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
870 // Populate the Final Chapter Dropdown
\r
871 drop_chapterFinish.Items.Clear();
\r
872 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
873 if (drop_chapterFinish.Items.Count > 0)
\r
874 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
876 // Populate the Audio Channels Dropdown
\r
877 drp_track1Audio.Items.Clear();
\r
878 drp_track1Audio.Items.Add("Automatic");
\r
879 drp_track1Audio.Items.Add("None");
\r
880 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
881 drp_track1Audio.SelectedIndex = 0;
\r
883 // Populate the Subtitles dropdown
\r
884 drp_subtitle.Items.Clear();
\r
885 drp_subtitle.Items.Add("None");
\r
886 drp_subtitle.Items.Add("Autoselect");
\r
887 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
888 if (drp_subtitle.Items.Count > 0)
\r
889 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
893 // Run the autoName & chapterNaming functions
\r
894 if (Properties.Settings.Default.autoNaming == "Checked")
\r
896 string autoPath = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
897 if (autoPath != null)
\r
898 text_destination.Text = autoPath;
\r
900 MessageBox.Show("You currently have automatic file naming enabled for the destination box, but you do not have a default direcotry set. You should set this in the program options (see Tools Menu)", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
903 data_chpt.Rows.Clear();
\r
904 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
905 if (chapterGridView != null)
\r
906 data_chpt = chapterGridView;
\r
908 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
909 data_chpt.Columns[0].Width = 166;
\r
910 data_chpt.Columns[0].Width = 165;
\r
912 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
914 int c_start, c_end;
\r
916 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
917 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
919 int.TryParse(drop_chapterStart.Text, out c_start);
\r
920 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
924 if (c_start > c_end)
\r
925 drop_chapterFinish.Text = c_start.ToString();
\r
928 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
930 // Run the Autonaming function
\r
931 if (Properties.Settings.Default.autoNaming == "Checked")
\r
932 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
935 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
937 int c_start, c_end;
\r
939 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
940 drop_chapterStart.SelectedIndex = 1;
\r
942 int.TryParse(drop_chapterStart.Text, out c_start);
\r
943 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
947 if (c_end < c_start)
\r
948 drop_chapterFinish.Text = c_start.ToString();
\r
951 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
953 // Run the Autonaming function
\r
954 if (Properties.Settings.Default.autoNaming == "Checked")
\r
955 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
957 // Add more rows to the Chapter menu if needed.
\r
958 if (Check_ChapterMarkers.Checked)
\r
960 int i = data_chpt.Rows.Count, finish = 0;
\r
962 if (drop_chapterFinish.Text != "Auto")
\r
963 int.TryParse(drop_chapterFinish.Text, out finish);
\r
967 int n = data_chpt.Rows.Add();
\r
968 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
969 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
970 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
971 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
978 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
980 // This removes the file extension from the filename box on the save file dialog.
\r
981 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
982 if (Path.HasExtension(text_destination.Text))
\r
983 DVD_Save.FileName = Path.Combine(Path.GetDirectoryName(text_destination.Text), Path.GetFileNameWithoutExtension(text_destination.Text));
\r
985 // Show the dialog and set the main form file path
\r
986 if (drop_format.SelectedIndex.Equals(0))
\r
987 DVD_Save.FilterIndex = 1;
\r
988 else if (drop_format.SelectedIndex.Equals(1))
\r
989 DVD_Save.FilterIndex = 2;
\r
990 else if (drop_format.SelectedIndex.Equals(2))
\r
991 DVD_Save.FilterIndex = 3;
\r
993 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
995 if (DVD_Save.FileName.StartsWith("\\"))
\r
996 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
999 setAudioByContainer(DVD_Save.FileName);
\r
1000 text_destination.Text = DVD_Save.FileName;
\r
1002 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
1003 if (Check_ChapterMarkers.Checked)
\r
1004 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
1008 private void text_destination_TextChanged(object sender, EventArgs e)
\r
1010 string path = text_destination.Text;
\r
1011 if (path.EndsWith(".mp4"))
\r
1012 drop_format.SelectedIndex = 0;
\r
1013 else if (path.EndsWith(".m4v"))
\r
1014 drop_format.SelectedIndex = 1;
\r
1015 else if (path.EndsWith(".mkv"))
\r
1016 drop_format.SelectedIndex = 2;
\r
1019 // Output Settings
\r
1020 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
1022 if (drop_format.SelectedIndex == 0)
\r
1023 setExtension(".mp4");
\r
1024 else if (drop_format.SelectedIndex == 1)
\r
1025 setExtension(".m4v");
\r
1026 else if (drop_format.SelectedIndex == 2)
\r
1027 setExtension(".mkv");
\r
1029 setAudioByContainer(drop_format.Text);
\r
1030 setVideoByContainer(drop_format.Text);
\r
1032 private void setExtension(string newExtension)
\r
1034 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1035 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1036 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1040 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1042 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1044 check_largeFile.Enabled = true;
\r
1045 check_optimiseMP4.Enabled = true;
\r
1046 check_iPodAtom.Enabled = true;
\r
1050 check_largeFile.Enabled = false;
\r
1051 check_optimiseMP4.Enabled = false;
\r
1052 check_iPodAtom.Enabled = false;
\r
1053 check_largeFile.Checked = false;
\r
1054 check_optimiseMP4.Checked = false;
\r
1055 check_iPodAtom.Checked = false;
\r
1058 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1059 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1061 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1062 check_turbo.Enabled = true;
\r
1064 h264Tab.Enabled = true;
\r
1065 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1066 check_iPodAtom.Enabled = true;
\r
1068 check_iPodAtom.Enabled = false;
\r
1072 check_turbo.CheckState = CheckState.Unchecked;
\r
1073 check_turbo.Enabled = false;
\r
1074 h264Tab.Enabled = false;
\r
1075 x264Panel.x264Query = "";
\r
1076 check_iPodAtom.Enabled = false;
\r
1077 check_iPodAtom.Checked = false;
\r
1080 // Setup the CQ Slider
\r
1081 switch (drp_videoEncoder.Text)
\r
1083 case "MPEG-4 (FFmpeg)":
\r
1084 slider_videoQuality.Minimum = 1;
\r
1085 slider_videoQuality.Maximum = 31;
\r
1086 slider_videoQuality.Value = 1;
\r
1087 SliderValue.Text = "0% QP: 31.00";
\r
1089 case "H.264 (x264)":
\r
1090 slider_videoQuality.Minimum = 0;
\r
1091 slider_videoQuality.Value = 0;
\r
1092 slider_videoQuality.TickFrequency = 1;
\r
1093 SliderValue.Text = "0% RF: 51.00";
\r
1094 String step = Properties.Settings.Default.x264cqstep;
\r
1098 slider_videoQuality.Maximum = 255;
\r
1101 slider_videoQuality.Maximum = 204;
\r
1104 slider_videoQuality.Maximum = 155;
\r
1107 slider_videoQuality.Maximum = 102;
\r
1110 slider_videoQuality.Maximum = 51;
\r
1113 slider_videoQuality.Maximum = 51;
\r
1117 case "VP3 (Theora)":
\r
1118 slider_videoQuality.Minimum = 0;
\r
1119 slider_videoQuality.Maximum = 63;
\r
1120 slider_videoQuality.Value = 0;
\r
1121 SliderValue.Text = "0% QP: 0.00";
\r
1125 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1127 switch (drp_videoEncoder.Text)
\r
1129 case "MPEG-4 (FFmpeg)":
\r
1130 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1131 double max = slider_videoQuality.Maximum;
\r
1132 double min = slider_videoQuality.Minimum;
\r
1133 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1134 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1136 case "H.264 (x264)":
\r
1138 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1139 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1140 System.Globalization.NumberStyles.Number,
\r
1143 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1144 max = slider_videoQuality.Maximum * divided;
\r
1145 min = slider_videoQuality.Minimum;
\r
1146 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1147 rfValue = Math.Round(rfValue, 2);
\r
1148 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1150 case "VP3 (Theora)":
\r
1151 rfValue = slider_videoQuality.Value;
\r
1152 double value = rfValue / 63;
\r
1153 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1157 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1159 text_bitrate.Enabled = false;
\r
1160 text_filesize.Enabled = true;
\r
1161 slider_videoQuality.Enabled = false;
\r
1163 check_2PassEncode.Enabled = true;
\r
1165 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1167 text_bitrate.Enabled = true;
\r
1168 text_filesize.Enabled = false;
\r
1169 slider_videoQuality.Enabled = false;
\r
1171 check_2PassEncode.Enabled = true;
\r
1173 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1175 text_bitrate.Enabled = false;
\r
1176 text_filesize.Enabled = false;
\r
1177 slider_videoQuality.Enabled = true;
\r
1179 check_2PassEncode.Enabled = false;
\r
1180 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1182 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1184 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1186 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1187 check_turbo.Enabled = true;
\r
1191 check_turbo.Enabled = false;
\r
1192 check_turbo.CheckState = CheckState.Unchecked;
\r
1197 private void text_width_TextChanged(object sender, EventArgs e)
\r
1199 if (text_width.Text == "")
\r
1200 text_width.BackColor = Color.White;
\r
1202 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
1203 lbl_max.Text = "";
\r
1206 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1209 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1211 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1213 if (drp_anamorphic.Text == "None")
\r
1215 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1217 text_height.Text = height.ToString();
\r
1222 private void text_height_TextChanged(object sender, EventArgs e)
\r
1224 if (text_height.Text == "")
\r
1225 text_height.BackColor = Color.White;
\r
1227 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1228 if (maxWidth != 0)
\r
1229 lbl_max.Text = "Max Width";
\r
1231 lbl_max.Text = "";
\r
1234 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1236 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1238 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1240 text_left.Enabled = true;
\r
1241 text_right.Enabled = true;
\r
1242 text_top.Enabled = true;
\r
1243 text_bottom.Enabled = true;
\r
1244 if (selectedTitle != null)
\r
1246 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1247 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1248 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1249 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1253 text_left.Text = "0";
\r
1254 text_right.Text = "0";
\r
1255 text_top.Text = "0";
\r
1256 text_bottom.Text = "0";
\r
1259 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1261 text_left.Enabled = false;
\r
1262 text_right.Enabled = false;
\r
1263 text_top.Enabled = false;
\r
1264 text_bottom.Enabled = false;
\r
1266 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1268 if (drp_anamorphic.SelectedIndex == 1)
\r
1270 text_height.BackColor = Color.LightGray;
\r
1271 text_width.BackColor = Color.LightGray;
\r
1272 text_height.Text = "";
\r
1273 text_width.Text = "";
\r
1274 text_height.Enabled = false;
\r
1275 text_width.Enabled = false;
\r
1278 if (drp_anamorphic.SelectedIndex == 2)
\r
1280 text_height.Text = "";
\r
1281 text_height.Enabled = false;
\r
1282 text_height.BackColor = Color.LightGray;
\r
1284 text_width.Enabled = true;
\r
1285 text_width.BackColor = Color.White;
\r
1288 if (drp_anamorphic.SelectedIndex == 0)
\r
1290 text_height.BackColor = Color.White;
\r
1291 text_width.BackColor = Color.White;
\r
1292 text_height.Enabled = true;
\r
1293 text_width.Enabled = true;
\r
1298 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1300 if (ctl_decomb.getDropValue != "Off")
\r
1301 if (ctl_deinterlace.getDropValue != "None")
\r
1302 ctl_deinterlace.setOption("None");
\r
1304 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1306 if (ctl_detelecine.getDropValue != "None")
\r
1307 if (ctl_decomb.getDropValue != "Off")
\r
1308 ctl_decomb.setOption("Off");
\r
1310 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1312 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1316 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1318 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1320 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1321 lv_audioList.Select();
\r
1324 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1326 if (drp_audenc_1.Text == "AC3")
\r
1328 drp_audmix_1.Enabled = false;
\r
1329 drp_audbit_1.Enabled = false;
\r
1330 drp_audsr_1.Enabled = false;
\r
1332 drp_audmix_1.SelectedIndex = 0;
\r
1333 drp_audbit_1.SelectedIndex = 0;
\r
1334 drp_audsr_1.SelectedIndex = 0;
\r
1338 drp_audmix_1.Enabled = true;
\r
1339 drp_audbit_1.Enabled = true;
\r
1340 drp_audsr_1.Enabled = true;
\r
1342 drp_audmix_1.Text = "Automatic";
\r
1343 drp_audbit_1.Text = "160";
\r
1344 drp_audsr_1.Text = "Auto";
\r
1347 if (drp_audenc_1.Text == "AAC")
\r
1349 setMixDownAllOptions(drp_audmix_1);
\r
1350 setBitrateSelections160(drp_audbit_1);
\r
1354 setMixDownNotAAC(drp_audmix_1);
\r
1355 setBitrateSelections320(drp_audbit_1);
\r
1358 // Update an item in the Audio list if required.
\r
1359 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1361 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1362 lv_audioList.Select();
\r
1365 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1367 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1368 setBitrateSelections384(drp_audbit_1);
\r
1369 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1370 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1372 // Update an item in the Audio list if required.
\r
1373 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1375 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1376 lv_audioList.Select();
\r
1379 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1381 // Update an item in the Audio list if required.
\r
1382 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1384 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1385 lv_audioList.Select();
\r
1388 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1390 // Update an item in the Audio list if required.
\r
1391 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1393 if (drp_audenc_1.Text == "AC3")
\r
1394 drp_audbit_1.Text = "Auto";
\r
1395 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1396 lv_audioList.Select();
\r
1399 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1402 if (tb_drc.Value == 0) value = 0;
\r
1404 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1406 lbl_drc.Text = value.ToString();
\r
1408 // Update an item in the Audio list if required.
\r
1409 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1411 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1412 lv_audioList.Select();
\r
1416 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1418 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1419 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1420 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1421 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1422 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1423 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1424 newTrack.SubItems.Add(lbl_drc.Text);
\r
1426 // Select the newly added track and select the control
\r
1427 lv_audioList.Items.Add(newTrack);
\r
1428 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1429 lv_audioList.Select();
\r
1431 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1433 removeAudioTrack();
\r
1435 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1437 if (lv_audioList.SelectedIndices.Count != 0)
\r
1439 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1440 int index = item.Index;
\r
1443 if (lv_audioList.Items.Count > index && index >= 0)
\r
1445 lv_audioList.Items.Remove(item);
\r
1446 lv_audioList.Items.Insert(index, item);
\r
1447 item.Selected = true;
\r
1448 lv_audioList.Focus();
\r
1452 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1454 if (lv_audioList.SelectedIndices.Count != 0)
\r
1456 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1457 int index = item.Index;
\r
1460 if (index < lv_audioList.Items.Count)
\r
1462 lv_audioList.Items.Remove(item);
\r
1463 lv_audioList.Items.Insert(index, item);
\r
1464 item.Selected = true;
\r
1465 lv_audioList.Focus();
\r
1470 private void audioList_remove_Click(object sender, EventArgs e)
\r
1472 removeAudioTrack();
\r
1474 private void removeAudioTrack()
\r
1476 // Remove the Item and reselect the control if the following conditions are met.
\r
1477 if (lv_audioList.SelectedItems.Count != 0)
\r
1479 // Record the current selected index.
\r
1480 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1482 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1484 // Now reslect the correct item and give focus to the audio list.
\r
1485 if (lv_audioList.Items.Count != 0)
\r
1487 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1488 lv_audioList.Items[currentPosition].Selected = true;
\r
1489 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1490 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1492 lv_audioList.Select();
\r
1496 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1498 // Set the dropdown controls based on the selected item in the Audio List.
\r
1499 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1501 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1502 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1503 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1504 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1505 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1506 double drcValue; int drcCalculated;
\r
1507 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1508 if (drcValue == 0) drcCalculated = 0;
\r
1510 drcValue = ((drcValue * 10) + 1) - 10;
\r
1511 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1512 tb_drc.Value = drcCalculated;
\r
1516 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1518 if (drp_subtitle.Text.Contains("None"))
\r
1520 check_forced.Enabled = false;
\r
1521 check_forced.Checked = false;
\r
1524 check_forced.Enabled = true;
\r
1527 // Chapter Marker Tab
\r
1528 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1530 if (Check_ChapterMarkers.Checked)
\r
1532 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1533 data_chpt.Rows.Clear();
\r
1534 data_chpt.Enabled = true;
\r
1535 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1536 if (chapterGridView != null)
\r
1537 data_chpt = chapterGridView;
\r
1541 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1542 data_chpt.Rows.Clear();
\r
1543 data_chpt.Enabled = false;
\r
1547 // Query Editor Tab
\r
1548 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1550 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1552 private void btn_clear_Click(object sender, EventArgs e)
\r
1554 rtf_query.Clear();
\r
1558 // MainWindow Components, Actions and Functions ***********************
\r
1560 #region Source Scan
\r
1561 private void setupGUIforScan(String filename)
\r
1563 text_source.Text = filename;
\r
1565 foreach (Control ctrl in Controls)
\r
1567 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1568 ctrl.Enabled = false;
\r
1570 lbl_encode.Visible = true;
\r
1571 lbl_encode.Text = "Scanning ...";
\r
1572 gb_source.Text = "Source: Scanning ...";
\r
1573 btn_source.Enabled = false;
\r
1574 btn_start.Enabled = false;
\r
1575 btn_showQueue.Enabled = false;
\r
1576 btn_add2Queue.Enabled = false;
\r
1577 tb_preview.Enabled = false;
\r
1578 mnu_killCLI.Visible = true;
\r
1580 private void startScan(String filename)
\r
1584 lbl_encode.Visible = true;
\r
1585 lbl_encode.Text = "Scanning...";
\r
1586 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1588 catch (Exception exc)
\r
1590 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1593 private void scanProcess(object state)
\r
1597 string inputFile = (string)state;
\r
1598 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1599 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1601 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1602 if (File.Exists(dvdInfoPath))
\r
1603 File.Delete(dvdInfoPath);
\r
1605 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1607 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
\r
1609 using (hbproc = Process.Start(hbParseDvd))
\r
1611 hbproc.WaitForExit();
\r
1614 if (!File.Exists(dvdInfoPath))
\r
1616 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1619 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1621 thisDVD = Parsing.DVD.Parse(sr);
\r
1626 updateUIafterScan();
\r
1628 catch (Exception exc)
\r
1630 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1634 private void updateUIafterScan()
\r
1638 if (InvokeRequired)
\r
1640 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1644 // Setup some GUI components
\r
1645 drp_dvdtitle.Items.Clear();
\r
1646 if (thisDVD.Titles.Count != 0)
\r
1647 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1648 drp_dvdtitle.Text = "Automatic";
\r
1649 drop_chapterFinish.Text = "Auto";
\r
1650 drop_chapterStart.Text = "Auto";
\r
1652 // Now select the longest title
\r
1653 if (thisDVD.Titles.Count != 0)
\r
1654 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1656 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1657 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1658 Check_ChapterMarkers.Enabled = true;
\r
1661 Check_ChapterMarkers.Enabled = false;
\r
1662 Check_ChapterMarkers.Checked = false;
\r
1663 data_chpt.Rows.Clear();
\r
1666 // If no titles were found, Display an error message
\r
1667 if (drp_dvdtitle.Items.Count == 0)
\r
1668 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
1670 // Enable the GUI components and enable any disabled components
\r
1673 catch (Exception exc)
\r
1675 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1680 private void enableGUI()
\r
1684 if (InvokeRequired)
\r
1686 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1688 lbl_encode.Text = "Scan Completed";
\r
1689 gb_source.Text = "Source";
\r
1690 foreach (Control ctrl in Controls)
\r
1691 ctrl.Enabled = true;
\r
1692 btn_start.Enabled = true;
\r
1693 btn_showQueue.Enabled = true;
\r
1694 btn_add2Queue.Enabled = true;
\r
1695 tb_preview.Enabled = true;
\r
1696 btn_source.Enabled = true;
\r
1697 mnu_killCLI.Visible = false;
\r
1699 catch (Exception exc)
\r
1701 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1704 private static void killCLI()
\r
1706 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1707 // hbproc.kill/close just won't do the trick.
\r
1710 string AppName = "HandBrakeCLI";
\r
1712 AppName = AppName.ToUpper();
\r
1714 Process[] prs = Process.GetProcesses();
\r
1715 foreach (Process proces in prs)
\r
1717 if (proces.ProcessName.ToUpper() == AppName)
\r
1720 if (!proces.HasExited)
\r
1725 catch (Exception ex)
\r
1727 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
1732 #region DVD Drive Detection
\r
1733 // Source Button Drive Detection
\r
1734 private delegate void ProgressUpdateHandler();
\r
1735 private void getDriveInfoThread()
\r
1739 if (InvokeRequired)
\r
1741 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1745 Boolean foundDrive = false;
\r
1746 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1747 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1749 if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
\r
1751 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1753 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1754 foundDrive = true;
\r
1760 if (foundDrive == false)
\r
1761 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1765 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1770 #region Audio Panel Code Helpers
\r
1771 private void setAudioByContainer(String path)
\r
1773 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1775 string oldval = drp_audenc_1.Text;
\r
1776 drp_audenc_1.Items.Clear();
\r
1777 drp_audenc_1.Items.Add("AAC");
\r
1778 drp_audenc_1.Items.Add("AC3");
\r
1779 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1780 drp_audenc_1.SelectedIndex = 0;
\r
1783 else if (path.Contains("MKV"))
\r
1785 drp_audenc_1.Items.Clear();
\r
1786 drp_audenc_1.Items.Add("AAC");
\r
1787 drp_audenc_1.Items.Add("MP3");
\r
1788 drp_audenc_1.Items.Add("AC3");
\r
1789 drp_audenc_1.Items.Add("Vorbis");
\r
1790 if (drp_audenc_1.Text == string.Empty)
\r
1791 drp_audenc_1.SelectedIndex = 0;
\r
1794 // Make sure the table is updated with new audio codecs
\r
1795 foreach (ListViewItem row in lv_audioList.Items)
\r
1797 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1798 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1801 private void setVideoByContainer(String path)
\r
1805 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1807 oldval = drp_videoEncoder.Text;
\r
1808 drp_videoEncoder.Items.Clear();
\r
1809 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1810 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1811 if (oldval == "VP3 (Theora)")
\r
1812 drp_videoEncoder.SelectedIndex = 1;
\r
1814 drp_videoEncoder.Text = oldval;
\r
1817 else if (path.Contains("MKV"))
\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("H.264 (x264)");
\r
1823 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1824 drp_videoEncoder.Text = oldval;
\r
1827 private static void setBitrateSelections384(ComboBox dropDown)
\r
1829 dropDown.Items.Clear();
\r
1830 dropDown.Items.Add("32");
\r
1831 dropDown.Items.Add("40");
\r
1832 dropDown.Items.Add("48");
\r
1833 dropDown.Items.Add("56");
\r
1834 dropDown.Items.Add("64");
\r
1835 dropDown.Items.Add("80");
\r
1836 dropDown.Items.Add("86");
\r
1837 dropDown.Items.Add("112");
\r
1838 dropDown.Items.Add("128");
\r
1839 dropDown.Items.Add("160");
\r
1840 dropDown.Items.Add("192");
\r
1841 dropDown.Items.Add("224");
\r
1842 dropDown.Items.Add("256");
\r
1843 dropDown.Items.Add("320");
\r
1844 dropDown.Items.Add("384");
\r
1846 private static void setBitrateSelections320(ComboBox dropDown)
\r
1848 dropDown.Items.Clear();
\r
1849 dropDown.Items.Add("32");
\r
1850 dropDown.Items.Add("40");
\r
1851 dropDown.Items.Add("48");
\r
1852 dropDown.Items.Add("56");
\r
1853 dropDown.Items.Add("64");
\r
1854 dropDown.Items.Add("80");
\r
1855 dropDown.Items.Add("86");
\r
1856 dropDown.Items.Add("112");
\r
1857 dropDown.Items.Add("128");
\r
1858 dropDown.Items.Add("160");
\r
1859 dropDown.Items.Add("192");
\r
1860 dropDown.Items.Add("224");
\r
1861 dropDown.Items.Add("256");
\r
1862 dropDown.Items.Add("320");
\r
1864 private static void setBitrateSelections160(ComboBox dropDown)
\r
1866 dropDown.Items.Clear();
\r
1867 dropDown.Items.Add("32");
\r
1868 dropDown.Items.Add("40");
\r
1869 dropDown.Items.Add("48");
\r
1870 dropDown.Items.Add("56");
\r
1871 dropDown.Items.Add("64");
\r
1872 dropDown.Items.Add("80");
\r
1873 dropDown.Items.Add("86");
\r
1874 dropDown.Items.Add("112");
\r
1875 dropDown.Items.Add("128");
\r
1876 dropDown.Items.Add("160");
\r
1878 private static void setMixDownAllOptions(ComboBox dropdown)
\r
1880 dropdown.Items.Clear();
\r
1881 dropdown.Items.Add("Automatic");
\r
1882 dropdown.Items.Add("Mono");
\r
1883 dropdown.Items.Add("Stereo");
\r
1884 dropdown.Items.Add("Dolby Surround");
\r
1885 dropdown.Items.Add("Dolby Pro Logic II");
\r
1886 dropdown.Items.Add("6 Channel Discrete");
\r
1888 private static void setMixDownNotAAC(ComboBox dropdown)
\r
1890 dropdown.Items.Clear();
\r
1891 dropdown.Items.Add("Automatic");
\r
1892 dropdown.Items.Add("Stereo");
\r
1893 dropdown.Items.Add("Dolby Surround");
\r
1894 dropdown.Items.Add("Dolby Pro Logic II");
\r
1898 #region Public Methods
\r
1901 /// Setup the GUI for Encoding or finished Encoding.
\r
1902 /// 1 = Encode Running
\r
1903 /// 0 = Encode Finished.
\r
1905 public void setEncodeFinished()
\r
1909 if (InvokeRequired)
\r
1911 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1915 lbl_encode.Text = "Encoding Finished";
\r
1916 btn_start.Text = "Start";
\r
1917 btn_start.ToolTipText = "Start the encoding process";
\r
1918 btn_start.Image = Properties.Resources.Play;
\r
1920 // If the window is minimized, display the notification in a popup.
\r
1921 if (FormWindowState.Minimized == this.WindowState)
\r
1923 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1924 notifyIcon.ShowBalloonTip(500);
\r
1927 catch (Exception exc)
\r
1929 MessageBox.Show(exc.ToString());
\r
1932 public void setEncodeStarted()
\r
1936 if (InvokeRequired)
\r
1938 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1942 lbl_encode.Visible = true;
\r
1943 lbl_encode.Text = "Encoding in Progress";
\r
1944 btn_start.Text = "Stop";
\r
1945 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
1946 btn_start.Image = Properties.Resources.stop;
\r
1948 catch (Exception exc)
\r
1950 MessageBox.Show(exc.ToString());
\r
1955 /// Action can be "encode" or "scan"
\r
1956 /// Set the last action varible in the main window.
\r
1957 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1959 /// <param name="last">String</param>
\r
1960 public void setLastAction(string last)
\r
1962 this.lastAction = last;
\r
1966 /// DVD parseing. Pass in a parsed DVD.
\r
1968 /// <param name="dvd"></param>
\r
1969 public void setStreamReader(Parsing.DVD dvd)
\r
1971 this.thisDVD = dvd;
\r
1975 /// Reload the preset panel display
\r
1977 public void loadPresetPanel()
\r
1979 presetHandler.loadPresetData();
\r
1980 treeView_presets.Nodes.Clear();
\r
1982 TreeNode preset_treeview;
\r
1983 TreeNode rootNode = new TreeNode();
\r
1984 TreeNode rootNodeTwo = new TreeNode();
\r
1985 TreeNode childNode;
\r
1986 int workingLevel = 0;
\r
1987 string previousCategory = String.Empty, currentCategory = String.Empty;
\r
1989 List<Preset> presetNameList = presetHandler.getBuildInPresets();
\r
1990 if (presetNameList.Count != 0)
\r
1992 foreach (Preset preset in presetNameList)
\r
1994 // Handle Root Nodes
\r
1996 // First Case - No presets have been read yet so setup the root category
\r
1997 if (preset.Level == 1 && currentCategory == String.Empty)
\r
1999 rootNode = new TreeNode(preset.Category);
\r
2000 workingLevel = preset.Level;
\r
2001 currentCategory = preset.Category;
\r
2002 previousCategory = preset.Category;
\r
2005 // Second Case - This is the first sub child node.
\r
2006 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2008 rootNodeTwo = new TreeNode(preset.Category);
\r
2009 workingLevel = preset.Level;
\r
2010 currentCategory = preset.Category;
\r
2011 rootNode.Nodes.Add(rootNodeTwo);
\r
2014 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2015 if (preset.Level == 1 && workingLevel == 2)
\r
2017 workingLevel = preset.Level;
\r
2018 currentCategory = preset.Category;
\r
2021 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2022 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2024 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2026 rootNode = new TreeNode(preset.Category);
\r
2027 workingLevel = preset.Level;
\r
2028 currentCategory = preset.Category;
\r
2029 previousCategory = preset.Category;
\r
2032 // Handle Child Nodes
\r
2033 // Add First level child nodes to the current root node
\r
2034 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2036 childNode = new TreeNode(preset.Name);
\r
2037 rootNode.Nodes.Add(childNode);
\r
2040 // Add Second level child nodes to the current sub root node
\r
2041 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2043 childNode = new TreeNode(preset.Name);
\r
2044 rootNodeTwo.Nodes.Add(childNode);
\r
2048 // Add the final root node which does not get added above.
\r
2049 treeView_presets.Nodes.Add(rootNode);
\r
2053 List<string> presetNames = presetHandler.getUserPresetNames();
\r
2054 foreach (string preset in presetNames)
\r
2056 preset_treeview = new TreeNode(preset) { ForeColor = Color.Black };
\r
2058 // Now Fill Out List View with Items
\r
2059 treeView_presets.Nodes.Add(preset_treeview);
\r
2067 /// If the queue is being processed, prompt the user to confirm application close.
\r
2069 /// <param name="e"></param>
\r
2070 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2072 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2073 if ((encodeQueue.isEncoding) && (!encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
2075 DialogResult result = MessageBox.Show("HandBrake has queue items to process. Closing HandBrake will not stop the current encoding, but will stop processing the queue.\n\nDo you want to close HandBrake?",
\r
2076 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2077 if (result == DialogResult.No)
\r
2080 base.OnFormClosing(e);
\r
2083 // This is the END of the road ------------------------------------------------------------------------------
\r