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 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
41 private Form splash;
\r
43 // Applicaiton Startup ************************************************
\r
45 #region Application Startup
\r
49 // Load the splash screen in this thread
\r
50 splash = new frmSplashScreen();
\r
53 //Create a label that can be updated from the parent thread.
\r
54 Label lblStatus = new Label { Size = new Size(250, 20), Location = new Point(10, 280) };
\r
55 splash.Controls.Add(lblStatus);
\r
56 InitializeComponent();
\r
58 // Update the users config file with the CLI version data.
\r
59 lblStatus.Text = "Setting Version Data ...";
\r
60 Application.DoEvents();
\r
61 ArrayList x = hb_common_func.getCliVersionData();
\r
62 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
63 Properties.Settings.Default.hb_version = x[0].ToString();
\r
65 // show the form, but leave disabled until preloading is complete then show the main form
\r
66 this.Enabled = false;
\r
68 Application.DoEvents(); // Forces frmMain to draw
\r
70 // update the status
\r
71 if (Properties.Settings.Default.updateStatus == "Checked")
\r
73 lblStatus.Text = "Checking for updates ...";
\r
74 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
88 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
89 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
90 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
92 // Load the user's default settings or Normal Preset
\r
93 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
95 // Ok, so, we've selected a preset. Now we want to load it.
\r
96 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
98 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
99 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
103 //Ok, Reset all the H264 widgets before changing the preset
\r
104 x264Panel.reset2Defaults();
\r
106 // Send the query from the file to the Query Parser class, then load the preset
\r
107 QueryParser presetQuery = QueryParser.Parse(query);
\r
108 PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
110 // The x264 widgets will need updated, so do this now:
\r
111 x264Panel.X264_StandardizeOptString();
\r
112 x264Panel.X264_SetCurrentSettingsInPanel();
\r
116 loadNormalPreset();
\r
119 loadNormalPreset();
\r
121 // Enabled GUI tooltip's if Required
\r
122 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
124 x264Panel.setToolTipActive(true);
\r
125 ToolTip.Active = true;
\r
129 lblStatus.Text = "Loading Complete!";
\r
130 Application.DoEvents();
\r
133 this.Enabled = true;
\r
142 // Startup Functions
\r
143 private delegate void updateStatusChanger();
\r
144 private void startupUpdateCheck()
\r
148 if (InvokeRequired)
\r
150 BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
154 Boolean update = hb_common_func.updateCheck(false);
\r
157 frmUpdater updateWindow = new frmUpdater();
\r
158 updateWindow.Show();
\r
161 catch (Exception exc)
\r
163 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
166 private void queueRecovery()
\r
168 if (hb_common_func.check_queue_recovery())
\r
170 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
172 if (result == DialogResult.Yes)
\r
173 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
176 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
177 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
178 if (File.Exists(queuePath))
\r
179 File.Delete(queuePath);
\r
186 // Encoding Events for setting up the GUI
\r
187 private void events()
\r
189 // Handle Window Resize
\r
190 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
191 this.Resize += new EventHandler(frmMain_Resize);
\r
193 // Handle Encode Start / Finish / Pause
\r
194 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
195 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
196 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
198 // Handle a file being draged onto the GUI.
\r
199 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
200 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
203 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
205 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
206 e.Effect = DragDropEffects.All;
\r
208 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
210 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
211 if (fileList != null)
\r
213 if (fileList[0].StartsWith("\\"))
\r
214 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
217 if (fileList[0] != "")
\r
219 setupGUIforScan(fileList[0]);
\r
220 startScan(fileList[0]);
\r
223 text_source.Text = "Click 'Source' to continue";
\r
227 private void encodeStarted(object sender, EventArgs e)
\r
229 setLastAction("encode");
\r
230 setEncodeStarted();
\r
232 private void encodeEnded(object sender, EventArgs e)
\r
234 setEncodeFinished();
\r
236 private void encodePaused(object sender, EventArgs e)
\r
238 setEncodeFinished();
\r
242 // User Interface Menus / Tool Strips *********************************
\r
245 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
249 private void mnu_exit_Click(object sender, EventArgs e)
\r
251 Application.Exit();
\r
256 private void mnu_encode_Click(object sender, EventArgs e)
\r
258 queueWindow.Show();
\r
260 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
263 file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
265 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
266 dvdInfoWindow.Show();
\r
268 private void mnu_options_Click(object sender, EventArgs e)
\r
270 Form Options = new frmOptions();
\r
271 Options.ShowDialog();
\r
275 #region Presets Menu
\r
276 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
278 presetHandler.updateBuiltInPresets();
\r
280 if (treeView_presets.Nodes.Count == 0)
\r
281 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
283 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
285 treeView_presets.ExpandAll();
\r
287 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
289 // Empty the preset file
\r
290 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
291 if (File.Exists(presetsFile))
\r
292 File.Delete(presetsFile);
\r
296 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
300 catch (Exception exc)
\r
302 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
305 // Reload the preset panel
\r
308 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
310 loadNormalPreset();
\r
312 private void btn_new_preset_Click(object sender, EventArgs e)
\r
314 // Remember each nodes expanded status so we can reload it
\r
315 List<Boolean> nodeStatus = saveTreeViewState();
\r
316 nodeStatus.Add(true);
\r
318 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
319 preset.ShowDialog();
\r
321 // Now reload the TreeView states
\r
322 loadTreeViewStates(nodeStatus);
\r
327 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
329 Process.Start("http://forum.handbrake.fr/");
\r
331 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
333 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
335 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
337 Process.Start("http://handbrake.fr");
\r
339 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
341 Boolean update = hb_common_func.updateCheck(true);
\r
344 frmUpdater updateWindow = new frmUpdater();
\r
345 updateWindow.Show();
\r
348 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
350 private void mnu_about_Click(object sender, EventArgs e)
\r
352 Form About = new frmAbout();
\r
353 About.ShowDialog();
\r
358 private void mnu_qptest_Click(object sender, EventArgs e)
\r
360 QueryParserTester qptest = new QueryParserTester();
\r
366 // Right Click Menu Code
\r
367 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
369 treeView_presets.ExpandAll();
\r
371 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
373 treeView_presets.CollapseAll();
\r
375 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
377 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
378 if (result == DialogResult.Yes)
\r
379 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
380 else if (result == DialogResult.No)
\r
381 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
383 private void pmnu_delete_click(object sender, EventArgs e)
\r
385 if (treeView_presets.SelectedNode != null)
\r
387 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
389 // Remember each nodes expanded status so we can reload it
\r
390 List<Boolean> nodeStatus = saveTreeViewState();
\r
392 // Now reload the preset panel
\r
395 // Now reload the TreeView states
\r
396 loadTreeViewStates(nodeStatus);
\r
398 treeView_presets.Select();
\r
400 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
402 // Make sure that the save menu is always disabled by default
\r
403 pmnu_saveChanges.Enabled = false;
\r
405 // Now enable the save menu if the selected preset is a user preset
\r
406 if (treeView_presets.SelectedNode != null)
\r
408 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
410 pmnu_saveChanges.Enabled = true;
\r
413 treeView_presets.Select();
\r
416 // Presets Management
\r
417 private void btn_addPreset_Click(object sender, EventArgs e)
\r
419 // Remember each nodes expanded status so we can reload it
\r
420 List<Boolean> nodeStatus = saveTreeViewState();
\r
421 nodeStatus.Add(true);
\r
423 // Now add the new preset
\r
424 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
425 preset.ShowDialog();
\r
427 // Now reload the TreeView states
\r
428 loadTreeViewStates(nodeStatus);
\r
430 private void btn_removePreset_Click(object sender, EventArgs e)
\r
432 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
433 if (result == DialogResult.Yes)
\r
435 if (treeView_presets.SelectedNode != null)
\r
436 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
438 // Remember each nodes expanded status so we can reload it
\r
439 List<Boolean> nodeStatus = saveTreeViewState();
\r
441 // Now reload the preset panel
\r
444 // Now reload the TreeView states
\r
445 loadTreeViewStates(nodeStatus);
\r
447 treeView_presets.Select();
\r
449 private void btn_setDefault_Click(object sender, EventArgs e)
\r
451 if (treeView_presets.SelectedNode != null)
\r
453 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
454 if (result == DialogResult.Yes)
\r
456 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
457 Properties.Settings.Default.Save();
\r
458 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
462 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
464 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
466 if (e.Button == MouseButtons.Right)
\r
467 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
468 else if (e.Button == MouseButtons.Left)
\r
470 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
472 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
477 treeView_presets.Select();
\r
479 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
483 private void selectPreset()
\r
485 if (treeView_presets.SelectedNode != null)
\r
487 // Ok, so, we've selected a preset. Now we want to load it.
\r
488 string presetName = treeView_presets.SelectedNode.Text;
\r
489 if (presetHandler.getPreset(presetName) != null)
\r
491 string query = presetHandler.getPreset(presetName).Query;
\r
492 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
496 //Ok, Reset all the H264 widgets before changing the preset
\r
497 x264Panel.reset2Defaults();
\r
499 // Send the query from the file to the Query Parser class
\r
500 QueryParser presetQuery = QueryParser.Parse(query);
\r
502 // Now load the preset
\r
503 PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
505 // The x264 widgets will need updated, so do this now:
\r
506 x264Panel.X264_StandardizeOptString();
\r
507 x264Panel.X264_SetCurrentSettingsInPanel();
\r
509 if (maxWidth != 0 && maxHeight != 0)
\r
510 lbl_max.Text = "Max Width / Height";
\r
511 else if (maxWidth != 0)
\r
512 lbl_max.Text = "Max Width";
\r
519 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
521 if (e.KeyCode == Keys.Delete)
\r
523 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
524 if (result == DialogResult.Yes)
\r
526 if (treeView_presets.SelectedNode != null)
\r
527 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
529 // Remember each nodes expanded status so we can reload it
\r
530 List<Boolean> nodeStatus = new List<Boolean>();
\r
531 foreach (TreeNode node in treeView_presets.Nodes)
\r
532 nodeStatus.Add(node.IsExpanded);
\r
534 // Now reload the preset panel
\r
537 // And finally, re-expand any of the nodes if required
\r
539 foreach (TreeNode node in treeView_presets.Nodes)
\r
549 private List<Boolean> saveTreeViewState()
\r
551 // Remember each nodes expanded status so we can reload it
\r
552 List<Boolean> nodeStatus = new List<Boolean>();
\r
553 foreach (TreeNode node in treeView_presets.Nodes)
\r
555 nodeStatus.Add(node.IsExpanded);
\r
556 foreach (TreeNode subNode in node.Nodes)
\r
557 nodeStatus.Add(node.IsExpanded);
\r
561 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
563 // And finally, re-expand any of the nodes if required
\r
565 foreach (TreeNode node in treeView_presets.Nodes)
\r
570 foreach (TreeNode subNode in node.Nodes)
\r
579 private void loadNormalPreset()
\r
581 treeView_presets.Nodes.Find("Normal", true);
\r
583 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
585 foreach (TreeNode node in treenode.Nodes)
\r
587 if (node.Text.Equals("Normal"))
\r
588 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
595 private void btn_source_Click(object sender, EventArgs e)
\r
597 if (Properties.Settings.Default.drive_detection == "Checked")
\r
599 mnu_dvd_drive.Visible = true;
\r
600 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
601 driveInfoThread.Start();
\r
604 mnu_dvd_drive.Visible = false;
\r
606 private void btn_start_Click(object sender, EventArgs e)
\r
608 if (btn_start.Text == "Stop")
\r
610 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
612 if (result == DialogResult.Yes)
\r
615 encodeQueue.pauseEncode();
\r
617 // Kill the current process.
\r
618 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
619 Process HandBrakeCLI;
\r
620 if (aProc.Length > 0)
\r
622 HandBrakeCLI = aProc[0];
\r
623 HandBrakeCLI.Kill();
\r
627 setEncodeFinished();
\r
632 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
634 // Set the last action to encode.
\r
635 // This is used for tracking which file to load in the activity window
\r
636 lastAction = "encode";
\r
638 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateTheQuery(this);
\r
640 if (encodeQueue.count() == 0)
\r
642 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
643 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
645 queueWindow.setQueue();
\r
646 if (encodeQueue.count() > 1)
\r
647 queueWindow.Show(false);
\r
649 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
650 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
653 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
654 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
658 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
660 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
661 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
664 String query = queryGen.GenerateTheQuery(this);
\r
665 if (rtf_query.Text != "")
\r
666 query = rtf_query.Text;
\r
669 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
671 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
672 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
673 if (result == DialogResult.Yes)
\r
674 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
678 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
680 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
681 queueWindow.Show();
\r
684 private void btn_showQueue_Click(object sender, EventArgs e)
\r
686 queueWindow.Show();
\r
688 private void tb_preview_Click(object sender, EventArgs e)
\r
690 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
691 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
694 if (qtpreview == null)
\r
696 qtpreview = new frmPreview(this);
\r
699 else if (qtpreview.IsDisposed)
\r
701 qtpreview = new frmPreview(this);
\r
705 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
708 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
710 String file = lastAction == "scan" ? "dvdinfo.dat" : "hb_encode_log.dat";
\r
712 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
713 ActivityWindow.Show();
\r
717 #region System Tray Icon
\r
718 private void frmMain_Resize(object sender, EventArgs e)
\r
720 if (FormWindowState.Minimized == this.WindowState)
\r
722 notifyIcon.Visible = true;
\r
723 if (!encodeQueue.isEncoding)
\r
725 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
726 notifyIcon.ShowBalloonTip(500);
\r
730 else if (FormWindowState.Normal == this.WindowState)
\r
731 notifyIcon.Visible = false;
\r
733 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
735 this.Visible = true;
\r
737 this.WindowState = FormWindowState.Normal;
\r
738 notifyIcon.Visible = false;
\r
740 private void btn_restore_Click(object sender, EventArgs e)
\r
742 this.Visible = true;
\r
744 this.WindowState = FormWindowState.Normal;
\r
745 notifyIcon.Visible = false;
\r
749 #region Tab Control
\r
752 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
754 // Enable the creation of chapter markers.
\r
755 Check_ChapterMarkers.Enabled = true;
\r
757 // Set the last action to scan.
\r
758 // This is used for tracking which file to load in the activity window
\r
759 lastAction = "scan";
\r
760 text_source.Text = "";
\r
762 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
764 String filename = DVD_Open.SelectedPath;
\r
766 if (filename.StartsWith("\\"))
\r
767 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
770 if (filename != "")
\r
772 setupGUIforScan(filename);
\r
773 startScan(filename);
\r
776 text_source.Text = "Click 'Source' to continue";
\r
780 text_source.Text = "Click 'Source' to continue";
\r
782 private void btn_file_source_Click(object sender, EventArgs e)
\r
784 // Set the last action to scan.
\r
785 // This is used for tracking which file to load in the activity window
\r
786 lastAction = "scan";
\r
787 text_source.Text = "";
\r
789 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
791 String filename = ISO_Open.FileName;
\r
792 if (filename.StartsWith("\\"))
\r
794 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
795 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
798 if (filename != "")
\r
800 setupGUIforScan(filename);
\r
801 startScan(filename);
\r
804 text_source.Text = "Click 'Source' to continue";
\r
808 text_source.Text = "Click 'Source' to continue";
\r
810 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
812 // Enable the creation of chapter markers.
\r
813 Check_ChapterMarkers.Enabled = true;
\r
815 // Set the last action to scan.
\r
816 // This is used for tracking which file to load in the activity window
\r
817 lastAction = "scan";
\r
819 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
821 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
822 String filename = path[0];
\r
823 setupGUIforScan(filename);
\r
824 startScan(filename);
\r
827 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
828 if (drp_dvdtitle.Items.Count == 0)
\r
829 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
831 lbl_encode.Text = "";
\r
833 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
835 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
836 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
838 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
840 // Reset some values on the form
\r
841 lbl_Aspect.Text = "Select a Title";
\r
842 //lbl_RecomendedCrop.Text = "Select a Title";
\r
843 drop_chapterStart.Items.Clear();
\r
844 drop_chapterFinish.Items.Clear();
\r
846 // If the dropdown is set to automatic nothing else needs to be done.
\r
847 // Otheriwse if its not, title data has to be loased from parsing.
\r
848 if (drp_dvdtitle.Text != "Automatic")
\r
850 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
852 // Set the Aspect Ratio
\r
853 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
854 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
855 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
857 // Set the Recommended Cropping values
\r
858 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
859 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
860 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
861 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
863 // Populate the Start chapter Dropdown
\r
864 drop_chapterStart.Items.Clear();
\r
865 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
866 if (drop_chapterStart.Items.Count > 0)
\r
867 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
869 // Populate the Final Chapter Dropdown
\r
870 drop_chapterFinish.Items.Clear();
\r
871 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
872 if (drop_chapterFinish.Items.Count > 0)
\r
873 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
875 // Populate the Audio Channels Dropdown
\r
876 drp_track1Audio.Items.Clear();
\r
877 drp_track1Audio.Items.Add("Automatic");
\r
878 drp_track1Audio.Items.Add("None");
\r
879 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
880 drp_track1Audio.SelectedIndex = 0;
\r
882 // Populate the Subtitles dropdown
\r
883 drp_subtitle.Items.Clear();
\r
884 drp_subtitle.Items.Add("None");
\r
885 drp_subtitle.Items.Add("Autoselect");
\r
886 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
887 if (drp_subtitle.Items.Count > 0)
\r
888 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
892 // Run the autoName & chapterNaming functions
\r
893 if (Properties.Settings.Default.autoNaming == "Checked")
\r
895 string autoPath = hb_common_func.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
896 if (autoPath != null)
\r
897 text_destination.Text = autoPath;
\r
899 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
902 data_chpt.Rows.Clear();
\r
903 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
904 if (chapterGridView != null)
\r
905 data_chpt = chapterGridView;
\r
907 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
908 data_chpt.Columns[0].Width = 166;
\r
909 data_chpt.Columns[0].Width = 165;
\r
911 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
913 int c_start, c_end;
\r
915 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
916 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
918 int.TryParse(drop_chapterStart.Text, out c_start);
\r
919 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
923 if (c_start > c_end)
\r
924 drop_chapterFinish.Text = c_start.ToString();
\r
927 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
929 // Run the Autonaming function
\r
930 if (Properties.Settings.Default.autoNaming == "Checked")
\r
931 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
934 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
936 int c_start, c_end;
\r
938 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
939 drop_chapterStart.SelectedIndex = 1;
\r
941 int.TryParse(drop_chapterStart.Text, out c_start);
\r
942 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
946 if (c_end < c_start)
\r
947 drop_chapterFinish.Text = c_start.ToString();
\r
950 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
952 // Run the Autonaming function
\r
953 if (Properties.Settings.Default.autoNaming == "Checked")
\r
954 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
956 // Add more rows to the Chapter menu if needed.
\r
957 if (Check_ChapterMarkers.Checked)
\r
959 int i = data_chpt.Rows.Count, finish = 0;
\r
961 if (drop_chapterFinish.Text != "Auto")
\r
962 int.TryParse(drop_chapterFinish.Text, out finish);
\r
966 int n = data_chpt.Rows.Add();
\r
967 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
968 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
969 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
970 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
977 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
979 // This removes the file extension from the filename box on the save file dialog.
\r
980 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
981 if (Path.HasExtension(text_destination.Text))
\r
982 DVD_Save.FileName = Path.Combine(Path.GetDirectoryName(text_destination.Text), Path.GetFileNameWithoutExtension(text_destination.Text));
\r
984 // Show the dialog and set the main form file path
\r
985 if (drop_format.SelectedIndex.Equals(0))
\r
986 DVD_Save.FilterIndex = 1;
\r
987 else if (drop_format.SelectedIndex.Equals(1))
\r
988 DVD_Save.FilterIndex = 2;
\r
989 else if (drop_format.SelectedIndex.Equals(2))
\r
990 DVD_Save.FilterIndex = 3;
\r
992 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
994 if (DVD_Save.FileName.StartsWith("\\"))
\r
995 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
998 setAudioByContainer(DVD_Save.FileName);
\r
999 text_destination.Text = DVD_Save.FileName;
\r
1001 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
1002 if (Check_ChapterMarkers.Checked)
\r
1003 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
1007 private void text_destination_TextChanged(object sender, EventArgs e)
\r
1009 string path = text_destination.Text;
\r
1010 if (path.EndsWith(".mp4"))
\r
1011 drop_format.SelectedIndex = 0;
\r
1012 else if (path.EndsWith(".m4v"))
\r
1013 drop_format.SelectedIndex = 1;
\r
1014 else if (path.EndsWith(".mkv"))
\r
1015 drop_format.SelectedIndex = 2;
\r
1018 // Output Settings
\r
1019 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
1021 if (drop_format.SelectedIndex == 0)
\r
1022 setExtension(".mp4");
\r
1023 else if (drop_format.SelectedIndex == 1)
\r
1024 setExtension(".m4v");
\r
1025 else if (drop_format.SelectedIndex == 2)
\r
1026 setExtension(".mkv");
\r
1028 setAudioByContainer(drop_format.Text);
\r
1029 setVideoByContainer(drop_format.Text);
\r
1031 private void setExtension(string newExtension)
\r
1033 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1034 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1035 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1039 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1041 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1043 check_largeFile.Enabled = true;
\r
1044 check_optimiseMP4.Enabled = true;
\r
1045 check_iPodAtom.Enabled = true;
\r
1049 check_largeFile.Enabled = false;
\r
1050 check_optimiseMP4.Enabled = false;
\r
1051 check_iPodAtom.Enabled = false;
\r
1052 check_largeFile.Checked = false;
\r
1053 check_optimiseMP4.Checked = false;
\r
1054 check_iPodAtom.Checked = false;
\r
1057 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1058 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1060 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1061 check_turbo.Enabled = true;
\r
1063 h264Tab.Enabled = true;
\r
1064 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1065 check_iPodAtom.Enabled = true;
\r
1067 check_iPodAtom.Enabled = false;
\r
1071 check_turbo.CheckState = CheckState.Unchecked;
\r
1072 check_turbo.Enabled = false;
\r
1073 h264Tab.Enabled = false;
\r
1074 x264Panel.x264Query = "";
\r
1075 check_iPodAtom.Enabled = false;
\r
1076 check_iPodAtom.Checked = false;
\r
1079 // Setup the CQ Slider
\r
1080 switch (drp_videoEncoder.Text)
\r
1082 case "MPEG-4 (FFmpeg)":
\r
1083 slider_videoQuality.Minimum = 1;
\r
1084 slider_videoQuality.Maximum = 31;
\r
1085 slider_videoQuality.Value = 1;
\r
1086 SliderValue.Text = "0% QP: 31.00";
\r
1088 case "H.264 (x264)":
\r
1089 slider_videoQuality.Minimum = 0;
\r
1090 slider_videoQuality.Value = 0;
\r
1091 slider_videoQuality.TickFrequency = 1;
\r
1092 SliderValue.Text = "0% RF: 51.00";
\r
1093 String step = Properties.Settings.Default.x264cqstep;
\r
1097 slider_videoQuality.Maximum = 255;
\r
1100 slider_videoQuality.Maximum = 204;
\r
1103 slider_videoQuality.Maximum = 155;
\r
1106 slider_videoQuality.Maximum = 102;
\r
1109 slider_videoQuality.Maximum = 51;
\r
1112 slider_videoQuality.Maximum = 51;
\r
1116 case "VP3 (Theora)":
\r
1117 slider_videoQuality.Minimum = 0;
\r
1118 slider_videoQuality.Maximum = 63;
\r
1119 slider_videoQuality.Value = 0;
\r
1120 SliderValue.Text = "0% QP: 0.00";
\r
1124 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1126 switch (drp_videoEncoder.Text)
\r
1128 case "MPEG-4 (FFmpeg)":
\r
1129 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1130 double max = slider_videoQuality.Maximum;
\r
1131 double min = slider_videoQuality.Minimum;
\r
1132 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1133 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1135 case "H.264 (x264)":
\r
1137 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1138 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1139 System.Globalization.NumberStyles.Number,
\r
1142 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1143 max = slider_videoQuality.Maximum * divided;
\r
1144 min = slider_videoQuality.Minimum;
\r
1145 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1146 rfValue = Math.Round(rfValue, 2);
\r
1147 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1149 case "VP3 (Theora)":
\r
1150 rfValue = slider_videoQuality.Value;
\r
1151 double value = rfValue / 63;
\r
1152 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1156 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1158 text_bitrate.Enabled = false;
\r
1159 text_filesize.Enabled = true;
\r
1160 slider_videoQuality.Enabled = false;
\r
1162 check_2PassEncode.Enabled = true;
\r
1164 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1166 text_bitrate.Enabled = true;
\r
1167 text_filesize.Enabled = false;
\r
1168 slider_videoQuality.Enabled = false;
\r
1170 check_2PassEncode.Enabled = true;
\r
1172 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1174 text_bitrate.Enabled = false;
\r
1175 text_filesize.Enabled = false;
\r
1176 slider_videoQuality.Enabled = true;
\r
1178 check_2PassEncode.Enabled = false;
\r
1179 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1181 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1183 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1185 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1186 check_turbo.Enabled = true;
\r
1190 check_turbo.Enabled = false;
\r
1191 check_turbo.CheckState = CheckState.Unchecked;
\r
1196 private void text_width_TextChanged(object sender, EventArgs e)
\r
1198 if (text_width.Text == "")
\r
1199 text_width.BackColor = Color.White;
\r
1201 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
1202 lbl_max.Text = "";
\r
1205 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1208 text_width.BackColor = (width % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1210 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1212 if (drp_anamorphic.Text == "None")
\r
1214 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1216 text_height.Text = height.ToString();
\r
1221 private void text_height_TextChanged(object sender, EventArgs e)
\r
1223 if (text_height.Text == "")
\r
1224 text_height.BackColor = Color.White;
\r
1226 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1227 if (maxWidth != 0)
\r
1228 lbl_max.Text = "Max Width";
\r
1230 lbl_max.Text = "";
\r
1233 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1235 text_height.BackColor = (height % 16) != 0 ? Color.LightCoral : Color.LightGreen;
\r
1237 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1239 text_left.Enabled = true;
\r
1240 text_right.Enabled = true;
\r
1241 text_top.Enabled = true;
\r
1242 text_bottom.Enabled = true;
\r
1243 if (selectedTitle != null)
\r
1245 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1246 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1247 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1248 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1252 text_left.Text = "0";
\r
1253 text_right.Text = "0";
\r
1254 text_top.Text = "0";
\r
1255 text_bottom.Text = "0";
\r
1258 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1260 text_left.Enabled = false;
\r
1261 text_right.Enabled = false;
\r
1262 text_top.Enabled = false;
\r
1263 text_bottom.Enabled = false;
\r
1265 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1267 if (drp_anamorphic.SelectedIndex == 1)
\r
1269 text_height.BackColor = Color.LightGray;
\r
1270 text_width.BackColor = Color.LightGray;
\r
1271 text_height.Text = "";
\r
1272 text_width.Text = "";
\r
1273 text_height.Enabled = false;
\r
1274 text_width.Enabled = false;
\r
1277 if (drp_anamorphic.SelectedIndex == 2)
\r
1279 text_height.Text = "";
\r
1280 text_height.Enabled = false;
\r
1281 text_height.BackColor = Color.LightGray;
\r
1283 text_width.Enabled = true;
\r
1284 text_width.BackColor = Color.White;
\r
1287 if (drp_anamorphic.SelectedIndex == 0)
\r
1289 text_height.BackColor = Color.White;
\r
1290 text_width.BackColor = Color.White;
\r
1291 text_height.Enabled = true;
\r
1292 text_width.Enabled = true;
\r
1297 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1299 if (ctl_decomb.getDropValue != "Off")
\r
1300 if (ctl_deinterlace.getDropValue != "None")
\r
1301 ctl_deinterlace.setOption("None");
\r
1303 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1305 if (ctl_detelecine.getDropValue != "None")
\r
1306 if (ctl_decomb.getDropValue != "Off")
\r
1307 ctl_decomb.setOption("Off");
\r
1309 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1311 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1315 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1317 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1319 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1320 lv_audioList.Select();
\r
1323 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1325 if (drp_audenc_1.Text == "AC3")
\r
1327 drp_audmix_1.Enabled = false;
\r
1328 drp_audbit_1.Enabled = false;
\r
1329 drp_audsr_1.Enabled = false;
\r
1331 drp_audmix_1.SelectedIndex = 0;
\r
1332 drp_audbit_1.SelectedIndex = 0;
\r
1333 drp_audsr_1.SelectedIndex = 0;
\r
1337 drp_audmix_1.Enabled = true;
\r
1338 drp_audbit_1.Enabled = true;
\r
1339 drp_audsr_1.Enabled = true;
\r
1341 drp_audmix_1.Text = "Automatic";
\r
1342 drp_audbit_1.Text = "160";
\r
1343 drp_audsr_1.Text = "Auto";
\r
1346 if (drp_audenc_1.Text == "AAC")
\r
1348 setMixDownAllOptions(drp_audmix_1);
\r
1349 setBitrateSelections160(drp_audbit_1);
\r
1353 setMixDownNotAAC(drp_audmix_1);
\r
1354 setBitrateSelections320(drp_audbit_1);
\r
1357 // Update an item in the Audio list if required.
\r
1358 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1360 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1361 lv_audioList.Select();
\r
1364 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1366 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1367 setBitrateSelections384(drp_audbit_1);
\r
1368 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1369 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1371 // Update an item in the Audio list if required.
\r
1372 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1374 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1375 lv_audioList.Select();
\r
1378 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1380 // Update an item in the Audio list if required.
\r
1381 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1383 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1384 lv_audioList.Select();
\r
1387 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1389 // Update an item in the Audio list if required.
\r
1390 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1392 if (drp_audenc_1.Text == "AC3")
\r
1393 drp_audbit_1.Text = "Auto";
\r
1394 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1395 lv_audioList.Select();
\r
1398 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1401 if (tb_drc.Value == 0) value = 0;
\r
1403 value = ((tb_drc.Value - 1) / 10.0) + 1;
\r
1405 lbl_drc.Text = value.ToString();
\r
1407 // Update an item in the Audio list if required.
\r
1408 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1410 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1411 lv_audioList.Select();
\r
1415 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1417 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1418 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1419 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1420 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1421 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1422 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1423 newTrack.SubItems.Add(lbl_drc.Text);
\r
1425 // Select the newly added track and select the control
\r
1426 lv_audioList.Items.Add(newTrack);
\r
1427 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1428 lv_audioList.Select();
\r
1430 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1432 removeAudioTrack();
\r
1434 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1436 if (lv_audioList.SelectedIndices.Count != 0)
\r
1438 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1439 int index = item.Index;
\r
1442 if (lv_audioList.Items.Count > index && index >= 0)
\r
1444 lv_audioList.Items.Remove(item);
\r
1445 lv_audioList.Items.Insert(index, item);
\r
1446 item.Selected = true;
\r
1447 lv_audioList.Focus();
\r
1451 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1453 if (lv_audioList.SelectedIndices.Count != 0)
\r
1455 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1456 int index = item.Index;
\r
1459 if (index < lv_audioList.Items.Count)
\r
1461 lv_audioList.Items.Remove(item);
\r
1462 lv_audioList.Items.Insert(index, item);
\r
1463 item.Selected = true;
\r
1464 lv_audioList.Focus();
\r
1469 private void audioList_remove_Click(object sender, EventArgs e)
\r
1471 removeAudioTrack();
\r
1473 private void removeAudioTrack()
\r
1475 // Remove the Item and reselect the control if the following conditions are met.
\r
1476 if (lv_audioList.SelectedItems.Count != 0)
\r
1478 // Record the current selected index.
\r
1479 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1481 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1483 // Now reslect the correct item and give focus to the audio list.
\r
1484 if (lv_audioList.Items.Count != 0)
\r
1486 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1487 lv_audioList.Items[currentPosition].Selected = true;
\r
1488 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1489 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1491 lv_audioList.Select();
\r
1495 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1497 // Set the dropdown controls based on the selected item in the Audio List.
\r
1498 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1500 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1501 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1502 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1503 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1504 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1505 double drcValue; int drcCalculated;
\r
1506 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1507 if (drcValue == 0) drcCalculated = 0;
\r
1509 drcValue = ((drcValue * 10) + 1) - 10;
\r
1510 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1511 tb_drc.Value = drcCalculated;
\r
1515 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1517 if (drp_subtitle.Text.Contains("None"))
\r
1519 check_forced.Enabled = false;
\r
1520 check_forced.Checked = false;
\r
1523 check_forced.Enabled = true;
\r
1526 // Chapter Marker Tab
\r
1527 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1529 if (Check_ChapterMarkers.Checked)
\r
1531 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1532 data_chpt.Rows.Clear();
\r
1533 data_chpt.Enabled = true;
\r
1534 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1535 if (chapterGridView != null)
\r
1536 data_chpt = chapterGridView;
\r
1540 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1541 data_chpt.Rows.Clear();
\r
1542 data_chpt.Enabled = false;
\r
1546 // Query Editor Tab
\r
1547 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1549 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1551 private void btn_clear_Click(object sender, EventArgs e)
\r
1553 rtf_query.Clear();
\r
1557 // MainWindow Components, Actions and Functions ***********************
\r
1559 #region Source Scan
\r
1560 private void setupGUIforScan(String filename)
\r
1562 text_source.Text = filename;
\r
1564 foreach (Control ctrl in Controls)
\r
1566 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1567 ctrl.Enabled = false;
\r
1569 lbl_encode.Visible = true;
\r
1570 lbl_encode.Text = "Scanning ...";
\r
1571 gb_source.Text = "Source: Scanning ...";
\r
1572 btn_source.Enabled = false;
\r
1573 btn_start.Enabled = false;
\r
1574 btn_showQueue.Enabled = false;
\r
1575 btn_add2Queue.Enabled = false;
\r
1576 tb_preview.Enabled = false;
\r
1577 mnu_killCLI.Visible = true;
\r
1579 private void startScan(String filename)
\r
1583 lbl_encode.Visible = true;
\r
1584 lbl_encode.Text = "Scanning...";
\r
1585 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1587 catch (Exception exc)
\r
1589 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1592 private void scanProcess(object state)
\r
1596 string inputFile = (string)state;
\r
1597 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1598 string dvdInfoPath = Path.Combine(Path.GetTempPath(), "dvdinfo.dat");
\r
1600 // Make we don't pick up a stale hb_encode_log.dat (and that we have rights to the file)
\r
1601 if (File.Exists(dvdInfoPath))
\r
1602 File.Delete(dvdInfoPath);
\r
1604 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 -v >""{2}"" 2>&1""", handbrakeCLIPath, inputFile, dvdInfoPath);
\r
1606 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
\r
1608 using (hbproc = Process.Start(hbParseDvd))
\r
1610 hbproc.WaitForExit();
\r
1613 if (!File.Exists(dvdInfoPath))
\r
1615 throw new Exception("Unable to retrieve the DVD Info. dvdinfo.dat is missing. \nExpected location of dvdinfo.dat: \n" + dvdInfoPath);
\r
1618 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1620 thisDVD = Parsing.DVD.Parse(sr);
\r
1625 updateUIafterScan();
\r
1627 catch (Exception exc)
\r
1629 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1633 private void updateUIafterScan()
\r
1637 if (InvokeRequired)
\r
1639 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1643 // Setup some GUI components
\r
1644 drp_dvdtitle.Items.Clear();
\r
1645 if (thisDVD.Titles.Count != 0)
\r
1646 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1647 drp_dvdtitle.Text = "Automatic";
\r
1648 drop_chapterFinish.Text = "Auto";
\r
1649 drop_chapterStart.Text = "Auto";
\r
1651 // Now select the longest title
\r
1652 if (thisDVD.Titles.Count != 0)
\r
1653 drp_dvdtitle.SelectedItem = hb_common_func.selectLongestTitle(drp_dvdtitle);
\r
1655 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1656 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1657 Check_ChapterMarkers.Enabled = true;
\r
1660 Check_ChapterMarkers.Enabled = false;
\r
1661 Check_ChapterMarkers.Checked = false;
\r
1662 data_chpt.Rows.Clear();
\r
1665 // If no titles were found, Display an error message
\r
1666 if (drp_dvdtitle.Items.Count == 0)
\r
1667 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
1669 // Enable the GUI components and enable any disabled components
\r
1672 catch (Exception exc)
\r
1674 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1679 private void enableGUI()
\r
1683 if (InvokeRequired)
\r
1685 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1687 lbl_encode.Text = "Scan Completed";
\r
1688 gb_source.Text = "Source";
\r
1689 foreach (Control ctrl in Controls)
\r
1690 ctrl.Enabled = true;
\r
1691 btn_start.Enabled = true;
\r
1692 btn_showQueue.Enabled = true;
\r
1693 btn_add2Queue.Enabled = true;
\r
1694 tb_preview.Enabled = true;
\r
1695 btn_source.Enabled = true;
\r
1696 mnu_killCLI.Visible = false;
\r
1698 catch (Exception exc)
\r
1700 MessageBox.Show("frmMain.cs - enableGUI " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1703 private static void killCLI()
\r
1705 // This may seem like a long way of killing HandBrakeCLI, but for whatever reason,
\r
1706 // hbproc.kill/close just won't do the trick.
\r
1709 string AppName = "HandBrakeCLI";
\r
1711 AppName = AppName.ToUpper();
\r
1713 Process[] prs = Process.GetProcesses();
\r
1714 foreach (Process proces in prs)
\r
1716 if (proces.ProcessName.ToUpper() == AppName)
\r
1719 if (!proces.HasExited)
\r
1724 catch (Exception ex)
\r
1726 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
1731 #region DVD Drive Detection
\r
1732 // Source Button Drive Detection
\r
1733 private delegate void ProgressUpdateHandler();
\r
1734 private void getDriveInfoThread()
\r
1738 if (InvokeRequired)
\r
1740 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1744 Boolean foundDrive = false;
\r
1745 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1746 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1748 if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
\r
1750 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1752 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1753 foundDrive = true;
\r
1759 if (foundDrive == false)
\r
1760 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1764 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1769 #region Audio Panel Code Helpers
\r
1770 private void setAudioByContainer(String path)
\r
1772 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1774 string oldval = drp_audenc_1.Text;
\r
1775 drp_audenc_1.Items.Clear();
\r
1776 drp_audenc_1.Items.Add("AAC");
\r
1777 drp_audenc_1.Items.Add("AC3");
\r
1778 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1779 drp_audenc_1.SelectedIndex = 0;
\r
1782 else if (path.Contains("MKV"))
\r
1784 drp_audenc_1.Items.Clear();
\r
1785 drp_audenc_1.Items.Add("AAC");
\r
1786 drp_audenc_1.Items.Add("MP3");
\r
1787 drp_audenc_1.Items.Add("AC3");
\r
1788 drp_audenc_1.Items.Add("Vorbis");
\r
1789 if (drp_audenc_1.Text == string.Empty)
\r
1790 drp_audenc_1.SelectedIndex = 0;
\r
1793 // Make sure the table is updated with new audio codecs
\r
1794 foreach (ListViewItem row in lv_audioList.Items)
\r
1796 if (!drp_audenc_1.Items.Contains(row.SubItems[1].Text))
\r
1797 row.SubItems[1].Text = drp_audenc_1.Items[0].ToString();
\r
1800 private void setVideoByContainer(String path)
\r
1804 if ((path.Contains("MP4")) || (path.Contains("M4V")))
\r
1806 oldval = drp_videoEncoder.Text;
\r
1807 drp_videoEncoder.Items.Clear();
\r
1808 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1809 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1810 if (oldval == "VP3 (Theora)")
\r
1811 drp_videoEncoder.SelectedIndex = 1;
\r
1813 drp_videoEncoder.Text = oldval;
\r
1816 else if (path.Contains("MKV"))
\r
1818 oldval = drp_videoEncoder.Text;
\r
1819 drp_videoEncoder.Items.Clear();
\r
1820 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1821 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1822 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1823 drp_videoEncoder.Text = oldval;
\r
1826 private static void setBitrateSelections384(ComboBox dropDown)
\r
1828 dropDown.Items.Clear();
\r
1829 dropDown.Items.Add("32");
\r
1830 dropDown.Items.Add("40");
\r
1831 dropDown.Items.Add("48");
\r
1832 dropDown.Items.Add("56");
\r
1833 dropDown.Items.Add("64");
\r
1834 dropDown.Items.Add("80");
\r
1835 dropDown.Items.Add("86");
\r
1836 dropDown.Items.Add("112");
\r
1837 dropDown.Items.Add("128");
\r
1838 dropDown.Items.Add("160");
\r
1839 dropDown.Items.Add("192");
\r
1840 dropDown.Items.Add("224");
\r
1841 dropDown.Items.Add("256");
\r
1842 dropDown.Items.Add("320");
\r
1843 dropDown.Items.Add("384");
\r
1845 private static void setBitrateSelections320(ComboBox dropDown)
\r
1847 dropDown.Items.Clear();
\r
1848 dropDown.Items.Add("32");
\r
1849 dropDown.Items.Add("40");
\r
1850 dropDown.Items.Add("48");
\r
1851 dropDown.Items.Add("56");
\r
1852 dropDown.Items.Add("64");
\r
1853 dropDown.Items.Add("80");
\r
1854 dropDown.Items.Add("86");
\r
1855 dropDown.Items.Add("112");
\r
1856 dropDown.Items.Add("128");
\r
1857 dropDown.Items.Add("160");
\r
1858 dropDown.Items.Add("192");
\r
1859 dropDown.Items.Add("224");
\r
1860 dropDown.Items.Add("256");
\r
1861 dropDown.Items.Add("320");
\r
1863 private static void setBitrateSelections160(ComboBox dropDown)
\r
1865 dropDown.Items.Clear();
\r
1866 dropDown.Items.Add("32");
\r
1867 dropDown.Items.Add("40");
\r
1868 dropDown.Items.Add("48");
\r
1869 dropDown.Items.Add("56");
\r
1870 dropDown.Items.Add("64");
\r
1871 dropDown.Items.Add("80");
\r
1872 dropDown.Items.Add("86");
\r
1873 dropDown.Items.Add("112");
\r
1874 dropDown.Items.Add("128");
\r
1875 dropDown.Items.Add("160");
\r
1877 private static void setMixDownAllOptions(ComboBox dropdown)
\r
1879 dropdown.Items.Clear();
\r
1880 dropdown.Items.Add("Automatic");
\r
1881 dropdown.Items.Add("Mono");
\r
1882 dropdown.Items.Add("Stereo");
\r
1883 dropdown.Items.Add("Dolby Surround");
\r
1884 dropdown.Items.Add("Dolby Pro Logic II");
\r
1885 dropdown.Items.Add("6 Channel Discrete");
\r
1887 private static void setMixDownNotAAC(ComboBox dropdown)
\r
1889 dropdown.Items.Clear();
\r
1890 dropdown.Items.Add("Automatic");
\r
1891 dropdown.Items.Add("Stereo");
\r
1892 dropdown.Items.Add("Dolby Surround");
\r
1893 dropdown.Items.Add("Dolby Pro Logic II");
\r
1897 #region Public Methods
\r
1900 /// Setup the GUI for Encoding or finished Encoding.
\r
1901 /// 1 = Encode Running
\r
1902 /// 0 = Encode Finished.
\r
1904 public void setEncodeFinished()
\r
1908 if (InvokeRequired)
\r
1910 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1914 lbl_encode.Text = "Encoding Finished";
\r
1915 btn_start.Text = "Start";
\r
1916 btn_start.ToolTipText = "Start the encoding process";
\r
1917 btn_start.Image = Properties.Resources.Play;
\r
1919 // If the window is minimized, display the notification in a popup.
\r
1920 if (FormWindowState.Minimized == this.WindowState)
\r
1922 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1923 notifyIcon.ShowBalloonTip(500);
\r
1926 catch (Exception exc)
\r
1928 MessageBox.Show(exc.ToString());
\r
1931 public void setEncodeStarted()
\r
1935 if (InvokeRequired)
\r
1937 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1941 lbl_encode.Visible = true;
\r
1942 lbl_encode.Text = "Encoding in Progress";
\r
1943 btn_start.Text = "Stop";
\r
1944 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
1945 btn_start.Image = Properties.Resources.stop;
\r
1947 catch (Exception exc)
\r
1949 MessageBox.Show(exc.ToString());
\r
1954 /// Action can be "encode" or "scan"
\r
1955 /// Set the last action varible in the main window.
\r
1956 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1958 /// <param name="last">String</param>
\r
1959 public void setLastAction(string last)
\r
1961 this.lastAction = last;
\r
1965 /// DVD parseing. Pass in a parsed DVD.
\r
1967 /// <param name="dvd"></param>
\r
1968 public void setStreamReader(Parsing.DVD dvd)
\r
1970 this.thisDVD = dvd;
\r
1974 /// Reload the preset panel display
\r
1976 public void loadPresetPanel()
\r
1978 presetHandler.loadPresetData();
\r
1979 treeView_presets.Nodes.Clear();
\r
1981 TreeNode preset_treeview;
\r
1982 TreeNode rootNode = new TreeNode();
\r
1983 TreeNode rootNodeTwo = new TreeNode();
\r
1984 TreeNode childNode;
\r
1985 int workingLevel = 0;
\r
1986 string previousCategory = String.Empty, currentCategory = String.Empty;
\r
1988 List<Preset> presetNameList = presetHandler.getBuildInPresets();
\r
1989 if (presetNameList.Count != 0)
\r
1991 foreach (Preset preset in presetNameList)
\r
1993 // Handle Root Nodes
\r
1995 // First Case - No presets have been read yet so setup the root category
\r
1996 if (preset.Level == 1 && currentCategory == String.Empty)
\r
1998 rootNode = new TreeNode(preset.Category);
\r
1999 workingLevel = preset.Level;
\r
2000 currentCategory = preset.Category;
\r
2001 previousCategory = preset.Category;
\r
2004 // Second Case - This is the first sub child node.
\r
2005 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
2007 rootNodeTwo = new TreeNode(preset.Category);
\r
2008 workingLevel = preset.Level;
\r
2009 currentCategory = preset.Category;
\r
2010 rootNode.Nodes.Add(rootNodeTwo);
\r
2013 // Third Case - Any presets the sub presets detected in the above if statment.
\r
2014 if (preset.Level == 1 && workingLevel == 2)
\r
2016 workingLevel = preset.Level;
\r
2017 currentCategory = preset.Category;
\r
2020 // Fourth Case - We've finished this root node and are onto the next root node.
\r
2021 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
2023 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
2025 rootNode = new TreeNode(preset.Category);
\r
2026 workingLevel = preset.Level;
\r
2027 currentCategory = preset.Category;
\r
2028 previousCategory = preset.Category;
\r
2031 // Handle Child Nodes
\r
2032 // Add First level child nodes to the current root node
\r
2033 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
2035 childNode = new TreeNode(preset.Name);
\r
2036 rootNode.Nodes.Add(childNode);
\r
2039 // Add Second level child nodes to the current sub root node
\r
2040 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
2042 childNode = new TreeNode(preset.Name);
\r
2043 rootNodeTwo.Nodes.Add(childNode);
\r
2047 // Add the final root node which does not get added above.
\r
2048 treeView_presets.Nodes.Add(rootNode);
\r
2052 List<string> presetNames = presetHandler.getUserPresetNames();
\r
2053 foreach (string preset in presetNames)
\r
2055 preset_treeview = new TreeNode(preset) { ForeColor = Color.Black };
\r
2057 // Now Fill Out List View with Items
\r
2058 treeView_presets.Nodes.Add(preset_treeview);
\r
2066 /// If the queue is being processed, prompt the user to confirm application close.
\r
2068 /// <param name="e"></param>
\r
2069 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2071 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2072 if ((encodeQueue.isEncoding) && (!encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
2074 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
2075 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2076 if (result == DialogResult.No)
\r
2079 base.OnFormClosing(e);
\r
2082 // This is the END of the road ------------------------------------------------------------------------------
\r