OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmQueue.cs
index 43f198a..e110a47 100644 (file)
 \r
 using System;\r
 using System.Collections.Generic;\r
-using System.Collections;\r
 using System.ComponentModel;\r
-using System.Data;\r
-using System.Drawing;\r
-using System.Text;\r
 using System.Windows.Forms;\r
-using System.Threading;\r
-using System.Diagnostics;\r
-using System.Runtime.InteropServices;\r
-using System.IO;\r
+using Handbrake.EncodeQueue;\r
+using System.Collections.ObjectModel;\r
 \r
 namespace Handbrake\r
 {\r
     public partial class frmQueue : Form\r
     {\r
-        private delegate void ProgressUpdateHandler();\r
-        private delegate void setEncoding();\r
-        Functions.Encode cliObj = new Functions.Encode();\r
-        Boolean paused = false;\r
-        Process hbProc = null;\r
-        Queue.QueueHandler queue;\r
-        frmMain mainWindow = null;\r
-        Thread theQ;\r
-\r
-        public frmQueue(frmMain main)\r
+        private delegate void UpdateHandler();\r
+        private EncodeAndQueueHandler queue;\r
+\r
+        public frmQueue(EncodeAndQueueHandler q)\r
         {\r
             InitializeComponent();\r
-            mainWindow = main;\r
+\r
+            this.queue = q;\r
+            queue.NewJobStarted += new EventHandler(queueOnEncodeStart);\r
+            queue.QueueCompleted += new EventHandler(queueOnQueueFinished);\r
+            queue.QueuePauseRequested += new EventHandler(queueOnPaused);\r
+        }\r
+        void queueOnPaused(object sender, EventArgs e)\r
+        {\r
+            setUIEncodeFinished();\r
+            updateUIElements();\r
+        }\r
+        void queueOnQueueFinished(object sender, EventArgs e)\r
+        {\r
+            setUIEncodeFinished();\r
+            resetQueue(); // Reset the Queue Window\r
+        }\r
+        void queueOnEncodeStart(object sender, EventArgs e)\r
+        {\r
+            setUIEncodeStarted(); // make sure the UI is set correctly\r
+            setCurrentEncodeInformation();\r
+            updateUIElements(); // Redraw the Queue, a new encode has started.\r
         }\r
 \r
         /// <summary>\r
         /// Initializes the Queue list with the Arraylist from the Queue class\r
         /// </summary>\r
-        /// <param name="qw"></param>\r
-        public void setQueue(Queue.QueueHandler qw)\r
+        public void setQueue()\r
         {\r
-            queue = qw;\r
-            redrawQueue();\r
-            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+            updateUIElements();\r
         }\r
 \r
         /// <summary>\r
-        /// Returns if there is currently an item being encoded by the queue\r
+        /// Initializes the Queue list, then shows and activates the window\r
         /// </summary>\r
-        /// <returns>Boolean true if encoding</returns>\r
-        public Boolean isEncoding()\r
+        public new void Show()\r
         {\r
-            if (hbProc == null)\r
-                return false;\r
-            else\r
-                return true;\r
+           Show(true);\r
         }\r
 \r
         /// <summary>\r
-        /// Allows frmMain to start an encode.\r
-        /// Should probably find a cleaner way of doing this.\r
+        /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window\r
         /// </summary>\r
-        public void frmMain_encode()\r
+        /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
+        public void Show(bool doSetQueue)\r
         {\r
-            btn_encode_Click(this, null);\r
+            if (doSetQueue) setQueue();\r
+            base.Show();\r
+\r
+            //Activate();\r
         }\r
 \r
         // Start and Stop Controls\r
         private void btn_encode_Click(object sender, EventArgs e)\r
         {\r
-            if (queue.count() != 0)\r
+            if (queue.PauseRequested)\r
             {\r
-                if (paused == true)\r
-                {\r
-                    paused = false;\r
-                    btn_encode.Enabled = false;\r
-                    btn_stop.Visible = true;\r
-                }\r
-                else\r
-                {\r
-                    paused = false;\r
-                    btn_encode.Enabled = false;\r
-                    mainWindow.setLastAction("encode");\r
-                    mainWindow.setEncodeStarted();\r
-\r
-                    // Start the encode\r
-                    try\r
-                    {\r
-                        // Setup or reset some values\r
-                        btn_encode.Enabled = false;\r
-                        btn_stop.Visible = true;\r
-\r
-                        theQ = new Thread(startProc);\r
-                        theQ.IsBackground = true;\r
-                        theQ.Start();\r
-                    }\r
-                    catch (Exception exc)\r
-                    {\r
-                        MessageBox.Show(exc.ToString());\r
-                    }\r
-                }\r
+                setUIEncodeStarted();\r
+                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
             }\r
+\r
+            if (!queue.isEncoding)\r
+                queue.StartEncodeQueue();\r
+\r
         }\r
-        private void btn_stop_Click(object sender, EventArgs e)\r
+        private void btn_pause_Click(object sender, EventArgs e)\r
         {\r
-            paused = true;\r
-            btn_stop.Visible = false;\r
-            btn_encode.Enabled = true;\r
-            mainWindow.setEncodeFinished();\r
+            queue.RequestPause();\r
+            setUIEncodeFinished();\r
             resetQueue();\r
-            MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode Video' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
         }\r
 \r
-        // Starts the encoding process\r
-        private void startProc(object state)\r
+        // Window Display Management\r
+        private void setUIEncodeStarted()\r
         {\r
-            try\r
+            if (InvokeRequired)\r
             {\r
-                // Run through each item on the queue\r
-                while (queue.count() != 0)\r
-                {\r
-                    string query = queue.getNextItemForEncoding();\r
-                    queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-\r
-                    setCurrentEncodeInformation();\r
-                    if (this.Created)\r
-                        updateUIElements();\r
-\r
-                    hbProc = cliObj.runCli(this, query);\r
-\r
-                    hbProc.WaitForExit();\r
-                    cliObj.addCLIQueryToLog(query);\r
-                    cliObj.copyLog(query, queue.getLastQueryItem().Destination);\r
-\r
-                    hbProc.Close();\r
-                    hbProc.Dispose();\r
-                    hbProc = null;\r
-                    query = "";\r
-\r
-                    while (paused == true) // Need to find a better way of doing this.\r
-                    {\r
-                        Thread.Sleep(10000);\r
-                    }\r
-                }\r
-\r
-                resetQueue();\r
-                \r
-                // After the encode is done, we may want to shutdown, suspend etc.\r
-                cliObj.afterEncodeAction();\r
+                BeginInvoke(new UpdateHandler(setUIEncodeStarted));\r
+                return;\r
             }\r
-            catch (Exception exc)\r
+            btn_encode.Enabled = false;\r
+            btn_pause.Visible = true;\r
+        }\r
+        private void setUIEncodeFinished()\r
+        {\r
+            if (InvokeRequired)\r
             {\r
-                MessageBox.Show(exc.ToString());\r
+                BeginInvoke(new UpdateHandler(setUIEncodeFinished));\r
+                return;\r
             }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
         }\r
-\r
-        // Window Display Management\r
-        private void resetQueue() \r
+        private void resetQueue()\r
         {\r
-            try\r
+            if (InvokeRequired)\r
             {\r
-                if (this.InvokeRequired)\r
-                {\r
-                    this.BeginInvoke(new ProgressUpdateHandler(resetQueue));\r
-                    return;\r
-                }\r
-                btn_stop.Visible = false;\r
-                btn_encode.Enabled = true;\r
-\r
-                lbl_source.Text = "-";\r
-                lbl_dest.Text = "-";\r
-                lbl_vEnc.Text = "-";\r
-                lbl_aEnc.Text = "-";\r
-                lbl_title.Text = "-";\r
-                lbl_chapt.Text = "-";\r
+                BeginInvoke(new UpdateHandler(resetQueue));\r
+                return;\r
+            }\r
+            btn_pause.Visible = false;\r
+            btn_encode.Enabled = true;\r
 \r
-                lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+            lbl_source.Text = "-";\r
+            lbl_dest.Text = "-";\r
+            lbl_vEnc.Text = "-";\r
+            lbl_aEnc.Text = "-";\r
+            lbl_title.Text = "-";\r
+            lbl_chapt.Text = "-";\r
 \r
-                mainWindow.setEncodeFinished(); // Tell the main window encodes have finished.\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show(exc.ToString());\r
-            }\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
-        private void redrawQueue()  \r
+        private void redrawQueue()\r
         {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(redrawQueue));\r
+                return;\r
+            }\r
+\r
             list_queue.Items.Clear();\r
-            List<Queue.QueueItem> theQueue = queue.getQueue();\r
-            foreach (Queue.QueueItem queue_item in theQueue)\r
+            ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
+            foreach (Job queue_item in theQueue)\r
             {\r
                 string q_item = queue_item.Query;\r
                 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
 \r
                 // Get the DVD Title\r
-                string title = "";\r
-                if (parsed.DVDTitle == 0)\r
-                    title = "Auto";\r
-                else\r
-                    title = parsed.DVDTitle.ToString();\r
+                string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
 \r
                 // Get the DVD Chapters\r
-                string chapters = "";\r
+                string chapters;\r
                 if (parsed.DVDChapterStart == 0)\r
                     chapters = "Auto";\r
                 else\r
@@ -219,125 +168,186 @@ namespace Handbrake
                 item.SubItems.Add(queue_item.Source); // Source\r
                 item.SubItems.Add(queue_item.Destination); // Destination\r
                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
-                item.SubItems.Add(parsed.AudioEncoder1); // Audio\r
 \r
-                list_queue.Items.Add(item);\r
-            }\r
-        }\r
-        private void updateUIElements() \r
-        {\r
-            try\r
-            {\r
-                if (this.InvokeRequired)\r
+                // Display The Audio Track Information\r
+                string audio = string.Empty;\r
+                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
                 {\r
-                    this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));\r
-                    return;\r
+                    if (audio != "")\r
+                        audio += ", " + track.Encoder;\r
+                    else\r
+                        audio = track.Encoder;\r
                 }\r
