private Queue encodeQueue = new Queue();\r
private PresetsHandler presetHandler = new PresetsHandler();\r
\r
- // Globals: Mainly used for tracking. *********************************\r
- public Title selectedTitle;\r
+ // Windows ************************************************************\r
private frmQueue queueWindow;\r
private frmPreview qtpreview;\r
private frmActivityWindow ActivityWindow;\r
- private Form splash;\r
+ private frmSplashScreen splash = new frmSplashScreen();\r
+\r
+ // Globals: Mainly used for tracking. *********************************\r
+ public Title selectedTitle;\r
public string sourcePath;\r
- private ActivityLogMode lastAction;\r
private SourceType selectedSourceType;\r
private string dvdDrivePath;\r
private string dvdDriveLabel;\r
private Preset CurrentlySelectedPreset;\r
private DVD currentSource;\r
- private Scan SourceScan = new Scan();\r
+ private ScanService SourceScan = new ScanService();\r
private List<DriveInformation> drives;\r
+ private Thread encodeMonitor;\r
\r
// Delegates **********************************************************\r
private delegate void UpdateWindowHandler();\r
\r
// Applicaiton Startup ************************************************\r
\r
+ #region Properties\r
+\r
+ /// <summary>\r
+ /// Gets SourceName.\r
+ /// </summary>\r
+ public string SourceName\r
+ {\r
+ get\r
+ {\r
+ if (this.selectedSourceType == SourceType.DvdDrive)\r
+ {\r
+ return this.dvdDriveLabel;\r
+ }\r
+\r
+ if (Path.GetFileNameWithoutExtension(this.sourcePath) != "VIDEO_TS")\r
+ return Path.GetFileNameWithoutExtension(this.sourcePath);\r
+\r
+ return Path.GetFileNameWithoutExtension(Path.GetDirectoryName(this.sourcePath));\r
+ }\r
+ }\r
+\r
+ #endregion\r
+\r
#region Application Startup\r
\r
public frmMain()\r
{\r
// Load and setup the splash screen in this thread\r
- splash = new frmSplashScreen();\r
splash.Show(this);\r
Label lblStatus = new Label { Size = new Size(150, 20), Location = new Point(182, 102) };\r
splash.Controls.Add(lblStatus);\r
InitializeComponent();\r
\r
// Update the users config file with the CLI version data.\r
- lblStatus.Text = "Checking CLI Version Data ...";\r
- Application.DoEvents();\r
+ UpdateSplashStatus(lblStatus, "Checking CLI Version Data ...");\r
Main.SetCliVersionData();\r
Main.CheckForValidCliVersion();\r
\r
TimeSpan elapsed = now.Subtract(lastCheck);\r
if (elapsed.TotalDays > Properties.Settings.Default.daysBetweenUpdateCheck)\r
{\r
- lblStatus.Text = "Checking for updates ...";\r
- Application.DoEvents();\r
-\r
+ UpdateSplashStatus(lblStatus, "Checking for updates ...");\r
Main.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDone), false);\r
}\r
}\r
// Clear the log files in the background\r
if (Properties.Settings.Default.clearOldLogs)\r
{\r
- lblStatus.Text = "Clearing Old Log Files ...";\r
- Application.DoEvents();\r
+ UpdateSplashStatus(lblStatus, "Clearing Old Log Files ..");\r
Thread clearLog = new Thread(Main.ClearOldLogs);\r
clearLog.Start();\r
}\r
\r
// Setup the GUI components\r
- lblStatus.Text = "Setting up the GUI ...";\r
- Application.DoEvents();\r
+ UpdateSplashStatus(lblStatus, "Setting up the GUI ...");\r
LoadPresetPanel(); // Load the Preset Panel\r
treeView_presets.ExpandAll();\r
lbl_encode.Text = string.Empty;\r
queueWindow = new frmQueue(encodeQueue, this); // Prepare the Queue\r
if (!Properties.Settings.Default.QueryEditorTab)\r
tabs_panel.TabPages.RemoveAt(7); // Remove the query editor tab if the user does not want it enabled.\r
+ if (Properties.Settings.Default.tooltipEnable)\r
+ ToolTip.Active = true;\r
\r
// Load the user's default settings or Normal Preset\r
- if (Properties.Settings.Default.defaultPreset != string.Empty)\r
+ if (Properties.Settings.Default.defaultPreset != string.Empty && presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)\r
{\r
- if (presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)\r
+ string query = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).Query;\r
+ if (query != null)\r
{\r
- string query = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).Query;\r
- bool loadPictureSettings =\r
- presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).PictureSettings;\r
+ x264Panel.Reset2Defaults();\r
\r
- if (query != null)\r
- {\r
- x264Panel.Reset2Defaults();\r
-\r
- QueryParser presetQuery = QueryParser.Parse(query);\r
- PresetLoader.LoadPreset(this, presetQuery, Properties.Settings.Default.defaultPreset,\r
- loadPictureSettings);\r
+ QueryParser presetQuery = QueryParser.Parse(query);\r
+ PresetLoader.LoadPreset(this, presetQuery, Properties.Settings.Default.defaultPreset,\r
+ presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).PictureSettings);\r
\r
- x264Panel.X264_StandardizeOptString();\r
- x264Panel.X264_SetCurrentSettingsInPanel();\r
- }\r
+ x264Panel.X264_StandardizeOptString();\r
+ x264Panel.X264_SetCurrentSettingsInPanel();\r
}\r
- else\r
- loadNormalPreset();\r
}\r
else\r
loadNormalPreset();\r
\r
- // Enabled GUI tooltip's if Required\r
- if (Properties.Settings.Default.tooltipEnable)\r
- ToolTip.Active = true;\r
-\r
// Register with Growl (if not using Growl for the encoding completion action, this wont hurt anything)\r
GrowlCommunicator.Register();\r
\r
// Finished Loading\r
- lblStatus.Text = "Loading Complete!";\r
- Application.DoEvents();\r
+ UpdateSplashStatus(lblStatus, "Loading Complete.");\r
splash.Close();\r
splash.Dispose();\r
this.Enabled = true;\r
catch (Exception ex)\r
{\r
if ((bool)result.AsyncState)\r
- MessageBox.Show(\r
- "Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex,\r
- "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ Main.ShowExceptiowWindow("Unable to check for updates, Please try again later.", ex.ToString());\r
}\r
}\r
\r
}\r
}\r
\r
- #endregion\r
-\r
- #region Properties\r
-\r
- public string SourceName\r
+ private void UpdateSplashStatus(Label status, string text)\r
{\r
- get\r
- {\r
- if (this.selectedSourceType == SourceType.DvdDrive)\r
- {\r
- return this.dvdDriveLabel;\r
- }\r
-\r
- if (Path.GetFileNameWithoutExtension(this.sourcePath) != "VIDEO_TS")\r
- return Path.GetFileNameWithoutExtension(this.sourcePath);\r
-\r
- return Path.GetFileNameWithoutExtension(Path.GetDirectoryName(this.sourcePath));\r
- }\r
+ status.Text = text;\r
+ Application.DoEvents();\r
}\r
\r
#endregion\r
this.Resize += new EventHandler(frmMain_Resize);\r
\r
// Handle Encode Start / Finish / Pause\r
-\r
encodeQueue.QueuePauseRequested += new EventHandler(encodePaused);\r
encodeQueue.EncodeStarted += new EventHandler(encodeStarted);\r
encodeQueue.EncodeEnded += new EventHandler(encodeEnded);\r
check_optimiseMP4.CheckedChanged += new EventHandler(changePresetLabel);\r
\r
// Picture Settings\r
- // PictureSettings.PictureSettingsChanged += new EventHandler(changePresetLabel);\r
+ PictureSettings.PictureSettingsChanged += new EventHandler(changePresetLabel);\r
\r
// Filter Settings\r
Filters.FilterSettingsChanged += new EventHandler(changePresetLabel);\r
check_optimiseMP4.CheckedChanged -= new EventHandler(changePresetLabel);\r
\r
// Picture Settings\r
- // PictureSettings.PictureSettingsChanged -= new EventHandler(changePresetLabel);\r
+ PictureSettings.PictureSettingsChanged -= new EventHandler(changePresetLabel);\r
\r
// Filter Settings\r
Filters.FilterSettingsChanged -= new EventHandler(changePresetLabel);\r
\r
if (fileList != null)\r
{\r
- if (fileList[0] != string.Empty)\r
+ if (!string.IsNullOrEmpty(fileList[0]))\r
{\r
this.selectedSourceType = SourceType.VideoFile;\r
StartScan(fileList[0], 0);\r
\r
private void encodeStarted(object sender, EventArgs e)\r
{\r
- lastAction = ActivityLogMode.Encode;\r
SetEncodeStarted();\r
\r
// Experimental HBProc Process Monitoring.\r
if (Properties.Settings.Default.enocdeStatusInGui)\r
{\r
- Thread encodeMon = new Thread(EncodeMonitorThread);\r
- encodeMon.Start();\r
+ encodeMonitor = new Thread(EncodeMonitorThread);\r
+ encodeMonitor.Start();\r
}\r
}\r
\r
\r
#region File Menu\r
\r
+ /// <summary>\r
+ /// Kill The scan menu Item\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_killCLI_Click(object sender, EventArgs e)\r
{\r
KillScan();\r
}\r
\r
+ /// <summary>\r
+ /// Exit the Application Menu Item\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_exit_Click(object sender, EventArgs e)\r
{\r
Application.Exit();\r
\r
#region Tools Menu\r
\r
+ /// <summary>\r
+ /// Menu - Start Button\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_encode_Click(object sender, EventArgs e)\r
{\r
queueWindow.Show();\r
}\r
\r
+ /// <summary>\r
+ /// Menu - Display the Log Window\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_encodeLog_Click(object sender, EventArgs e)\r
{\r
- frmActivityWindow dvdInfoWindow = new frmActivityWindow(lastAction, encodeQueue, SourceScan);\r
+ frmActivityWindow dvdInfoWindow = new frmActivityWindow(encodeQueue, SourceScan);\r
dvdInfoWindow.Show();\r
}\r
\r
+ /// <summary>\r
+ /// Menu - Display the Options Window\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_options_Click(object sender, EventArgs e)\r
{\r
Form options = new frmOptions(this);\r
\r
#region Presets Menu\r
\r
+ /// <summary>\r
+ /// Reset the Built in Presets\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_presetReset_Click(object sender, EventArgs e)\r
{\r
presetHandler.UpdateBuiltInPresets();\r
treeView_presets.ExpandAll();\r
}\r
\r
+ /// <summary>\r
+ /// Delete the selected preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_delete_preset_Click(object sender, EventArgs e)\r
{\r
presetHandler.RemoveBuiltInPresets();\r
LoadPresetPanel(); // Reload the preset panel\r
}\r
\r
+ /// <summary>\r
+ /// Select the Normal preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
{\r
loadNormalPreset();\r
}\r
\r
+ /// <summary>\r
+ /// Import a plist Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_importMacPreset_Click(object sender, EventArgs e)\r
{\r
ImportPreset();\r
}\r
\r
+ /// <summary>\r
+ /// Export a Plist Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
+ private void mnu_exportMacPreset_Click(object sender, EventArgs e)\r
+ {\r
+ ExportPreset();\r
+ }\r
+\r
+ /// <summary>\r
+ /// Create a new Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_new_preset_Click(object sender, EventArgs e)\r
{\r
Form preset = new frmAddPreset(this, QueryGenerator.GenerateCliQuery(this, drop_mode.SelectedIndex, 0, null),\r
\r
#region Help Menu\r
\r
+ /// <summary>\r
+ /// Menu - Display the User Guide Web Page\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_user_guide_Click(object sender, EventArgs e)\r
{\r
Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");\r
}\r
\r
- private void mnu_handbrake_home_Click(object sender, EventArgs e)\r
- {\r
- Process.Start("http://handbrake.fr");\r
- }\r
-\r
+ /// <summary>\r
+ /// Menu - Check for Updates\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
{\r
lbl_updateCheck.Visible = true;\r
Main.BeginCheckForUpdates(new AsyncCallback(updateCheckDoneMenu), false);\r
}\r
\r
- private void updateCheckDoneMenu(IAsyncResult result)\r
- {\r
- // Make sure it's running on the calling thread\r
- if (InvokeRequired)\r
- {\r
- Invoke(new MethodInvoker(() => updateCheckDoneMenu(result)));\r
- return;\r
- }\r
- UpdateCheckInformation info;\r
- try\r
- {\r
- // Get the information about the new build, if any, and close the window\r
- info = Main.EndCheckForUpdates(result);\r
-\r
- if (info.NewVersionAvailable && info.BuildInformation != null)\r
- {\r
- frmUpdater updateWindow = new frmUpdater(info.BuildInformation);\r
- updateWindow.ShowDialog();\r
- }\r
- else\r
- MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK,\r
- MessageBoxIcon.Information);\r
- lbl_updateCheck.Visible = false;\r
- return;\r
- }\r
- catch (Exception ex)\r
- {\r
- if ((bool)result.AsyncState)\r
- MessageBox.Show(\r
- "Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex,\r
- "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
- }\r
- }\r
-\r
+ /// <summary>\r
+ /// Menu - Display the About Window\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void mnu_about_Click(object sender, EventArgs e)\r
{\r
using (frmAbout About = new frmAbout())\r
\r
#region Preset Bar\r
\r
- // Right Click Menu Code\r
+ /// <summary>\r
+ /// RMenu - Expand All\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void pmnu_expandAll_Click(object sender, EventArgs e)\r
{\r
treeView_presets.ExpandAll();\r
}\r
\r
+ /// <summary>\r
+ /// RMenu - Collaspe All\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void pmnu_collapse_Click(object sender, EventArgs e)\r
{\r
treeView_presets.CollapseAll();\r
}\r
\r
+ /// <summary>\r
+ /// Menu - Import Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void pmnu_import_Click(object sender, EventArgs e)\r
{\r
ImportPreset();\r
}\r
\r
+ /// <summary>\r
+ /// RMenu - Save Changes to Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void pmnu_saveChanges_Click(object sender, EventArgs e)\r
{\r
DialogResult result =\r
QueryGenerator.GenerateTabbedComponentsQuery(this), false);\r
}\r
\r
+ /// <summary>\r
+ /// RMenu - Delete Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void pmnu_delete_click(object sender, EventArgs e)\r
{\r
if (treeView_presets.SelectedNode != null)\r
treeView_presets.Select();\r
}\r
\r
+ /// <summary>\r
+ /// Preset Menu Is Opening. Setup the Menu\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void presets_menu_Opening(object sender, CancelEventArgs e)\r
{\r
// Make sure that the save menu is always disabled by default\r
}\r
\r
// Presets Management\r
+\r
+ /// <summary>\r
+ /// Button - Add a preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_addPreset_Click(object sender, EventArgs e)\r
{\r
Form preset = new frmAddPreset(this, QueryGenerator.GenerateTabbedComponentsQuery(this), presetHandler);\r
preset.ShowDialog();\r
}\r
\r
+ /// <summary>\r
+ /// Button - remove a Preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_removePreset_Click(object sender, EventArgs e)\r
{\r
DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset",\r
treeView_presets.Select();\r
}\r
\r
+ /// <summary>\r
+ /// Button - Set the selected preset as the default\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_setDefault_Click(object sender, EventArgs e)\r
{\r
if (treeView_presets.SelectedNode != null)\r
MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
}\r
\r
+ /// <summary>\r
+ /// PresetBar Mouse Down event\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void treeview_presets_mouseUp(object sender, MouseEventArgs e)\r
{\r
if (e.Button == MouseButtons.Right)\r
treeView_presets.Select();\r
}\r
\r
+ /// <summary>\r
+ /// Preset Bar after selecting the preset\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
{\r
selectPreset();\r
}\r
\r
+ /// <summary>\r
+ /// Preset Bar - Handle the Delete Key\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void treeView_presets_deleteKey(object sender, KeyEventArgs e)\r
{\r
if (e.KeyCode == Keys.Delete)\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Select the selected preset and setup the GUI\r
+ /// </summary>\r
private void selectPreset()\r
{\r
if (treeView_presets.SelectedNode != null)\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Load the Normal Preset\r
+ /// </summary>\r
private void loadNormalPreset()\r
{\r
foreach (TreeNode treenode in treeView_presets.Nodes)\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Import a plist preset\r
+ /// </summary>\r
private void ImportPreset()\r
{\r
if (openPreset.ShowDialog() == DialogResult.OK)\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Export a plist Preset\r
+ /// </summary>\r
+ private void ExportPreset()\r
+ {\r
+ MessageBox.Show("This feature has not been implimented yet.", "Not Implimented", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+ return;\r
+\r
+ SaveFileDialog savefiledialog = new SaveFileDialog();\r
+ savefiledialog.Filter = "plist|*.plist";\r
+\r
+ if (treeView_presets.SelectedNode != null)\r
+ {\r
+\r
+ if (savefiledialog.ShowDialog() == DialogResult.OK)\r
+ {\r
+ Preset preset = presetHandler.GetPreset(treeView_presets.SelectedNode.Text);\r
+ PlistPresetHandler.Export(savefiledialog.FileName, preset);\r
+ }\r
+ }\r
+ }\r
+\r
#endregion\r
\r
#region ToolStrip\r
\r
+ /// <summary>\r
+ /// Toolbar - When the Source button is clicked, Clear any DVD drives and add any available DVD drives that can be used as a source.\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_source_Click(object sender, EventArgs e)\r
{\r
// Remove old Drive Menu Items.\r
driveInfoThread.Start();\r
}\r
\r
+ /// <summary>\r
+ /// Toolbar - Start The Encode\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_start_Click(object sender, EventArgs e)\r
{\r
if (btn_start.Text == "Stop")\r
{\r
encodeQueue.SafelyClose();\r
}\r
-\r
- // Update the GUI\r
- SetEncodeFinished();\r
}\r
}\r
else\r
\r
SetEncodeStarted(); // Encode is running, so setup the GUI appropriately\r
encodeQueue.Start(); // Start The Queue Encoding Process\r
- lastAction = ActivityLogMode.Encode; // Set the last action to encode - Used for activity window.\r
}\r
- if (ActivityWindow != null)\r
- ActivityWindow.SetMode(ActivityLogMode.Encode);\r
\r
this.Focus();\r
}\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Toolbar - Add the current job to the Queue\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_add2Queue_Click(object sender, EventArgs e)\r
{\r
if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
- MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK,\r
- MessageBoxIcon.Warning);\r
+ MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
else\r
{\r
+ if (!Directory.Exists(Path.GetDirectoryName(text_destination.Text)))\r
+ {\r
+ MessageBox.Show("Destination Path does not exist.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+ return;\r
+ }\r
+\r
string query = QueryGenerator.GenerateCliQuery(this, drop_mode.SelectedIndex, 0, null);\r
if (rtf_query.Text != string.Empty)\r
query = rtf_query.Text;\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Toolbar - Show the Queue\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_showQueue_Click(object sender, EventArgs e)\r
{\r
queueWindow.Show();\r
queueWindow.Activate();\r
}\r
\r
+ /// <summary>\r
+ /// Toolbar - Show the Preview Window\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void tb_preview_Click(object sender, EventArgs e)\r
{\r
if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Toolbar - Show the Activity log Window\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_ActivityWindow_Click(object sender, EventArgs e)\r
{\r
if (ActivityWindow == null || !ActivityWindow.IsHandleCreated)\r
- ActivityWindow = new frmActivityWindow(lastAction, encodeQueue, SourceScan);\r
- else\r
- switch (lastAction)\r
- {\r
- case ActivityLogMode.Scan:\r
- ActivityWindow.SetMode(ActivityLogMode.Scan);\r
- break;\r
- case ActivityLogMode.Encode:\r
- ActivityWindow.SetMode(ActivityLogMode.Encode);\r
- break;\r
- default:\r
- ActivityWindow.SetMode(ActivityLogMode.Encode);\r
- break;\r
- }\r
+ ActivityWindow = new frmActivityWindow(encodeQueue, SourceScan);\r
\r
ActivityWindow.Show();\r
ActivityWindow.Activate();\r
\r
#region System Tray Icon\r
\r
+ /// <summary>\r
+ /// Handle Resizing of the main window when deaing with the Notify Icon\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void frmMain_Resize(object sender, EventArgs e)\r
{\r
if (FormWindowState.Minimized == this.WindowState)\r
notifyIcon.Visible = false;\r
}\r
\r
+ /// <summary>\r
+ /// Double Click the Tray Icon\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)\r
{\r
this.Visible = true;\r
notifyIcon.Visible = false;\r
}\r
\r
+ /// <summary>\r
+ /// Tray Icon - Restore Menu Item - Resture the Window\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void btn_restore_Click(object sender, EventArgs e)\r
{\r
this.Visible = true;\r
this.Activate();\r
this.WindowState = FormWindowState.Normal;\r
notifyIcon.Visible = false;\r
-\r
- this.StartScan(null, 2);\r
}\r
\r
#endregion\r
\r
- #region Tab Control\r
+ #region Main Window and Tab Control\r
\r
// Source\r
private void btn_dvd_source_Click(object sender, EventArgs e)\r
private void SelectSource(string file)\r
{\r
Check_ChapterMarkers.Enabled = true;\r
- lastAction = ActivityLogMode.Scan;\r
sourcePath = string.Empty;\r
\r
if (file == string.Empty) // Must have a file or path\r
{\r
drop_angle.Visible = true;\r
lbl_angle.Visible = true;\r
- drop_angle.Items.AddRange(selectedTitle.Angles.ToArray());\r
+\r
+ for (int i = 1; i <= selectedTitle.AngleCount; i++)\r
+ drop_angle.Items.Add(i.ToString());\r
+\r
if (drop_angle.Items.Count != 0)\r
drop_angle.SelectedIndex = 0;\r
}\r
}\r
\r
AudioSettings.SetContainer(drop_format.Text);\r
- Subtitles.SetContainer(drop_format.SelectedIndex);\r
\r
if (drop_format.Text.Contains("MP4"))\r
{\r
}\r
}\r
\r
+ private void btn_export_Click(object sender, EventArgs e)\r
+ {\r
+ SaveFileDialog saveFileDialog = new SaveFileDialog();\r
+ saveFileDialog.Filter = "Csv File|*.csv";\r
+ saveFileDialog.DefaultExt = "csv";\r
+ if (saveFileDialog.ShowDialog() == DialogResult.OK)\r
+ {\r
+ string filename = saveFileDialog.FileName;\r
+\r
+ Main.SaveChapterMarkersToCsv(this, filename);\r
+ }\r
+ }\r
+\r
private void mnu_resetChapters_Click(object sender, EventArgs e)\r
{\r
data_chpt.Rows.Clear();\r
\r
#region Source Scan\r
\r
- public bool isScanning { get; set; }\r
-\r
+ /// <summary>\r
+ /// Start the Scan Process\r
+ /// </summary>\r
+ /// <param name="filename">\r
+ /// The filename.\r
+ /// </param>\r
+ /// <param name="title">\r
+ /// The title.\r
+ /// </param>\r
private void StartScan(string filename, int title)\r
{\r
// Setup the GUI components for the scan.\r
\r
this.DisableGUI();\r
\r
- if (ActivityWindow != null)\r
- ActivityWindow.SetMode(ActivityLogMode.Scan);\r
-\r
// Start the Scan\r
try\r
{\r
- isScanning = true;\r
- SourceScan = new Scan();\r
- SourceScan.ScanSource(sourcePath, title);\r
+ SourceScan.Scan(sourcePath, title);\r
SourceScan.ScanStatusChanged += new EventHandler(SourceScan_ScanStatusChanged);\r
SourceScan.ScanCompleted += new EventHandler(SourceScan_ScanCompleted);\r
}\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Update the Status label for the scan\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void SourceScan_ScanStatusChanged(object sender, EventArgs e)\r
{\r
UpdateScanStatusLabel();\r
}\r
\r
+ /// <summary>\r
+ /// Update the UI after the scan has completed\r
+ /// </summary>\r
+ /// <param name="sender">\r
+ /// The sender.\r
+ /// </param>\r
+ /// <param name="e">\r
+ /// The e.\r
+ /// </param>\r
private void SourceScan_ScanCompleted(object sender, EventArgs e)\r
{\r
UpdateGuiAfterScan();\r
}\r
\r
+ /// <summary>\r
+ /// Update the Scan Status Label\r
+ /// </summary>\r
private void UpdateScanStatusLabel()\r
{\r
if (InvokeRequired)\r
BeginInvoke(new UpdateWindowHandler(UpdateScanStatusLabel));\r
return;\r
}\r
- lbl_encode.Text = SourceScan.ScanStatus();\r
+ lbl_encode.Text = SourceScan.ScanStatus;\r
}\r
\r
+ /// <summary>\r
+ /// Reset the GUI when the scan has completed\r
+ /// </summary>\r
private void UpdateGuiAfterScan()\r
{\r
if (InvokeRequired)\r
\r
try\r
{\r
- currentSource = SourceScan.SouceData();\r
+ currentSource = SourceScan.SouceData;\r
\r
// Setup some GUI components\r
drp_dvdtitle.Items.Clear();\r
}\r
}\r
\r
+ if (drp_dvdtitle.SelectedItem == null && drp_dvdtitle.Items.Count > 0)\r
+ {\r
+ drp_dvdtitle.SelectedIndex = 0;\r
+ }\r
+\r
// Enable the creation of chapter markers if the file is an image of a dvd.\r
int start, end;\r
int.TryParse(drop_chapterStart.Items[0].ToString(), out start);\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Enable the GUI\r
+ /// </summary>\r
private void EnableGUI()\r
{\r
try\r
}\r
}\r
\r
+ /// <summary>\r
+ /// Disable the GUI\r
+ /// </summary>\r
private void DisableGUI()\r
{\r
foreach (Control ctrl in Controls)\r
mnu_killCLI.Visible = true;\r
}\r
\r
+ /// <summary>\r
+ /// Kill the Scan\r
+ /// </summary>\r
private void KillScan()\r
{\r
- try\r
- {\r
- SourceScan.ScanCompleted -= new EventHandler(SourceScan_ScanCompleted);\r
- EnableGUI();\r
- ResetGUI();\r
+ SourceScan.ScanCompleted -= new EventHandler(SourceScan_ScanCompleted);\r
+ EnableGUI();\r
+ ResetGUI();\r
\r
- if (SourceScan.ScanProcess() != null)\r
- SourceScan.ScanProcess().Kill();\r
+ SourceScan.Stop();\r
\r
- lbl_encode.Text = "Scan Cancelled!";\r
- }\r
- catch (Exception ex)\r
- {\r
- MessageBox.Show(\r
- "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" +\r
- ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
- }\r
+ lbl_encode.Text = "Scan Cancelled!";\r
}\r
\r
+ /// <summary>\r
+ /// Reset the GUI\r
+ /// </summary>\r
private void ResetGUI()\r
{\r
drp_dvdtitle.Items.Clear();\r
sourcePath = String.Empty;\r
text_destination.Text = String.Empty;\r
selectedTitle = null;\r
- isScanning = false;\r
}\r
\r
+ /// <summary>\r
+ /// Update the Source Label\r
+ /// </summary>\r
private void UpdateSourceLabel()\r
{\r
labelSource.Text = string.IsNullOrEmpty(sourcePath) ? "Select \"Source\" to continue." : this.SourceName;\r
labelSource.Text = Path.GetFileName(selectedTitle.SourceName);\r
}\r
\r
+ /// <summary>\r
+ /// Take a job from the Queue, rescan it, and reload the GUI for that job.\r
+ /// </summary>\r
+ /// <param name="job">\r
+ /// The job.\r
+ /// </param>\r
public void RecievingJob(Job job)\r
{\r
string query = job.Query;\r
}\r
\r
lbl_encode.Text = "Encoding Finished";\r
+ ProgressBarStatus.Visible = false;\r
btn_start.Text = "Start";\r
btn_start.ToolTipText = "Start the encoding process";\r
btn_start.Image = Properties.Resources.Play;\r
BeginInvoke(new UpdateWindowHandler(SetEncodeStarted));\r
return;\r
}\r
-\r
lbl_encode.Visible = true;\r
+ ProgressBarStatus.Value = 0;\r
+ ProgressBarStatus.Visible = true;\r
lbl_encode.Text = "Encoding with " + encodeQueue.Count + " encode(s) pending";\r
btn_start.Text = "Stop";\r
btn_start.ToolTipText = "Stop the encoding process.";\r
List<ToolStripMenuItem> menuItems = new List<ToolStripMenuItem>();\r
foreach (DriveInformation drive in drives)\r
{\r
- ToolStripMenuItem menuItem = new ToolStripMenuItem();\r
- menuItem.Name = drive.ToString();\r
- menuItem.Text = drive.RootDirectory + " (" + drive.VolumeLabel + ")";\r
- menuItem.Image = Resources.disc_small;\r
+ ToolStripMenuItem menuItem = new ToolStripMenuItem\r
+ {\r
+ Name = drive.ToString(),\r
+ Text = drive.RootDirectory + " (" + drive.VolumeLabel + ")",\r
+ Image = Resources.disc_small\r
+ };\r
menuItem.Click += new EventHandler(mnu_dvd_drive_Click);\r
menuItems.Add(menuItem);\r
}\r
return title;\r
}\r
\r
+ /// <summary>\r
+ /// Handle the Update Check Finishing.\r
+ /// </summary>\r
+ /// <param name="result">\r
+ /// The result.\r
+ /// </param>\r
+ private void updateCheckDoneMenu(IAsyncResult result)\r
+ {\r
+ // Make sure it's running on the calling thread\r
+ if (InvokeRequired)\r
+ {\r
+ Invoke(new MethodInvoker(() => updateCheckDoneMenu(result)));\r
+ return;\r
+ }\r
+ UpdateCheckInformation info;\r
+ try\r
+ {\r
+ // Get the information about the new build, if any, and close the window\r
+ info = Main.EndCheckForUpdates(result);\r
+\r
+ if (info.NewVersionAvailable && info.BuildInformation != null)\r
+ {\r
+ frmUpdater updateWindow = new frmUpdater(info.BuildInformation);\r
+ updateWindow.ShowDialog();\r
+ }\r
+ else\r
+ MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK,\r
+ MessageBoxIcon.Information);\r
+ lbl_updateCheck.Visible = false;\r
+ return;\r
+ }\r
+ catch (Exception ex)\r
+ {\r
+ if ((bool)result.AsyncState)\r
+ MessageBox.Show(\r
+ "Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex,\r
+ "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+ }\r
+ }\r
+\r
#endregion\r
\r
#region Overrides\r
/// <summary>\r
/// Handle GUI shortcuts\r
/// </summary>\r
- /// <param name="msg"></param>\r
- /// <param name="keyData"></param>\r
- /// <returns></returns>\r
+ /// <param name="msg">Message</param>\r
+ /// <param name="keyData">Keys</param>\r
+ /// <returns>Bool</returns>\r
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)\r
{\r
if (keyData == (Keys.Control | Keys.S))\r
/// <summary>\r
/// If the queue is being processed, prompt the user to confirm application close.\r
/// </summary>\r
- /// <param name="e"></param>\r
+ /// <param name="e">FormClosingEventArgs</param>\r
protected override void OnFormClosing(FormClosingEventArgs e)\r
{\r
// If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.\r
- if ((encodeQueue.IsEncoding) && (!encodeQueue.PauseRequested) && (encodeQueue.Count > 0))\r
+ if (encodeQueue.IsEncoding)\r
{\r
DialogResult result =\r
MessageBox.Show(\r
- "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
+ "HandBrake has queue items to process. Closing HandBrake will stop the current encoding.\n\nDo you want to close HandBrake?",\r
"Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+\r
if (result == DialogResult.No)\r
e.Cancel = true;\r
+\r
+ // Try to safely close out if we can, or kill the cli if using in-gui status\r
+ if (Settings.Default.enocdeStatusInGui)\r
+ encodeQueue.Stop();\r
+ else\r
+ encodeQueue.SafelyClose();\r
+ }\r
+\r
+ if (SourceScan.IsScanning)\r
+ {\r
+ SourceScan.ScanCompleted -= new EventHandler(SourceScan_ScanCompleted);\r
+ SourceScan.Stop();\r
}\r
base.OnFormClosing(e);\r
}\r
\r
#endregion\r
\r
- #region In-GUI Encode Status (Experimental)\r
+ #region In-GUI Encode Status\r
\r
/// <summary>\r
/// Starts a new thread to monitor and process the CLI encode status\r
encode.OnEncodeProgress += EncodeOnEncodeProgress;\r
while (!encode.EndOfStream)\r
encode.ReadEncodeStatus();\r
+\r
+ SetEncodeFinished();\r
}\r
catch (Exception exc)\r
{\r
/// <summary>\r
/// Displays the Encode status in the GUI\r
/// </summary>\r
- /// <param name="Sender"></param>\r
- /// <param name="CurrentTask"></param>\r
- /// <param name="TaskCount"></param>\r
- /// <param name="PercentComplete"></param>\r
- /// <param name="CurrentFps"></param>\r
- /// <param name="AverageFps"></param>\r
- /// <param name="TimeRemaining"></param>\r
- private void EncodeOnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)\r
+ /// <param name="sender">The sender</param>\r
+ /// <param name="currentTask">The current task</param>\r
+ /// <param name="taskCount">Number of tasks</param>\r
+ /// <param name="percentComplete">Percent complete</param>\r
+ /// <param name="currentFps">Current encode speed in fps</param>\r
+ /// <param name="av">Avg encode speed</param>\r
+ /// <param name="timeRemaining">Time Left</param>\r
+ private void EncodeOnEncodeProgress(object sender, int currentTask, int taskCount, float percentComplete, float currentFps, float av, TimeSpan timeRemaining)\r
{\r
if (this.InvokeRequired)\r
{\r
this.BeginInvoke(\r
new EncodeProgressEventHandler(EncodeOnEncodeProgress),\r
- new[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });\r
+ new[] { sender, currentTask, taskCount, percentComplete, currentFps, av, timeRemaining });\r
return;\r
}\r
lbl_encode.Text =\r
- string.Format("Encode Progress: {0}%, FPS: {1}, Avg FPS: {2}, Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);\r
+ string.Format(\r
+ "{0:00.00}%, FPS: {1:000.0}, Avg FPS: {2:000.0}, Time Remaining: {3}",\r
+ percentComplete,\r
+ currentFps,\r
+ av,\r
+ timeRemaining);\r
+\r
+ ProgressBarStatus.Value = (int)Math.Round(percentComplete);\r
}\r
\r
#endregion\r