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.Collections;
\r
10 using System.ComponentModel;
\r
12 using System.Drawing;
\r
14 using System.Windows.Forms;
\r
15 using System.Threading;
\r
16 using System.Diagnostics;
\r
17 using System.Runtime.InteropServices;
\r
22 public partial class frmQueue : Form
\r
24 private delegate void ProgressUpdateHandler();
\r
25 private delegate void setEncoding();
\r
26 Functions.Encode cliObj = new Functions.Encode();
\r
27 Boolean paused = false;
\r
28 Process hbProc = null;
\r
29 Queue.QueueHandler queue;
\r
30 frmMain mainWindow = null;
\r
33 public frmQueue(frmMain main)
\r
35 InitializeComponent();
\r
40 /// Initializes the Queue list with the Arraylist from the Queue class
\r
42 /// <param name="qw"></param>
\r
43 public void setQueue(Queue.QueueHandler qw)
\r
47 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
51 /// Returns if there is currently an item being encoded by the queue
\r
53 /// <returns>Boolean true if encoding</returns>
\r
54 public Boolean isEncoding()
\r
63 /// Allows frmMain to start an encode.
\r
64 /// Should probably find a cleaner way of doing this.
\r
66 public void frmMain_encode()
\r
68 btn_encode_Click(this, null);
\r
71 // Start and Stop Controls
\r
72 private void btn_encode_Click(object sender, EventArgs e)
\r
74 if (queue.count() != 0)
\r
79 btn_encode.Enabled = false;
\r
80 btn_stop.Visible = true;
\r
85 btn_encode.Enabled = false;
\r
86 mainWindow.setLastAction("encode");
\r
87 mainWindow.setEncodeStarted();
\r
92 // Setup or reset some values
\r
93 btn_encode.Enabled = false;
\r
94 btn_stop.Visible = true;
\r
96 theQ = new Thread(startProc);
\r
97 theQ.IsBackground = true;
\r
100 catch (Exception exc)
\r
102 MessageBox.Show(exc.ToString());
\r
107 private void btn_stop_Click(object sender, EventArgs e)
\r
110 btn_stop.Visible = false;
\r
111 btn_encode.Enabled = true;
\r
112 mainWindow.setEncodeFinished();
\r
114 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
117 // Starts the encoding process
\r
118 private void startProc(object state)
\r
122 // Run through each item on the queue
\r
123 while (queue.count() != 0)
\r
125 string query = queue.getNextItemForEncoding();
\r
126 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
128 setCurrentEncodeInformation();
\r
130 updateUIElements();
\r
132 hbProc = cliObj.runCli(this, query);
\r
134 hbProc.WaitForExit();
\r
135 cliObj.addCLIQueryToLog(query);
\r
136 cliObj.copyLog(query, queue.getLastQueryItem().Destination);
\r
143 while (paused == true) // Need to find a better way of doing this.
\r
145 Thread.Sleep(10000);
\r
151 // After the encode is done, we may want to shutdown, suspend etc.
\r
152 cliObj.afterEncodeAction();
\r
154 catch (Exception exc)
\r
156 MessageBox.Show(exc.ToString());
\r
160 // Window Display Management
\r
161 private void resetQueue()
\r
165 if (this.InvokeRequired)
\r
167 this.BeginInvoke(new ProgressUpdateHandler(resetQueue));
\r
170 btn_stop.Visible = false;
\r
171 btn_encode.Enabled = true;
\r
173 lbl_source.Text = "-";
\r
174 lbl_dest.Text = "-";
\r
175 lbl_vEnc.Text = "-";
\r
176 lbl_aEnc.Text = "-";
\r
177 lbl_title.Text = "-";
\r
178 lbl_chapt.Text = "-";
\r
180 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
182 mainWindow.setEncodeFinished(); // Tell the main window encodes have finished.
\r
184 catch (Exception exc)
\r
186 MessageBox.Show(exc.ToString());
\r
189 private void redrawQueue()
\r
191 list_queue.Items.Clear();
\r
192 List<Queue.QueueItem> theQueue = queue.getQueue();
\r
193 foreach (Queue.QueueItem queue_item in theQueue)
\r
195 string q_item = queue_item.Query;
\r
196 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);
\r
198 // Get the DVD Title
\r
200 if (parsed.DVDTitle == 0)
\r
203 title = parsed.DVDTitle.ToString();
\r
205 // Get the DVD Chapters
\r
206 string chapters = "";
\r
207 if (parsed.DVDChapterStart == 0)
\r
211 chapters = parsed.DVDChapterStart.ToString();
\r
212 if (parsed.DVDChapterFinish != 0)
\r
213 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
216 ListViewItem item = new ListViewItem();
\r
217 item.Text = title; // Title
\r
218 item.SubItems.Add(chapters); // Chapters
\r
219 item.SubItems.Add(queue_item.Source); // Source
\r
220 item.SubItems.Add(queue_item.Destination); // Destination
\r
221 item.SubItems.Add(parsed.VideoEncoder); // Video
\r
222 item.SubItems.Add(parsed.AudioEncoder1); // Audio
\r
224 list_queue.Items.Add(item);
\r
227 private void updateUIElements()
\r
231 if (this.InvokeRequired)
\r
233 this.BeginInvoke(new ProgressUpdateHandler(updateUIElements));
\r
238 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
240 catch (Exception exc)
\r
242 MessageBox.Show(exc.ToString());
\r
245 private void setCurrentEncodeInformation()
\r
249 if (this.InvokeRequired)
\r
251 this.BeginInvoke(new setEncoding(setCurrentEncodeInformation));
\r
254 // found query is a global varible
\r
255 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQueryItem().Query);
\r
256 lbl_source.Text = queue.getLastQueryItem().Source;
\r
257 lbl_dest.Text = queue.getLastQueryItem().Destination;
\r
260 if (parsed.DVDTitle == 0)
\r
261 lbl_title.Text = "Auto";
\r
263 lbl_title.Text = parsed.DVDTitle.ToString();
\r
265 string chapters = "";
\r
266 if (parsed.DVDChapterStart == 0)
\r
268 lbl_chapt.Text = "Auto";
\r
272 chapters = parsed.DVDChapterStart.ToString();
\r
273 if (parsed.DVDChapterFinish != 0)
\r
274 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
275 lbl_chapt.Text = chapters;
\r
278 lbl_vEnc.Text = parsed.VideoEncoder;
\r
279 lbl_aEnc.Text = parsed.AudioEncoder1;
\r
287 // Queue Management
\r
288 private void btn_up_Click(object sender, EventArgs e)
\r
290 if (list_queue.SelectedIndices.Count != 0)
\r
292 int selected = list_queue.SelectedIndices[0];
\r
294 queue.moveUp(selected);
\r
295 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
298 if (selected - 1 > 0)
\r
299 list_queue.Items[selected - 1].Selected = true;
\r
301 list_queue.Select();
\r
304 private void btn_down_Click(object sender, EventArgs e)
\r
306 if (list_queue.SelectedIndices.Count != 0)
\r
308 int selected = list_queue.SelectedIndices[0];
\r
310 queue.moveDown(list_queue.SelectedIndices[0]);
\r
311 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
314 if (selected + 1 < list_queue.Items.Count)
\r
315 list_queue.Items[selected + 1].Selected = true;
\r
317 list_queue.Select();
\r
320 private void btn_delete_Click(object sender, EventArgs e)
\r
322 if (list_queue.SelectedIndices.Count != 0)
\r
324 queue.remove(list_queue.SelectedIndices[0]);
\r
325 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
327 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
330 private void list_queue_deleteKey(object sender, KeyEventArgs e)
\r
332 if (e.KeyCode == Keys.Delete)
\r
334 if (list_queue.SelectedIndices.Count != 0)
\r
336 queue.remove(list_queue.SelectedIndices[0]);
\r
337 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
343 // Queue Import/Export Features
\r
344 private void mnu_batch_Click(object sender, EventArgs e)
\r
346 SaveFile.FileName = "";
\r
347 SaveFile.Filter = "Batch|.bat";
\r
348 SaveFile.ShowDialog();
\r
349 if (SaveFile.FileName != String.Empty)
\r
350 queue.writeBatchScript(SaveFile.FileName);
\r
352 private void mnu_export_Click(object sender, EventArgs e)
\r
354 SaveFile.FileName = "";
\r
355 SaveFile.Filter = "HandBrake Queue|*.queue";
\r
356 SaveFile.ShowDialog();
\r
357 if (SaveFile.FileName != String.Empty)
\r
358 queue.write2disk(SaveFile.FileName);
\r
360 private void mnu_import_Click(object sender, EventArgs e)
\r
362 OpenFile.FileName = "";
\r
363 OpenFile.ShowDialog();
\r
364 if (OpenFile.FileName != String.Empty)
\r
365 queue.recoverQueue(OpenFile.FileName);
\r
369 // Hide's the window when the user tries to "x" out of the window instead of closing it.
\r
370 protected override void OnClosing(CancelEventArgs e)
\r