using System.Collections;\r
using System.Collections.Generic;\r
using System.Drawing;\r
-using System.Text;\r
using System.Windows.Forms;\r
using System.IO;\r
using System.Diagnostics;\r
using System.Threading;\r
-using System.Runtime.InteropServices;\r
-using System.Globalization;\r
-using System.Text.RegularExpressions;\r
\r
namespace Handbrake\r
{\r
public partial class frmMain : Form\r
{\r
// Objects which may be used by one or more other objects\r
+ private delegate void UpdateWindowHandler();\r
Functions.Main hb_common_func = new Functions.Main();\r
- Functions.Encode cliObj = new Functions.Encode();\r
- Queue.Queue encodeQueue = new Queue.Queue();\r
+ Functions.Encode encodeHandler = new Functions.Encode();\r
+ Queue.QueueHandler encodeQueue = new Queue.QueueHandler();\r
Presets.PresetsHandler presetHandler = new Presets.PresetsHandler();\r
Parsing.Title selectedTitle;\r
Parsing.DVD thisDVD;\r
\r
// Globals: Mainly used for tracking.\r
private frmQueue queueWindow;\r
- private frmGenPreview preview;\r
+ private frmGenPreview vlcpreview;\r
+ private frmPreview qtpreview;\r
private string lastAction = null;\r
public int maxWidth = 0;\r
public int maxHeight = 0;\r
loadPresetPanel(); // Load the Preset Panel\r
treeView_presets.ExpandAll();\r
lbl_encode.Text = "";\r
- queueWindow = new frmQueue(this); // Prepare the Queue\r
+ queueWindow = new frmQueue(encodeQueue); // Prepare the Queue\r
if (Properties.Settings.Default.QueryEditorTab != "Checked")\r
tabs_panel.TabPages.RemoveAt(5); // Remove the query editor tab if the user does not want it enabled.\r
\r
// Load the user's default settings or Normal Preset\r
- if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultUserSettings != "")\r
+ if (Properties.Settings.Default.defaultSettings == "Checked" && Properties.Settings.Default.defaultPreset != "")\r
{\r
- Functions.QueryParser presetQuery = Functions.QueryParser.Parse(Properties.Settings.Default.defaultUserSettings);\r
- presetLoader.presetLoader(this, presetQuery, "User Defaults ");\r
- // The x264 widgets will need updated, so do this now:\r
- x264PanelFunctions.X264_StandardizeOptString(this);\r
- x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);\r
+ // Ok, so, we've selected a preset. Now we want to load it.\r
+ if (presetHandler.getPreset(Properties.Settings.Default.defaultPreset) != null)\r
+ {\r
+ string query = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).Query;\r
+ Boolean loadPictureSettings = presetHandler.getPreset(Properties.Settings.Default.defaultPreset).PictureSettings;\r
+\r
+ if (query != null)\r
+ {\r
+ //Ok, Reset all the H264 widgets before changing the preset\r
+ x264PanelFunctions.reset2Defaults(this);\r
+\r
+ // Send the query from the file to the Query Parser class, then load the preset\r
+ Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);\r
+ presetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);\r
+\r
+ // The x264 widgets will need updated, so do this now:\r
+ x264PanelFunctions.X264_StandardizeOptString(this);\r
+ x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);\r
+ }\r
+ }\r
+ else\r
+ loadNormalPreset();\r
}\r
else\r
loadNormalPreset();\r
this.Enabled = true;\r
\r
// Event Handlers\r
- if (Properties.Settings.Default.MainWindowMinimize == "Checked")\r
- this.Resize += new EventHandler(frmMain_Resize);\r
+ events();\r
\r
// Queue Recovery\r
queueRecovery();\r
}\r
#endregion\r
\r
+ #region Events\r
+ // Encoding Events for setting up the GUI\r
+ private void events()\r
+ {\r
+ // Handle Window Resize\r
+ if (Properties.Settings.Default.MainWindowMinimize == "Checked")\r
+ this.Resize += new EventHandler(frmMain_Resize);\r
+\r
+ // Handle Encode Start\r
+ encodeQueue.OnEncodeEnded += new EventHandler(encodeEnded);\r
+ encodeQueue.OnPaused += new EventHandler(encodePaused);\r
+ encodeQueue.OnEncodeStart += new EventHandler(encodeStarted);\r
+ }\r
+ private void encodeStarted(object sender, EventArgs e)\r
+ {\r
+ setLastAction("encode");\r
+ setEncodeStarted();\r
+ }\r
+ private void encodeEnded(object sender, EventArgs e)\r
+ {\r
+ setEncodeFinished();\r
+ }\r
+ private void encodePaused(object sender, EventArgs e)\r
+ {\r
+ setEncodeFinished();\r
+ }\r
+ #endregion\r
+\r
// User Interface Menus / Tool Strips *********************************\r
\r
#region File Menu\r
#region Tools Menu\r
private void mnu_encode_Click(object sender, EventArgs e)\r
{\r
- queueWindow.setQueue(encodeQueue);\r
+ queueWindow.setQueue();\r
queueWindow.Show();\r
}\r
private void mnu_encodeLog_Click(object sender, EventArgs e)\r
else\r
file = "hb_encode_log.dat";\r
\r
- frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, this, queueWindow);\r
+ frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeHandler);\r
dvdInfoWindow.Show();\r
}\r
private void mnu_options_Click(object sender, EventArgs e)\r
{\r
- Form Options = new frmOptions(this);\r
+ Form Options = new frmOptions();\r
Options.ShowDialog();\r
}\r
#endregion\r
{\r
treeView_presets.CollapseAll();\r
}\r
+ private void pmnu_saveChanges_Click(object sender, EventArgs e)\r
+ {\r
+ 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
+ if (result == DialogResult.Yes)\r
+ presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), true);\r
+ else if (result == DialogResult.No)\r
+ presetHandler.updatePreset(treeView_presets.SelectedNode.Text, queryGen.generateTabbedComponentsQuery(this), false);\r
+ }\r
private void pmnu_delete_click(object sender, EventArgs e)\r
{\r
if (treeView_presets.SelectedNode != null)\r
}\r
treeView_presets.Select();\r
}\r
+ private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)\r
+ {\r
+ // Make sure that the save menu is always disabled by default\r
+ pmnu_saveChanges.Enabled = false;\r
+\r
+ // Now enable the save menu if the selected preset is a user preset\r
+ if (treeView_presets.SelectedNode != null)\r
+ {\r
+ if (presetHandler.checkIfUserPresetExists(treeView_presets.SelectedNode.Text))\r
+ {\r
+ pmnu_saveChanges.Enabled = true;\r
+ }\r
+ }\r
+ treeView_presets.Select();\r
+ }\r
\r
// Presets Management\r
private void btn_addPreset_Click(object sender, EventArgs e)\r
}\r
private void btn_setDefault_Click(object sender, EventArgs e)\r
{\r
- String query = queryGen.GenerateTheQuery(this);\r
- Properties.Settings.Default.defaultUserSettings = query;\r
- // Save the new default Settings\r
- Properties.Settings.Default.Save();\r
- MessageBox.Show("New default settings saved.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
+ if (treeView_presets.SelectedNode != null)\r
+ {\r
+ Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;\r
+ Properties.Settings.Default.Save();\r
+ MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+ }\r
+ else\r
+ MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
}\r
private void treeview_presets_mouseUp(object sender, MouseEventArgs e)\r
{\r
{\r
// Ok, so, we've selected a preset. Now we want to load it.\r
string presetName = treeView_presets.SelectedNode.Text;\r
- string query = presetHandler.getCliForPreset(presetName);\r
-\r
- if (query != null)\r
+ if (presetHandler.getPreset(presetName) != null)\r
{\r
- //Ok, Reset all the H264 widgets before changing the preset\r
- x264PanelFunctions.reset2Defaults(this);\r
+ string query = presetHandler.getPreset(presetName).Query;\r
+ Boolean loadPictureSettings = presetHandler.getPreset(presetName).PictureSettings;\r
+\r
+ if (query != null)\r
+ {\r
+ //Ok, Reset all the H264 widgets before changing the preset\r
+ x264PanelFunctions.reset2Defaults(this);\r
\r
- // Send the query from the file to the Query Parser class\r
- Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);\r
+ // Send the query from the file to the Query Parser class\r
+ Functions.QueryParser presetQuery = Functions.QueryParser.Parse(query);\r
\r
- // Now load the preset\r
- presetLoader.presetLoader(this, presetQuery, presetName);\r
+ // Now load the preset\r
+ presetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);\r
\r
- // The x264 widgets will need updated, so do this now:\r
- x264PanelFunctions.X264_StandardizeOptString(this);\r
- x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);\r
+ // The x264 widgets will need updated, so do this now:\r
+ x264PanelFunctions.X264_StandardizeOptString(this);\r
+ x264PanelFunctions.X264_SetCurrentSettingsInPanel(this);\r
+ }\r
}\r
}\r
}\r
\r
if (result == DialogResult.Yes)\r
{\r
- queueWindow.frmMain_cancelEncode();\r
- if (!queueWindow.isEncoding())\r
- setEncodeStatus(0);\r
+ // Pause The Queue\r
+ encodeQueue.pauseEncode();\r
+\r
+ // Kill the current process.\r
+ Process[] aProc = Process.GetProcessesByName("HandBrakeCLI");\r
+ Process HandBrakeCLI;\r
+ if (aProc.Length > 0)\r
+ {\r
+ HandBrakeCLI = aProc[0];\r
+ HandBrakeCLI.Kill();\r
+ }\r
+\r
+ // Update the GUI\r
+ setEncodeFinished();\r
}\r
}\r
else\r
encodeQueue.add(query, text_source.Text, text_destination.Text);\r
encodeQueue.write2disk("hb_queue_recovery.xml");\r
}\r
- queueWindow.setQueue(encodeQueue);\r
+ queueWindow.setQueue();\r
if (encodeQueue.count() > 1)\r
queueWindow.Show();\r
\r
- queueWindow.frmMain_encode();\r
+ setEncodeStarted(); // Encode is running, so setup the GUI appropriately\r
+ encodeQueue.startEncode(); // Start The Queue Encoding Process\r
\r
- setEncodeStatus(1); // Encode is running, so setup the GUI appropriately\r
}\r
else if (text_source.Text == string.Empty || text_source.Text == "Click 'Source' to continue" || text_destination.Text == string.Empty)\r
MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
encodeQueue.add(query, text_source.Text, text_destination.Text);\r
encodeQueue.write2disk("hb_queue_recovery.xml"); // Writes the queue to the recovery file, just incase the GUI crashes.\r
\r
- queueWindow.setQueue(encodeQueue);\r
+ queueWindow.setQueue();\r
queueWindow.Show();\r
}\r
}\r
private void btn_showQueue_Click(object sender, EventArgs e)\r
{\r
- queueWindow.setQueue(encodeQueue);\r
+ queueWindow.setQueue();\r
queueWindow.Show();\r
}\r
- private void btn_vidPreview_Click(object sender, EventArgs e)\r
+ private void mnu_vlcpreview_Click(object sender, EventArgs e)\r
+ {\r
+ if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")\r
+ MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+ else\r
+ {\r
+ if (vlcpreview == null)\r
+ {\r
+ vlcpreview = new frmGenPreview(this);\r
+ vlcpreview.Show();\r
+ }\r
+ else if (vlcpreview.IsDisposed)\r
+ {\r
+ vlcpreview = new frmGenPreview(this);\r
+ vlcpreview.Show();\r
+ }\r
+ else\r
+ MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+ }\r
+ }\r
+ private void mnu_qtpreview_Click(object sender, EventArgs e)\r
{\r
if (text_source.Text == "" || text_source.Text == "Click 'Source' to continue" || text_destination.Text == "")\r
MessageBox.Show("No source OR destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
else\r
{\r
- if (preview == null)\r
+ if (qtpreview == null)\r
{\r
- preview = new frmGenPreview(this);\r
- preview.Show();\r
+ qtpreview = new frmPreview(this);\r
+ qtpreview.Show();\r
}\r
- else if (preview.IsDisposed)\r
+ else if (qtpreview.IsDisposed)\r
{\r
- preview = new frmGenPreview(this);\r
- preview.Show();\r
+ qtpreview = new frmPreview(this);\r
+ qtpreview.Show();\r
}\r
else\r
MessageBox.Show("The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
else\r
file = "hb_encode_log.dat";\r
\r
- frmActivityWindow ActivityWindow = new frmActivityWindow(file, this, queueWindow);\r
+ frmActivityWindow ActivityWindow = new frmActivityWindow(file, encodeHandler);\r
ActivityWindow.Show();\r
}\r
#endregion\r
DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "").Replace(".ogm", "").Replace(".avi", "");\r
\r
// Show the dialog and set the main form file path\r
- if (text_destination.Text.EndsWith(".mp4"))\r
+ if (drop_format.SelectedIndex.Equals(0))\r
DVD_Save.FilterIndex = 1;\r
- else if (text_destination.Text.EndsWith(".m4v"))\r
+ else if (drop_format.SelectedIndex.Equals(1))\r
DVD_Save.FilterIndex = 2;\r
- else if (text_destination.Text.EndsWith(".avi"))\r
+ else if (drop_format.SelectedIndex.Equals(2))\r
DVD_Save.FilterIndex = 3;\r
- else if (text_destination.Text.EndsWith(".ogm"))\r
+ else if (drop_format.SelectedIndex.Equals(3))\r
DVD_Save.FilterIndex = 4;\r
- else if (text_destination.Text.EndsWith(".mkv"))\r
+ else if (drop_format.SelectedIndex.Equals(4))\r
DVD_Save.FilterIndex = 5;\r
\r
if (DVD_Save.ShowDialog() == DialogResult.OK)\r
//Picture Tab\r
private void text_width_TextChanged(object sender, EventArgs e)\r
{\r
+ if (text_width.Text == "")\r
+ text_width.BackColor = Color.White;\r
+\r
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
\r
int width;\r
}\r
private void text_height_TextChanged(object sender, EventArgs e)\r
{\r
+ if (text_height.Text == "")\r
+ text_height.BackColor = Color.White;\r
+\r
maxHeight = 0; // Reset max height so that it's not using the MaxHeight -Y. Quick hack to allow -Y for preset usage.\r
\r
int height;\r
setBitrateSelections384(drp_audbit_1);\r
else if ((drp_audenc_1.Text == "AAC") && (drp_audmix_1.Text != "6 Channel Discrete"))\r
setBitrateSelections160(drp_audbit_1); drp_audbit_1.Text = "160";\r
- \r
+\r
// Update an item in the Audio list if required.\r
if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
{\r
}\r
\r
}\r
- \r
+\r
private void audioList_remove_Click(object sender, EventArgs e)\r
{\r
removeAudioTrack();\r
else\r
check_forced.Enabled = true;\r
}\r
- \r
+\r
// Chapter Marker Tab\r
private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)\r
{\r
else\r
{\r
// Just make sure not to re-enable the following boxes if the track above is none\r
- /* if (drp_track2Audio.Text != "None")\r
- {\r
- audMix.Enabled = true;\r
- audbit.Enabled = true;\r
- audsr.Enabled = true;\r
+ /* if (drp_track2Audio.Text != "None")\r
+ {\r
+ audMix.Enabled = true;\r
+ audbit.Enabled = true;\r
+ audsr.Enabled = true;\r
\r
- audMix.Text = "Automatic";\r
- audbit.Text = "160";\r
- audsr.Text = "Auto";\r
- }*/\r
+ audMix.Text = "Automatic";\r
+ audbit.Text = "160";\r
+ audsr.Text = "Auto";\r
+ }*/\r
}\r
}\r
#endregion\r
/// 0 = Encode Finished.\r
/// </summary>\r
/// <param name="i">Int</param>\r
- public void setEncodeStatus(int i)\r
+ public void setEncodeFinished()\r
{\r
- if (i == 0)\r
+ try\r
{\r
+ if (this.InvokeRequired)\r
+ {\r
+ this.BeginInvoke(new UpdateWindowHandler(setEncodeFinished));\r
+ return;\r
+ }\r
+\r
lbl_encode.Text = "Encoding Finished";\r
btn_start.Text = "Start";\r
btn_start.ToolTipText = "Start the encoding process";\r
notifyIcon.BalloonTipText = lbl_encode.Text;\r
notifyIcon.ShowBalloonTip(500);\r
}\r
+\r
}\r
- else\r
+ catch (Exception exc)\r
+ {\r
+ MessageBox.Show(exc.ToString());\r
+ }\r
+ }\r
+ public void setEncodeStarted()\r
+ {\r
+ try\r
{\r
+ if (this.InvokeRequired)\r
+ {\r
+ this.BeginInvoke(new UpdateWindowHandler(setEncodeStarted));\r
+ return;\r
+ }\r
+\r
lbl_encode.Visible = true;\r
lbl_encode.Text = "Encoding in Progress";\r
btn_start.Text = "Stop";\r
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
btn_start.Image = Properties.Resources.stop;\r
}\r
+ catch (Exception exc)\r
+ {\r
+ MessageBox.Show(exc.ToString());\r
+ }\r
}\r
\r
/// <summary>\r
\r
#endregion\r
\r
+\r
+\r
+\r
// This is the END of the road ------------------------------------------------------------------------------\r
}\r
}
\ No newline at end of file