+                item.SubItems.Add(audio); // Audio\r
 \r
-                redrawQueue();\r
-                lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
+                list_queue.Items.Add(item);\r
             }\r
-            catch (Exception exc)\r
+        }\r
+        private void updateUIElements()\r
+        {\r
+            if (InvokeRequired)\r
             {\r
-                MessageBox.Show(exc.ToString());\r
+                BeginInvoke(new UpdateHandler(updateUIElements));\r
+                return;\r
             }\r
+\r
+            redrawQueue();\r
+            lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
-        private void setCurrentEncodeInformation() \r
+        private void setCurrentEncodeInformation()\r
         {\r
             try\r
             {\r
-                if (this.InvokeRequired)\r
+                if (InvokeRequired)\r
                 {\r
-                    this.BeginInvoke(new setEncoding(setCurrentEncodeInformation));\r
+                    BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
                 }\r
 \r
                 // found query is a global varible\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQueryItem().Query);\r
-                lbl_source.Text = queue.getLastQueryItem().Source;\r
-                lbl_dest.Text = queue.getLastQueryItem().Destination;\r
+                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query);\r
+                lbl_source.Text = queue.LastEncode.Source;\r
+                lbl_dest.Text = queue.LastEncode.Destination;\r
 \r
+                lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
 \r
-                if (parsed.DVDTitle == 0)\r
-                    lbl_title.Text = "Auto";\r
-                else\r
-                    lbl_title.Text = parsed.DVDTitle.ToString();\r
-\r
-                string chapters = "";\r
-                if (parsed.DVDChapterStart == 0)\r
-                {\r
+                if (Equals(parsed.DVDChapterStart, 0))\r
                     lbl_chapt.Text = "Auto";\r
-                }\r
                 else\r
                 {\r
-                    chapters = parsed.DVDChapterStart.ToString();\r
+                    string chapters = parsed.DVDChapterStart.ToString();\r
                     if (parsed.DVDChapterFinish != 0)\r
                         chapters = chapters + " - " + parsed.DVDChapterFinish;\r
                     lbl_chapt.Text = chapters;\r
                 }\r
 \r
                 lbl_vEnc.Text = parsed.VideoEncoder;\r
-                lbl_aEnc.Text = parsed.AudioEncoder1;\r
+\r
+                // Display The Audio Track Information\r
+                string audio = string.Empty;\r
+                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
+                {\r
+                    if (audio != "")\r
+                        audio += ", " + track.Encoder;\r
+                    else\r
+                        audio = track.Encoder;\r
+                }\r
+                lbl_aEnc.Text = audio;\r
             }\r
             catch (Exception)\r
             {\r
                 // Do Nothing\r
             }\r
         }\r
