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("
\95Ï
\8a·
\8dì
\8bÆ
\82ª
\8dÄ
\8aJ
\82³
\82ê
\82Ü
\82µ
\82½", "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("
\83L
\83\85\81[
\93à
\82É
\82 \82é
\83A
\83C
\83e
\83\80\82Ì
\95Ï
\8a·
\82Í
\92â
\8e~
\82³
\82ê
\82Ü
\82·
\81B
\8c»
\8dÝ
\95Ï
\8a·
\8dì
\8bÆ
\92\86\82Ì
\83t
\83@
\83C
\83\8b\82É
\82Â
\82¢
\82Ä
\82Í
\8f\88\97\9d\82ª
\91±
\8ds
\82³
\82ê
\82Ü
\82·
\81B\n
\83L
\83\85\81[
\93à
\82Ì
\83A
\83C
\83e
\83\80\82Ì
\95Ï
\8a·
\82ð
\8dÄ
\8aJ
\82µ
\82½
\82¢
\8fê
\8d\87\82Í
\81u
\95Ï
\8a·
\8aJ
\8en
\81v
\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B", "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 + "
\8cÂ
\82Ì
\95Ï
\8a·
\8dì
\8bÆ
\82ª
\91Ò
\8b@
\92\86";
\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 ? "
\8e©
\93®" : 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
205 chapters = "
\8e©
\93®";
\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 + "
\8cÂ
\82Ì
\95Ï
\8a·
\8dì
\8bÆ
\82ª
\91Ò
\8b@
\92\86";
\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 ? "
\8e©
\93®" : 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