3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections;
\r
9 using System.Collections.Generic;
\r
10 using System.Drawing;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
18 public partial class frmMain : Form
\r
20 // Objects which may be used by one or more other objects
\r
21 private delegate void UpdateWindowHandler();
\r
22 Functions.Main hb_common_func = new Functions.Main();
\r
23 Functions.Encode encodeHandler = new Functions.Encode();
\r
24 Queue.QueueHandler encodeQueue = new Queue.QueueHandler();
\r
25 Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();
\r
26 Parsing.Title selectedTitle;
\r
27 Parsing.DVD thisDVD;
\r
29 // Objects belonging to this window only
\r
30 PresetLoader presetLoader = new PresetLoader();
\r
31 x264Panel x264PanelFunctions = new x264Panel();
\r
32 QueryGenerator queryGen = new QueryGenerator();
\r
34 // Globals: Mainly used for tracking.
\r
35 private frmQueue queueWindow;
\r
36 private frmGenPreview vlcpreview;
\r
37 private frmPreview qtpreview;
\r
38 private string lastAction = null;
\r
39 public int maxWidth = 0;
\r
40 public int maxHeight = 0;
\r
42 // Applicaiton Startup ************************************************
\r
44 #region Application Startup
\r
48 // Load the splash screen in this thread
\r
49 Form splash = new frmSplashScreen();
\r
52 //Create a label that can be updated from the parent thread.
\r
53 Label lblStatus = new Label();
\r
54 lblStatus.Size = new Size(250, 20);
\r
55 lblStatus.Location = new Point(10, 280);
\r
56 splash.Controls.Add(lblStatus);
\r
57 InitializeComponent();
\r
59 // Update the users config file with the CLI version data.
\r
60 lblStatus.Text = "Setting Version Data ...";
\r
61 Application.DoEvents();
\r
62 ArrayList x = hb_common_func.getCliVersionData();
\r
63 Properties.Settings.Default.hb_build = int.Parse(x[1].ToString());
\r
64 Properties.Settings.Default.hb_version = x[0].ToString();
\r
66 // show the form, but leave disabled until preloading is complete then show the main form
\r
67 this.Enabled = false;
\r
69 Application.DoEvents(); // Forces frmMain to draw
\r
71 // update the status
\r
72 if (Properties.Settings.Default.updateStatus == "Checked")
\r
74 lblStatus.Text = "Checking for updates ...";
\r
75 Application.DoEvents();
\r
76 Thread updateCheckThread = new Thread(startupUpdateCheck);
\r
77 updateCheckThread.Start();
\r
80 // Setup the GUI components
\r
81 lblStatus.Text = "Setting up the GUI ...";
\r
82 Application.DoEvents();
\r
83 x264PanelFunctions.reset2Defaults(this); // Initialize all the x264 widgets to their default values
\r
84 loadPresetPanel(); // Load the Preset Panel
\r
85 treeView_presets.ExpandAll();
\r
86 lbl_encode.Text = "";
\r
87 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
88 if (Properties.Settings.Default.QueryEditorTab != "Checked")
\r
89 tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.
\r
91 // Load the user's default settings or Normal Preset
\r
92 if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")
\r
94 // Ok, so, we've selected a preset. Now we want to load it.
\r
95 if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)
\r
97 string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;
\r
98 Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
102 //Ok, Reset all the H264 widgets before changing the preset
\r
103 x264PanelFunctions.reset2Defaults(this);
\r
105 // Send the query from the file to the Query Parser class, then load the preset
\r
106 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
107 presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
109 // The x264 widgets will need updated, so do this now:
\r
110 x264PanelFunctions.X264_StandardizeOptString(this);
\r
111 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
115 loadNormalPreset();
\r
118 loadNormalPreset();
\r
120 // Enabled GUI tooltip's if Required
\r
121 if (Properties.Settings.Default.tooltipEnable == "Checked")
\r
122 ToolTip.Active = true;
\r
125 lblStatus.Text = "Loading Complete!";
\r
126 Application.DoEvents();
\r
129 this.Enabled = true;
\r
138 // Startup Functions
\r
139 private delegate void updateStatusChanger();
\r
140 private void startupUpdateCheck()
\r
144 if (this.InvokeRequired)
\r
146 this.BeginInvoke(new updateStatusChanger(startupUpdateCheck));
\r
150 Boolean update = hb_common_func.updateCheck(false);
\r
151 if (update == true)
\r
153 frmUpdater updateWindow = new frmUpdater();
\r
154 updateWindow.Show();
\r
157 catch (Exception) { /* Do Nothing*/ }
\r
159 private void queueRecovery()
\r
161 if (hb_common_func.check_queue_recovery() == true)
\r
163 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
165 if (result == DialogResult.Yes)
\r
166 encodeQueue.recoverQueue("hb_queue_recovery.xml"); // Start Recovery
\r
169 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
170 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
171 if (File.Exists(queuePath))
\r
172 File.Delete(queuePath);
\r
179 // Encoding Events for setting up the GUI
\r
180 private void events()
\r
182 // Handle Window Resize
\r
183 if (Properties.Settings.Default.MainWindowMinimize == "Checked")
\r
184 this.Resize += new EventHandler(frmMain_Resize);
\r
186 // Handle Encode Start
\r
187 encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);
\r
188 encodeQueue.OnPaused += new EventHandler(encodePaused);
\r
189 encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);
\r
191 private void encodeStarted(object sender, EventArgs e)
\r
193 setLastAction("encode");
\r
194 setEncodeStarted();
\r
196 private void encodeEnded(object sender, EventArgs e)
\r
198 setEncodeFinished();
\r
200 private void encodePaused(object sender, EventArgs e)
\r
202 setEncodeFinished();
\r
206 // User Interface Menus / Tool Strips *********************************
\r
209 private void mnu_exit_Click(object sender, EventArgs e)
\r
211 Application.Exit();
\r
216 private void mnu_encode_Click(object sender, EventArgs e)
\r
218 queueWindow.setQueue();
\r
219 queueWindow.Show();
\r
221 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
223 String file = String.Empty;
\r
224 if (lastAction == "scan")
\r
225 file = "dvdinfo.dat";
\r
227 file = "hb_encode_log.dat";
\r
229 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);
\r
230 dvdInfoWindow.Show();
\r
232 private void mnu_options_Click(object sender, EventArgs e)
\r
234 Form Options = new frmOptions();
\r
235 Options.ShowDialog();
\r
239 #region Presets Menu
\r
240 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
242 presetHandler.updateBuiltInPresets();
\r
244 if (treeView_presets.Nodes.Count == 0)
\r
245 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
247 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
249 treeView_presets.ExpandAll();
\r
251 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
253 // Empty the preset file
\r
254 string presetsFile = Application.StartupPath.ToString() + "\\presets.xml";
\r
255 if (File.Exists(presetsFile))
\r
256 File.Delete(presetsFile);
\r
260 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
264 catch (Exception exc)
\r
266 MessageBox.Show("An error has occured during the preset removal process.\n If you are using Windows Vista, you may need to run under Administrator Mode to complete this task. \n" + exc.ToString());
\r
269 // Reload the preset panel
\r
272 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
274 loadNormalPreset();
\r
276 private void btn_new_preset_Click(object sender, EventArgs e)
\r
278 // Remember each nodes expanded status so we can reload it
\r
279 List<Boolean> nodeStatus = saveTreeViewState();
\r
280 nodeStatus.Add(true);
\r
282 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
283 preset.ShowDialog();
\r
285 // Now reload the TreeView states
\r
286 loadTreeViewStates(nodeStatus);
\r
291 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
293 Process.Start("http://forum.handbrake.fr/");
\r
295 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
297 Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
299 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
301 Process.Start("http://handbrake.fr");
\r
303 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
305 Boolean update = hb_common_func.updateCheck(true);
\r
306 if (update == true)
\r
308 frmUpdater updateWindow = new frmUpdater();
\r
309 updateWindow.Show();
\r
312 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
314 private void mnu_about_Click(object sender, EventArgs e)
\r
316 Form About = new frmAbout();
\r
317 About.ShowDialog();
\r
322 // Right Click Menu Code
\r
323 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
325 treeView_presets.ExpandAll();
\r
327 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
329 treeView_presets.CollapseAll();
\r
331 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
333 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
334 if (result == DialogResult.Yes)
\r
335 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);
\r
336 else if (result == DialogResult.No)
\r
337 presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);
\r
339 private void pmnu_delete_click(object sender, EventArgs e)
\r
341 if (treeView_presets.SelectedNode != null)
\r
343 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
345 // Remember each nodes expanded status so we can reload it
\r
346 List<Boolean> nodeStatus = saveTreeViewState();
\r
348 // Now reload the preset panel
\r
351 // Now reload the TreeView states
\r
352 loadTreeViewStates(nodeStatus);
\r
354 treeView_presets.Select();
\r
356 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
358 // Make sure that the save menu is always disabled by default
\r
359 pmnu_saveChanges.Enabled = false;
\r
361 // Now enable the save menu if the selected preset is a user preset
\r
362 if (treeView_presets.SelectedNode != null)
\r
364 if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
366 pmnu_saveChanges.Enabled = true;
\r
369 treeView_presets.Select();
\r
372 // Presets Management
\r
373 private void btn_addPreset_Click(object sender, EventArgs e)
\r
375 // Remember each nodes expanded status so we can reload it
\r
376 List<Boolean> nodeStatus = saveTreeViewState();
\r
377 nodeStatus.Add(true);
\r
379 // Now add the new preset
\r
380 Form preset = new frmAddPreset(this, queryGen.generateTabbedComponentsQuery(this), presetHandler);
\r
381 preset.ShowDialog();
\r
383 // Now reload the TreeView states
\r
384 loadTreeViewStates(nodeStatus);
\r
386 private void btn_removePreset_Click(object sender, EventArgs e)
\r
388 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
389 if (result == DialogResult.Yes)
\r
391 if (treeView_presets.SelectedNode != null)
\r
392 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
394 // Remember each nodes expanded status so we can reload it
\r
395 List<Boolean> nodeStatus = saveTreeViewState();
\r
397 // Now reload the preset panel
\r
400 // Now reload the TreeView states
\r
401 loadTreeViewStates(nodeStatus);
\r
403 treeView_presets.Select();
\r
405 private void btn_setDefault_Click(object sender, EventArgs e)
\r
407 if (treeView_presets.SelectedNode != null)
\r
409 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
410 Properties.Settings.Default.Save();
\r
411 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
414 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
416 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
418 if (e.Button == MouseButtons.Right)
\r
419 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
420 else if (e.Button == MouseButtons.Left)
\r
423 treeView_presets.Select();
\r
425 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
429 private void selectPreset()
\r
431 if (treeView_presets.SelectedNode != null)
\r
433 // Ok, so, we've selected a preset. Now we want to load it.
\r
434 string presetName = treeView_presets.SelectedNode.Text;
\r
435 if (presetHandler.getPreset(presetName) != null)
\r
437 string query = presetHandler.getPreset(presetName).Query;
\r
438 Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;
\r
442 //Ok, Reset all the H264 widgets before changing the preset
\r
443 x264PanelFunctions.reset2Defaults(this);
\r
445 // Send the query from the file to the Query Parser class
\r
446 Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);
\r
448 // Now load the preset
\r
449 presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
451 // The x264 widgets will need updated, so do this now:
\r
452 x264PanelFunctions.X264_StandardizeOptString(this);
\r
453 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
458 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
460 if (e.KeyCode == Keys.Delete)
\r
462 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
463 if (result == DialogResult.Yes)
\r
465 if (treeView_presets.SelectedNode != null)
\r
466 presetHandler.remove(treeView_presets.SelectedNode.Text);
\r
468 // Remember each nodes expanded status so we can reload it
\r
469 List<Boolean> nodeStatus = new List<Boolean>();
\r
470 foreach (TreeNode node in treeView_presets.Nodes)
\r
471 nodeStatus.Add(node.IsExpanded);
\r
473 // Now reload the preset panel
\r
476 // And finally, re-expand any of the nodes if required
\r
478 foreach (TreeNode node in treeView_presets.Nodes)
\r
480 if (nodeStatus[i] == true)
\r
488 private List<Boolean> saveTreeViewState()
\r
490 // Remember each nodes expanded status so we can reload it
\r
491 List<Boolean> nodeStatus = new List<Boolean>();
\r
492 foreach (TreeNode node in treeView_presets.Nodes)
\r
494 nodeStatus.Add(node.IsExpanded);
\r
495 foreach (TreeNode subNode in node.Nodes)
\r
496 nodeStatus.Add(node.IsExpanded);
\r
500 private void loadTreeViewStates(List<Boolean> nodeStatus)
\r
502 // And finally, re-expand any of the nodes if required
\r
504 foreach (TreeNode node in treeView_presets.Nodes)
\r
506 if (nodeStatus[i] == true)
\r
509 foreach (TreeNode subNode in node.Nodes)
\r
511 if (nodeStatus[i] == true)
\r
518 private void loadNormalPreset()
\r
520 treeView_presets.Nodes.Find("Normal", true);
\r
522 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
524 foreach (TreeNode node in treenode.Nodes)
\r
526 if (node.Text.ToString().Equals("Normal"))
\r
527 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
534 private void btn_source_Click(object sender, EventArgs e)
\r
536 if (Properties.Settings.Default.drive_detection == "Checked")
\r
538 mnu_dvd_drive.Visible = true;
\r
539 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
540 driveInfoThread.Start();
\r
543 mnu_dvd_drive.Visible = false;
\r
545 private void btn_start_Click(object sender, EventArgs e)
\r
547 if (btn_start.Text == "Stop")
\r
549 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
551 if (result == DialogResult.Yes)
\r
554 encodeQueue.pauseEncode();
\r
556 // Kill the current process.
\r
557 Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");
\r
558 Process HandBrakeCLI;
\r
559 if (aProc.Length > 0)
\r
561 HandBrakeCLI = aProc[0];
\r
562 HandBrakeCLI.Kill();
\r
566 setEncodeFinished();
\r
571 if (encodeQueue.count() != 0 || (text_source.Text != string.Empty && text_source.Text != "Click 'Source' to continue" && text_destination.Text != string.Empty))
\r
573 // Set the last action to encode.
\r
574 // This is used for tracking which file to load in the activity window
\r
575 lastAction = "encode";
\r
578 if (rtf_query.Text != "")
\r
579 query = rtf_query.Text;
\r
581 query = queryGen.GenerateTheQuery(this);
\r
583 if (encodeQueue.count() == 0)
\r
585 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
586 encodeQueue.write2disk("hb_queue_recovery.xml");
\r
588 queueWindow.setQueue();
\r
589 if (encodeQueue.count() > 1)
\r
590 queueWindow.Show();
\r
592 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
593 encodeQueue.startEncode(); // Start The Queue Encoding Process
\r
596 else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
597 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
601 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
603 if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)
\r
604 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
607 String query = queryGen.GenerateTheQuery(this);
\r
608 if (rtf_query.Text != "")
\r
609 query = rtf_query.Text;
\r
611 encodeQueue.add(query, text_source.Text, text_destination.Text);
\r
612 encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.
\r
614 queueWindow.setQueue();
\r
615 queueWindow.Show();
\r
618 private void btn_showQueue_Click(object sender, EventArgs e)
\r
620 queueWindow.setQueue();
\r
621 queueWindow.Show();
\r
623 private void mnu_vlcpreview_Click(object sender, EventArgs e)
\r
625 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
626 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
629 if (vlcpreview == null)
\r
631 vlcpreview = new frmGenPreview(this);
\r
634 else if (vlcpreview.IsDisposed)
\r
636 vlcpreview = new frmGenPreview(this);
\r
640 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
643 private void mnu_qtpreview_Click(object sender, EventArgs e)
\r
645 if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")
\r
646 MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
649 if (qtpreview == null)
\r
651 qtpreview = new frmPreview(this);
\r
654 else if (qtpreview.IsDisposed)
\r
656 qtpreview = new frmPreview(this);
\r
660 MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
663 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
665 String file = String.Empty;
\r
666 if (lastAction == "scan")
\r
667 file = "dvdinfo.dat";
\r
669 file = "hb_encode_log.dat";
\r
671 frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);
\r
672 ActivityWindow.Show();
\r
676 #region System Tray Icon
\r
677 private void frmMain_Resize(object sender, EventArgs e)
\r
679 if (FormWindowState.Minimized == this.WindowState)
\r
681 notifyIcon.Visible = true;
\r
682 if (lbl_encode.Text != "")
\r
683 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
685 notifyIcon.BalloonTipText = "Not Encoding";
\r
686 notifyIcon.ShowBalloonTip(500);
\r
689 else if (FormWindowState.Normal == this.WindowState)
\r
690 notifyIcon.Visible = false;
\r
692 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
694 this.Visible = true;
\r
696 this.WindowState = FormWindowState.Normal;
\r
697 notifyIcon.Visible = false;
\r
699 private void btn_restore_Click(object sender, EventArgs e)
\r
701 this.Visible = true;
\r
703 this.WindowState = FormWindowState.Normal;
\r
704 notifyIcon.Visible = false;
\r
708 #region Tab Control
\r
711 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
713 // Enable the creation of chapter markers.
\r
714 Check_ChapterMarkers.Enabled = true;
\r
716 // Set the last action to scan.
\r
717 // This is used for tracking which file to load in the activity window
\r
718 lastAction = "scan";
\r
720 String filename = "";
\r
721 text_source.Text = "";
\r
723 DVD_Open.ShowDialog();
\r
724 filename = DVD_Open.SelectedPath;
\r
726 if (filename.StartsWith("\\"))
\r
727 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
730 if (filename != "")
\r
732 Form frmRD = new frmReadDVD(filename, this);
\r
733 text_source.Text = filename;
\r
734 lbl_encode.Text = "Scanning ...";
\r
735 frmRD.ShowDialog();
\r
738 text_source.Text = "Click 'Source' to continue";
\r
740 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
741 if (drp_dvdtitle.Items.Count == 0)
\r
742 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
744 lbl_encode.Text = "";
\r
747 private void btn_file_source_Click(object sender, EventArgs e)
\r
749 // Set the last action to scan.
\r
750 // This is used for tracking which file to load in the activity window
\r
751 lastAction = "scan";
\r
753 String filename = "";
\r
754 text_source.Text = "";
\r
756 ISO_Open.ShowDialog();
\r
757 filename = ISO_Open.FileName;
\r
759 if (filename.StartsWith("\\"))
\r
760 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
763 if (filename != "")
\r
765 Form frmRD = new frmReadDVD(filename, this);
\r
766 text_source.Text = filename;
\r
767 lbl_encode.Text = "Scanning ...";
\r
768 frmRD.ShowDialog();
\r
771 text_source.Text = "Click 'Source' to continue";
\r
773 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
774 if (drp_dvdtitle.Items.Count == 0)
\r
775 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
777 lbl_encode.Text = "";
\r
779 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
780 if (filename.ToLower().Contains(".iso"))
\r
781 Check_ChapterMarkers.Enabled = true;
\r
784 Check_ChapterMarkers.Enabled = false;
\r
785 Check_ChapterMarkers.Checked = false;
\r
786 data_chpt.Rows.Clear();
\r
790 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
792 // Enable the creation of chapter markers.
\r
793 Check_ChapterMarkers.Enabled = true;
\r
795 // Set the last action to scan.
\r
796 // This is used for tracking which file to load in the activity window
\r
797 lastAction = "scan";
\r
799 String filename = "";
\r
800 if (mnu_dvd_drive.Text.Contains("VIDEO_TS"))
\r
802 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
803 filename = path[0];
\r
804 lbl_encode.Text = "Scanning ...";
\r
805 Form frmRD = new frmReadDVD(filename, this);
\r
806 text_source.Text = filename;
\r
807 frmRD.ShowDialog();
\r
810 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
811 if (drp_dvdtitle.Items.Count == 0)
\r
812 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
814 lbl_encode.Text = "";
\r
817 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
819 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
820 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
822 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
824 // Reset some values on the form
\r
825 lbl_Aspect.Text = "Select a Title";
\r
826 //lbl_RecomendedCrop.Text = "Select a Title";
\r
827 drop_chapterStart.Items.Clear();
\r
828 drop_chapterFinish.Items.Clear();
\r
830 // If the dropdown is set to automatic nothing else needs to be done.
\r
831 // Otheriwse if its not, title data has to be loased from parsing.
\r
832 if (drp_dvdtitle.Text != "Automatic")
\r
834 selectedTitle = drp_dvdtitle.SelectedItem as Parsing.Title;
\r
836 // Set the Aspect Ratio
\r
837 lbl_Aspect.Text = selectedTitle.AspectRatio.ToString();
\r
838 lbl_src_res.Text = selectedTitle.Resolution.Width + " x " + selectedTitle.Resolution.Height;
\r
839 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
841 // Set the Recommended Cropping values
\r
842 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
843 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
844 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
845 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
847 // Populate the Start chapter Dropdown
\r
848 drop_chapterStart.Items.Clear();
\r
849 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
850 if (drop_chapterStart.Items.Count > 0)
\r
851 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
853 // Populate the Final Chapter Dropdown
\r
854 drop_chapterFinish.Items.Clear();
\r
855 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
856 if (drop_chapterFinish.Items.Count > 0)
\r
857 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
859 // Populate the Audio Channels Dropdown
\r
860 drp_track1Audio.Items.Clear();
\r
861 drp_track1Audio.Items.Add("Automatic");
\r
862 drp_track1Audio.Items.Add("None");
\r
863 drp_track1Audio.Items.AddRange(selectedTitle.AudioTracks.ToArray());
\r
864 drp_track1Audio.SelectedIndex = 0;
\r
866 // Populate the Subtitles dropdown
\r
867 drp_subtitle.Items.Clear();
\r
868 drp_subtitle.Items.Add("None");
\r
869 drp_subtitle.Items.Add("Autoselect");
\r
870 drp_subtitle.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
871 if (drp_subtitle.Items.Count > 0)
\r
872 drp_subtitle.Text = drp_subtitle.Items[0].ToString();
\r
876 // Run the autoName & chapterNaming functions
\r
877 if (Properties.Settings.Default.autoNaming == "Checked")
\r
878 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
880 data_chpt.Rows.Clear();
\r
881 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterStart.Text, drop_chapterFinish.Text);
\r
882 if (chapterGridView != null)
\r
883 data_chpt = chapterGridView;
\r
885 private void drop_chapterStart_SelectedIndexChanged(object sender, EventArgs e)
\r
887 int c_start, c_end = 1;
\r
889 if (drop_chapterFinish.Text == "Auto" && drop_chapterFinish.Items.Count != 0)
\r
890 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
892 int.TryParse(drop_chapterStart.Text, out c_start);
\r
893 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
897 if (c_start > c_end)
\r
898 drop_chapterFinish.Text = c_start.ToString();
\r
901 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
903 // Run the Autonaming function
\r
904 if (Properties.Settings.Default.autoNaming == "Checked")
\r
905 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
907 private void drop_chapterFinish_SelectedIndexChanged(object sender, EventArgs e)
\r
909 int c_start, c_end = 1;
\r
911 if (drop_chapterStart.Text == "Auto" && drop_chapterStart.Items.Count >= 1)
\r
912 drop_chapterStart.SelectedIndex = 1;
\r
914 int.TryParse(drop_chapterStart.Text, out c_start);
\r
915 int.TryParse(drop_chapterFinish.Text, out c_end);
\r
919 if (c_end < c_start)
\r
920 drop_chapterFinish.Text = c_start.ToString();
\r
923 lbl_duration.Text = hb_common_func.calculateDuration(drop_chapterStart.Text, drop_chapterFinish.Text, selectedTitle).ToString();
\r
925 // Run the Autonaming function
\r
926 if (Properties.Settings.Default.autoNaming == "Checked")
\r
927 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
931 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
933 // This removes the file extension from the filename box on the save file dialog.
\r
934 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
935 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");
\r
937 // Show the dialog and set the main form file path
\r
938 if (drop_format.SelectedIndex.Equals(0))
\r
939 DVD_Save.FilterIndex = 1;
\r
940 else if (drop_format.SelectedIndex.Equals(1))
\r
941 DVD_Save.FilterIndex = 2;
\r
942 else if (drop_format.SelectedIndex.Equals(2))
\r
943 DVD_Save.FilterIndex = 3;
\r
944 else if (drop_format.SelectedIndex.Equals(3))
\r
945 DVD_Save.FilterIndex = 4;
\r
946 else if (drop_format.SelectedIndex.Equals(4))
\r
947 DVD_Save.FilterIndex = 5;
\r
949 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
951 if (DVD_Save.FileName.StartsWith("\\"))
\r
952 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
955 setAudioByContainer(DVD_Save.FileName);
\r
956 text_destination.Text = DVD_Save.FileName;
\r
958 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
959 if (Check_ChapterMarkers.Checked)
\r
960 text_destination.Text = text_destination.Text.Replace(".mp4", ".m4v");
\r
964 private void text_destination_TextChanged(object sender, EventArgs e)
\r
966 setAudioByContainer(text_destination.Text);
\r
967 setVideoByContainer(text_destination.Text);
\r
968 string path = text_destination.Text;
\r
969 if (path.EndsWith(".mp4"))
\r
970 drop_format.SelectedIndex = 0;
\r
971 else if (path.EndsWith(".m4v"))
\r
972 drop_format.SelectedIndex = 1;
\r
973 else if (path.EndsWith(".mkv"))
\r
974 drop_format.SelectedIndex = 2;
\r
975 else if (path.EndsWith(".avi"))
\r
976 drop_format.SelectedIndex = 3;
\r
977 else if (path.EndsWith(".ogm"))
\r
978 drop_format.SelectedIndex = 4;
\r
983 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
985 if (drop_format.SelectedIndex == 0)
\r
986 setExtension(".mp4");
\r
987 else if (drop_format.SelectedIndex == 1)
\r
988 setExtension(".m4v");
\r
989 else if (drop_format.SelectedIndex == 2)
\r
990 setExtension(".mkv");
\r
991 else if (drop_format.SelectedIndex == 3)
\r
992 setExtension(".avi");
\r
993 else if (drop_format.SelectedIndex == 4)
\r
994 setExtension(".ogm");
\r
996 private void setExtension(string newExtension)
\r
998 text_destination.Text = text_destination.Text.Replace(".mp4", newExtension);
\r
999 text_destination.Text = text_destination.Text.Replace(".m4v", newExtension);
\r
1000 text_destination.Text = text_destination.Text.Replace(".mkv", newExtension);
\r
1001 text_destination.Text = text_destination.Text.Replace(".avi", newExtension);
\r
1002 text_destination.Text = text_destination.Text.Replace(".ogm", newExtension);
\r
1006 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1008 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1010 check_largeFile.Enabled = true;
\r
1011 check_optimiseMP4.Enabled = true;
\r
1012 check_iPodAtom.Enabled = true;
\r
1016 check_largeFile.Enabled = false;
\r
1017 check_optimiseMP4.Enabled = false;
\r
1018 check_iPodAtom.Enabled = false;
\r
1019 check_largeFile.Checked = false;
\r
1020 check_optimiseMP4.Checked = false;
\r
1021 check_iPodAtom.Checked = false;
\r
1024 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1025 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1027 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1028 check_turbo.Enabled = true;
\r
1030 h264Tab.Enabled = true;
\r
1031 if ((text_destination.Text.Contains(".mp4")) || (text_destination.Text.Contains(".m4v")))
\r
1032 check_iPodAtom.Enabled = true;
\r
1034 check_iPodAtom.Enabled = false;
\r
1035 if (!drp_anamorphic.Items.Contains("Loose"))
\r
1036 drp_anamorphic.Items.Add("Loose");
\r
1040 check_turbo.CheckState = CheckState.Unchecked;
\r
1041 check_turbo.Enabled = false;
\r
1042 h264Tab.Enabled = false;
\r
1043 rtf_x264Query.Text = "";
\r
1044 check_iPodAtom.Enabled = false;
\r
1045 check_iPodAtom.Checked = false;
\r
1046 if (drp_anamorphic.Items.Count == 3)
\r
1047 drp_anamorphic.Items.RemoveAt(2);
\r
1051 private void text_bitrate_TextChanged(object sender, EventArgs e)
\r
1053 text_filesize.Text = "";
\r
1054 slider_videoQuality.Value = 0;
\r
1055 SliderValue.Text = "0%";
\r
1056 check_2PassEncode.Enabled = true;
\r
1058 private void text_filesize_TextChanged(object sender, EventArgs e)
\r
1060 text_bitrate.Text = "";
\r
1061 slider_videoQuality.Value = 0;
\r
1062 SliderValue.Text = "0%";
\r
1063 check_2PassEncode.Enabled = true;
\r
1065 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1067 SliderValue.Text = slider_videoQuality.Value.ToString() + "%";
\r
1068 text_bitrate.Text = "";
\r
1069 text_filesize.Text = "";
\r
1070 check_2PassEncode.Enabled = false;
\r
1071 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1073 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1075 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1077 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1078 check_turbo.Enabled = true;
\r
1082 check_turbo.Enabled = false;
\r
1083 check_turbo.CheckState = CheckState.Unchecked;
\r
1088 private void text_width_TextChanged(object sender, EventArgs e)
\r
1090 if (text_width.Text == "")
\r
1091 text_width.BackColor = Color.White;
\r
1093 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
1096 Boolean parsed = int.TryParse(text_width.Text, out width);
\r
1097 if (parsed != false)
\r
1099 if ((width % 16) != 0)
\r
1100 text_width.BackColor = Color.LightCoral;
\r
1102 text_width.BackColor = Color.LightGreen;
\r
1105 if (lbl_Aspect.Text != "Select a Title" && maxWidth == 0 && maxHeight == 0)
\r
1107 if (drp_anamorphic.Text == "None")
\r
1109 int height = hb_common_func.cacluateNonAnamorphicHeight(width, text_top.Value, text_bottom.Value, text_left.Value, text_right.Value, selectedTitle);
\r
1111 text_height.Text = height.ToString();
\r
1116 private void text_height_TextChanged(object sender, EventArgs e)
\r
1118 if (text_height.Text == "")
\r
1119 text_height.BackColor = Color.White;
\r
1121 maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.
\r
1124 Boolean parsed = int.TryParse(text_height.Text, out height);
\r
1125 if (parsed != false)
\r
1127 if ((height % 16) != 0)
\r
1128 text_height.BackColor = Color.LightCoral;
\r
1130 text_height.BackColor = Color.LightGreen;
\r
1133 private void check_customCrop_CheckedChanged(object sender, EventArgs e)
\r
1135 text_left.Enabled = true;
\r
1136 text_right.Enabled = true;
\r
1137 text_top.Enabled = true;
\r
1138 text_bottom.Enabled = true;
\r
1139 if (selectedTitle != null)
\r
1141 text_top.Text = selectedTitle.AutoCropDimensions[0].ToString();
\r
1142 text_bottom.Text = selectedTitle.AutoCropDimensions[1].ToString();
\r
1143 text_left.Text = selectedTitle.AutoCropDimensions[2].ToString();
\r
1144 text_right.Text = selectedTitle.AutoCropDimensions[3].ToString();
\r
1148 text_left.Text = "0";
\r
1149 text_right.Text = "0";
\r
1150 text_top.Text = "0";
\r
1151 text_bottom.Text = "0";
\r
1154 private void check_autoCrop_CheckedChanged(object sender, EventArgs e)
\r
1156 text_left.Enabled = false;
\r
1157 text_right.Enabled = false;
\r
1158 text_top.Enabled = false;
\r
1159 text_bottom.Enabled = false;
\r
1161 private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)
\r
1163 if (drp_anamorphic.SelectedIndex == 1)
\r
1165 text_height.BackColor = Color.LightGray;
\r
1166 text_width.BackColor = Color.LightGray;
\r
1167 text_height.Text = "";
\r
1168 text_width.Text = "";
\r
1169 text_height.Enabled = false;
\r
1170 text_width.Enabled = false;
\r
1173 if (drp_anamorphic.SelectedIndex == 2)
\r
1175 text_height.Text = "";
\r
1176 text_height.Enabled = false;
\r
1177 text_height.BackColor = Color.LightGray;
\r
1179 text_width.Enabled = true;
\r
1180 text_width.BackColor = Color.White;
\r
1183 if (drp_anamorphic.SelectedIndex == 0)
\r
1185 text_height.BackColor = Color.White;
\r
1186 text_width.BackColor = Color.White;
\r
1187 text_height.Enabled = true;
\r
1188 text_width.Enabled = true;
\r
1191 private void slider_deblock_Scroll(object sender, EventArgs e)
\r
1193 if (slider_deblock.Value == 4)
\r
1194 lbl_deblockVal.Text = "Off";
\r
1196 lbl_deblockVal.Text = slider_deblock.Value.ToString();
\r
1200 private void drp_track1Audio_SelectedIndexChanged(object sender, EventArgs e)
\r
1202 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1204 lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text = drp_track1Audio.Text;
\r
1205 lv_audioList.Select();
\r
1208 private void drp_audenc_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1210 if (drp_audenc_1.Text == "AC3")
\r
1212 drp_audmix_1.Enabled = false;
\r
1213 drp_audbit_1.Enabled = false;
\r
1214 drp_audsr_1.Enabled = false;
\r
1216 drp_audmix_1.SelectedIndex = 0;
\r
1217 drp_audbit_1.SelectedIndex = 0;
\r
1218 drp_audsr_1.SelectedIndex = 0;
\r
1222 drp_audmix_1.Enabled = true;
\r
1223 drp_audbit_1.Enabled = true;
\r
1224 drp_audsr_1.Enabled = true;
\r
1226 drp_audmix_1.Text = "Automatic";
\r
1227 drp_audbit_1.Text = "160";
\r
1228 drp_audsr_1.Text = "Auto";
\r
1231 if (drp_audenc_1.Text == "AAC")
\r
1233 setMixDownAllOptions(drp_audmix_1);
\r
1234 setBitrateSelections160(drp_audbit_1);
\r
1238 setMixDownNotAAC(drp_audmix_1);
\r
1239 setBitrateSelections320(drp_audbit_1);
\r
1242 // Update an item in the Audio list if required.
\r
1243 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1245 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audenc_1.Text;
\r
1246 lv_audioList.Select();
\r
1249 private void drp_audmix_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1251 if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text == "6 Channel Discrete"))
\r
1252 setBitrateSelections384(drp_audbit_1);
\r
1253 else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))
\r
1254 setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";
\r
1256 // Update an item in the Audio list if required.
\r
1257 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1259 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audmix_1.Text;
\r
1260 lv_audioList.Select();
\r
1263 private void drp_audsr_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1265 // Update an item in the Audio list if required.
\r
1266 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1268 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audsr_1.Text;
\r
1269 lv_audioList.Select();
\r
1272 private void drp_audbit_1_SelectedIndexChanged(object sender, EventArgs e)
\r
1274 // Update an item in the Audio list if required.
\r
1275 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1277 if (drp_audenc_1.Text == "AC3")
\r
1278 drp_audbit_1.Text = "Auto";
\r
1279 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audbit_1.Text;
\r
1280 lv_audioList.Select();
\r
1283 private void tb_drc_Scroll(object sender, EventArgs e)
\r
1285 double value = (tb_drc.Value / 10.0) + 1;
\r
1286 lbl_drc.Text = value.ToString();
\r
1288 // Update an item in the Audio list if required.
\r
1289 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1291 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = lbl_drc.Text;
\r
1292 lv_audioList.Select();
\r
1296 private void btn_addAudioTrack_Click(object sender, EventArgs e)
\r
1298 // Create a new row for the Audio list based on the currently selected items in the dropdown.
\r
1299 ListViewItem newTrack = new ListViewItem(drp_track1Audio.Text);
\r
1300 newTrack.SubItems.Add(drp_audenc_1.Text);
\r
1301 newTrack.SubItems.Add(drp_audmix_1.Text);
\r
1302 newTrack.SubItems.Add(drp_audsr_1.Text);
\r
1303 newTrack.SubItems.Add(drp_audbit_1.Text);
\r
1304 newTrack.SubItems.Add(lbl_drc.Text);
\r
1306 // Select the newly added track and select the control
\r
1307 lv_audioList.Items.Add(newTrack);
\r
1308 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1309 lv_audioList.Select();
\r
1311 private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)
\r
1313 removeAudioTrack();
\r
1315 private void audioList_moveup_Click(object sender, EventArgs e)
\r
1317 if (lv_audioList.SelectedIndices.Count != 0)
\r
1319 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1320 int index = item.Index;
\r
1323 if (lv_audioList.Items.Count > index && index >= 0)
\r
1325 lv_audioList.Items.Remove(item);
\r
1326 lv_audioList.Items.Insert(index, item);
\r
1327 item.Selected = true;
\r
1328 lv_audioList.Focus();
\r
1332 private void audioList_movedown_Click(object sender, EventArgs e)
\r
1334 if (lv_audioList.SelectedIndices.Count != 0)
\r
1336 ListViewItem item = lv_audioList.SelectedItems[0];
\r
1337 int index = item.Index;
\r
1340 if (index < lv_audioList.Items.Count)
\r
1342 lv_audioList.Items.Remove(item);
\r
1343 lv_audioList.Items.Insert(index, item);
\r
1344 item.Selected = true;
\r
1345 lv_audioList.Focus();
\r
1351 private void audioList_remove_Click(object sender, EventArgs e)
\r
1353 removeAudioTrack();
\r
1355 private void removeAudioTrack()
\r
1357 // Remove the Item and reselect the control if the following conditions are met.
\r
1358 if (lv_audioList.SelectedItems.Count != 0)
\r
1360 // Record the current selected index.
\r
1361 int currentPosition = lv_audioList.SelectedIndices[0];
\r
1363 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);
\r
1365 // Now reslect the correct item and give focus to the audio list.
\r
1366 if (lv_audioList.Items.Count != 0)
\r
1368 if (currentPosition <= (lv_audioList.Items.Count - 1))
\r
1369 lv_audioList.Items[currentPosition].Selected = true;
\r
1370 else if (currentPosition > (lv_audioList.Items.Count - 1))
\r
1371 lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;
\r
1373 lv_audioList.Select();
\r
1378 private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)
\r
1380 // Set the dropdown controls based on the selected item in the Audio List.
\r
1381 if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)
\r
1383 drp_track1Audio.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].Text;
\r
1384 drp_audenc_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;
\r
1385 drp_audmix_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;
\r
1386 drp_audsr_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;
\r
1387 drp_audbit_1.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;
\r
1388 double drcValue = 0; int drcCalculated = 0;
\r
1389 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text, out drcValue);
\r
1390 drcValue = (drcValue * 10) - 10;
\r
1391 int.TryParse(drcValue.ToString(), out drcCalculated);
\r
1392 tb_drc.Value = drcCalculated;
\r
1396 private void drp_subtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1398 if (drp_subtitle.Text.Contains("None"))
\r
1400 check_forced.Enabled = false;
\r
1401 check_forced.Checked = false;
\r
1404 check_forced.Enabled = true;
\r
1407 // Chapter Marker Tab
\r
1408 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1410 if (Check_ChapterMarkers.Checked)
\r
1412 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1413 data_chpt.Rows.Clear();
\r
1414 data_chpt.Enabled = true;
\r
1415 DataGridView chapterGridView = hb_common_func.chapterNaming(data_chpt, drop_chapterStart.Text, drop_chapterFinish.Text);
\r
1416 if (chapterGridView != null)
\r
1417 data_chpt = chapterGridView;
\r
1421 text_destination.Text = text_destination.Text.Replace(".m4v", ".mp4");
\r
1422 data_chpt.Rows.Clear();
\r
1423 data_chpt.Enabled = false;
\r
1428 private void drop_refFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1430 x264PanelFunctions.on_x264_WidgetChange("ref", this);
\r
1432 private void check_mixedReferences_CheckedChanged(object sender, EventArgs e)
\r
1434 x264PanelFunctions.on_x264_WidgetChange("mixed-refs", this);
\r
1436 private void drop_bFrames_SelectedIndexChanged(object sender, EventArgs e)
\r
1438 x264PanelFunctions.on_x264_WidgetChange("bframes", this);
\r
1440 private void drop_directPrediction_SelectedIndexChanged(object sender, EventArgs e)
\r
1442 x264PanelFunctions.on_x264_WidgetChange("direct", this);
\r
1444 private void check_weightedBFrames_CheckedChanged(object sender, EventArgs e)
\r
1446 x264PanelFunctions.on_x264_WidgetChange("weightb", this);
\r
1448 private void check_bFrameDistortion_CheckedChanged(object sender, EventArgs e)
\r
1450 x264PanelFunctions.on_x264_WidgetChange("brdo", this);
\r
1452 private void check_BidirectionalRefinement_CheckedChanged(object sender, EventArgs e)
\r
1454 x264PanelFunctions.on_x264_WidgetChange("bime", this);
\r
1456 private void check_pyrmidalBFrames_CheckedChanged(object sender, EventArgs e)
\r
1458 x264PanelFunctions.on_x264_WidgetChange("b-pyramid", this);
\r
1460 private void drop_MotionEstimationMethod_SelectedIndexChanged(object sender, EventArgs e)
\r
1462 x264PanelFunctions.on_x264_WidgetChange("me", this);
\r
1464 private void drop_MotionEstimationRange_SelectedIndexChanged(object sender, EventArgs e)
\r
1466 x264PanelFunctions.on_x264_WidgetChange("merange", this);
\r
1468 private void drop_subpixelMotionEstimation_SelectedIndexChanged(object sender, EventArgs e)
\r
1470 x264PanelFunctions.on_x264_WidgetChange("subq", this);
\r
1472 private void drop_analysis_SelectedIndexChanged(object sender, EventArgs e)
\r
1474 x264PanelFunctions.on_x264_WidgetChange("analyse", this);
\r
1476 private void check_8x8DCT_CheckedChanged(object sender, EventArgs e)
\r
1478 x264PanelFunctions.on_x264_WidgetChange("8x8dct", this);
\r
1480 private void drop_deblockAlpha_SelectedIndexChanged(object sender, EventArgs e)
\r
1482 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1485 private void drop_deblockBeta_SelectedIndexChanged(object sender, EventArgs e)
\r
1487 x264PanelFunctions.on_x264_WidgetChange("deblock", this);
\r
1490 private void drop_trellis_SelectedIndexChanged(object sender, EventArgs e)
\r
1492 x264PanelFunctions.on_x264_WidgetChange("trellis", this);
\r
1494 private void check_noFastPSkip_CheckedChanged(object sender, EventArgs e)
\r
1496 x264PanelFunctions.on_x264_WidgetChange("no-fast-pskip", this);
\r
1498 private void check_noDCTDecimate_CheckedChanged(object sender, EventArgs e)
\r
1500 x264PanelFunctions.on_x264_WidgetChange("no-dct-decimate", this);
\r
1503 private void check_Cabac_CheckedChanged(object sender, EventArgs e)
\r
1506 x264PanelFunctions.on_x264_WidgetChange("cabac", this);
\r
1509 private void rtf_x264Query_TextChanged(object sender, EventArgs e)
\r
1511 if (rtf_x264Query.Text.EndsWith("\n"))
\r
1513 rtf_x264Query.Text = rtf_x264Query.Text.Replace("\n", "");
\r
1514 x264PanelFunctions.X264_StandardizeOptString(this);
\r
1515 x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);
\r
1517 if (rtf_x264Query.Text == string.Empty)
\r
1518 x264PanelFunctions.reset2Defaults(this);
\r
1521 private void btn_reset_Click(object sender, EventArgs e)
\r
1523 rtf_x264Query.Text = "";
\r
1524 x264PanelFunctions.reset2Defaults(this);
\r
1527 // Query Editor Tab
\r
1528 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1530 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1532 private void btn_clear_Click(object sender, EventArgs e)
\r
1534 rtf_query.Clear();
\r
1538 // MainWindow Components, Actions and Functions ***********************
\r
1540 #region DVD Drive Detection
\r
1541 // Source Button Drive Detection
\r
1542 private delegate void ProgressUpdateHandler();
\r
1543 private void getDriveInfoThread()
\r
1547 if (this.InvokeRequired)
\r
1549 this.BeginInvoke(new ProgressUpdateHandler(getDriveInfoThread));
\r
1553 Boolean foundDrive = false;
\r
1554 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1555 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1557 if (curDrive.DriveType == DriveType.CDRom)
\r
1559 if (curDrive.IsReady)
\r
1561 if (File.Exists(curDrive.RootDirectory.ToString() + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1562 mnu_dvd_drive.Text = curDrive.RootDirectory.ToString() + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1564 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1566 foundDrive = true;
\r
1572 if (foundDrive == false)
\r
1573 mnu_dvd_drive.Text = "[No DVD Drive Ready]";
\r
1577 mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";
\r
1582 #region Audio Panel Code Helpers
\r
1583 private void setAudioByContainer(String path)
\r
1585 string oldval = "";
\r
1587 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1589 oldval = drp_audenc_1.Text;
\r
1590 drp_audenc_1.Items.Clear();
\r
1591 drp_audenc_1.Items.Add("AAC");
\r
1592 drp_audenc_1.Items.Add("AC3");
\r
1593 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1594 drp_audenc_1.SelectedIndex = 0;
\r
1597 else if (path.EndsWith(".avi"))
\r
1599 oldval = drp_audenc_1.Text;
\r
1600 drp_audenc_1.Items.Clear();
\r
1601 drp_audenc_1.Items.Add("MP3");
\r
1602 drp_audenc_1.Items.Add("AC3");
\r
1603 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1604 drp_audenc_1.SelectedIndex = 0;
\r
1607 else if (path.EndsWith(".ogm"))
\r
1609 drp_audenc_1.Items.Clear();
\r
1610 drp_audenc_1.Items.Add("Vorbis");
\r
1611 drp_audenc_1.SelectedIndex = 0;
\r
1614 else if (path.EndsWith(".mkv"))
\r
1616 drp_audenc_1.Items.Clear();
\r
1617 drp_audenc_1.Items.Add("AAC");
\r
1618 drp_audenc_1.Items.Add("MP3");
\r
1619 drp_audenc_1.Items.Add("AC3");
\r
1620 drp_audenc_1.Items.Add("Vorbis");
\r
1621 if (drp_audenc_1.Text == string.Empty)
\r
1622 drp_audenc_1.SelectedIndex = 0;
\r
1625 private void setVideoByContainer(String path)
\r
1627 string oldval = "";
\r
1629 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1631 oldval = drp_videoEncoder.Text;
\r
1632 drp_videoEncoder.Items.Clear();
\r
1633 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1634 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1635 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1636 if (oldval == "VP3 (Theora)")
\r
1637 drp_videoEncoder.SelectedIndex = 2;
\r
1639 drp_videoEncoder.Text = oldval;
\r
1642 else if (path.EndsWith(".avi"))
\r
1644 oldval = drp_videoEncoder.Text;
\r
1645 drp_videoEncoder.Items.Clear();
\r
1646 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1647 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1648 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1649 if (oldval == "VP3 (Theora)")
\r
1650 drp_videoEncoder.SelectedIndex = 2;
\r
1652 drp_videoEncoder.Text = oldval;
\r
1654 else if (path.EndsWith(".ogm"))
\r
1656 oldval = drp_videoEncoder.Text;
\r
1657 drp_videoEncoder.Items.Clear();
\r
1658 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1659 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1660 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1661 if (oldval == "H.264 (x264)")
\r
1662 drp_videoEncoder.SelectedIndex = 2;
\r
1664 drp_videoEncoder.Text = oldval;
\r
1666 else if (path.EndsWith(".mkv"))
\r
1668 oldval = drp_videoEncoder.Text;
\r
1669 drp_videoEncoder.Items.Clear();
\r
1670 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
1671 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
1672 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
1673 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1674 drp_videoEncoder.Text = oldval;
\r
1677 private void setBitrateSelections384(ComboBox dropDown)
\r
1679 dropDown.Items.Clear();
\r
1680 dropDown.Items.Add("32");
\r
1681 dropDown.Items.Add("40");
\r
1682 dropDown.Items.Add("48");
\r
1683 dropDown.Items.Add("56");
\r
1684 dropDown.Items.Add("64");
\r
1685 dropDown.Items.Add("80");
\r
1686 dropDown.Items.Add("86");
\r
1687 dropDown.Items.Add("112");
\r
1688 dropDown.Items.Add("128");
\r
1689 dropDown.Items.Add("160");
\r
1690 dropDown.Items.Add("192");
\r
1691 dropDown.Items.Add("224");
\r
1692 dropDown.Items.Add("256");
\r
1693 dropDown.Items.Add("320");
\r
1694 dropDown.Items.Add("384");
\r
1696 private void setBitrateSelections320(ComboBox dropDown)
\r
1698 dropDown.Items.Clear();
\r
1699 dropDown.Items.Add("32");
\r
1700 dropDown.Items.Add("40");
\r
1701 dropDown.Items.Add("48");
\r
1702 dropDown.Items.Add("56");
\r
1703 dropDown.Items.Add("64");
\r
1704 dropDown.Items.Add("80");
\r
1705 dropDown.Items.Add("86");
\r
1706 dropDown.Items.Add("112");
\r
1707 dropDown.Items.Add("128");
\r
1708 dropDown.Items.Add("160");
\r
1709 dropDown.Items.Add("192");
\r
1710 dropDown.Items.Add("224");
\r
1711 dropDown.Items.Add("256");
\r
1712 dropDown.Items.Add("320");
\r
1714 private void setBitrateSelections160(ComboBox dropDown)
\r
1716 dropDown.Items.Clear();
\r
1717 dropDown.Items.Add("32");
\r
1718 dropDown.Items.Add("40");
\r
1719 dropDown.Items.Add("48");
\r
1720 dropDown.Items.Add("56");
\r
1721 dropDown.Items.Add("64");
\r
1722 dropDown.Items.Add("80");
\r
1723 dropDown.Items.Add("86");
\r
1724 dropDown.Items.Add("112");
\r
1725 dropDown.Items.Add("128");
\r
1726 dropDown.Items.Add("160");
\r
1728 private void setMixDownAllOptions(ComboBox dropdown)
\r
1730 dropdown.Items.Clear();
\r
1731 dropdown.Items.Add("Automatic");
\r
1732 dropdown.Items.Add("Mono");
\r
1733 dropdown.Items.Add("Stereo");
\r
1734 dropdown.Items.Add("Dolby Surround");
\r
1735 dropdown.Items.Add("Dolby Pro Logic II");
\r
1736 dropdown.Items.Add("6 Channel Discrete");
\r
1738 private void setMixDownNotAAC(ComboBox dropdown)
\r
1740 dropdown.Items.Clear();
\r
1741 dropdown.Items.Add("Automatic");
\r
1742 dropdown.Items.Add("Stereo");
\r
1743 dropdown.Items.Add("Dolby Surround");
\r
1744 dropdown.Items.Add("Dolby Pro Logic II");
\r
1746 private void audioEncoderChange(ComboBox audenc, ComboBox audMix, ComboBox audbit, ComboBox audsr)
\r
1748 if (audenc.Text == "AC3")
\r
1750 audMix.Enabled = false;
\r
1751 audbit.Enabled = false;
\r
1752 audsr.Enabled = false;
\r
1754 audMix.Text = "Automatic";
\r
1755 audbit.Text = "160";
\r
1756 audsr.Text = "Auto";
\r
1760 // Just make sure not to re-enable the following boxes if the track above is none
\r
1761 /* if (drp_track2Audio.Text != "None")
\r
1763 audMix.Enabled = true;
\r
1764 audbit.Enabled = true;
\r
1765 audsr.Enabled = true;
\r
1767 audMix.Text = "Automatic";
\r
1768 audbit.Text = "160";
\r
1769 audsr.Text = "Auto";
\r
1775 #region Public Methods
\r
1778 /// Setup the GUI for Encoding or finished Encoding.
\r
1779 /// 1 = Encode Running
\r
1780 /// 0 = Encode Finished.
\r
1782 /// <param name="i">Int</param>
\r
1783 public void setEncodeFinished()
\r
1787 if (this.InvokeRequired)
\r
1789 this.BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1793 lbl_encode.Text = "Encoding Finished";
\r
1794 btn_start.Text = "Start";
\r
1795 btn_start.ToolTipText = "Start the encoding process";
\r
1796 btn_start.Image = Properties.Resources.Play;
\r
1798 // If the window is minimized, display the notification in a popup.
\r
1799 if (FormWindowState.Minimized == this.WindowState)
\r
1801 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1802 notifyIcon.ShowBalloonTip(500);
\r
1806 catch (Exception exc)
\r
1808 MessageBox.Show(exc.ToString());
\r
1811 public void setEncodeStarted()
\r
1815 if (this.InvokeRequired)
\r
1817 this.BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1821 lbl_encode.Visible = true;
\r
1822 lbl_encode.Text = "Encoding in Progress";
\r
1823 btn_start.Text = "Stop";
\r
1824 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
1825 btn_start.Image = Properties.Resources.stop;
\r
1827 catch (Exception exc)
\r
1829 MessageBox.Show(exc.ToString());
\r
1834 /// Action can be "encode" or "scan"
\r
1835 /// Set the last action varible in the main window.
\r
1836 /// This is used to control which log file is displayed when the Activity window is displayed.
\r
1838 /// <param name="last">String</param>
\r
1839 public void setLastAction(string last)
\r
1841 this.lastAction = last;
\r
1845 /// DVD parseing. Pass in a parsed DVD.
\r
1847 /// <param name="dvd"></param>
\r
1848 public void setStreamReader(Parsing.DVD dvd)
\r
1850 this.thisDVD = dvd;
\r
1854 /// Reload the preset panel display
\r
1856 public void loadPresetPanel()
\r
1858 presetHandler.loadPresetData();
\r
1860 treeView_presets.Nodes.Clear();
\r
1862 List<Presets.Preset> presetNameList = new List<Presets.Preset>();
\r
1863 List<string> presetNames = new List<string>();
\r
1864 TreeNode preset_treeview = new TreeNode();
\r
1866 TreeNode rootNode = new TreeNode();
\r
1867 TreeNode rootNodeTwo = new TreeNode();
\r
1868 TreeNode childNode = new TreeNode();
\r
1869 int workingLevel = 0;
\r
1870 string previousCategory = String.Empty;
\r
1871 string currentCategory = String.Empty;
\r
1873 presetNameList = presetHandler.getBuildInPresets();
\r
1874 if (presetNameList.Count != 0)
\r
1876 foreach (Presets.Preset preset in presetNameList)
\r
1878 // Handle Root Nodes
\r
1880 // First Case - No presets have been read yet so setup the root category
\r
1881 if (preset.Level == 1 && currentCategory == String.Empty)
\r
1883 rootNode = new TreeNode(preset.Category);
\r
1884 workingLevel = preset.Level;
\r
1885 currentCategory = preset.Category;
\r
1886 previousCategory = preset.Category;
\r
1889 // Second Case - This is the first sub child node.
\r
1890 if (preset.Level == 2 && workingLevel == 1 && currentCategory != preset.Category)
\r
1892 rootNodeTwo = new TreeNode(preset.Category);
\r
1893 workingLevel = preset.Level;
\r
1894 currentCategory = preset.Category;
\r
1895 rootNode.Nodes.Add(rootNodeTwo);
\r
1898 // Third Case - Any presets the sub presets detected in the above if statment.
\r
1899 if (preset.Level == 1 && workingLevel == 2)
\r
1901 workingLevel = preset.Level;
\r
1902 currentCategory = preset.Category;
\r
1905 // Fourth Case - We've finished this root node and are onto the next root node.
\r
1906 if (preset.Level == 1 && workingLevel == 1 && previousCategory != preset.Category)
\r
1908 treeView_presets.Nodes.Add(rootNode); // Add the finished node
\r
1910 rootNode = new TreeNode(preset.Category);
\r
1911 workingLevel = preset.Level;
\r
1912 currentCategory = preset.Category;
\r
1913 previousCategory = preset.Category;
\r
1916 // Handle Child Nodes
\r
1917 // Add First level child nodes to the current root node
\r
1918 if (preset.Level == 1 && workingLevel == 1 && currentCategory == preset.Category)
\r
1920 childNode = new TreeNode(preset.Name);
\r
1921 rootNode.Nodes.Add(childNode);
\r
1924 // Add Second level child nodes to the current sub root node
\r
1925 if (preset.Level == 2 && workingLevel == 2 && currentCategory == preset.Category)
\r
1927 childNode = new TreeNode(preset.Name);
\r
1928 rootNodeTwo.Nodes.Add(childNode);
\r
1932 // Add the final root node which does not get added above.
\r
1933 treeView_presets.Nodes.Add(rootNode);
\r
1937 presetNames = presetHandler.getUserPresetNames();
\r
1938 foreach (string preset in presetNames)
\r
1940 preset_treeview = new TreeNode(preset);
\r
1941 preset_treeview.ForeColor = Color.Black;
\r
1943 // Now Fill Out List View with Items
\r
1944 treeView_presets.Nodes.Add(preset_treeview);
\r
1953 // This is the END of the road ------------------------------------------------------------------------------
\r