X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=win%2FC%23%2FfrmQueue.cs;h=e110a470e51232d0af2fc8261c4ab9590352ba43;hb=2157ff283ee677c229c017d13a84805b0ab24fd3;hp=5dfdec47b774d097ddee22f5beab661a2ad4543f;hpb=c4e911b8c94ec5d004f54fc72ecba54709b1337b;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/win/C#/frmQueue.cs b/win/C#/frmQueue.cs index 5dfdec47..e110a470 100644 --- a/win/C#/frmQueue.cs +++ b/win/C#/frmQueue.cs @@ -1,191 +1,396 @@ +/* frmQueue.cs $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; using System.Windows.Forms; -using System.Threading; -using System.Diagnostics; -using System.Runtime.InteropServices; +using Handbrake.EncodeQueue; +using System.Collections.ObjectModel; namespace Handbrake { public partial class frmQueue : Form { - private delegate void ProgressUpdateHandler(); + private delegate void UpdateHandler(); + private EncodeAndQueueHandler queue; - public frmQueue() + public frmQueue(EncodeAndQueueHandler q) { InitializeComponent(); + + this.queue = q; + queue.NewJobStarted += new EventHandler(queueOnEncodeStart); + queue.QueueCompleted += new EventHandler(queueOnQueueFinished); + queue.QueuePauseRequested += new EventHandler(queueOnPaused); + } + void queueOnPaused(object sender, EventArgs e) + { + setUIEncodeFinished(); + updateUIElements(); + } + void queueOnQueueFinished(object sender, EventArgs e) + { + setUIEncodeFinished(); + resetQueue(); // Reset the Queue Window + } + void queueOnEncodeStart(object sender, EventArgs e) + { + setUIEncodeStarted(); // make sure the UI is set correctly + setCurrentEncodeInformation(); + updateUIElements(); // Redraw the Queue, a new encode has started. } - int initialListCount = 0; - bool started = false; + /// + /// Initializes the Queue list with the Arraylist from the Queue class + /// + public void setQueue() + { + updateUIElements(); + } - - private void btn_q_encoder_Click(object sender, EventArgs e) + /// + /// Initializes the Queue list, then shows and activates the window + /// + public new void Show() { - progressBar.Value = 0; - lbl_progressValue.Text = "0 %"; - progressBar.Step = 100 / list_queue.Items.Count; - progressBar.Update(); - ThreadPool.QueueUserWorkItem(startProc); + Show(true); } - /* - * - * Code to Handle the CLI and updating of the UI as each process is completed. - * - */ + /// + /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window + /// + /// Indicates whether to call setQueue() before showing the window + public void Show(bool doSetQueue) + { + if (doSetQueue) setQueue(); + base.Show(); - [DllImport("user32.dll")] - public static extern void LockWorkStation(); - [DllImport("user32.dll")] - public static extern int ExitWindowsEx(int uFlags, int dwReason); + //Activate(); + } - private void processItem() + // Start and Stop Controls + private void btn_encode_Click(object sender, EventArgs e) { + if (queue.PauseRequested) + { + setUIEncodeStarted(); + MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + if (!queue.isEncoding) + queue.StartEncodeQueue(); + + } + private void btn_pause_Click(object sender, EventArgs e) + { + queue.RequestPause(); + setUIEncodeFinished(); + resetQueue(); + 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); } - private void startProc(object state) + // Window Display Management + private void setUIEncodeStarted() { - try + if (InvokeRequired) + { + BeginInvoke(new UpdateHandler(setUIEncodeStarted)); + return; + } + btn_encode.Enabled = false; + btn_pause.Visible = true; + } + private void setUIEncodeFinished() + { + if (InvokeRequired) { - initialListCount = list_queue.Items.Count; - while (list_queue.Items.Count != 0) + BeginInvoke(new UpdateHandler(setUIEncodeFinished)); + return; + } + btn_pause.Visible = false; + btn_encode.Enabled = true; + } + private void resetQueue() + { + if (InvokeRequired) + { + BeginInvoke(new UpdateHandler(resetQueue)); + return; + } + btn_pause.Visible = false; + btn_encode.Enabled = true; + + lbl_source.Text = "-"; + lbl_dest.Text = "-"; + lbl_vEnc.Text = "-"; + lbl_aEnc.Text = "-"; + lbl_title.Text = "-"; + lbl_chapt.Text = "-"; + + lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending"; + } + private void redrawQueue() + { + if (InvokeRequired) + { + BeginInvoke(new UpdateHandler(redrawQueue)); + return; + } + + list_queue.Items.Clear(); + ReadOnlyCollection theQueue = queue.CurrentQueue; + foreach (Job queue_item in theQueue) + { + string q_item = queue_item.Query; + Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item); + + // Get the DVD Title + string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString(); + + // Get the DVD Chapters + string chapters; + if (parsed.DVDChapterStart == 0) + chapters = "Auto"; + else { - string query = list_queue.Items[0].ToString(); - updateUIElements(); - - Functions.CLI process = new Functions.CLI(); - Process hbProc = process.runCli(this, query, false, false, false, false); - - hbProc.WaitForExit(); - hbProc.Close(); - hbProc.Dispose(); + chapters = parsed.DVDChapterStart.ToString(); + if (parsed.DVDChapterFinish != 0) + chapters = chapters + " - " + parsed.DVDChapterFinish; } - resetQueue(); + ListViewItem item = new ListViewItem(); + item.Text = title; // Title + item.SubItems.Add(chapters); // Chapters + item.SubItems.Add(queue_item.Source); // Source + item.SubItems.Add(queue_item.Destination); // Destination + item.SubItems.Add(parsed.VideoEncoder); // Video - // Do something whent he encode ends. - switch (Properties.Settings.Default.CompletionOption) + // Display The Audio Track Information + string audio = string.Empty; + foreach (Functions.AudioTrack track in parsed.AudioInformation) { - case "Shutdown": - System.Diagnostics.Process.Start("Shutdown", "-s -t 60"); - break; - case "Log Off": - ExitWindowsEx(0, 0); - break; - case "Suspend": - Application.SetSuspendState(PowerState.Suspend, true, true); - break; - case "Hibernate": - Application.SetSuspendState(PowerState.Hibernate, true, true); - break; - case "Lock System": - LockWorkStation(); - break; - case "Quit HandBrake": - Application.Exit(); - break; - default: - break; + if (audio != "") + audio += ", " + track.Encoder; + else + audio = track.Encoder; } + item.SubItems.Add(audio); // Audio - MessageBox.Show("Encode Queue Completed!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); - } - catch (Exception exc) - { - MessageBox.Show(exc.ToString()); + list_queue.Items.Add(item); } } - private void updateUIElements() { - if (this.InvokeRequired) + if (InvokeRequired) { - this.BeginInvoke(new ProgressUpdateHandler(updateUIElements)); + BeginInvoke(new UpdateHandler(updateUIElements)); return; } - this.list_queue.Items.RemoveAt(0); - progressBar.PerformStep(); - lbl_progressValue.Text = string.Format("{0} %", progressBar.Value); - progressBar.Update(); + redrawQueue(); + lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending"; } - - private void resetQueue() + private void setCurrentEncodeInformation() { - if (this.InvokeRequired) + try { - this.BeginInvoke(new ProgressUpdateHandler(resetQueue)); - return; + if (InvokeRequired) + { + BeginInvoke(new UpdateHandler(setCurrentEncodeInformation)); + } + + // found query is a global varible + Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query); + lbl_source.Text = queue.LastEncode.Source; + lbl_dest.Text = queue.LastEncode.Destination; + + lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString(); + + if (Equals(parsed.DVDChapterStart, 0)) + lbl_chapt.Text = "Auto"; + else + { + string chapters = parsed.DVDChapterStart.ToString(); + if (parsed.DVDChapterFinish != 0) + chapters = chapters + " - " + parsed.DVDChapterFinish; + lbl_chapt.Text = chapters; + } + + lbl_vEnc.Text = parsed.VideoEncoder; + + // Display The Audio Track Information + string audio = string.Empty; + foreach (Functions.AudioTrack track in parsed.AudioInformation) + { + if (audio != "") + audio += ", " + track.Encoder; + else + audio = track.Encoder; + } + lbl_aEnc.Text = audio; + } + catch (Exception) + { + // Do Nothing } - lbl_progressValue.Text = "0 %"; - progressBar.Value = 0; - progressBar.Update(); } + private void deleteSelectedItems() + { + // If there are selected items + if (list_queue.SelectedIndices.Count > 0) + { + // Save the selected indices to select them after the move + List selectedIndices = new List(list_queue.SelectedIndices.Count); + foreach (int selectedIndex in list_queue.SelectedIndices) + selectedIndices.Add(selectedIndex); - /* - * - * Code to Re-arrange / Delete items from the Queue - * - */ - #region Queue Management + int firstSelectedIndex = selectedIndices[0]; - private void btn_up_Click(object sender, EventArgs e) - { - int count = list_queue.Items.Count; - int itemToMove = list_queue.SelectedIndex; - int previousItemint = 0; - String previousItem = ""; + // Reverse the list to delete the items from last to first (preserves indices) + selectedIndices.Reverse(); - if (itemToMove > 0) - { - previousItemint = itemToMove - 1; - previousItem = list_queue.Items[previousItemint].ToString(); - list_queue.Items[previousItemint] = list_queue.Items[itemToMove]; - list_queue.Items[itemToMove] = previousItem; - list_queue.SelectedIndex = list_queue.SelectedIndex - 1; + // Remove each selected item + foreach (int selectedIndex in selectedIndices) + queue.RemoveJob(selectedIndex); + + updateUIElements(); + + // Select the item where the first deleted item was previously + if (firstSelectedIndex < list_queue.Items.Count) + list_queue.Items[firstSelectedIndex].Selected = true; } + + list_queue.Select(); // Activate the control to show the selected items } + // Queue Management + private void mnu_up_Click(object sender, EventArgs e) + { + moveUp(); + } + private void mnu_Down_Click(object sender, EventArgs e) + { + moveDown(); + } + private void mnu_delete_Click(object sender, EventArgs e) + { + deleteSelectedItems(); + } + private void btn_up_Click(object sender, EventArgs e) + { + moveUp(); + } private void btn_down_Click(object sender, EventArgs e) { - int count = list_queue.Items.Count; - int itemToMove = list_queue.SelectedIndex; - int itemAfterInt = 0; - String itemAfter = ""; + moveDown(); + } + private void btn_delete_Click(object sender, EventArgs e) + { + deleteSelectedItems(); + } + private void list_queue_deleteKey(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete) + deleteSelectedItems(); + } + private void moveUp() + { + // If there are selected items and the first item is not selected + if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0)) + { + // Copy the selected indices to preserve them during the movement + List selectedIndices = new List(list_queue.SelectedIndices.Count); + foreach (int selectedIndex in list_queue.SelectedIndices) + selectedIndices.Add(selectedIndex); + + // Move up each selected item + foreach (int selectedIndex in selectedIndices) + queue.MoveUp(selectedIndex); + + updateUIElements(); - if (itemToMove < (count - 1)) + // Keep the selected item(s) selected, now moved up one index + foreach (int selectedIndex in selectedIndices) + if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good + list_queue.Items[selectedIndex - 1].Selected = true; + } + + list_queue.Select(); // Activate the control to show the selected items + } + private void moveDown() + { + // If there are selected items and the last item is not selected + if (list_queue.SelectedIndices.Count > 0 && + !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index)) { - itemAfterInt = itemToMove + 1; - itemAfter = list_queue.Items[itemAfterInt].ToString(); - list_queue.Items[itemAfterInt] = list_queue.Items[itemToMove]; - list_queue.Items[itemToMove] = itemAfter; - list_queue.SelectedIndex = list_queue.SelectedIndex + 1; + // Copy the selected indices to preserve them during the movement + List selectedIndices = new List(list_queue.SelectedIndices.Count); + foreach (int selectedIndex in list_queue.SelectedIndices) + selectedIndices.Add(selectedIndex); + + // Reverse the indices to move the items down from last to first (preserves indices) + selectedIndices.Reverse(); + + // Move down each selected item + foreach (int selectedIndex in selectedIndices) + queue.MoveDown(selectedIndex); + + updateUIElements(); + + // Keep the selected item(s) selected, now moved down one index + foreach (int selectedIndex in selectedIndices) + if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good + list_queue.Items[selectedIndex + 1].Selected = true; } + + list_queue.Select(); // Activate the control to show the selected items } - private void btn_delete_Click(object sender, EventArgs e) + // Queue Import/Export Features + private void mnu_batch_Click(object sender, EventArgs e) { - list_queue.Items.Remove(list_queue.SelectedItem); + SaveFile.FileName = ""; + SaveFile.Filter = "Batch|.bat"; + SaveFile.ShowDialog(); + if (SaveFile.FileName != String.Empty) + queue.WriteBatchScriptToFile(SaveFile.FileName); } - #endregion - - /* - * Hide the Queue Window - */ - private void btn_Close_Click(object sender, EventArgs e) + private void mnu_export_Click(object sender, EventArgs e) { - this.Hide(); + SaveFile.FileName = ""; + SaveFile.Filter = "HandBrake Queue|*.queue"; + SaveFile.ShowDialog(); + if (SaveFile.FileName != String.Empty) + queue.WriteQueueStateToFile(SaveFile.FileName); + } + private void mnu_import_Click(object sender, EventArgs e) + { + OpenFile.FileName = ""; + OpenFile.ShowDialog(); + if (OpenFile.FileName != String.Empty) + queue.LoadQueueFromFile(OpenFile.FileName); + updateUIElements(); + } + private void mnu_readd_Click(object sender, EventArgs e) + { + if (!queue.LastEncode.IsEmpty) + { + queue.AddJob(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination); + updateUIElements(); + } } - private void btn_minimise_Click(object sender, EventArgs e) + // Hide's the window when the user tries to "x" out of the window instead of closing it. + protected override void OnClosing(CancelEventArgs e) { - this.WindowState = FormWindowState.Minimized; + e.Cancel = true; + this.Hide(); + base.OnClosing(e); } + } -} \ No newline at end of file +}