3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
8 using System.Collections.Generic;
\r
9 using System.ComponentModel;
\r
10 using System.Windows.Forms;
\r
11 using Handbrake.EncodeQueue;
\r
12 using System.Collections.ObjectModel;
\r
16 public partial class frmQueue : Form
\r
18 private delegate void UpdateHandler();
\r
19 private EncodeAndQueueHandler queue;
\r
21 public frmQueue(EncodeAndQueueHandler q)
\r
23 InitializeComponent();
\r
26 queue.NewJobStarted += new EventHandler(queueOnEncodeStart);
\r
27 queue.QueueCompleted += new EventHandler(queueOnQueueFinished);
\r
28 queue.QueuePauseRequested += new EventHandler(queueOnPaused);
\r
30 void queueOnPaused(object sender, EventArgs e)
\r
32 setUIEncodeFinished();
\r
35 void queueOnQueueFinished(object sender, EventArgs e)
\r
37 setUIEncodeFinished();
\r
38 resetQueue(); // Reset the Queue Window
\r
40 void queueOnEncodeStart(object sender, EventArgs e)
\r
42 setUIEncodeStarted(); // make sure the UI is set correctly
\r
43 setCurrentEncodeInformation();
\r
44 updateUIElements(); // Redraw the Queue, a new encode has started.
\r
48 /// Initializes the Queue list with the Arraylist from the Queue class
\r
50 public void setQueue()
\r
55 lbl_encodesPending.Text = list_queue.Items.Count + "
\8cÂ
\82Ì
\83W
\83\87\83u
\82ª
\91Ò
\8b@
\92\86";
\r
61 /// Initializes the Queue list, then shows and activates the window
\r
63 public new void Show()
\r
69 /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window
\r
71 /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>
\r
72 public void Show(bool doSetQueue)
\r
75 list_queue.Items.Clear();
\r
76 ArrayList theQueue = queue.getQueue();
\r
77 foreach (ArrayList queue_item in theQueue)
\r
79 string q_item = queue_item[1].ToString();
\r
80 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);
\r
82 // Get the DVD Title
\r
84 if (parsed.DVDTitle == 0)
\r
85 title = "Automatic";
\r
87 title = parsed.DVDTitle.ToString();
\r
89 // Get the DVD Chapters
\r
90 string chapters = "";
\r
91 if (parsed.DVDChapterStart == 0)
\r
95 chapters = parsed.DVDChapterStart.ToString();
\r
96 if (parsed.DVDChapterFinish != 0)
\r
97 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
100 ListViewItem item = new ListViewItem();
\r
101 item.Text = title; // Title
\r
102 item.SubItems.Add(chapters); // Chapters
\r
103 item.SubItems.Add(parsed.Source); // Source
\r
104 item.SubItems.Add(parsed.Destination); // Destination
\r
105 item.SubItems.Add(parsed.VideoEncoder); // Video
\r
106 item.SubItems.Add(parsed.AudioEncoder1); // Audio
\r
108 if (doSetQueue) setQueue();
\r
114 // Start and Stop Controls
\r
115 private void btn_encode_Click(object sender, EventArgs e)
\r
117 if (queue.PauseRequested)
\r
119 setUIEncodeStarted();
\r
120 MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
123 if (!queue.isEncoding)
\r
124 queue.StartEncodeQueue();
\r
127 private void btn_pause_Click(object sender, EventArgs e)
\r
129 queue.RequestPause();
\r
130 setUIEncodeFinished();
\r
132 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
135 // Window Display Management
\r
136 private void setUIEncodeStarted()
\r
138 if (InvokeRequired)
\r
140 BeginInvoke(new UpdateHandler(setUIEncodeStarted));
\r
143 btn_encode.Enabled = false;
\r
144 btn_pause.Visible = true;
\r
146 private void setUIEncodeFinished()
\r
148 if (InvokeRequired)
\r
150 BeginInvoke(new UpdateHandler(setUIEncodeFinished));
\r
153 btn_pause.Visible = false;
\r
154 btn_encode.Enabled = true;
\r
156 private void resetQueue()
\r
158 if (InvokeRequired)
\r
160 BeginInvoke(new UpdateHandler(resetQueue));
\r
163 btn_pause.Visible = false;
\r
164 btn_encode.Enabled = true;
\r
166 lbl_source.Text = "-";
\r
167 lbl_dest.Text = "-";
\r
168 lbl_vEnc.Text = "-";
\r
169 lbl_aEnc.Text = "-";
\r
170 lbl_title.Text = "-";
\r
171 lbl_chapt.Text = "-";
\r
173 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
175 private void redrawQueue()
\r
177 if (InvokeRequired)
\r
179 BeginInvoke(new UpdateHandler(redrawQueue));
\r
183 list_queue.Items.Clear();
\r
184 ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;
\r
185 foreach (Job queue_item in theQueue)
\r
187 string q_item = queue_item.Query;
\r
188 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);
\r
190 // Get the DVD Title
\r
191 string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();
\r
194 if (cancel == true)
\r
196 lbl_progressValue.Text = "
\83G
\83\93\83R
\81[
\83h
\82ª
\83L
\83\83\83\93\83Z
\83\8b\82³
\82ê
\82Ü
\82µ
\82½";
\r
200 lbl_progressValue.Text = "
\83G
\83\93\83R
\81[
\83h
\8dì
\8bÆ
\82ð
\8a®
\97¹
\82µ
\82Ü
\82µ
\82½";
\r
202 // Get the DVD Chapters
\r
204 if (parsed.DVDChapterStart == 0)
\r
208 chapters = parsed.DVDChapterStart.ToString();
\r
209 if (parsed.DVDChapterFinish != 0)
\r
210 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
213 ListViewItem item = new ListViewItem();
\r
214 item.Text = title; // Title
\r
215 item.SubItems.Add(chapters); // Chapters
\r
216 item.SubItems.Add(queue_item.Source); // Source
\r
217 item.SubItems.Add(queue_item.Destination); // Destination
\r
218 item.SubItems.Add(parsed.VideoEncoder); // Video
\r
220 // Display The Audio Track Information
\r
221 string audio = string.Empty;
\r
222 foreach (Functions.AudioTrack track in parsed.AudioInformation)
\r
225 audio += ", " + track.Encoder;
\r
227 audio = track.Encoder;
\r
229 item.SubItems.Add(audio); // Audio
\r
232 lbl_encodesPending.Text = list_queue.Items.Count + "
\8cÂ
\82Ì
\83W
\83\87\83u
\82ª
\91Ò
\8b@
\92\86";
\r
234 catch (Exception exc)
\r
236 MessageBox.Show(exc.ToString());
\r
240 // Stop's the queue from continuing.
\r
241 private void btn_stop_Click(object sender, EventArgs e)
\r
244 btn_stop.Visible = false;
\r
245 btn_encode.Enabled = true;
\r
246 MessageBox.Show("
\83L
\83\85\81[
\82Ì
\8eÀ
\8ds
\82ª
\92â
\8e~
\82³
\82ê
\82Ü
\82µ
\82½
\81B.
\8c»
\8dÝ
\83G
\83\93\83R
\81[
\83h
\92\86\82Ì
\8f\88\97\9d\82Í
\8a®
\97¹
\82·
\82é
\82Ü
\82Å
\8cp
\91±
\82³
\82ê
\82Ü
\82·
\81B\n
\83L
\83\85\81[
\82Ì
\8dì
\8bÆ
\82ð
\8dÄ
\8aJ
\82µ
\82½
\82¢
\8fê
\8d\87\82Í
\81u
\83G
\83\93\83R
\81[
\83h
\81v
\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
249 // Updates the progress bar and progress label for a new status.
\r
250 private void updateUIElements()
\r
254 if (this.InvokeRequired)
\r
256 this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));
\r
262 progressBar.PerformStep();
\r
263 lbl_progressValue.Text = string.Format("{0} %", progressBar.Value);
\r
264 lbl_encodesPending.Text = list_queue.Items.Count + "
\8cÂ
\82Ì
\83W
\83\87\83u
\82ª
\91Ò
\8b@
\92\86";
\r
266 catch (Exception exc)
\r
268 list_queue.Items.Add(item);
\r
271 private void updateUIElements()
\r
273 if (InvokeRequired)
\r
275 BeginInvoke(new UpdateHandler(updateUIElements));
\r
280 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
282 private void setCurrentEncodeInformation()
\r
286 if (InvokeRequired)
\r
288 BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));
\r
291 // found query is a global varible
\r
292 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query);
\r
293 lbl_source.Text = queue.LastEncode.Source;
\r
294 lbl_dest.Text = queue.LastEncode.Destination;
\r
296 lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();
\r
299 if (parsed.DVDTitle == 0)
\r
300 lbl_title.Text = "Automatic";
\r
302 lbl_title.Text = parsed.DVDTitle.ToString();
\r
304 string chapters = "";
\r
305 if (parsed.DVDChapterStart == 0)
\r
308 if (Equals(parsed.DVDChapterStart, 0))
\r
309 lbl_chapt.Text = "Auto";
\r
312 string chapters = parsed.DVDChapterStart.ToString();
\r
313 if (parsed.DVDChapterFinish != 0)
\r
314 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
315 lbl_chapt.Text = chapters;
\r
318 lbl_vEnc.Text = parsed.VideoEncoder;
\r
320 // Display The Audio Track Information
\r
321 string audio = string.Empty;
\r
322 foreach (Functions.AudioTrack track in parsed.AudioInformation)
\r
325 audio += ", " + track.Encoder;
\r
327 audio = track.Encoder;
\r
329 lbl_aEnc.Text = audio;
\r
336 private void deleteSelectedItems()
\r
338 // If there are selected items
\r
339 if (list_queue.SelectedIndices.Count > 0)
\r
341 // Save the selected indices to select them after the move
\r
342 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
\r
343 foreach (int selectedIndex in list_queue.SelectedIndices)
\r
344 selectedIndices.Add(selectedIndex);
\r
346 int firstSelectedIndex = selectedIndices[0];
\r
348 // Reverse the list to delete the items from last to first (preserves indices)
\r
349 selectedIndices.Reverse();
\r
351 // Remove each selected item
\r
352 foreach (int selectedIndex in selectedIndices)
\r
353 queue.RemoveJob(selectedIndex);
\r
355 updateUIElements();
\r
357 // Select the item where the first deleted item was previously
\r
358 if (firstSelectedIndex < list_queue.Items.Count)
\r
359 list_queue.Items[firstSelectedIndex].Selected = true;
\r
362 list_queue.Select(); // Activate the control to show the selected items
\r
365 // Queue Management
\r
366 private void mnu_up_Click(object sender, EventArgs e)
\r
370 private void mnu_Down_Click(object sender, EventArgs e)
\r
374 private void mnu_delete_Click(object sender, EventArgs e)
\r
376 deleteSelectedItems();
\r
378 private void btn_up_Click(object sender, EventArgs e)
\r
382 private void btn_down_Click(object sender, EventArgs e)
\r
386 private void btn_delete_Click(object sender, EventArgs e)
\r
388 deleteSelectedItems();
\r
390 private void list_queue_deleteKey(object sender, KeyEventArgs e)
\r
392 if (e.KeyCode == Keys.Delete)
\r
393 deleteSelectedItems();
\r
395 private void moveUp()
\r
397 // If there are selected items and the first item is not selected
\r
398 if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))
\r
400 // Copy the selected indices to preserve them during the movement
\r
401 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
\r
402 foreach (int selectedIndex in list_queue.SelectedIndices)
\r
403 selectedIndices.Add(selectedIndex);
\r
405 // Move up each selected item
\r
406 foreach (int selectedIndex in selectedIndices)
\r
407 queue.MoveUp(selectedIndex);
\r
409 updateUIElements();
\r
411 // Keep the selected item(s) selected, now moved up one index
\r
412 foreach (int selectedIndex in selectedIndices)
\r
413 if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good
\r
414 list_queue.Items[selectedIndex - 1].Selected = true;
\r
417 list_queue.Select(); // Activate the control to show the selected items
\r
419 private void moveDown()
\r
421 // If there are selected items and the last item is not selected
\r
422 if (list_queue.SelectedIndices.Count > 0 &&
\r
423 !list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count - 1].Index))
\r
426 queue.remove(list_queue.SelectedIndices[0]);
\r
427 queue.write2disk("hb_queue_recovery.dat"); // Update the queue recovery file
\r
429 lbl_encodesPending.Text = list_queue.Items.Count + "
\8cÂ
\82Ì
\83W
\83\87\83u
\82ª
\91Ò
\8b@
\92\86";
\r
431 // Copy the selected indices to preserve them during the movement
\r
432 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
\r
433 foreach (int selectedIndex in list_queue.SelectedIndices)
\r
434 selectedIndices.Add(selectedIndex);
\r
436 // Reverse the indices to move the items down from last to first (preserves indices)
\r
437 selectedIndices.Reverse();
\r
439 // Move down each selected item
\r
440 foreach (int selectedIndex in selectedIndices)
\r
441 queue.MoveDown(selectedIndex);
\r
443 updateUIElements();
\r
445 // Keep the selected item(s) selected, now moved down one index
\r
446 foreach (int selectedIndex in selectedIndices)
\r
447 if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good
\r
448 list_queue.Items[selectedIndex + 1].Selected = true;
\r
451 list_queue.Select(); // Activate the control to show the selected items
\r
454 // Queue Import/Export Features
\r
455 private void mnu_batch_Click(object sender, EventArgs e)
\r
457 SaveFile.FileName = "";
\r
458 SaveFile.Filter = "Batch|.bat";
\r
459 SaveFile.ShowDialog();
\r
460 if (SaveFile.FileName != String.Empty)
\r
461 queue.WriteBatchScriptToFile(SaveFile.FileName);
\r
463 private void mnu_export_Click(object sender, EventArgs e)
\r
465 SaveFile.FileName = "";
\r
466 SaveFile.Filter = "HandBrake Queue|*.queue";
\r
467 SaveFile.ShowDialog();
\r
468 if (SaveFile.FileName != String.Empty)
\r
469 queue.WriteQueueStateToFile(SaveFile.FileName);
\r
471 private void mnu_import_Click(object sender, EventArgs e)
\r
473 OpenFile.FileName = "";
\r
474 OpenFile.ShowDialog();
\r
475 if (OpenFile.FileName != String.Empty)
\r
476 queue.LoadQueueFromFile(OpenFile.FileName);
\r
477 updateUIElements();
\r
479 private void mnu_readd_Click(object sender, EventArgs e)
\r
481 if (!queue.LastEncode.IsEmpty)
\r
483 queue.AddJob(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination, queue.LastEncode.CustomQuery);
\r
484 updateUIElements();
\r
488 // Hide's the window when the user tries to "x" out of the window instead of closing it.
\r
489 protected override void OnClosing(CancelEventArgs e)
\r