-\r
-        // Queue Management\r
-        private void btn_up_Click(object sender, EventArgs e)\r
+        private void deleteSelectedItems()\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
+            // If there are selected items\r
+            if (list_queue.SelectedIndices.Count > 0)\r
             {\r
-                int selected = list_queue.SelectedIndices[0];\r
+                // Save the selected indices to select them after the move\r
+                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
+                foreach (int selectedIndex in list_queue.SelectedIndices)\r
+                    selectedIndices.Add(selectedIndex);\r
+\r
+                int firstSelectedIndex = selectedIndices[0];\r
 \r
-                queue.moveUp(selected);\r
-                queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                redrawQueue();\r
+                // Reverse the list to delete the items from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
 \r
-                if (selected - 1 > 0)\r
-                    list_queue.Items[selected - 1].Selected = true;\r
+                // Remove each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.RemoveJob(selectedIndex);\r
 \r
-                list_queue.Select();\r
+                updateUIElements();\r
+\r
+                // Select the item where the first deleted item was previously\r
+                if (firstSelectedIndex < list_queue.Items.Count)\r
+                    list_queue.Items[firstSelectedIndex].Selected = true;\r
             }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
+        }\r
+\r
+        // Queue Management\r
+        private void mnu_up_Click(object sender, EventArgs e)\r
+        {\r
+            moveUp();\r
+        }\r
+        private void mnu_Down_Click(object sender, EventArgs e)\r
+        {\r
+            moveDown();\r
+        }\r
+        private void mnu_delete_Click(object sender, EventArgs e)\r
+        {\r
+            deleteSelectedItems();\r
+        }\r
+        private void btn_up_Click(object sender, EventArgs e)\r
+        {\r
+            moveUp();\r
         }\r
         private void btn_down_Click(object sender, EventArgs e)\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
