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.Generic;
\r
9 using System.Drawing;
\r
10 using System.Windows.Forms;
\r
12 using System.Diagnostics;
\r
13 using System.Threading;
\r
14 using Handbrake.EncodeQueue;
\r
15 using Handbrake.Functions;
\r
16 using Handbrake.Presets;
\r
17 using Handbrake.Parsing;
\r
21 public partial class frmMain : Form
\r
23 // Objects which may be used by one or more other objects *************
\r
24 QueueHandler encodeQueue = new QueueHandler();
\r
25 PresetsHandler presetHandler = new PresetsHandler();
\r
26 QueryGenerator queryGen = new QueryGenerator();
\r
28 // Globals: Mainly used for tracking. *********************************
\r
29 private Title selectedTitle;
\r
30 private DVD thisDVD;
\r
31 private frmQueue queueWindow;
\r
32 private frmPreview qtpreview;
\r
33 private Form splash;
\r
35 // Delegates **********************************************************
\r
36 private delegate void UpdateWindowHandler();
\r
37 private delegate void UpdateStatusChanger();
\r
39 // Applicaiton Startup ************************************************
\r
41 #region Application Startup
\r
44 // Load and setup the splash screen in this thread
\r
45 splash = new frmSplashScreen();
\r
47 Label lblStatus = new Label { Size = new Size(250, 20), Location = new Point(10, 280) };
\r
48 splash.Controls.Add(lblStatus);
\r
50 InitializeComponent();
\r
52 // Update the users config file with the CLI version data.
\r
53 lblStatus.Text = "Setting Version Data ...";
\r
54 Application.DoEvents();
\r
55 Main.setCliVersionData();
\r
57 // Show the form, but leave disabled until preloading is complete then show the main form
\r
58 this.Enabled = false;
\r
60 Application.DoEvents(); // Forces frmMain to draw
\r
62 // Check for new versions, if update checking is enabled
\r
63 if (Properties.Settings.Default.updateStatus == "Checked")
\r
65 lblStatus.Text = "Checking for updates ...";
\r
66 Application.DoEvents();
\r
68 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
69 updateCheckThread.Start();
\r
72 // Setup the GUI components
\r
73 lblStatus.Text = "Setting up the GUI ...";
\r
74 Application.DoEvents();
\r
75 loadPresetPanel(); // Load the Preset Panel
\r
76 treeView_presets.ExpandAll();
\r
77 lbl_encode.Text = "";
\r
78 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
79 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
80 tabs_panel.TabPages.RemoveAt(7); // Remove the query editor tab if the user does not want it enabled.
\r
82 // Load the user's default settings or Normal Preset
\r
83 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
85 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
87 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
88 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
92 //Ok, Reset all the H264 widgets before changing the preset
\r
93 x264Panel.reset2Defaults();
\r
95 // Send the query from the file to the Query Parser class, then load the preset
\r
96 QueryParser presetQuery = QueryParser.Parse(query);
\r
97 PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
99 // The x264 widgets will need updated, so do this now:
\r
100 x264Panel.X264_StandardizeOptString();
\r
101 x264Panel.X264_SetCurrentSettingsInPanel();
\r
105 loadNormalPreset();
\r
108 loadNormalPreset();
\r
110 // Enabled GUI tooltip's if Required
\r
111 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
112 ToolTip.Active = true;
\r
115 lblStatus.Text = "Loading Complete!";
\r
116 Application.DoEvents();
\r
119 this.Enabled = true;
\r
121 // Event Handlers and Queue Recovery
\r
126 // Startup Functions
\r
127 private void startupUpdateCheck()
\r
131 if (InvokeRequired)
\r
133 BeginInvoke(new UpdateStatusChanger(startupUpdateCheck));
\r
137 Boolean update = Main.updateCheck(false);
\r
140 frmUpdater updateWindow = new frmUpdater();
\r
141 updateWindow.Show();
\r
144 catch (Exception exc)
\r
146 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
149 private void queueRecovery()
\r
151 if (Main.check_queue_recovery())
\r
153 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
155 if (result == DialogResult.Yes)
\r
156 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
159 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
160 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
161 if (File.Exists(queuePath))
\r
162 File.Delete(queuePath);
\r
169 // Encoding Events for setting up the GUI
\r
170 private void events()
\r
172 // Handle Window Resize
\r
173 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
174 this.Resize += new EventHandler(frmMain_Resize);
\r
176 // Handle Encode Start / Finish / Pause
\r
177 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
178 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
179 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
181 // Handle a file being draged onto the GUI.
\r
182 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
183 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
186 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
188 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
189 e.Effect = DragDropEffects.All;
\r
191 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
193 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
194 if (fileList != null)
\r
196 if (fileList[0].StartsWith("\\"))
\r
197 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
200 if (fileList[0] != "")
\r
202 setupGUIforScan(fileList[0]);
\r
203 startScan(fileList[0]);
\r
206 text_source.Text = "Click 'Source' to continue";
\r
210 private void encodeStarted(object sender, EventArgs e)
\r
212 lastAction = "encode";
\r
213 setEncodeStarted();
\r
215 // Experimental HBProc Process Monitoring.
\r
216 if (Properties.Settings.Default.enocdeStatusInGui == "Checked")
\r
218 Thread encodeMon = new Thread(encodeMonitorThread);
\r
222 private void encodeEnded(object sender, EventArgs e)
\r
224 setEncodeFinished();
\r
226 private void encodePaused(object sender, EventArgs e)
\r
228 setEncodeFinished();
\r
232 // User Interface Menus / Tool Strips *********************************
\r
235 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
239 private void mnu_exit_Click(object sender, EventArgs e)
\r
241 Application.Exit();
\r
246 private void mnu_encode_Click(object sender, EventArgs e)
\r
248 queueWindow.Show();
\r
250 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
252 String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";
\r
254 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeQueue, this);
\r
255 dvdInfoWindow.Show();
\r
257 private void mnu_options_Click(object sender, EventArgs e)
\r
259 Form Options = new frmOptions();
\r
260 Options.ShowDialog();
\r
264 #region Presets Menu
\r
265 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
267 presetHandler.updateBuiltInPresets();
\r
269 if (treeView_presets.Nodes.Count == 0)
\r
270 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
272 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
274 treeView_presets.ExpandAll();
\r
276 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
278 // Empty the preset file
\r
279 string presetsFile = Application.StartupPath + "\\presets.xml";
\r
280 if (File.Exists(presetsFile))
\r
281 File.Delete(presetsFile);
\r
285 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
289 catch (Exception exc)
\r
291 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
294 // Reload the preset panel
\r
297 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
299 loadNormalPreset();
\r
301 private void btn_new_preset_Click(object sender, EventArgs e)
\r
303 Form preset = new frmAddPreset(this, queryGen.generateTheQuery(this), presetHandler);
\r
304 preset.ShowDialog();
\r
309 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
311 Process.Start("http://forum.handbrake.fr/");
\r
313 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
315 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
317 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
319 Process.Start("http://handbrake.fr");
\r
321 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
323 Boolean update = Main.updateCheck(true);
\r
326 frmUpdater updateWindow = new frmUpdater();
\r
327 updateWindow.Show();
\r
330 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
332 private void mnu_about_Click(object sender, EventArgs e)
\r
334 Form About = new frmAbout();
\r
335 About.ShowDialog();
\r
340 // Right Click Menu Code
\r
341 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
343 treeView_presets.ExpandAll();
\r
345 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
347 treeView_presets.CollapseAll();
\r
349 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
351 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
352 if (result == DialogResult.Yes)
\r
353 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, QueryGenerator.generateTabbedComponentsQuery(this), true);
\r
354 else if (result == DialogResult.No)
\r
355 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, QueryGenerator.generateTabbedComponentsQuery(this), false);
\r
357 private void pmnu_delete_click(object sender, EventArgs e)
\r
359 if (treeView_presets.SelectedNode != null)
\r
361 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
362 treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);
\r
364 treeView_presets.Select();
\r
366 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
368 // Make sure that the save menu is always disabled by default
\r
369 pmnu_saveChanges.Enabled = false;
\r
371 // Now enable the save menu if the selected preset is a user preset
\r
372 if (treeView_presets.SelectedNode != null)
\r
373 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
374 pmnu_saveChanges.Enabled = true;
\r
376 treeView_presets.Select();
\r
379 // Presets Management
\r
380 private void btn_addPreset_Click(object sender, EventArgs e)
\r
382 Form preset = new frmAddPreset(this, QueryGenerator.generateTabbedComponentsQuery(this), presetHandler);
\r
383 preset.ShowDialog();
\r
385 private void btn_removePreset_Click(object sender, EventArgs e)
\r
387 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
388 if (result == DialogResult.Yes)
\r
390 if (treeView_presets.SelectedNode != null)
\r
392 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
393 treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);
\r
396 treeView_presets.Select();
\r
398 private void btn_setDefault_Click(object sender, EventArgs e)
\r
400 if (treeView_presets.SelectedNode != null)
\r
402 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
403 if (result == DialogResult.Yes)
\r
405 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
406 Properties.Settings.Default.Save();
\r
407 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
411 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
413 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
415 if (e.Button == MouseButtons.Right)
\r
416 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
417 else if (e.Button == MouseButtons.Left)
\r
419 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
421 if (groupBox_output.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
426 treeView_presets.Select();
\r
428 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
432 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
434 if (e.KeyCode == Keys.Delete)
\r
436 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
437 if (result == DialogResult.Yes)
\r
439 if (treeView_presets.SelectedNode != null)
\r
440 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
442 // Remember each nodes expanded status so we can reload it
\r
443 List<Boolean> nodeStatus = new List<Boolean>();
\r
444 foreach (TreeNode node in treeView_presets.Nodes)
\r
445 nodeStatus.Add(node.IsExpanded);
\r
447 // Now reload the preset panel
\r
450 // And finally, re-expand any of the nodes if required
\r
452 foreach (TreeNode node in treeView_presets.Nodes)
\r
462 private void selectPreset()
\r
464 if (treeView_presets.SelectedNode != null)
\r
466 // Ok, so, we've selected a preset. Now we want to load it.
\r
467 string presetName = treeView_presets.SelectedNode.Text;
\r
468 if (presetHandler.getPreset(presetName) != null)
\r
470 string query = presetHandler.getPreset(presetName).Query;
\r
471 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
475 //Ok, Reset all the H264 widgets before changing the preset
\r
476 x264Panel.reset2Defaults();
\r
478 // Send the query from the file to the Query Parser class
\r
479 QueryParser presetQuery = QueryParser.Parse(query);
\r
481 // Now load the preset
\r
482 PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
484 // The x264 widgets will need updated, so do this now:
\r
485 x264Panel.X264_StandardizeOptString();
\r
486 x264Panel.X264_SetCurrentSettingsInPanel();
\r
491 private void loadNormalPreset()
\r
493 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
495 foreach (TreeNode node in treenode.Nodes)
\r
497 if (node.Text.Equals("Normal"))
\r
498 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
505 private void btn_source_Click(object sender, EventArgs e)
\r
507 if (Properties.Settings.Default.drive_detection == "Checked")
\r
509 mnu_dvd_drive.Visible = true;
\r
510 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
511 driveInfoThread.Start();
\r
514 mnu_dvd_drive.Visible = false;
\r
516 private void btn_start_Click(object sender, EventArgs e)
\r
518 if (btn_start.Text == "Stop")
\r
520 DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode?", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
522 if (result == DialogResult.Yes)
\r
525 encodeQueue.pauseEncodeQueue();
\r
527 // Allow the CLI to exit cleanly
\r
528 Win32.SetForegroundWindow(encodeQueue.encodeProcess.processHandle);
\r
529 SendKeys.Send("^C");
\r
532 setEncodeFinished();
\r
537 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
539 // Set the last action to encode.
\r
540 // This is used for tracking which file to load in the activity window
\r
541 lastAction = "encode";
\r
543 String query = rtf_query.Text != "" ? rtf_query.Text : queryGen.generateTheQuery(this);
\r
545 if (encodeQueue.count() == 0)
\r
546 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
548 queueWindow.setQueue();
\r
549 if (encodeQueue.count() > 1)
\r
550 queueWindow.Show(false);
\r
552 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
553 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
556 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
557 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
560 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
563 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
564 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
567 String query = queryGen.generateTheQuery(this);
\r
568 if (rtf_query.Text != "")
\r
569 query = rtf_query.Text;
\r
571 if (encodeQueue.checkDestinationPath(text_destination.Text))
\r
573 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
574 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
575 if (result == DialogResult.Yes)
\r
576 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
580 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
582 queueWindow.Show();
\r
585 private void btn_showQueue_Click(object sender, EventArgs e)
\r
587 queueWindow.Show();
\r
589 private void tb_preview_Click(object sender, EventArgs e)
\r
591 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
592 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
595 if (qtpreview == null)
\r
597 qtpreview = new frmPreview(this);
\r
600 else if (qtpreview.IsDisposed)
\r
602 qtpreview = new frmPreview(this);
\r
606 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
609 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
611 String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";
\r
613 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeQueue, this);
\r
614 ActivityWindow.Show();
\r
618 #region System Tray Icon
\r
619 private void frmMain_Resize(object sender, EventArgs e)
\r
621 if (FormWindowState.Minimized == this.WindowState)
\r
623 notifyIcon.Visible = true;
\r
624 if (!encodeQueue.isEncoding)
\r
626 notifyIcon.BalloonTipText = lbl_encode.Text != "" ? lbl_encode.Text : "Not Encoding";
\r
627 if (Properties.Settings.Default.trayIconAlerts == "Checked")
\r
628 notifyIcon.ShowBalloonTip(500);
\r
632 else if (FormWindowState.Normal == this.WindowState)
\r
633 notifyIcon.Visible = false;
\r
635 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
637 this.Visible = true;
\r
639 this.WindowState = FormWindowState.Normal;
\r
640 notifyIcon.Visible = false;
\r
642 private void btn_restore_Click(object sender, EventArgs e)
\r
644 this.Visible = true;
\r
646 this.WindowState = FormWindowState.Normal;
\r
647 notifyIcon.Visible = false;
\r
651 #region Tab Control
\r
654 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
656 // Enable the creation of chapter markers.
\r
657 Check_ChapterMarkers.Enabled = true;
\r
659 // Set the last action to scan.
\r
660 // This is used for tracking which file to load in the activity window
\r
661 lastAction = "scan";
\r
662 text_source.Text = "";
\r
664 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
666 String filename = DVD_Open.SelectedPath;
\r
668 if (filename.StartsWith("\\"))
\r
669 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
672 if (filename != "")
\r
674 setupGUIforScan(filename);
\r
675 startScan(filename);
\r
678 text_source.Text = "Click 'Source' to continue";
\r
682 text_source.Text = "Click 'Source' to continue";
\r
684 private void btn_file_source_Click(object sender, EventArgs e)
\r
686 // Set the last action to scan.
\r
687 // This is used for tracking which file to load in the activity window
\r
688 lastAction = "scan";
\r
689 text_source.Text = "";
\r
691 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
693 String filename = ISO_Open.FileName;
\r
694 if (filename.StartsWith("\\"))
\r
696 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",
\r
697 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
700 if (filename != "")
\r
702 setupGUIforScan(filename);
\r
703 startScan(filename);
\r
706 text_source.Text = "Click 'Source' to continue";
\r
710 text_source.Text = "Click 'Source' to continue";
\r
712 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
714 // Enable the creation of chapter markers.
\r
715 Check_ChapterMarkers.Enabled = true;
\r
717 // Set the last action to scan.
\r
718 // This is used for tracking which file to load in the activity window
\r
719 lastAction = "scan";
\r
721 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
723 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
724 String filename = path[0];
\r
725 setupGUIforScan(filename);
\r
726 startScan(filename);
\r
729 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
730 if (drp_dvdtitle.Items.Count == 0)
\r
731 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
733 lbl_encode.Text = "";
\r
735 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
737 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
738 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
740 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
742 // Reset some values on the form
\r
743 pictureSettings.lbl_Aspect.Text = "Select a Title";
\r
744 //lbl_RecomendedCrop.Text = "Select a Title";
\r
745 drop_chapterStart.Items.Clear();
\r
746 drop_chapterFinish.Items.Clear();
\r
748 // If the dropdown is set to automatic nothing else needs to be done.
\r
749 // Otheriwse if its not, title data has to be loased from parsing.
\r
750 if (drp_dvdtitle.Text != "Automatic")
\r
752 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
753 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
754 pictureSettings.setComponentsAfterScan(selectedTitle); // Setup Picture Settings Tab Control
\r
756 // Populate the Angles dropdown
\r
757 drop_angle.Items.Clear();
\r
758 if (Properties.Settings.Default.dvdnav == "Checked")
\r
760 drop_angle.Visible = true;
\r
761 lbl_angle.Visible = true;
\r
762 drop_angle.Items.AddRange(selectedTitle.Angles.ToArray());
\r
763 if (drop_angle.Items.Count != 0)
\r
764 drop_angle.SelectedIndex = 0;
\r
768 drop_angle.Visible = false;
\r
769 lbl_angle.Visible = false;
\r
772 // Populate the Start chapter Dropdown
\r
773 drop_chapterStart.Items.Clear();
\r
774 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
775 if (drop_chapterStart.Items.Count > 0)
\r
776 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
778 // Populate the Final Chapter Dropdown
\r
779 drop_chapterFinish.Items.Clear();
\r
780 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
781 if (drop_chapterFinish.Items.Count > 0)
\r
782 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
784 // Populate the Audio Channels Dropdown
\r
785 audioPanel.setTrackList(selectedTitle);
\r
787 // Populate the Subtitles dropdown
\r
788 Subtitles.drp_subtitleTracks.Items.Clear();
\r
789 Subtitles.drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");
\r
790 Subtitles.drp_subtitleTracks.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
791 Subtitles.drp_subtitleTracks.SelectedIndex = 0;
\r
794 // Run the autoName & chapterNaming functions
\r
795 if (Properties.Settings.Default.autoNaming == "Checked")
\r
797 string autoPath = Main.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
798 if (autoPath != null)
\r
799 text_destination.Text = autoPath;
\r
801 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
804 data_chpt.Rows.Clear();
\r
805 if (selectedTitle.Chapters.Count != 1)
\r
807 DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
808 if (chapterGridView != null)
\r
809 data_chpt = chapterGridView;
\r
813 Check_ChapterMarkers.Checked = false;
\r
814 Check_ChapterMarkers.Enabled = false;
\r
817 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
818 data_chpt.Columns[0].Width = 166;
\r
819 data_chpt.Columns[0].Width = 165;
\r
821 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
823 int c_start, c_end;
\r
825 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
826 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
828 int.TryParse(drop_chapterStart.Text, out c_start);
\r
829 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
833 if (c_start > c_end)
\r
834 drop_chapterFinish.Text = c_start.ToString();
\r
837 lbl_duration.Text = Main.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
839 // Run the Autonaming function
\r
840 if (Properties.Settings.Default.autoNaming == "Checked")
\r
841 text_destination.Text = Main.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
843 // Disable chapter markers if only 1 chapter is selected.
\r
844 if (c_start == c_end)
\r
846 Check_ChapterMarkers.Checked = false;
\r
847 Check_ChapterMarkers.Enabled = false;
\r
850 Check_ChapterMarkers.Enabled = true;
\r
852 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
854 int c_start, c_end;
\r
856 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
857 drop_chapterStart.SelectedIndex = 1;
\r
859 int.TryParse(drop_chapterStart.Text, out c_start);
\r
860 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
864 if (c_end < c_start)
\r
865 drop_chapterFinish.Text = c_start.ToString();
\r
868 lbl_duration.Text = Main.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
870 // Run the Autonaming function
\r
871 if (Properties.Settings.Default.autoNaming == "Checked")
\r
872 text_destination.Text = Main.autoName(drp_dvdtitle, drop_chapterStart.Text, drop_chapterFinish.Text, text_source.Text, text_destination.Text, drop_format.SelectedIndex);
\r
874 // Add more rows to the Chapter menu if needed.
\r
875 if (Check_ChapterMarkers.Checked)
\r
877 int i = data_chpt.Rows.Count, finish = 0;
\r
879 if (drop_chapterFinish.Text != "Auto")
\r
880 int.TryParse(drop_chapterFinish.Text, out finish);
\r
884 int n = data_chpt.Rows.Add();
\r
885 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
886 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
887 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
888 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
893 // Disable chapter markers if only 1 chapter is selected.
\r
894 if (c_start == c_end)
\r
896 Check_ChapterMarkers.Checked = false;
\r
897 Check_ChapterMarkers.Enabled = false;
\r
900 Check_ChapterMarkers.Enabled = true;
\r
904 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
906 // This removes the file extension from the filename box on the save file dialog.
\r
907 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
908 DVD_Save.FileName = Path.GetFileNameWithoutExtension(text_destination.Text);
\r
910 if (Path.IsPathRooted(text_destination.Text))
\r
911 DVD_Save.InitialDirectory = Path.GetDirectoryName(text_destination.Text);
\r
913 // Show the dialog and set the main form file path
\r
914 if (drop_format.SelectedIndex.Equals(0))
\r
915 DVD_Save.FilterIndex = 1;
\r
916 else if (drop_format.SelectedIndex.Equals(1))
\r
917 DVD_Save.FilterIndex = 2;
\r
918 else if (drop_format.SelectedIndex.Equals(2))
\r
919 DVD_Save.FilterIndex = 3;
\r
921 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
923 if (DVD_Save.FileName.StartsWith("\\"))
\r
924 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
927 // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames
\r
928 switch (DVD_Save.FilterIndex)
\r
931 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))
\r
932 DVD_Save.FileName += ".mp4";
\r
935 if (!Path.GetExtension(DVD_Save.FileName).Equals(".m4v", StringComparison.InvariantCultureIgnoreCase))
\r
936 DVD_Save.FileName += ".m4v";
\r
939 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))
\r
940 DVD_Save.FileName += ".mkv";
\r
946 text_destination.Text = DVD_Save.FileName;
\r
948 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
949 if (Check_ChapterMarkers.Checked)
\r
950 drop_format.SelectedIndex = 1;
\r
954 private void text_destination_TextChanged(object sender, EventArgs e)
\r
956 string path = text_destination.Text;
\r
957 if (path.EndsWith(".mp4"))
\r
958 drop_format.SelectedIndex = 0;
\r
959 else if (path.EndsWith(".m4v"))
\r
960 drop_format.SelectedIndex = 1;
\r
961 else if (path.EndsWith(".mkv"))
\r
962 drop_format.SelectedIndex = 2;
\r
966 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
968 if (drop_format.SelectedIndex == 0)
\r
969 setExtension(".mp4");
\r
970 else if (drop_format.SelectedIndex == 1)
\r
971 setExtension(".m4v");
\r
972 else if (drop_format.SelectedIndex == 2)
\r
973 setExtension(".mkv");
\r
975 audioPanel.setAudioByContainer(drop_format.Text);
\r
976 Subtitles.setContainer = drop_format.SelectedIndex;
\r
979 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
981 oldval = drp_videoEncoder.Text;
\r
982 drp_videoEncoder.Items.Clear();
\r
983 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
984 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
985 if (oldval == "VP3 (Theora)")
\r
986 drp_videoEncoder.SelectedIndex = 1;
\r
988 drp_videoEncoder.Text = oldval;
\r
990 else if (drop_format.Text.Contains("MKV"))
\r
992 oldval = drp_videoEncoder.Text;
\r
993 drp_videoEncoder.Items.Clear();
\r
994 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
995 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
996 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
997 drp_videoEncoder.Text = oldval;
\r
1000 private void setExtension(string newExtension)
\r
1002 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
1003 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1004 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1008 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1010 setContainerOpts();
\r
1012 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1013 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1015 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1016 check_turbo.Enabled = true;
\r
1018 tab_advanced.Enabled = true;
\r
1019 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
1020 check_iPodAtom.Enabled = true;
\r
1022 check_iPodAtom.Enabled = false;
\r
1026 check_turbo.CheckState = CheckState.Unchecked;
\r
1027 check_turbo.Enabled = false;
\r
1028 tab_advanced.Enabled = false;
\r
1029 x264Panel.x264Query = "";
\r
1030 check_iPodAtom.Enabled = false;
\r
1031 check_iPodAtom.Checked = false;
\r
1034 // Setup the CQ Slider
\r
1035 switch (drp_videoEncoder.Text)
\r
1037 case "MPEG-4 (FFmpeg)":
\r
1038 slider_videoQuality.Minimum = 1;
\r
1039 slider_videoQuality.Maximum = 31;
\r
1040 slider_videoQuality.Value = 1;
\r
1041 SliderValue.Text = "0% QP: 31.00";
\r
1043 case "H.264 (x264)":
\r
1044 slider_videoQuality.Minimum = 0;
\r
1045 slider_videoQuality.Value = 0;
\r
1046 slider_videoQuality.TickFrequency = 1;
\r
1047 SliderValue.Text = "0% RF: 51.00";
\r
1048 String step = Properties.Settings.Default.x264cqstep;
\r
1052 slider_videoQuality.Maximum = 255;
\r
1055 slider_videoQuality.Maximum = 204;
\r
1058 slider_videoQuality.Maximum = 155;
\r
1061 slider_videoQuality.Maximum = 102;
\r
1064 slider_videoQuality.Maximum = 51;
\r
1067 slider_videoQuality.Maximum = 51;
\r
1071 case "VP3 (Theora)":
\r
1072 slider_videoQuality.Minimum = 0;
\r
1073 slider_videoQuality.Maximum = 63;
\r
1074 slider_videoQuality.Value = 0;
\r
1075 SliderValue.Text = "0% QP: 0.00";
\r
1080 /// Set the container format options
\r
1082 public void setContainerOpts()
\r
1084 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
1086 check_largeFile.Enabled = true;
\r
1087 check_optimiseMP4.Enabled = true;
\r
1088 check_iPodAtom.Enabled = true;
\r
1092 check_largeFile.Enabled = false;
\r
1093 check_optimiseMP4.Enabled = false;
\r
1094 check_iPodAtom.Enabled = false;
\r
1095 check_largeFile.Checked = false;
\r
1096 check_optimiseMP4.Checked = false;
\r
1097 check_iPodAtom.Checked = false;
\r
1100 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1102 switch (drp_videoEncoder.Text)
\r
1104 case "MPEG-4 (FFmpeg)":
\r
1105 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1106 double max = slider_videoQuality.Maximum;
\r
1107 double min = slider_videoQuality.Minimum;
\r
1108 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1109 SliderValue.Text = Math.Round((val * 100), 2) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1111 case "H.264 (x264)":
\r
1113 System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
\r
1114 double.TryParse(Properties.Settings.Default.x264cqstep,
\r
1115 System.Globalization.NumberStyles.Number,
\r
1118 rfValue = 51.0 - slider_videoQuality.Value * divided;
\r
1119 max = slider_videoQuality.Maximum * divided;
\r
1120 min = slider_videoQuality.Minimum;
\r
1121 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1122 rfValue = Math.Round(rfValue, 2);
\r
1123 SliderValue.Text = Math.Round((val * 100), 2) + "% RF:" + rfValue;
\r
1125 case "VP3 (Theora)":
\r
1126 rfValue = slider_videoQuality.Value;
\r
1127 double value = rfValue / 63;
\r
1128 SliderValue.Text = Math.Round((value * 100), 2) + "% QP:" + slider_videoQuality.Value;
\r
1132 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1134 text_bitrate.Enabled = false;
\r
1135 text_filesize.Enabled = true;
\r
1136 slider_videoQuality.Enabled = false;
\r
1138 check_2PassEncode.Enabled = true;
\r
1140 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1142 text_bitrate.Enabled = true;
\r
1143 text_filesize.Enabled = false;
\r
1144 slider_videoQuality.Enabled = false;
\r
1146 check_2PassEncode.Enabled = true;
\r
1148 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1150 text_bitrate.Enabled = false;
\r
1151 text_filesize.Enabled = false;
\r
1152 slider_videoQuality.Enabled = true;
\r
1154 check_2PassEncode.Enabled = false;
\r
1155 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1157 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1159 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1161 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1162 check_turbo.Enabled = true;
\r
1166 check_turbo.Enabled = false;
\r
1167 check_turbo.CheckState = CheckState.Unchecked;
\r
1172 private void ctl_decomb_changed(object sender, EventArgs e)
\r
1174 if (ctl_decomb.getDropValue != "Off")
\r
1175 if (ctl_deinterlace.getDropValue != "None")
\r
1176 ctl_deinterlace.setOption("None");
\r
1178 private void ctl_deinterlace_changed(object sender, EventArgs e)
\r
1180 if (ctl_detelecine.getDropValue != "None")
\r
1181 if (ctl_decomb.getDropValue != "Off")
\r
1182 ctl_decomb.setOption("Off");
\r
1184 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1186 lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();
\r
1189 // Chapter Marker Tab
\r
1190 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1192 if (Check_ChapterMarkers.Checked)
\r
1194 drop_format.SelectedIndex = 1;
\r
1195 data_chpt.Rows.Clear();
\r
1196 data_chpt.Enabled = true;
\r
1197 DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1198 if (chapterGridView != null)
\r
1199 data_chpt = chapterGridView;
\r
1203 drop_format.SelectedIndex = 0;
\r
1204 data_chpt.Rows.Clear();
\r
1205 data_chpt.Enabled = false;
\r
1209 // Query Editor Tab
\r
1210 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1212 rtf_query.Text = queryGen.generateTheQuery(this);
\r
1214 private void btn_clear_Click(object sender, EventArgs e)
\r
1216 rtf_query.Clear();
\r
1220 // MainWindow Components, Actions and Functions ***********************
\r
1222 #region Source Scan
\r
1223 public Boolean isScanning { get; set; }
\r
1224 private static int scanProcessID { get; set; }
\r
1225 private void setupGUIforScan(String filename)
\r
1227 text_source.Text = filename;
\r
1229 foreach (Control ctrl in Controls)
\r
1231 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1232 ctrl.Enabled = false;
\r
1234 lbl_encode.Visible = true;
\r
1235 lbl_encode.Text = "Scanning ...";
\r
1236 gb_source.Text = "Source: Scanning ...";
\r
1237 btn_source.Enabled = false;
\r
1238 btn_start.Enabled = false;
\r
1239 btn_showQueue.Enabled = false;
\r
1240 btn_add2Queue.Enabled = false;
\r
1241 tb_preview.Enabled = false;
\r
1242 mnu_killCLI.Visible = true;
\r
1244 private void startScan(String filename)
\r
1248 lbl_encode.Visible = true;
\r
1249 lbl_encode.Text = "Scanning...";
\r
1250 isScanning = true;
\r
1251 ThreadPool.QueueUserWorkItem(scanProcess, filename);
\r
1253 catch (Exception exc)
\r
1255 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1258 private void scanProcess(object state)
\r
1262 string inputFile = (string)state;
\r
1263 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1264 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
1265 string dvdInfoPath = Path.Combine(logDir, "last_scan_log.txt");
\r
1267 // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)
\r
1268 if (File.Exists(dvdInfoPath))
\r
1269 File.Delete(dvdInfoPath);
\r
1271 String dvdnav = string.Empty;
\r
1272 if (Properties.Settings.Default.dvdnav == "Checked")
\r
1273 dvdnav = " --dvdnav";
\r
1274 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 {2} -v >""{3}"" 2>&1""", handbrakeCLIPath, inputFile, dvdnav, dvdInfoPath);
\r
1276 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
\r
1278 Boolean cleanExit = true;
\r
1279 using (hbproc = Process.Start(hbParseDvd))
\r
1281 Process[] before = Process.GetProcesses(); // Get a list of running processes before starting.
\r
1282 scanProcessID = Main.getCliProcess(before);
\r
1283 hbproc.WaitForExit();
\r
1284 if (hbproc.ExitCode != 0)
\r
1285 cleanExit = false;
\r
1288 if (cleanExit) // If 0 exit code, CLI exited cleanly.
\r
1290 if (!File.Exists(dvdInfoPath))
\r
1292 throw new Exception(
\r
1293 "Unable to retrieve the DVD Info. last_scan_log.txt is missing. \nExpected location of last_scan_log.txt: \n" +
\r
1297 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1299 thisDVD = DVD.Parse(sr);
\r
1304 updateUIafterScan();
\r
1307 catch (Exception exc)
\r
1309 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1313 private void updateUIafterScan()
\r
1317 if (InvokeRequired)
\r
1319 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1323 // Setup some GUI components
\r
1324 drp_dvdtitle.Items.Clear();
\r
1325 if (thisDVD.Titles.Count != 0)
\r
1326 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1327 drp_dvdtitle.Text = "Automatic";
\r
1328 drop_chapterFinish.Text = "Auto";
\r
1329 drop_chapterStart.Text = "Auto";
\r
1331 // Now select the longest title
\r
1332 if (thisDVD.Titles.Count != 0)
\r
1333 drp_dvdtitle.SelectedItem = Main.selectLongestTitle(drp_dvdtitle);
\r
1335 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1336 if (text_source.Text.ToLower().Contains(".iso") || text_source.Text.ToLower().Contains("VIDEO_TS"))
\r
1337 Check_ChapterMarkers.Enabled = true;
\r
1340 Check_ChapterMarkers.Enabled = false;
\r
1341 Check_ChapterMarkers.Checked = false;
\r
1342 data_chpt.Rows.Clear();
\r
1345 // If no titles were found, Display an error message
\r
1346 if (drp_dvdtitle.Items.Count == 0)
\r
1347 MessageBox.Show("No Title(s) found. \n\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
1349 // Enable the GUI components and enable any disabled components
\r
1352 catch (Exception exc)
\r
1354 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1358 private void enableGUI()
\r
1362 if (InvokeRequired)
\r
1363 BeginInvoke(new UpdateWindowHandler(enableGUI));
\r
1364 lbl_encode.Text = "Scan Completed";
\r
1365 gb_source.Text = "Source";
\r
1366 foreach (Control ctrl in Controls)
\r
1367 ctrl.Enabled = true;
\r
1368 btn_start.Enabled = true;
\r
1369 btn_showQueue.Enabled = true;
\r
1370 btn_add2Queue.Enabled = true;
\r
1371 tb_preview.Enabled = true;
\r
1372 btn_source.Enabled = true;
\r
1373 mnu_killCLI.Visible = false;
\r
1375 catch (Exception exc)
\r
1377 MessageBox.Show("frmMain.cs - enableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1380 private void killScan()
\r
1387 Process[] prs = Process.GetProcesses();
\r
1388 foreach (Process process in prs)
\r
1390 if (process.Id == scanProcessID)
\r
1392 process.Refresh();
\r
1393 if (!process.HasExited)
\r
1398 catch (Exception ex)
\r
1400 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
1403 private void resetGUI()
\r
1405 drp_dvdtitle.Items.Clear();
\r
1406 drp_dvdtitle.Text = "Automatic";
\r
1407 drop_chapterStart.Items.Clear();
\r
1408 drop_chapterStart.Text = "Auto";
\r
1409 drop_chapterFinish.Items.Clear();
\r
1410 drop_chapterFinish.Text = "Auto";
\r
1411 lbl_duration.Text = "Select a Title";
\r
1412 pictureSettings.lbl_src_res.Text = "Select a Title";
\r
1413 pictureSettings.lbl_Aspect.Text = "Select a Title";
\r
1414 text_source.Text = "Click 'Source' to continue";
\r
1415 text_destination.Text = "";
\r
1417 selectedTitle = null;
\r
1418 isScanning = false;
\r
1424 /// Set the GUI to it's finished encoding state.
\r
1426 private void setEncodeFinished()
\r
1430 if (InvokeRequired)
\r
1432 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1436 lbl_encode.Text = "Encoding Finished";
\r
1437 btn_start.Text = "Start";
\r
1438 btn_start.ToolTipText = "Start the encoding process";
\r
1439 btn_start.Image = Properties.Resources.Play;
\r
1441 // If the window is minimized, display the notification in a popup.
\r
1442 if (FormWindowState.Minimized == this.WindowState)
\r
1444 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1445 notifyIcon.ShowBalloonTip(500);
\r
1448 catch (Exception exc)
\r
1450 MessageBox.Show(exc.ToString());
\r
1455 /// Set the GUI to it's started encoding state.
\r
1457 private void setEncodeStarted()
\r
1461 if (InvokeRequired)
\r
1463 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1467 lbl_encode.Visible = true;
\r
1468 lbl_encode.Text = "Encoding in Progress";
\r
1469 btn_start.Text = "Stop";
\r
1470 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
1471 btn_start.Image = Properties.Resources.stop;
\r
1473 catch (Exception exc)
\r
1475 MessageBox.Show(exc.ToString());
\r
1480 #region DVD Drive Detection
\r
1481 private delegate void ProgressUpdateHandler();
\r
1482 private void getDriveInfoThread()
\r
1486 if (InvokeRequired)
\r
1488 BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1492 Boolean foundDrive = false;
\r
1493 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1494 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1496 if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
\r
1498 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1500 mnu_dvd_drive.Text = curDrive.RootDirectory + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1501 foundDrive = true;
\r
1507 if (foundDrive == false)
\r
1508 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1512 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1517 #region Public Methods
\r
1519 /// Access the preset Handler and setup the preset panel.
\r
1521 public void loadPresetPanel()
\r
1523 if (presetHandler.checkIfPresetsAreOutOfDate())
\r
1524 if (Properties.Settings.Default.presetNotification == "Unchecked")
\r
1526 "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",
\r
1527 "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
1529 presetHandler.getPresetPanel(ref treeView_presets);
\r
1530 treeView_presets.Update();
\r
1534 /// Either Encode or Scan was last performed.
\r
1536 public string lastAction { get; set; }
\r
1541 /// If the queue is being processed, prompt the user to confirm application close.
\r
1543 /// <param name="e"></param>
\r
1544 protected override void OnFormClosing(FormClosingEventArgs e)
\r
1546 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
1547 if ((encodeQueue.isEncoding) && (!encodeQueue.isPaused) && (encodeQueue.count() > 0))
\r
1549 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
1550 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
1551 if (result == DialogResult.No)
\r
1554 base.OnFormClosing(e);
\r
1558 #region In-GUI Encode Status (Experimental)
\r
1560 private void encodeMonitorThread()
\r
1564 Parser encode = new Parser(encodeQueue.encodeProcess.hbProcProcess.StandardOutput.BaseStream);
\r
1565 encode.OnEncodeProgress += encodeOnEncodeProgress;
\r
1566 while (!encode.EndOfStream)
\r
1568 encode.readEncodeStatus();
\r
1571 catch (Exception exc)
\r
1573 MessageBox.Show(exc.ToString());
\r
1576 private void encodeOnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)
\r
1578 if (this.InvokeRequired)
\r
1580 this.BeginInvoke(new EncodeProgressEventHandler(encodeOnEncodeProgress),
\r
1581 new object[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });
\r
1584 lbl_encode.Text = string.Format("Encode Progress: {0}%, FPS: {1}, Avg FPS: {2}, Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);
\r
1589 // This is the END of the road ****************************************
\r