OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmMain.cs
index c8753d1..83ea0de 100644 (file)
@@ -8,23 +8,20 @@ using System;
 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
@@ -36,7 +33,8 @@ namespace Handbrake
 \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
@@ -86,18 +84,35 @@ namespace Handbrake
             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
@@ -114,8 +129,7 @@ namespace Handbrake
             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
@@ -161,6 +175,34 @@ namespace Handbrake
         }\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
@@ -173,7 +215,7 @@ namespace Handbrake
         #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
@@ -184,12 +226,12 @@ namespace Handbrake
             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
@@ -286,6 +328,14 @@ namespace Handbrake
         {\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
@@ -303,6 +353,21 @@ namespace Handbrake
             }\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
@@ -339,11 +404,14 @@ namespace Handbrake
         }\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
@@ -364,22 +432,26 @@ namespace Handbrake
             {\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
@@ -478,9 +550,20 @@ namespace Handbrake
 \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
@@ -502,13 +585,13 @@ namespace Handbrake
                         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
@@ -528,30 +611,50 @@ namespace Handbrake
                 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
@@ -565,7 +668,7 @@ namespace Handbrake
             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
@@ -832,15 +935,15 @@ namespace Handbrake
             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
@@ -984,6 +1087,9 @@ namespace Handbrake
         //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
@@ -1009,6 +1115,9 @@ namespace Handbrake
         }\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
@@ -1143,7 +1252,7 @@ namespace Handbrake
                 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
@@ -1238,7 +1347,7 @@ namespace Handbrake
             }\r
 \r
         }\r
-        \r
+\r
         private void audioList_remove_Click(object sender, EventArgs e)\r
         {\r
             removeAudioTrack();\r
@@ -1294,7 +1403,7 @@ namespace Handbrake
             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
@@ -1649,16 +1758,16 @@ namespace Handbrake
             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
@@ -1671,10 +1780,16 @@ namespace Handbrake
         /// 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
@@ -1686,15 +1801,33 @@ namespace Handbrake
                     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
@@ -1814,6 +1947,9 @@ namespace Handbrake
 \r
         #endregion\r
 \r
+\r
+\r
+\r
         // This is the END of the road ------------------------------------------------------------------------------\r
     }\r
 }
\ No newline at end of file