-            {\r
-                int selected = list_queue.SelectedIndices[0];\r
-\r
-                queue.moveDown(list_queue.SelectedIndices[0]);\r
-                queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                redrawQueue();\r
-\r
-                if (selected + 1 < list_queue.Items.Count)\r
-                    list_queue.Items[selected + 1].Selected = true;\r
-\r
-                list_queue.Select();\r
-            }\r
+            moveDown();\r
         }\r
         private void btn_delete_Click(object sender, EventArgs e)\r
         {\r
-            if (list_queue.SelectedIndices.Count != 0)\r
-            {\r
-                queue.remove(list_queue.SelectedIndices[0]);\r
-                queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                redrawQueue();\r
-                lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
-            }\r
+            deleteSelectedItems();\r
         }\r
         private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
         {\r
             if (e.KeyCode == Keys.Delete)\r
+                deleteSelectedItems();\r
+        }\r
+        private void moveUp()\r
+        {\r
+            // If there are selected items and the first item is not selected\r
+            if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
             {\r
-                if (list_queue.SelectedIndices.Count != 0)\r
-                {\r
-                    queue.remove(list_queue.SelectedIndices[0]);\r
-                    queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file\r
-                    redrawQueue();\r
-                }\r
+                // Copy the selected indices to preserve them during the movement\r
+                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
+                foreach (int selectedIndex in list_queue.SelectedIndices)\r
+                    selectedIndices.Add(selectedIndex);\r
+\r
+                // Move up each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.MoveUp(selectedIndex);\r
+\r
+                updateUIElements();\r
+\r
+                // Keep the selected item(s) selected, now moved up one index\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
+                        list_queue.Items[selectedIndex - 1].Selected = true;\r
+            }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
+        }\r
+        private void moveDown()\r
+        {\r
+            // If there are selected items and the last item is not selected\r
+            if (list_queue.SelectedIndices.Count > 0 &&\r
+                !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))\r
+            {\r
+                // Copy the selected indices to preserve them during the movement\r
+                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
+                foreach (int selectedIndex in list_queue.SelectedIndices)\r
+                    selectedIndices.Add(selectedIndex);\r
+\r
+                // Reverse the indices to move the items down from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
+\r
+                // Move down each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.MoveDown(selectedIndex);\r
+\r
+                updateUIElements();\r
+\r
+                // Keep the selected item(s) selected, now moved down one index\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
+                        list_queue.Items[selectedIndex + 1].Selected = true;\r
             }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
         }\r
 \r
         // Queue Import/Export Features\r
@@ -347,7 +357,7 @@ namespace Handbrake
             SaveFile.Filter = "Batch|.bat";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
-                queue.writeBatchScript(SaveFile.FileName);\r
+                queue.WriteBatchScriptToFile(SaveFile.FileName);\r
         }\r
         private void mnu_export_Click(object sender, EventArgs e)\r
         {\r
@@ -355,15 +365,23 @@ namespace Handbrake
             SaveFile.Filter = "HandBrake Queue|*.queue";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
-                queue.write2disk(SaveFile.FileName);\r
+                queue.WriteQueueStateToFile(SaveFile.FileName);\r
         }\r
         private void mnu_import_Click(object sender, EventArgs e)\r
         {\r
             OpenFile.FileName = "";\r
             OpenFile.ShowDialog();\r
             if (OpenFile.FileName != String.Empty)\r
-                queue.recoverQueue(OpenFile.FileName);\r
-            redrawQueue();\r
+                queue.LoadQueueFromFile(OpenFile.FileName);\r
+            updateUIElements();\r
+        }\r
+        private void mnu_readd_Click(object sender, EventArgs e)\r
+        {\r
+            if (!queue.LastEncode.IsEmpty)\r
+            {\r
+                queue.AddJob(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination);\r
+                updateUIElements();\r
+            }\r
         }\r
 \r
         // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
@@ -375,4 +393,4 @@ namespace Handbrake
         }\r
 \r
     }\r
-}
\ No newline at end of file
+}\r