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
14 public partial class frmQueue : Form
\r
16 private delegate void UpdateHandler();
\r
17 Queue.QueueHandler queue;
\r
19 public frmQueue(Queue.QueueHandler q)
\r
21 InitializeComponent();
\r
24 queue.OnEncodeStart += new EventHandler(queue_OnEncodeStart);
\r
25 queue.OnQueueFinished += new EventHandler(queue_OnQueueFinished);
\r
26 queue.OnPaused += new EventHandler(queue_OnPaused);
\r
28 void queue_OnPaused(object sender, EventArgs e)
\r
30 setUIEncodeFinished();
\r
33 void queue_OnQueueFinished(object sender, EventArgs e)
\r
35 setUIEncodeFinished();
\r
36 resetQueue(); // Reset the Queue Window
\r
38 void queue_OnEncodeStart(object sender, EventArgs e)
\r
40 setUIEncodeStarted(); // make sure the UI is set correctly
\r
41 setCurrentEncodeInformation();
\r
42 updateUIElements(); // Redraw the Queue, a new encode has started.
\r
46 /// Initializes the Queue list with the Arraylist from the Queue class
\r
48 public void setQueue()
\r
54 /// Initializes the Queue list, then shows and activates the window
\r
56 public new void Show()
\r
62 /// Initializes the Queue list only if doSetQueue is true, then shows and activates the window
\r
64 /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>
\r
65 public void Show(bool doSetQueue)
\r
67 if (doSetQueue) setQueue();
\r
72 // Start and Stop Controls
\r
73 private void btn_encode_Click(object sender, EventArgs e)
\r
77 setUIEncodeStarted();
\r
78 MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
81 if (!queue.isEncodeStarted)
\r
82 queue.startEncode();
\r
85 private void btn_pause_Click(object sender, EventArgs e)
\r
87 queue.pauseEncode();
\r
88 setUIEncodeFinished();
\r
90 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
93 // Window Display Management
\r
94 private void setUIEncodeStarted()
\r
98 BeginInvoke(new UpdateHandler(setUIEncodeStarted));
\r
101 btn_encode.Enabled = false;
\r
102 btn_pause.Visible = true;
\r
104 private void setUIEncodeFinished()
\r
106 if (InvokeRequired)
\r
108 BeginInvoke(new UpdateHandler(setUIEncodeFinished));
\r
111 btn_pause.Visible = false;
\r
112 btn_encode.Enabled = true;
\r
114 private void resetQueue()
\r
116 if (InvokeRequired)
\r
118 BeginInvoke(new UpdateHandler(resetQueue));
\r
121 btn_pause.Visible = false;
\r
122 btn_encode.Enabled = true;
\r
124 lbl_source.Text = "-";
\r
125 lbl_dest.Text = "-";
\r
126 lbl_vEnc.Text = "-";
\r
127 lbl_aEnc.Text = "-";
\r
128 lbl_title.Text = "-";
\r
129 lbl_chapt.Text = "-";
\r
131 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
133 private void redrawQueue()
\r
135 if (InvokeRequired)
\r
137 BeginInvoke(new UpdateHandler(redrawQueue));
\r
141 list_queue.Items.Clear();
\r
142 List<Queue.QueueItem> theQueue = queue.getQueue();
\r
143 foreach (Queue.QueueItem queue_item in theQueue)
\r
145 string q_item = queue_item.Query;
\r
146 Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);
\r
148 // Get the DVD Title
\r
149 string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();
\r
151 // Get the DVD Chapters
\r
153 if (parsed.DVDChapterStart == 0)
\r
157 chapters = parsed.DVDChapterStart.ToString();
\r
158 if (parsed.DVDChapterFinish != 0)
\r
159 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
162 ListViewItem item = new ListViewItem();
\r
163 item.Text = title; // Title
\r
164 item.SubItems.Add(chapters); // Chapters
\r
165 item.SubItems.Add(queue_item.Source); // Source
\r
166 item.SubItems.Add(queue_item.Destination); // Destination
\r
167 item.SubItems.Add(parsed.VideoEncoder); // Video
\r
168 item.SubItems.Add(parsed.AudioEncoder1); // Audio
\r
170 list_queue.Items.Add(item);
\r
173 private void updateUIElements()
\r
175 if (InvokeRequired)
\r
177 BeginInvoke(new UpdateHandler(updateUIElements));
\r
182 lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";
\r
184 private void setCurrentEncodeInformation()
\r
188 if (InvokeRequired)
\r
190 BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));
\r
193 // found query is a global varible
\r
194 Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.getLastQueryItem().Query);
\r
195 lbl_source.Text = queue.getLastQueryItem().Source;
\r
196 lbl_dest.Text = queue.getLastQueryItem().Destination;
\r
198 lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();
\r
200 if (Equals(parsed.DVDChapterStart, 0))
\r
201 lbl_chapt.Text = "Auto";
\r
204 string chapters = parsed.DVDChapterStart.ToString();
\r
205 if (parsed.DVDChapterFinish != 0)
\r
206 chapters = chapters + " - " + parsed.DVDChapterFinish;
\r
207 lbl_chapt.Text = chapters;
\r
210 lbl_vEnc.Text = parsed.VideoEncoder;
\r
211 lbl_aEnc.Text = parsed.AudioEncoder1;
\r
218 private void deleteSelectedItems()
\r
220 // If there are selected items
\r
221 if (list_queue.SelectedIndices.Count > 0)
\r
223 // Save the selected indices to select them after the move
\r
224 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
\r
225 foreach (int selectedIndex in list_queue.SelectedIndices)
\r
226 selectedIndices.Add(selectedIndex);
\r
228 int firstSelectedIndex = selectedIndices[0];
\r
230 // Reverse the list to delete the items from last to first (preserves indices)
\r
231 selectedIndices.Reverse();
\r
233 // Remove each selected item
\r
234 foreach (int selectedIndex in selectedIndices)
\r
235 queue.remove(selectedIndex);
\r
237 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
238 updateUIElements();
\r
240 // Select the item where the first deleted item was previously
\r
241 if (firstSelectedIndex < list_queue.Items.Count)
\r
242 list_queue.Items[firstSelectedIndex].Selected = true;
\r
245 list_queue.Select(); // Activate the control to show the selected items
\r
248 // Queue Management
\r
249 private void btn_re_add_Click(object sender, EventArgs e)
\r
251 if (queue.getLastQueryItem() != null)
\r
253 queue.add(queue.getLastQueryItem().Query, queue.getLastQueryItem().Source, queue.getLastQueryItem().Destination);
\r
254 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
255 updateUIElements();
\r
258 private void btn_up_Click(object sender, EventArgs e)
\r
260 // If there are selected items and the first item is not selected
\r
261 if (list_queue.SelectedIndices.Count > 0 && ! list_queue.SelectedIndices.Contains(0))
\r
263 // Copy the selected indices to preserve them during the movement
\r
264 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
\r
265 foreach (int selectedIndex in list_queue.SelectedIndices)
\r
266 selectedIndices.Add(selectedIndex);
\r
268 // Move up each selected item
\r
269 foreach (int selectedIndex in selectedIndices)
\r
270 queue.moveUp(selectedIndex);
\r
272 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
273 updateUIElements();
\r
275 // Keep the selected item(s) selected, now moved up one index
\r
276 foreach (int selectedIndex in selectedIndices)
\r
277 if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good
\r
278 list_queue.Items[selectedIndex - 1].Selected = true;
\r
281 list_queue.Select(); // Activate the control to show the selected items
\r
283 private void btn_down_Click(object sender, EventArgs e)
\r
285 // If there are selected items and the last item is not selected
\r
286 if (list_queue.SelectedIndices.Count > 0 &&
\r
287 ! list_queue.SelectedIndices.Contains(list_queue.Items[list_queue.Items.Count-1].Index))
\r
289 // Copy the selected indices to preserve them during the movement
\r
290 List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);
\r
291 foreach (int selectedIndex in list_queue.SelectedIndices)
\r
292 selectedIndices.Add(selectedIndex);
\r
294 // Reverse the indices to move the items down from last to first (preserves indices)
\r
295 selectedIndices.Reverse();
\r
297 // Move down each selected item
\r
298 foreach (int selectedIndex in selectedIndices)
\r
299 queue.moveDown(selectedIndex);
\r
301 queue.write2disk("hb_queue_recovery.xml"); // Update the queue recovery file
\r
302 updateUIElements();
\r
304 // Keep the selected item(s) selected, now moved down one index
\r
305 foreach (int selectedIndex in selectedIndices)
\r
306 if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good
\r
307 list_queue.Items[selectedIndex + 1].Selected = true;
\r
310 list_queue.Select(); // Activate the control to show the selected items
\r
312 private void btn_delete_Click(object sender, EventArgs e)
\r
314 deleteSelectedItems();
\r
316 private void list_queue_deleteKey(object sender, KeyEventArgs e)
\r
318 if (e.KeyCode == Keys.Delete)
\r
319 deleteSelectedItems();
\r
322 // Queue Import/Export Features
\r
323 private void mnu_batch_Click(object sender, EventArgs e)
\r
325 SaveFile.FileName = "";
\r
326 SaveFile.Filter = "Batch|.bat";
\r
327 SaveFile.ShowDialog();
\r
328 if (SaveFile.FileName != String.Empty)
\r
329 queue.writeBatchScript(SaveFile.FileName);
\r
331 private void mnu_export_Click(object sender, EventArgs e)
\r
333 SaveFile.FileName = "";
\r
334 SaveFile.Filter = "HandBrake Queue|*.queue";
\r
335 SaveFile.ShowDialog();
\r
336 if (SaveFile.FileName != String.Empty)
\r
337 queue.write2disk(SaveFile.FileName);
\r
339 private void mnu_import_Click(object sender, EventArgs e)
\r
341 OpenFile.FileName = "";
\r
342 OpenFile.ShowDialog();
\r
343 if (OpenFile.FileName != String.Empty)
\r
344 queue.recoverQueue(OpenFile.FileName);
\r
345 updateUIElements();
\r
348 // Hide's the window when the user tries to "x" out of the window instead of closing it.
\r
349 protected override void OnClosing(CancelEventArgs e)
\r