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.Drawing;
\r
10 using System.Globalization;
\r
11 using System.Windows.Forms;
\r
13 using System.Diagnostics;
\r
14 using System.Threading;
\r
15 using Handbrake.EncodeQueue;
\r
16 using Handbrake.Functions;
\r
17 using Handbrake.Presets;
\r
18 using Handbrake.Parsing;
\r
22 public partial class frmMain : Form
\r
24 // Objects which may be used by one or more other objects *************
\r
25 EncodeAndQueueHandler encodeQueue = new EncodeAndQueueHandler();
\r
26 PresetsHandler presetHandler = new PresetsHandler();
\r
27 QueryGenerator queryGen = new QueryGenerator();
\r
29 // Globals: Mainly used for tracking. *********************************
\r
30 public Title selectedTitle;
\r
31 private DVD thisDVD;
\r
32 private frmQueue queueWindow;
\r
33 private frmPreview qtpreview;
\r
34 private frmActivityWindow ActivityWindow;
\r
35 private Form splash;
\r
36 public string sourcePath;
\r
37 private string lastAction;
\r
38 private SourceType selectedSourceType;
\r
39 private string dvdDrivePath;
\r
40 private string dvdDriveLabel;
\r
42 // Delegates **********************************************************
\r
43 private delegate void UpdateWindowHandler();
\r
45 // Applicaiton Startup ************************************************
\r
47 #region Application Startup
\r
50 // Load and setup the splash screen in this thread
\r
51 splash = new frmSplashScreen();
\r
53 Label lblStatus = new Label { Size = new Size(150, 20), Location = new Point(182, 102) };
\r
54 splash.Controls.Add(lblStatus);
\r
56 InitializeComponent();
\r
58 // Update the users config file with the CLI version data.
\r
59 lblStatus.Text = "
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82Ì
\8eæ
\93¾
\92\86...";
\r
60 Application.DoEvents();
\r
61 Main.setCliVersionData();
\r
63 // Show the form, but leave disabled until preloading is complete then show the main form
\r
64 this.Enabled = false;
\r
66 Application.DoEvents(); // Forces frmMain to draw
\r
68 // Check for new versions, if update checking is enabled
\r
69 if (Properties.Settings.Default.updateStatus)
\r
71 DateTime now = DateTime.Now;
\r
72 DateTime lastCheck = Properties.Settings.Default.lastUpdateCheckDate;
\r
73 TimeSpan elapsed = now.Subtract(lastCheck);
\r
74 if (elapsed.TotalDays > Properties.Settings.Default.daysBetweenUpdateCheck)
\r
76 lblStatus.Text = "
\83A
\83b
\83v
\83f
\81[
\83g
\82Ì
\8am
\94F
\92\86...";
\r
77 Application.DoEvents();
\r
79 Main.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDone), false);
\r
83 // Setup the GUI components
\r
84 lblStatus.Text = "GUI
\82Ì
\90Ý
\92è
\92\86...";
\r
85 Application.DoEvents();
\r
86 loadPresetPanel(); // Load the Preset Panel
\r
87 treeView_presets.ExpandAll();
\r
88 lbl_encode.Text = "";
\r
89 queueWindow = new frmQueue(encodeQueue); // Prepare the Queue
\r
90 if (!Properties.Settings.Default.QueryEditorTab)
\r
91 tabs_panel.TabPages.RemoveAt(7); // Remove the query editor tab if the user does not want it enabled.
\r
93 // Load the user's default settings or Normal Preset
\r
94 if (Properties.Settings.Default.defaultPreset != "")
\r
96 if (presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)
\r
98 string query = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).Query;
\r
99 Boolean loadPictureSettings = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).PictureSettings;
\r
103 //Ok, Reset all the H264 widgets before changing the preset
\r
104 x264Panel.reset2Defaults();
\r
106 // Send the query from the file to the Query Parser class, then load the preset
\r
107 QueryParser presetQuery = QueryParser.Parse(query);
\r
108 PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);
\r
110 // The x264 widgets will need updated, so do this now:
\r
111 x264Panel.X264_StandardizeOptString();
\r
112 x264Panel.X264_SetCurrentSettingsInPanel();
\r
116 loadNormalPreset();
\r
119 loadNormalPreset();
\r
121 // Enabled GUI tooltip's if Required
\r
122 if (Properties.Settings.Default.tooltipEnable)
\r
123 ToolTip.Active = true;
\r
125 // Register with Growl (if not using Growl for the encoding completion action, this wont hurt anything)
\r
126 GrowlCommunicator.Register();
\r
129 lblStatus.Text = "
\83\8d\81[
\83h
\8a®
\97¹
\81I";
\r
130 Application.DoEvents();
\r
133 this.Enabled = true;
\r
135 // Event Handlers and Queue Recovery
\r
140 private void UpdateCheckDone(IAsyncResult result)
\r
142 if (InvokeRequired)
\r
144 Invoke(new MethodInvoker(() => UpdateCheckDone(result)));
\r
148 UpdateCheckInformation info;
\r
152 info = Main.EndCheckForUpdates(result);
\r
154 if (info.NewVersionAvailable)
\r
156 frmUpdater updateWindow = new frmUpdater(info.BuildInformation);
\r
157 updateWindow.ShowDialog();
\r
160 catch (Exception ex)
\r
162 if ((bool)result.AsyncState)
\r
163 MessageBox.Show("Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
167 // Startup Functions
\r
168 private void queueRecovery()
\r
170 if (Main.checkQueueRecovery())
\r
172 DialogResult result = MessageBox.Show("
\83L
\83\85\81[
\82É
\96¢
\8a®
\97¹
\82Ì
\83A
\83C
\83e
\83\80\82ª
\8ec
\82³
\82ê
\82Ä
\82¢
\82Ü
\82·
\81B
\82±
\82ê
\82ç
\82ð
\95\9c\8c³
\82µ
\82Ü
\82·
\82©
\81H", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
174 if (result == DialogResult.Yes)
\r
175 encodeQueue.LoadQueueFromFile("hb_queue_recovery.xml"); // Start Recovery
\r
178 // Remove the Queue recovery file if the user doesn't want to recovery the last queue.
\r
179 string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");
\r
180 if (File.Exists(queuePath))
\r
181 File.Delete(queuePath);
\r
188 public string SourceName
\r
192 if (this.selectedSourceType == SourceType.DvdDrive)
\r
194 return this.dvdDriveLabel;
\r
197 return Path.GetFileNameWithoutExtension(this.sourcePath);
\r
203 // Encoding Events for setting up the GUI
\r
204 private void events()
\r
206 // Handle Widget changes when preset is selected.
\r
207 RegisterPresetEventHandler();
\r
209 // Handle Window Resize
\r
210 if (Properties.Settings.Default.MainWindowMinimize)
\r
211 this.Resize += new EventHandler(frmMain_Resize);
\r
213 // Handle Encode Start / Finish / Pause
\r
214 encodeQueue.CurrentJobCompleted += new EventHandler(encodeEnded);
\r
215 encodeQueue.QueuePauseRequested += new EventHandler(encodePaused);
\r
216 encodeQueue.NewJobStarted += new EventHandler(encodeStarted);
\r
218 // Handle a file being draged onto the GUI.
\r
219 this.DragEnter += new DragEventHandler(frmMain_DragEnter);
\r
220 this.DragDrop += new DragEventHandler(frmMain_DragDrop);
\r
223 // Change the preset label to custom when a user changes a setting. Don't want to give the impression that users can change settings and still be using a preset
\r
224 private void RegisterPresetEventHandler()
\r
227 drop_format.SelectedIndexChanged += new EventHandler(changePresetLabel);
\r
228 check_largeFile.CheckedChanged += new EventHandler(changePresetLabel);
\r
229 check_iPodAtom.CheckedChanged += new EventHandler(changePresetLabel);
\r
230 check_optimiseMP4.CheckedChanged += new EventHandler(changePresetLabel);
\r
232 // Picture Settings
\r
233 //PictureSettings.PictureSettingsChanged += new EventHandler(changePresetLabel);
\r
236 Filters.FilterSettingsChanged += new EventHandler(changePresetLabel);
\r
239 drp_videoEncoder.SelectedIndexChanged += new EventHandler(changePresetLabel);
\r
240 check_2PassEncode.CheckedChanged += new EventHandler(changePresetLabel);
\r
241 check_turbo.CheckedChanged += new EventHandler(changePresetLabel);
\r
242 text_filesize.TextChanged += new EventHandler(changePresetLabel);
\r
243 text_bitrate.TextChanged += new EventHandler(changePresetLabel);
\r
244 slider_videoQuality.ValueChanged += new EventHandler(changePresetLabel);
\r
247 AudioSettings.AudioListChanged += new EventHandler(changePresetLabel);
\r
250 x264Panel.rtf_x264Query.TextChanged += new EventHandler(changePresetLabel);
\r
252 private void UnRegisterPresetEventHandler()
\r
254 // Output Settings
\r
255 drop_format.SelectedIndexChanged -= new EventHandler(changePresetLabel);
\r
256 check_largeFile.CheckedChanged -= new EventHandler(changePresetLabel);
\r
257 check_iPodAtom.CheckedChanged -= new EventHandler(changePresetLabel);
\r
258 check_optimiseMP4.CheckedChanged -= new EventHandler(changePresetLabel);
\r
260 // Picture Settings
\r
261 //PictureSettings.PictureSettingsChanged -= new EventHandler(changePresetLabel);
\r
264 Filters.FilterSettingsChanged -= new EventHandler(changePresetLabel);
\r
267 drp_videoEncoder.SelectedIndexChanged -= new EventHandler(changePresetLabel);
\r
268 check_2PassEncode.CheckedChanged -= new EventHandler(changePresetLabel);
\r
269 check_turbo.CheckedChanged -= new EventHandler(changePresetLabel);
\r
270 text_filesize.TextChanged -= new EventHandler(changePresetLabel);
\r
271 text_bitrate.TextChanged -= new EventHandler(changePresetLabel);
\r
272 slider_videoQuality.ValueChanged -= new EventHandler(changePresetLabel);
\r
275 AudioSettings.AudioListChanged -= new EventHandler(changePresetLabel);
\r
278 x264Panel.rtf_x264Query.TextChanged -= new EventHandler(changePresetLabel);
\r
280 private void changePresetLabel(object sender, EventArgs e)
\r
282 labelPreset.Text = "Output Settings (Preset: Custom)";
\r
285 private static void frmMain_DragEnter(object sender, DragEventArgs e)
\r
287 if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
\r
288 e.Effect = DragDropEffects.All;
\r
290 private void frmMain_DragDrop(object sender, DragEventArgs e)
\r
292 string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
\r
293 sourcePath = string.Empty;
\r
295 if (fileList != null)
\r
297 if (fileList[0].StartsWith("\\"))
\r
300 "Sorry, HandBrake does not support UNC file paths. \nTry mounting the network share as a network drive in My Computer",
\r
301 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
302 UpdateSourceLabel();
\r
306 if (fileList[0] != "")
\r
307 startScan(fileList[0]);
\r
309 UpdateSourceLabel();
\r
313 UpdateSourceLabel();
\r
315 private void encodeStarted(object sender, EventArgs e)
\r
317 lastAction = "encode";
\r
318 setEncodeStarted();
\r
320 // Experimental HBProc Process Monitoring.
\r
321 if (Properties.Settings.Default.enocdeStatusInGui)
\r
323 Thread encodeMon = new Thread(encodeMonitorThread);
\r
327 private void encodeEnded(object sender, EventArgs e)
\r
329 setEncodeFinished();
\r
331 private void encodePaused(object sender, EventArgs e)
\r
333 setEncodeFinished();
\r
337 // User Interface Menus / Tool Strips *********************************
\r
340 private void mnu_killCLI_Click(object sender, EventArgs e)
\r
344 private void mnu_exit_Click(object sender, EventArgs e)
\r
346 Application.Exit();
\r
351 private void mnu_encode_Click(object sender, EventArgs e)
\r
353 queueWindow.Show();
\r
355 private void mnu_encodeLog_Click(object sender, EventArgs e)
\r
357 String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";
\r
359 frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeQueue, this);
\r
360 dvdInfoWindow.Show();
\r
362 private void mnu_options_Click(object sender, EventArgs e)
\r
364 Form options = new frmOptions(this);
\r
365 options.ShowDialog();
\r
369 #region Presets Menu
\r
370 private void mnu_presetReset_Click(object sender, EventArgs e)
\r
372 presetHandler.UpdateBuiltInPresets();
\r
374 if (treeView_presets.Nodes.Count == 0)
\r
375 MessageBox.Show("presets.xml
\83t
\83@
\83C
\83\8b\82ð
\83\8d\81[
\83h
\82Å
\82«
\82Ü
\82¹
\82ñ
\81B
\81u
\83v
\83\8a\83Z
\83b
\83g
\81v
\83\81\83j
\83\85\81[
\82©
\82ç
\81u
\91g
\82Ý
\8d\9e\82Ý
\83v
\83\8a\83Z
\83b
\83g
\82Ì
\83A
\83b
\83v
\83f
\81[
\83g
\81v
\82ð
\8eÀ
\8ds
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B\n
\82Ü
\82½
\81AVista
\82Ì
\8fê
\8d\87\8aÇ
\97\9d\8eÒ
\83\82\81[
\83h
\82Å
\8eÀ
\8ds
\82µ
\82Ä
\82¢
\82é
\82©
\82Ç
\82¤
\82©
\8am
\94F
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
\8fÚ
\82µ
\82
\82ÍFAQ
\82ð
\8eQ
\8fÆ
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81I", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
377 MessageBox.Show("
\91g
\82Ý
\8d\9e\82Ý
\83v
\83\8a\83Z
\83b
\83g
\82ð
\83A
\83b
\83v
\83f
\81[
\83g
\82µ
\82Ü
\82µ
\82½
\81I", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
379 treeView_presets.ExpandAll();
\r
381 private void mnu_delete_preset_Click(object sender, EventArgs e)
\r
384 // Empty the preset file
\r
385 string presetsFile = Application.StartupPath.ToString() + "\\presets.dat";
\r
386 if (File.Exists(presetsFile))
\r
387 File.Delete(presetsFile);
\r
391 FileStream strm = new FileStream(presetsFile, FileMode.Create, FileAccess.Write);
\r
395 catch (Exception exc)
\r
397 MessageBox.Show("
\83v
\83\8a\83Z
\83b
\83g
\82Ì
\8dí
\8f\9c\8f\88\97\9d\82Å
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82Ü
\82µ
\82½
\81B\nWindows Vista
\82Ì
\8fê
\8d\87\81A
\8aÇ
\97\9d\8eÒ
\83\82\81[
\83h
\82Å
\8eÀ
\8ds
\82µ
\82Ä
\82
\82¾
\82³
\82¢\n" + exc.ToString());
\r
400 // Reload the preset panel
\r
403 presetHandler.RemoveBuiltInPresets();
\r
404 loadPresetPanel(); // Reload the preset panel
\r
406 private void mnu_SelectDefault_Click(object sender, EventArgs e)
\r
408 loadNormalPreset();
\r
410 private void mnu_importMacPreset_Click(object sender, EventArgs e)
\r
414 private void btn_new_preset_Click(object sender, EventArgs e)
\r
416 Form preset = new frmAddPreset(this, queryGen.GenerateCLIQuery(this, 0, null), presetHandler);
\r
417 preset.ShowDialog();
\r
422 private void mnu_handbrake_forums_Click(object sender, EventArgs e)
\r
424 // Process.Start("http://forum.handbrake.fr/");
\r
425 Process.Start("http://sourceforge.jp/projects/handbrake-jp/wiki/Forum");
\r
427 private void mnu_user_guide_Click(object sender, EventArgs e)
\r
429 // Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");
\r
430 Process.Start("http://sourceforge.jp/projects/handbrake-jp/wiki/Guide");
\r
432 private void mnu_handbrake_home_Click(object sender, EventArgs e)
\r
434 // Process.Start("http://handbrake.fr");
\r
435 Process.Start("http://sourceforge.jp/projects/handbrake-jp/wiki/");
\r
437 private void mnu_UpdateCheck_Click(object sender, EventArgs e)
\r
439 lbl_updateCheck.Visible = true;
\r
440 Main.BeginCheckForUpdates(new AsyncCallback(updateCheckDoneMenu), false);
\r
442 private void updateCheckDoneMenu(IAsyncResult result)
\r
444 // Make sure it's running on the calling thread
\r
445 if (InvokeRequired)
\r
447 Invoke(new MethodInvoker(() => updateCheckDoneMenu(result)));
\r
450 UpdateCheckInformation info;
\r
453 // Get the information about the new build, if any, and close the window
\r
454 info = Main.EndCheckForUpdates(result);
\r
456 if (info.NewVersionAvailable && info.BuildInformation != null)
\r
458 frmUpdater updateWindow = new frmUpdater(info.BuildInformation);
\r
459 updateWindow.ShowDialog();
\r
462 MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
463 lbl_updateCheck.Visible = false;
\r
466 catch (Exception ex)
\r
468 if ((bool)result.AsyncState)
\r
469 MessageBox.Show("Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
473 MessageBox.Show("
\8c»
\8dÝ
\97\98\97p
\89Â
\94\
\82È
\83A
\83b
\83v
\83f
\81[
\83g
\82Í
\82 \82è
\82Ü
\82¹
\82ñ", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
476 private void mnu_about_Click(object sender, EventArgs e)
\r
478 using (frmAbout About = new frmAbout())
\r
480 About.ShowDialog();
\r
486 // Right Click Menu Code
\r
487 private void pmnu_expandAll_Click(object sender, EventArgs e)
\r
489 treeView_presets.ExpandAll();
\r
491 private void pmnu_collapse_Click(object sender, EventArgs e)
\r
493 treeView_presets.CollapseAll();
\r
495 private void pmnu_import_Click(object sender, EventArgs e)
\r
499 private void pmnu_saveChanges_Click(object sender, EventArgs e)
\r
501 DialogResult result = MessageBox.Show("Do you wish to include picture settings when updating the preset: " + treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
\r
502 if (result == DialogResult.Yes)
\r
503 presetHandler.Update(treeView_presets.SelectedNode.Text, QueryGenerator.GenerateTabbedComponentsQuery(this), true);
\r
504 else if (result == DialogResult.No)
\r
505 presetHandler.Update(treeView_presets.SelectedNode.Text, QueryGenerator.GenerateTabbedComponentsQuery(this), false);
\r
507 private void pmnu_delete_click(object sender, EventArgs e)
\r
509 if (treeView_presets.SelectedNode != null)
\r
511 presetHandler.Remove(treeView_presets.SelectedNode.Text);
\r
512 treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);
\r
514 treeView_presets.Select();
\r
516 private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
\r
518 // Make sure that the save menu is always disabled by default
\r
519 pmnu_saveChanges.Enabled = false;
\r
521 // Now enable the save menu if the selected preset is a user preset
\r
522 if (treeView_presets.SelectedNode != null)
\r
523 if (presetHandler.CheckIfUserPresetExists(treeView_presets.SelectedNode.Text))
\r
524 pmnu_saveChanges.Enabled = true;
\r
526 treeView_presets.Select();
\r
529 // Presets Management
\r
530 private void btn_addPreset_Click(object sender, EventArgs e)
\r
532 Form preset = new frmAddPreset(this, QueryGenerator.GenerateTabbedComponentsQuery(this), presetHandler);
\r
533 preset.ShowDialog();
\r
535 private void btn_removePreset_Click(object sender, EventArgs e)
\r
538 if (text_source.Text == string.Empty || text_source.Text == "
\81u
\95Ï
\8a·
\8c³
\81v
\83{
\83^
\83\93\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\91I
\91ð..." || text_destination.Text == string.Empty)
\r
539 MessageBox.Show("
\95Ï
\8a·
\8c³
\82à
\82µ
\82
\82Í
\95Û
\91¶
\90æ
\82ª
\91I
\91ð
\82³
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
542 // Set the last action to encode.
\r
543 // This is used for tracking which file to load in the activity window
\r
544 lastAction = "encode";
\r
547 if (rtf_query.Text != "")
\r
548 query = rtf_query.Text;
\r
550 query = queryGen.GenerateTheQuery(this);
\r
552 ThreadPool.QueueUserWorkItem(procMonitor, query);
\r
553 lbl_encode.Visible = true;
\r
554 lbl_encode.Text = "
\83G
\83\93\83R
\81[
\83h
\8eÀ
\8ds
\92\86";
\r
556 btn_start.Text = "
\95Ï
\8a·
\92â
\8e~";
\r
557 btn_start.ToolTipText = "
\83G
\83\93\83R
\81[
\83h
\8f\88\97\9d\82ð
\92\86\8e~
\82µ
\82Ü
\82·
\81B\nWarning:
\82±
\82ê
\82É
\82æ
\82è
\81A
\83t
\83@
\83C
\83\8b\82ª
\94j
\89ó
\82³
\82ê
\82é
\89Â
\94\
\90«
\82ª
\82 \82è
\82Ü
\82·
\81B
\88À
\91S
\82É
\83G
\83\93\83R
\81[
\83h
\82ð
\92\86\8e~
\82·
\82é
\82É
\82Í
\81A
\83R
\83}
\83\93\83h
\83E
\83B
\83\93\83h
\83E
\82Åctrl-C
\82ð
\93ü
\97Í
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B";
\r
558 btn_start.Image = Properties.Resources.stop;
\r
560 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
561 if (result == DialogResult.Yes)
\r
563 if (treeView_presets.SelectedNode != null)
\r
565 presetHandler.Remove(treeView_presets.SelectedNode.Text);
\r
566 treeView_presets.Nodes.Remove(treeView_presets.SelectedNode);
\r
569 treeView_presets.Select();
\r
571 private void btn_setDefault_Click(object sender, EventArgs e)
\r
574 if (text_source.Text == string.Empty || text_source.Text == "
\81u
\95Ï
\8a·
\8c³
\81v
\83{
\83^
\83\93\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\91I
\91ð..." || text_destination.Text == string.Empty)
\r
575 MessageBox.Show("
\95Ï
\8a·
\8c³
\82à
\82µ
\82
\82Í
\95Û
\91¶
\90æ
\82ª
\91I
\91ð
\82³
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
578 if (treeView_presets.SelectedNode != null)
\r
580 DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
581 if (result == DialogResult.Yes)
\r
583 Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;
\r
584 Properties.Settings.Default.Save();
\r
585 MessageBox.Show("New default preset set.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
589 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
591 private void treeview_presets_mouseUp(object sender, MouseEventArgs e)
\r
593 if (e.Button == MouseButtons.Right)
\r
594 treeView_presets.SelectedNode = treeView_presets.GetNodeAt(e.Location);
\r
595 else if (e.Button == MouseButtons.Left)
\r
597 if (treeView_presets.GetNodeAt(e.Location) != null)
\r
599 if (labelPreset.Text.Contains(treeView_presets.GetNodeAt(e.Location).Text))
\r
604 treeView_presets.Select();
\r
606 private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)
\r
610 private void treeView_presets_deleteKey(object sender, KeyEventArgs e)
\r
612 if (e.KeyCode == Keys.Delete)
\r
614 DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
615 if (result == DialogResult.Yes)
\r
617 if (treeView_presets.SelectedNode != null)
\r
618 presetHandler.Remove(treeView_presets.SelectedNode.Text);
\r
620 // Remember each nodes expanded status so we can reload it
\r
621 List<Boolean> nodeStatus = new List<Boolean>();
\r
622 foreach (TreeNode node in treeView_presets.Nodes)
\r
623 nodeStatus.Add(node.IsExpanded);
\r
625 // Now reload the preset panel
\r
628 // And finally, re-expand any of the nodes if required
\r
630 foreach (TreeNode node in treeView_presets.Nodes)
\r
636 if (filename.StartsWith("\\"))
\r
637 MessageBox.Show("HandBrake
\82ÍUNC
\83p
\83X
\82É
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B\n
\8b¤
\97L
\83t
\83H
\83\8b\83_
\82ð
\83}
\83E
\83\93\83g
\82µ
\82Ä
\8eÀ
\8ds
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
640 if (filename != "")
\r
642 Form frmRD = new frmReadDVD(filename, this);
\r
643 text_source.Text = filename;
\r
644 lbl_encode.Text = "
\83X
\83L
\83\83\83\93\92\86...";
\r
645 frmRD.ShowDialog();
\r
648 text_source.Text = "
\81u
\95Ï
\8a·
\8c³
\81v
\83{
\83^
\83\93\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\91I
\91ð...";
\r
650 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
651 if (drp_dvdtitle.Items.Count == 0)
\r
652 MessageBox.Show("
\83^
\83C
\83g
\83\8b\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ
\81B
\90³
\82µ
\82¢
\95Ï
\8a·
\8c³
\82ð
\91I
\91ð
\82µ
\82Ä
\82¢
\82é
\82©
\82²
\8am
\94F
\82
\82¾
\82³
\82¢
\81B
\82Ü
\82½
\81A
\83R
\83s
\81[
\83v
\83\8d\83e
\83N
\83g
\82³
\82ê
\82½
\83f
\83B
\83X
\83N
\82É
\82Í
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
654 lbl_encode.Text = "";
\r
661 private void selectPreset()
\r
663 if (treeView_presets.SelectedNode != null)
\r
665 // Ok, so, we've selected a preset. Now we want to load it.
\r
666 string presetName = treeView_presets.SelectedNode.Text;
\r
667 if (presetHandler.GetPreset(presetName) != null)
\r
669 string query = presetHandler.GetPreset(presetName).Query;
\r
670 Boolean loadPictureSettings = presetHandler.GetPreset(presetName).PictureSettings;
\r
674 //Ok, Reset all the H264 widgets before changing the preset
\r
675 x264Panel.reset2Defaults();
\r
677 // Send the query from the file to the Query Parser class
\r
678 QueryParser presetQuery = QueryParser.Parse(query);
\r
681 if (filename.StartsWith("\\"))
\r
682 MessageBox.Show("HandBrake
\82ÍUNC
\83p
\83X
\82É
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B\n
\8b¤
\97L
\83t
\83H
\83\8b\83_
\82ð
\83}
\83E
\83\93\83g
\82µ
\82Ä
\8eÀ
\8ds
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
685 // Now load the preset
\r
686 PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);
\r
688 // The x264 widgets will need updated, so do this now:
\r
689 x264Panel.X264_StandardizeOptString();
\r
690 x264Panel.X264_SetCurrentSettingsInPanel();
\r
695 private void loadNormalPreset()
\r
697 foreach (TreeNode treenode in treeView_presets.Nodes)
\r
699 foreach (TreeNode node in treenode.Nodes)
\r
701 if (node.Text.Equals("Normal"))
\r
702 treeView_presets.SelectedNode = treeView_presets.Nodes[treenode.Index].Nodes[0];
\r
706 private void importPreset()
\r
708 Import imp = new Import();
\r
709 if (openPreset.ShowDialog() == DialogResult.OK)
\r
711 QueryParser parsed = imp.importMacPreset(openPreset.FileName);
\r
712 if (presetHandler.CheckIfUserPresetExists(parsed.PresetName + " (Imported)"))
\r
714 DialogResult result = MessageBox.Show("This preset appears to already exist. Would you like to overwrite it?", "Overwrite preset?",
\r
715 MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
716 if (result == DialogResult.Yes)
\r
718 PresetLoader.presetLoader(this, parsed, parsed.PresetName, parsed.UsesPictureSettings);
\r
719 presetHandler.Update(parsed.PresetName + " (Imported)", queryGen.GenerateCLIQuery(this, 0, null),
\r
720 parsed.UsesPictureSettings);
\r
725 text_source.Text = "
\81u
\95Ï
\8a·
\8c³
\81v
\83{
\83^
\83\93\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\91I
\91ð...";
\r
727 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
728 if (drp_dvdtitle.Items.Count == 0)
\r
729 MessageBox.Show("
\83^
\83C
\83g
\83\8b\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ
\81B
\90³
\82µ
\82¢
\95Ï
\8a·
\8c³
\82ð
\91I
\91ð
\82µ
\82Ä
\82¢
\82é
\82©
\82²
\8am
\94F
\82
\82¾
\82³
\82¢
\81B
\82Ü
\82½
\81A
\83R
\83s
\81[
\83v
\83\8d\83e
\83N
\83g
\82³
\82ê
\82½
\83f
\83B
\83X
\83N
\82É
\82Í
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
732 PresetLoader.presetLoader(this, parsed, parsed.PresetName, parsed.UsesPictureSettings);
\r
733 presetHandler.Add(parsed.PresetName, queryGen.GenerateCLIQuery(this, 0, null), parsed.UsesPictureSettings);
\r
735 if (presetHandler.Add(parsed.PresetName + " (Imported)", queryGen.GenerateCLIQuery(this, 0, null), parsed.UsesPictureSettings))
\r
737 TreeNode preset_treeview = new TreeNode(parsed.PresetName + " (Imported)") { ForeColor = Color.Black };
\r
738 treeView_presets.Nodes.Add(preset_treeview);
\r
746 private void btn_source_Click(object sender, EventArgs e)
\r
748 mnu_dvd_drive.Visible = true;
\r
749 Thread driveInfoThread = new Thread(getDriveInfoThread);
\r
750 driveInfoThread.Start();
\r
752 private void btn_start_Click(object sender, EventArgs e)
\r
754 if (btn_start.Text == "Stop")
\r
756 DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode?", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
758 if (result == DialogResult.Yes)
\r
761 encodeQueue.RequestPause();
\r
763 // Allow the CLI to exit cleanly
\r
764 Win32.SetForegroundWindow((int)encodeQueue.processHandle);
\r
765 SendKeys.Send("^C");
\r
768 setEncodeFinished();
\r
773 if (encodeQueue.Count != 0 || (!string.IsNullOrEmpty(sourcePath) && !string.IsNullOrEmpty(text_destination.Text)))
\r
775 string generatedQuery = queryGen.GenerateCLIQuery(this, 0, null);
\r
776 string specifiedQuery = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateCLIQuery(this, 0, null);
\r
777 string query = string.Empty;
\r
779 // Check to make sure the generated query matches the GUI settings
\r
780 if (Properties.Settings.Default.PromptOnUnmatchingQueries && !string.IsNullOrEmpty(specifiedQuery) && generatedQuery != specifiedQuery)
\r
782 DialogResult result = MessageBox.Show("The query under the \"Query Editor\" tab " +
\r
783 "does not match the current GUI settings.\n\nBecause the manual query takes " +
\r
784 "priority over the GUI, your recently updated settings will not be taken " +
\r
785 "into account when encoding this job." + Environment.NewLine + Environment.NewLine +
\r
786 "Do you want to replace the manual query with the updated GUI-generated query?",
\r
787 "Manual Query does not Match GUI",
\r
788 MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk,
\r
789 MessageBoxDefaultButton.Button3);
\r
793 case DialogResult.Yes:
\r
794 // Replace the manual query with the generated one
\r
795 query = generatedQuery;
\r
796 rtf_query.Text = generatedQuery;
\r
798 case DialogResult.No:
\r
799 // Use the manual query
\r
800 query = specifiedQuery;
\r
802 case DialogResult.Cancel:
\r
803 // Don't start the encode
\r
809 query = specifiedQuery;
\r
812 DialogResult overwrite = DialogResult.Yes;
\r
813 if (text_destination.Text != "")
\r
814 if (File.Exists(text_destination.Text))
\r
815 overwrite = MessageBox.Show("The destination file already exists. Are you sure you want to overwrite it?", "Overwrite File?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
817 if (overwrite == DialogResult.Yes)
\r
819 if (encodeQueue.Count == 0)
\r
820 encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));
\r
822 queueWindow.setQueue();
\r
823 if (encodeQueue.Count > 1)
\r
824 queueWindow.Show(false);
\r
826 setEncodeStarted(); // Encode is running, so setup the GUI appropriately
\r
827 encodeQueue.StartEncodeQueue(); // Start The Queue Encoding Process
\r
828 lastAction = "encode"; // Set the last action to encode - Used for activity window.
\r
830 if (ActivityWindow != null)
\r
831 ActivityWindow.SetLogView(false);
\r
836 else if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))
\r
837 MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
840 private void btn_add2Queue_Click(object sender, EventArgs e)
\r
842 if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))
\r
843 MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
846 String query = queryGen.GenerateCLIQuery(this, 0, null);
\r
847 if (rtf_query.Text != "")
\r
848 query = rtf_query.Text;
\r
850 if (encodeQueue.CheckForDestinationDuplicate(text_destination.Text))
\r
852 DialogResult result = MessageBox.Show("There is already a queue item for this destination path. \n\n If you continue, the encode will be overwritten. Do you wish to continue?",
\r
853 "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
\r
854 if (result == DialogResult.Yes)
\r
855 encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));
\r
859 encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));
\r
861 lbl_encode.Text = encodeQueue.Count + " encode(s) pending in the queue";
\r
863 queueWindow.Show();
\r
866 private void btn_showQueue_Click(object sender, EventArgs e)
\r
868 queueWindow.Show();
\r
869 queueWindow.Activate();
\r
871 private void tb_preview_Click(object sender, EventArgs e)
\r
873 if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))
\r
874 MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
877 if (qtpreview == null)
\r
879 qtpreview = new frmPreview(this);
\r
882 else if (qtpreview.IsDisposed)
\r
884 qtpreview = new frmPreview(this);
\r
888 MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
891 private void btn_ActivityWindow_Click(object sender, EventArgs e)
\r
893 String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";
\r
894 if (ActivityWindow == null)
\r
895 ActivityWindow = new frmActivityWindow(file, encodeQueue, this);
\r
897 ActivityWindow.SetLogView(!encodeQueue.isEncoding);
\r
899 ActivityWindow.Show();
\r
903 #region System Tray Icon
\r
904 private void frmMain_Resize(object sender, EventArgs e)
\r
906 if (FormWindowState.Minimized == this.WindowState)
\r
908 notifyIcon.Visible = true;
\r
911 else if (FormWindowState.Normal == this.WindowState)
\r
912 notifyIcon.Visible = false;
\r
914 private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
\r
916 this.Visible = true;
\r
918 this.WindowState = FormWindowState.Normal;
\r
919 notifyIcon.Visible = false;
\r
921 private void btn_restore_Click(object sender, EventArgs e)
\r
923 this.Visible = true;
\r
925 this.WindowState = FormWindowState.Normal;
\r
926 notifyIcon.Visible = false;
\r
930 #region Tab Control
\r
933 private void btn_dvd_source_Click(object sender, EventArgs e)
\r
935 if (DVD_Open.ShowDialog() == DialogResult.OK)
\r
937 this.selectedSourceType = SourceType.Folder;
\r
938 selectSource(DVD_Open.SelectedPath);
\r
941 UpdateSourceLabel();
\r
943 private void btn_file_source_Click(object sender, EventArgs e)
\r
945 if (ISO_Open.ShowDialog() == DialogResult.OK)
\r
947 this.selectedSourceType = SourceType.VideoFile;
\r
948 selectSource(ISO_Open.FileName);
\r
951 UpdateSourceLabel();
\r
953 private void mnu_dvd_drive_Click(object sender, EventArgs e)
\r
955 if (this.dvdDrivePath == null) return;
\r
956 this.selectedSourceType = SourceType.DvdDrive;
\r
957 selectSource(this.dvdDrivePath);
\r
959 private void selectSource(string file)
\r
961 Check_ChapterMarkers.Enabled = true;
\r
962 lastAction = "scan";
\r
963 sourcePath = string.Empty;
\r
965 if (file == string.Empty) // Must have a file or path
\r
968 string[] path = mnu_dvd_drive.Text.Split(' ');
\r
969 filename = path[0];
\r
970 lbl_encode.Text = "
\83X
\83L
\83\83\83\93\92\86...";
\r
971 Form frmRD = new frmReadDVD(filename, this);
\r
972 text_source.Text = filename;
\r
973 frmRD.ShowDialog();
\r
976 // If there are no titles in the dropdown menu then the scan has obviously failed. Display an error message explaining to the user.
\r
977 if (drp_dvdtitle.Items.Count == 0)
\r
978 MessageBox.Show("
\83^
\83C
\83g
\83\8b\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ
\81B
\90³
\82µ
\82¢
\95Ï
\8a·
\8c³
\82ð
\91I
\91ð
\82µ
\82Ä
\82¢
\82é
\82©
\82²
\8am
\94F
\82
\82¾
\82³
\82¢
\81B
\82Ü
\82½
\81A
\83R
\83s
\81[
\83v
\83\8d\83e
\83N
\83g
\82³
\82ê
\82½
\83f
\83B
\83X
\83N
\82É
\82Í
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
980 UpdateSourceLabel();
\r
984 if (file.StartsWith("\\")) // NO UNC Paths
\r
987 "HandBrake
\82ÍUNC
\83p
\83X
\82É
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B\n
\8b¤
\97L
\83t
\83H
\83\8b\83_
\82ð
\83}
\83E
\83\93\83g
\82µ
\82Ä
\8eÀ
\8ds
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B",
\r
988 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
989 UpdateSourceLabel();
\r
993 sourcePath = Path.GetFileName(file);
\r
996 private void drp_dvdtitle_Click(object sender, EventArgs e)
\r
998 if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))
\r
999 MessageBox.Show("
\83^
\83C
\83g
\83\8b\82ª
\91I
\91ð
\82³
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B
\81u
\95Ï
\8a·
\8c³
\81v
\82ð
\83N
\83\8a\83b
\83N
\82µ
\82Ä
\95Ï
\8a·
\8c³
\82ð
\91I
\91ð
\82µ
\82Ä
\82
\82¾
\82³
\82¢", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
\r
1001 private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)
\r
1003 UnRegisterPresetEventHandler();
\r
1005 PictureSettings.lbl_Aspect.Text = "Select a Title"; // Reset some values on the form
\r
1006 drop_chapterStart.Items.Clear();
\r
1007 drop_chapterFinish.Items.Clear();
\r
1009 // If the dropdown is set to automatic nothing else needs to be done.
\r
1010 // Otheriwse if its not, title data has to be loased from parsing.
\r
1011 if (drp_dvdtitle.Text != "Automatic")
\r
1013 selectedTitle = drp_dvdtitle.SelectedItem as Title;
\r
1014 lbl_duration.Text = selectedTitle.Duration.ToString();
\r
1015 PictureSettings.Source = selectedTitle; // Setup Picture Settings Tab Control
\r
1017 // Populate the Angles dropdown
\r
1018 drop_angle.Items.Clear();
\r
1019 if (!Properties.Settings.Default.noDvdNav)
\r
1021 drop_angle.Visible = true;
\r
1022 lbl_angle.Visible = true;
\r
1023 drop_angle.Items.AddRange(selectedTitle.Angles.ToArray());
\r
1024 if (drop_angle.Items.Count != 0)
\r
1025 drop_angle.SelectedIndex = 0;
\r
1029 drop_angle.Visible = false;
\r
1030 lbl_angle.Visible = false;
\r
1033 // Populate the Start chapter Dropdown
\r
1034 drop_chapterStart.Items.Clear();
\r
1035 drop_chapterStart.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
1036 if (drop_chapterStart.Items.Count > 0)
\r
1037 drop_chapterStart.Text = drop_chapterStart.Items[0].ToString();
\r
1039 // Populate the Final Chapter Dropdown
\r
1040 drop_chapterFinish.Items.Clear();
\r
1041 drop_chapterFinish.Items.AddRange(selectedTitle.Chapters.ToArray());
\r
1042 if (drop_chapterFinish.Items.Count > 0)
\r
1043 drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();
\r
1045 // Populate the Audio Channels Dropdown
\r
1046 AudioSettings.SetTrackList(selectedTitle);
\r
1048 // Populate the Subtitles dropdown
\r
1049 Subtitles.drp_subtitleTracks.Items.Clear();
\r
1050 Subtitles.drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");
\r
1051 Subtitles.drp_subtitleTracks.Items.AddRange(selectedTitle.Subtitles.ToArray());
\r
1052 Subtitles.drp_subtitleTracks.SelectedIndex = 0;
\r
1053 Subtitles.Clear();
\r
1054 Subtitles.SetSubtitleTrackAuto();
\r
1057 // Run the autoName & chapterNaming functions
\r
1058 if (Properties.Settings.Default.autoNaming)
\r
1060 string autoPath = Main.autoName(this);
\r
1061 if (autoPath != null)
\r
1062 text_destination.Text = autoPath;
\r
1064 MessageBox.Show("You currently have \"Automatically name output files\" enabled for the destination file box, but you do not have a default directory set.\n\nYou should set a \"Default Path\" in HandBrakes preferences. (See 'Tools' menu -> 'Options' -> 'General' Tab -> 'Default Path')", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
1067 data_chpt.Rows.Clear();
\r
1068 if (selectedTitle.Chapters.Count != 1)
\r
1070 DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1071 if (chapterGridView != null)
\r
1072 data_chpt = chapterGridView;
\r
1076 Check_ChapterMarkers.Checked = false;
\r
1077 Check_ChapterMarkers.Enabled = false;
\r
1080 // Hack to force the redraw of the scrollbars which don't resize properly when the control is disabled.
\r
1081 data_chpt.Columns[0].Width = 166;
\r
1082 data_chpt.Columns[0].Width = 165;
\r
1084 RegisterPresetEventHandler();
\r
1086 private void chapersChanged(object sender, EventArgs e)
\r
1088 Control ctl = (Control)sender;
\r
1089 int chapterStart, chapterEnd;
\r
1090 int.TryParse(drop_chapterStart.Text, out chapterStart);
\r
1091 int.TryParse(drop_chapterFinish.Text, out chapterEnd);
\r
1095 case "drop_chapterStart":
\r
1096 if (drop_chapterFinish.SelectedIndex == -1 && drop_chapterFinish.Items.Count != 0)
\r
1097 drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;
\r
1099 if (chapterEnd != 0)
\r
1100 if (chapterStart > chapterEnd)
\r
1101 drop_chapterFinish.Text = chapterStart.ToString();
\r
1103 case "drop_chapterFinish":
\r
1104 if (drop_chapterStart.Items.Count >= 1 && drop_chapterStart.SelectedIndex == -1)
\r
1105 drop_chapterStart.SelectedIndex = 0;
\r
1107 if (chapterStart != 0)
\r
1108 if (chapterEnd < chapterStart)
\r
1109 drop_chapterFinish.Text = chapterStart.ToString();
\r
1111 // Add more rows to the Chapter menu if needed.
\r
1112 if (Check_ChapterMarkers.Checked)
\r
1114 int i = data_chpt.Rows.Count, finish = 0;
\r
1115 int.TryParse(drop_chapterFinish.Text, out finish);
\r
1117 while (i < finish)
\r
1119 int n = data_chpt.Rows.Add();
\r
1120 data_chpt.Rows[n].Cells[0].Value = (i + 1);
\r
1121 data_chpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);
\r
1122 data_chpt.Rows[n].Cells[0].ValueType = typeof(int);
\r
1123 data_chpt.Rows[n].Cells[1].ValueType = typeof(string);
\r
1130 // Update the Duration
\r
1131 lbl_duration.Text = Main.calculateDuration(drop_chapterStart.SelectedIndex, drop_chapterFinish.SelectedIndex, selectedTitle).ToString();
\r
1133 // Run the Autonaming function
\r
1134 if (Properties.Settings.Default.autoNaming)
\r
1135 text_destination.Text = Main.autoName(this);
\r
1137 // Disable chapter markers if only 1 chapter is selected.
\r
1138 if (chapterStart == chapterEnd)
\r
1140 Check_ChapterMarkers.Enabled = false;
\r
1141 btn_importChapters.Enabled = false;
\r
1142 data_chpt.Enabled = false;
\r
1146 Check_ChapterMarkers.Enabled = true;
\r
1147 if (Check_ChapterMarkers.Checked)
\r
1149 btn_importChapters.Enabled = true;
\r
1150 data_chpt.Enabled = true;
\r
1156 private void btn_destBrowse_Click(object sender, EventArgs e)
\r
1158 // This removes the file extension from the filename box on the save file dialog.
\r
1159 // It's daft but some users don't realise that typing an extension overrides the dropdown extension selected.
\r
1160 DVD_Save.FileName = Path.GetFileNameWithoutExtension(text_destination.Text);
\r
1162 if (Path.IsPathRooted(text_destination.Text))
\r
1163 DVD_Save.InitialDirectory = Path.GetDirectoryName(text_destination.Text);
\r
1165 // Show the dialog and set the main form file path
\r
1166 if (drop_format.SelectedIndex.Equals(0))
\r
1167 DVD_Save.FilterIndex = 1;
\r
1168 else if (drop_format.SelectedIndex.Equals(1))
\r
1169 DVD_Save.FilterIndex = 2;
\r
1171 if (DVD_Save.ShowDialog() == DialogResult.OK)
\r
1173 if (DVD_Save.FileName.StartsWith("\\"))
\r
1174 MessageBox.Show("HandBrake
\82ÍUNC
\83p
\83X
\82É
\91Î
\89\9e\82µ
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B\n
\8b¤
\97L
\83t
\83H
\83\8b\83_
\82ð
\83}
\83E
\83\93\83g
\82µ
\82Ä
\8eÀ
\8ds
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B","Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
\r
1177 // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames
\r
1178 switch (DVD_Save.FilterIndex)
\r
1181 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))
\r
1182 if (Properties.Settings.Default.useM4v)
\r
1183 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".m4v").Replace(".mkv", ".m4v");
\r
1185 DVD_Save.FileName = DVD_Save.FileName.Replace(".m4v", ".mp4").Replace(".mkv", ".mp4");
\r
1188 if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))
\r
1189 DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".mkv").Replace(".m4v", ".mkv");
\r
1195 text_destination.Text = DVD_Save.FileName;
\r
1197 // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)
\r
1198 if (Check_ChapterMarkers.Checked && DVD_Save.FilterIndex != 2)
\r
1199 SetExtension(".m4v");
\r
1203 private void text_destination_TextChanged(object sender, EventArgs e)
\r
1205 string path = text_destination.Text;
\r
1206 if (path.EndsWith(".mp4") || path.EndsWith(".m4v"))
\r
1207 drop_format.SelectedIndex = 0;
\r
1208 else if (path.EndsWith(".mkv"))
\r
1209 drop_format.SelectedIndex = 1;
\r
1212 // Output Settings
\r
1213 private void drop_format_SelectedIndexChanged(object sender, EventArgs e)
\r
1215 switch (drop_format.SelectedIndex)
\r
1218 if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())
\r
1219 SetExtension(".m4v");
\r
1221 SetExtension(".mp4");
\r
1224 SetExtension(".mkv");
\r
1228 AudioSettings.SetContainer(drop_format.Text);
\r
1229 Subtitles.SetContainer(drop_format.SelectedIndex);
\r
1231 if (drop_format.Text.Contains("MP4"))
\r
1233 if (drp_videoEncoder.Items.Contains("VP3 (Theora)"))
\r
1235 drp_videoEncoder.Items.Remove("VP3 (Theora)");
\r
1236 drp_videoEncoder.SelectedIndex = 1;
\r
1239 else if (drop_format.Text.Contains("MKV"))
\r
1240 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
1242 public void SetExtension(string newExtension)
\r
1244 if (newExtension == ".mp4" || newExtension == ".m4v")
\r
1245 if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())
\r
1246 newExtension = ".m4v";
\r
1248 newExtension = ".mp4";
\r
1250 if (Path.HasExtension(newExtension))
\r
1251 text_destination.Text = Path.ChangeExtension(text_destination.Text, newExtension);
\r
1255 private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)
\r
1257 setContainerOpts();
\r
1259 //Turn off some options which are H.264 only when the user selects a non h.264 encoder
\r
1260 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1262 if (check_2PassEncode.CheckState == CheckState.Checked)
\r
1263 check_turbo.Enabled = true;
\r
1265 tab_advanced.Enabled = true;
\r
1266 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
1267 check_iPodAtom.Enabled = true;
\r
1269 check_iPodAtom.Enabled = false;
\r
1273 check_turbo.CheckState = CheckState.Unchecked;
\r
1274 check_turbo.Enabled = false;
\r
1275 tab_advanced.Enabled = false;
\r
1276 x264Panel.x264Query = "";
\r
1277 check_iPodAtom.Enabled = false;
\r
1278 check_iPodAtom.Checked = false;
\r
1281 // Setup the CQ Slider
\r
1282 switch (drp_videoEncoder.Text)
\r
1284 case "MPEG-4 (FFmpeg)":
\r
1285 if (slider_videoQuality.Value > 31)
\r
1286 slider_videoQuality.Value = 20; // Just reset to 70% QP 10 on encode change.
\r
1287 slider_videoQuality.Minimum = 1;
\r
1288 slider_videoQuality.Maximum = 31;
\r
1290 case "H.264 (x264)":
\r
1291 slider_videoQuality.Minimum = 0;
\r
1292 slider_videoQuality.TickFrequency = 1;
\r
1294 CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
\r
1295 double cqStep = Properties.Settings.Default.x264cqstep;
\r
1296 double multiplier = 1.0 / cqStep;
\r
1297 double value = slider_videoQuality.Value * multiplier;
\r
1299 switch (Properties.Settings.Default.x264cqstep.ToString(culture))
\r
1302 slider_videoQuality.Maximum = 255;
\r
1305 slider_videoQuality.Maximum = 204;
\r
1308 slider_videoQuality.Maximum = 102;
\r
1311 slider_videoQuality.Maximum = 51;
\r
1314 slider_videoQuality.Maximum = 51;
\r
1317 if (value < slider_videoQuality.Maximum)
\r
1318 slider_videoQuality.Value = slider_videoQuality.Maximum - (int)value;
\r
1321 case "VP3 (Theora)":
\r
1322 if (slider_videoQuality.Value > 63)
\r
1323 slider_videoQuality.Value = 45; // Just reset to 70% QP 45 on encode change.
\r
1324 slider_videoQuality.Minimum = 0;
\r
1325 slider_videoQuality.Maximum = 63;
\r
1330 /// Set the container format options
\r
1332 public void setContainerOpts()
\r
1334 if ((drop_format.Text.Contains("MP4")) || (drop_format.Text.Contains("M4V")))
\r
1336 check_largeFile.Enabled = true;
\r
1337 check_optimiseMP4.Enabled = true;
\r
1338 check_iPodAtom.Enabled = true;
\r
1342 check_largeFile.Enabled = false;
\r
1343 check_optimiseMP4.Enabled = false;
\r
1344 check_iPodAtom.Enabled = false;
\r
1345 check_largeFile.Checked = false;
\r
1346 check_optimiseMP4.Checked = false;
\r
1347 check_iPodAtom.Checked = false;
\r
1350 private double _cachedCqStep = Properties.Settings.Default.x264cqstep;
\r
1352 /// Update the CQ slider for x264 for a new CQ step. This is set from option
\r
1354 public void setQualityFromSlider()
\r
1356 // Work out the current RF value.
\r
1357 double cqStep = _cachedCqStep;
\r
1358 double rfValue = 51.0 - slider_videoQuality.Value * cqStep;
\r
1360 // Change the maximum value for the slider
\r
1361 switch (Properties.Settings.Default.x264cqstep.ToString(new CultureInfo("en-US")))
\r
1364 slider_videoQuality.Maximum = 255;
\r
1367 slider_videoQuality.Maximum = 204;
\r
1370 slider_videoQuality.Maximum = 102;
\r
1373 slider_videoQuality.Maximum = 51;
\r
1376 slider_videoQuality.Maximum = 51;
\r
1380 // Reset the CQ slider to RF0
\r
1381 slider_videoQuality.Value = slider_videoQuality.Maximum;
\r
1383 // Reset the CQ slider back to the previous value as close as possible
\r
1384 double cqStepNew = Properties.Settings.Default.x264cqstep;
\r
1385 double rfValueCurrent = 51.0 - slider_videoQuality.Value * cqStepNew;
\r
1386 while (rfValueCurrent < rfValue)
\r
1388 slider_videoQuality.Value--;
\r
1389 rfValueCurrent = 51.0 - slider_videoQuality.Value * cqStepNew;
\r
1392 // Cache the CQ step for the next calculation
\r
1393 _cachedCqStep = Properties.Settings.Default.x264cqstep;
\r
1395 private void slider_videoQuality_Scroll(object sender, EventArgs e)
\r
1397 double cqStep = Properties.Settings.Default.x264cqstep;
\r
1398 switch (drp_videoEncoder.Text)
\r
1400 case "MPEG-4 (FFmpeg)":
\r
1401 double rfValue = 31 - (slider_videoQuality.Value - 1);
\r
1402 double max = slider_videoQuality.Maximum;
\r
1403 double min = slider_videoQuality.Minimum;
\r
1404 double val = ((max - min) - (rfValue - min)) / (max - min);
\r
1405 SliderValue.Text = Math.Round((val * 100), 2).ToString(new CultureInfo("en-US")) + "% QP:" + (32 - slider_videoQuality.Value);
\r
1407 case "H.264 (x264)":
\r
1408 rfValue = 51.0 - slider_videoQuality.Value * cqStep;
\r
1409 max = slider_videoQuality.Maximum * cqStep;
\r
1410 min = slider_videoQuality.Minimum;
\r
1411 val = ((max - min) - (rfValue - min)) / (max - min);
\r
1412 rfValue = Math.Round(rfValue, 2);
\r
1413 SliderValue.Text = Math.Round((val * 100), 2).ToString(new CultureInfo("en-US")) + "% RF:" + rfValue.ToString(new CultureInfo("en-US"));
\r
1415 case "VP3 (Theora)":
\r
1416 rfValue = slider_videoQuality.Value;
\r
1417 double value = rfValue / 63;
\r
1418 SliderValue.Text = Math.Round((value * 100), 2).ToString(new CultureInfo("en-US")) + "% QP:" + slider_videoQuality.Value;
\r
1422 private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)
\r
1424 text_bitrate.Enabled = false;
\r
1425 text_filesize.Enabled = true;
\r
1426 slider_videoQuality.Enabled = false;
\r
1428 check_2PassEncode.Enabled = true;
\r
1430 private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)
\r
1432 text_bitrate.Enabled = true;
\r
1433 text_filesize.Enabled = false;
\r
1434 slider_videoQuality.Enabled = false;
\r
1436 check_2PassEncode.Enabled = true;
\r
1438 private void radio_cq_CheckedChanged(object sender, EventArgs e)
\r
1440 text_bitrate.Enabled = false;
\r
1441 text_filesize.Enabled = false;
\r
1442 slider_videoQuality.Enabled = true;
\r
1444 check_2PassEncode.Enabled = false;
\r
1445 check_2PassEncode.CheckState = CheckState.Unchecked;
\r
1447 private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)
\r
1449 if (check_2PassEncode.CheckState.ToString() == "Checked")
\r
1451 if (drp_videoEncoder.Text.Contains("H.264"))
\r
1452 check_turbo.Enabled = true;
\r
1456 check_turbo.Enabled = false;
\r
1457 check_turbo.CheckState = CheckState.Unchecked;
\r
1461 // Chapter Marker Tab
\r
1462 private void Check_ChapterMarkers_CheckedChanged(object sender, EventArgs e)
\r
1464 if (Check_ChapterMarkers.Checked)
\r
1466 if (drop_format.SelectedIndex != 1)
\r
1467 SetExtension(".m4v");
\r
1468 data_chpt.Enabled = true;
\r
1469 btn_importChapters.Enabled = true;
\r
1473 if (drop_format.SelectedIndex != 1 && !Properties.Settings.Default.useM4v)
\r
1474 SetExtension(".mp4");
\r
1475 data_chpt.Enabled = false;
\r
1476 btn_importChapters.Enabled = false;
\r
1479 private void btn_importChapters_Click(object sender, EventArgs e)
\r
1481 if (File_ChapterImport.ShowDialog() == DialogResult.OK)
\r
1483 String filename = File_ChapterImport.FileName;
\r
1484 DataGridView imported = Main.importChapterNames(data_chpt, filename);
\r
1485 if (imported != null)
\r
1486 data_chpt = imported;
\r
1489 private void mnu_resetChapters_Click(object sender, EventArgs e)
\r
1491 data_chpt.Rows.Clear();
\r
1492 DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);
\r
1493 if (chapterGridView != null)
\r
1495 data_chpt = chapterGridView;
\r
1499 // Query Editor Tab
\r
1500 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1502 rtf_query.Text = queryGen.GenerateCLIQuery(this, 0, null);
\r
1504 private void btn_clear_Click(object sender, EventArgs e)
\r
1506 rtf_query.Clear();
\r
1510 // MainWindow Components, Actions and Functions ***********************
\r
1512 #region Source Scan
\r
1513 public Boolean isScanning { get; set; }
\r
1514 private static int scanProcessID { get; set; }
\r
1515 private void startScan(String filename)
\r
1517 // Setup the GUI components for the scan.
\r
1518 sourcePath = filename;
\r
1519 foreach (Control ctrl in Controls)
\r
1520 if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))
\r
1521 ctrl.Enabled = false;
\r
1523 lbl_encode.Visible = true;
\r
1524 lbl_encode.Text = "Scanning ...";
\r
1525 btn_source.Enabled = false;
\r
1526 btn_start.Enabled = false;
\r
1527 btn_showQueue.Enabled = false;
\r
1528 btn_add2Queue.Enabled = false;
\r
1529 tb_preview.Enabled = false;
\r
1530 mnu_killCLI.Visible = true;
\r
1532 // Start hte Scan Thread
\r
1535 if (ActivityWindow != null)
\r
1536 ActivityWindow.SetLogView(true);
\r
1537 isScanning = true;
\r
1538 ThreadPool.QueueUserWorkItem(scanProcess);
\r
1540 catch (Exception exc)
\r
1542 MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1545 private void scanProcess(object state)
\r
1549 string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");
\r
1550 string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
\r
1551 string dvdInfoPath = Path.Combine(logDir, "last_scan_log.txt");
\r
1553 // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)
\r
1554 if (File.Exists(dvdInfoPath))
\r
1555 File.Delete(dvdInfoPath);
\r
1557 String dvdnav = string.Empty;
\r
1558 if (Properties.Settings.Default.noDvdNav)
\r
1559 dvdnav = " --no-dvdnav";
\r
1560 string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 {2} -v >""{3}"" 2>&1""", handbrakeCLIPath, sourcePath, dvdnav, dvdInfoPath);
\r
1562 ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };
\r
1564 Boolean cleanExit = true;
\r
1565 using (hbproc = Process.Start(hbParseDvd))
\r
1567 Process[] before = Process.GetProcesses(); // Get a list of running processes before starting.
\r
1568 scanProcessID = Main.getCliProcess(before);
\r
1569 hbproc.WaitForExit();
\r
1570 if (hbproc.ExitCode != 0)
\r
1571 cleanExit = false;
\r
1574 if (cleanExit) // If 0 exit code, CLI exited cleanly.
\r
1576 if (!File.Exists(dvdInfoPath))
\r
1577 throw new Exception("Unable to retrieve the DVD Info. last_scan_log.txt is missing. \nExpected location of last_scan_log.txt: \n"
\r
1580 using (StreamReader sr = new StreamReader(dvdInfoPath))
\r
1582 thisDVD = DVD.Parse(sr);
\r
1587 updateUIafterScan();
\r
1590 catch (Exception exc)
\r
1592 MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1596 private void updateUIafterScan()
\r
1600 if (InvokeRequired)
\r
1602 BeginInvoke(new UpdateWindowHandler(updateUIafterScan));
\r
1606 // Setup some GUI components
\r
1607 drp_dvdtitle.Items.Clear();
\r
1608 if (thisDVD.Titles.Count != 0)
\r
1609 drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());
\r
1611 // Now select the longest title
\r
1612 if (thisDVD.Titles.Count != 0)
\r
1613 drp_dvdtitle.SelectedItem = Main.selectLongestTitle(thisDVD);
\r
1615 // Enable the creation of chapter markers if the file is an image of a dvd.
\r
1616 if (sourcePath.ToLower().Contains(".iso") || sourcePath.Contains("VIDEO_TS"))
\r
1617 Check_ChapterMarkers.Enabled = true;
\r
1618 else if (Directory.Exists(Path.Combine(sourcePath, "VIDEO_TS")))
\r
1619 Check_ChapterMarkers.Enabled = true;
\r
1622 Check_ChapterMarkers.Enabled = false;
\r
1623 Check_ChapterMarkers.Checked = false;
\r
1624 data_chpt.Rows.Clear();
\r
1627 // If no titles were found, Display an error message
\r
1628 if (drp_dvdtitle.Items.Count == 0)
\r
1631 "No Title(s) found. \n\nYour Source may be copy protected, badly mastered or in a format which HandBrake does not support. \nPlease refer to the Documentation and FAQ (see Help Menu).",
\r
1632 "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
\r
1633 sourcePath = string.Empty;
\r
1635 UpdateSourceLabel();
\r
1637 // Enable the GUI components and enable any disabled components
\r
1640 catch (Exception exc)
\r
1642 MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1646 private void enableGUI()
\r
1650 if (InvokeRequired)
\r
1651 BeginInvoke(new UpdateWindowHandler(enableGUI));
\r
1652 lbl_encode.Text = "Scan Completed";
\r
1653 foreach (Control ctrl in Controls)
\r
1654 ctrl.Enabled = true;
\r
1655 btn_start.Enabled = true;
\r
1656 btn_showQueue.Enabled = true;
\r
1657 btn_add2Queue.Enabled = true;
\r
1658 tb_preview.Enabled = true;
\r
1659 btn_source.Enabled = true;
\r
1660 mnu_killCLI.Visible = false;
\r
1662 catch (Exception exc)
\r
1664 MessageBox.Show("frmMain.cs - enableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1667 private void killScan()
\r
1674 Process[] prs = Process.GetProcesses();
\r
1675 foreach (Process process in prs)
\r
1677 if (process.Id == scanProcessID)
\r
1679 process.Refresh();
\r
1680 if (!process.HasExited)
\r
1687 private void btn_reset_Click(object sender, EventArgs e)
\r
1689 rtf_x264Query.Text = "";
\r
1690 x264PanelFunctions.reset2Defaults(this);
\r
1693 // Query Editor Tab
\r
1694 private void btn_generate_Query_Click(object sender, EventArgs e)
\r
1696 rtf_query.Text = queryGen.GenerateTheQuery(this);
\r
1698 private void btn_clear_Click(object sender, EventArgs e)
\r
1700 rtf_query.Clear();
\r
1704 private void btn_addPreset_Click(object sender, EventArgs e)
\r
1706 // Remember each nodes expanded status so we can reload it
\r
1707 List<Boolean> nodeStatus = saveTreeViewState();
\r
1708 nodeStatus.Add(true);
\r
1710 // Now add the new preset
\r
1711 Form preset = new frmAddPreset(this, queryGen.GenerateTheQuery(this), presetHandler);
\r
1712 preset.ShowDialog();
\r
1714 // Now reload the TreeView states
\r
1715 loadTreeViewStates(nodeStatus);
\r
1717 private void btn_removePreset_Click(object sender, EventArgs e)
\r
1719 DialogResult result = MessageBox.Show("
\91I
\91ð
\82µ
\82½
\83v
\83\8a\83Z
\83b
\83g
\82ð
\8dí
\8f\9c\82µ
\82Ü
\82·
\82©
\81H", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
1720 if (result == DialogResult.Yes)
\r
1722 catch (Exception ex)
\r
1724 MessageBox.Show("Unable to kill HandBrakeCLI.exe \nYou may need to manually kill HandBrakeCLI.exe using the Windows Task Manager if it does not close automatically within the next few minutes. \n\nError Information: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1727 private void resetGUI()
\r
1730 String query = queryGen.GenerateTheQuery(this);
\r
1731 Properties.Settings.Default.defaultUserSettings = query;
\r
1732 // Save the new default Settings
\r
1733 Properties.Settings.Default.Save();
\r
1734 MessageBox.Show("
\83f
\83t
\83H
\83\8b\83g
\90Ý
\92è
\82ª
\95Û
\91¶
\82³
\82ê
\82Ü
\82µ
\82½", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
\r
1736 drp_dvdtitle.Items.Clear();
\r
1737 drop_chapterStart.Items.Clear();
\r
1738 drop_chapterFinish.Items.Clear();
\r
1739 lbl_duration.Text = "Select a Title";
\r
1740 PictureSettings.lbl_src_res.Text = "Select a Title";
\r
1741 PictureSettings.lbl_Aspect.Text = "Select a Title";
\r
1742 sourcePath = String.Empty;
\r
1743 text_destination.Text = String.Empty;
\r
1745 selectedTitle = null;
\r
1746 isScanning = false;
\r
1748 private void UpdateSourceLabel()
\r
1750 labelSource.Text = string.IsNullOrEmpty(sourcePath) ? "Select \"Source\" to continue." : this.SourceName;
\r
1756 /// Set the GUI to it's finished encoding state.
\r
1758 private void setEncodeFinished()
\r
1763 DialogResult result = MessageBox.Show("
\91I
\91ð
\82µ
\82½
\83v
\83\8a\83Z
\83b
\83g
\82ð
\8dí
\8f\9c\82µ
\82Ü
\82·
\82©
\81H", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
1764 if (result == DialogResult.Yes)
\r
1766 if (InvokeRequired)
\r
1768 BeginInvoke(new UpdateWindowHandler(setEncodeFinished));
\r
1772 lbl_encode.Text = "Encoding Finished";
\r
1773 btn_start.Text = "Start";
\r
1774 btn_start.ToolTipText = "Start the encoding process";
\r
1775 btn_start.Image = Properties.Resources.Play;
\r
1777 // If the window is minimized, display the notification in a popup.
\r
1778 if (Properties.Settings.Default.trayIconAlerts)
\r
1779 if (FormWindowState.Minimized == this.WindowState)
\r
1781 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
1782 notifyIcon.ShowBalloonTip(500);
\r
1785 catch (Exception exc)
\r
1787 MessageBox.Show(exc.ToString());
\r
1792 /// Set the GUI to it's started encoding state.
\r
1794 private void setEncodeStarted()
\r
1798 if (InvokeRequired)
\r
1800 BeginInvoke(new UpdateWindowHandler(setEncodeStarted));
\r
1804 lbl_encode.Visible = true;
\r
1805 lbl_encode.Text = "Encoding with " + encodeQueue.Count + " encode(s) pending";
\r
1806 btn_start.Text = "Stop";
\r
1807 btn_start.ToolTipText = "Stop the encoding process.";
\r
1808 btn_start.Image = Properties.Resources.stop;
\r
1810 catch (Exception exc)
\r
1812 MessageBox.Show(exc.ToString());
\r
1817 #region DVD Drive Detection
\r
1818 private void getDriveInfoThread()
\r
1822 if (InvokeRequired)
\r
1824 BeginInvoke(new UpdateWindowHandler(getDriveInfoThread));
\r
1828 Boolean foundDrive = false;
\r
1829 DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();
\r
1830 foreach (DriveInfo curDrive in theCollectionOfDrives)
\r
1832 if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)
\r
1834 if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1837 if (File.Exists(curDrive.RootDirectory.ToString() + "VIDEO_TS\\VIDEO_TS.IFO"))
\r
1838 mnu_dvd_drive.Text = curDrive.RootDirectory.ToString() + "VIDEO_TS (" + curDrive.VolumeLabel + ")";
\r
1840 mnu_dvd_drive.Text = "[DVD
\83h
\83\89\83C
\83u
\82É
\83f
\83B
\83X
\83N
\82ª
\82 \82è
\82Ü
\82¹
\82ñ]";
\r
1843 this.dvdDrivePath = curDrive.RootDirectory + "VIDEO_TS";
\r
1844 this.dvdDriveLabel = curDrive.VolumeLabel;
\r
1845 mnu_dvd_drive.Text = this.dvdDrivePath + " (" + this.dvdDriveLabel + ")";
\r
1846 foundDrive = true;
\r
1852 if (foundDrive == false)
\r
1853 mnu_dvd_drive.Text = "[DVD
\83h
\83\89\83C
\83u
\82É
\83f
\83B
\83X
\83N
\82ª
\82 \82è
\82Ü
\82¹
\82ñ]";
\r
1857 mnu_dvd_drive.Text = "[DVD
\83h
\83\89\83C
\83u
\82É
\83f
\83B
\83X
\83N
\82ª
\82 \82è
\82Ü
\82¹
\82ñ]";
\r
1863 #region Audio Panel Stuff
\r
1864 public void setAudioByContainer(String path)
\r
1866 string oldval = "";
\r
1868 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
1870 oldval = drp_audenc_1.Text;
\r
1871 drp_audenc_1.Items.Clear();
\r
1872 drp_audenc_1.Items.Add("AAC");
\r
1873 drp_audenc_1.Items.Add("AC3");
\r
1874 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1875 drp_audenc_1.SelectedIndex = 0;
\r
1877 oldval = drp_audenc_2.Text;
\r
1878 drp_audenc_2.Items.Clear();
\r
1879 drp_audenc_2.Items.Add("AAC");
\r
1880 drp_audenc_2.Items.Add("AC3");
\r
1881 if (drp_audenc_2.Enabled)
\r
1883 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1884 drp_audenc_2.SelectedIndex = 0;
\r
1887 oldval = drp_audenc_3.Text;
\r
1888 drp_audenc_3.Items.Clear();
\r
1889 drp_audenc_3.Items.Add("AAC");
\r
1890 drp_audenc_3.Items.Add("AC3");
\r
1891 if (drp_audenc_3.Enabled)
\r
1893 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1894 drp_audenc_3.SelectedIndex = 0;
\r
1897 oldval = drp_audenc_4.Text;
\r
1898 drp_audenc_4.Items.Clear();
\r
1899 drp_audenc_4.Items.Add("AAC");
\r
1900 drp_audenc_4.Items.Add("AC3");
\r
1901 if (drp_audenc_4.Enabled)
\r
1903 if ((oldval != "AAC") && (oldval != "AC3"))
\r
1904 drp_audenc_4.SelectedIndex = 0;
\r
1907 else if (path.EndsWith(".avi"))
\r
1909 oldval = drp_audenc_1.Text;
\r
1910 drp_audenc_1.Items.Clear();
\r
1911 drp_audenc_1.Items.Add("MP3");
\r
1912 drp_audenc_1.Items.Add("AC3");
\r
1913 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1914 drp_audenc_1.SelectedIndex = 0;
\r
1916 oldval = drp_audenc_2.Text;
\r
1917 drp_audenc_2.Items.Clear();
\r
1918 drp_audenc_2.Items.Add("MP3");
\r
1919 drp_audenc_2.Items.Add("AC3");
\r
1920 if (drp_audenc_2.Enabled)
\r
1922 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1923 drp_audenc_2.SelectedIndex = 0;
\r
1927 oldval = drp_audenc_3.Text;
\r
1928 drp_audenc_3.Items.Clear();
\r
1929 drp_audenc_3.Items.Add("MP3");
\r
1930 drp_audenc_3.Items.Add("AC3");
\r
1931 if (drp_audenc_3.Enabled)
\r
1933 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1934 drp_audenc_3.SelectedIndex = 0;
\r
1937 oldval = drp_audenc_4.Text;
\r
1938 drp_audenc_4.Items.Clear();
\r
1939 drp_audenc_4.Items.Add("MP3");
\r
1940 drp_audenc_4.Items.Add("AC3");
\r
1941 if (drp_audenc_4.Enabled)
\r
1943 if ((oldval != "MP3") && (oldval != "AC3"))
\r
1944 drp_audenc_4.SelectedIndex = 0;
\r
1947 else if (path.EndsWith(".ogm"))
\r
1949 drp_audenc_1.Items.Clear();
\r
1950 drp_audenc_1.Items.Add("Vorbis");
\r
1951 drp_audenc_1.SelectedIndex = 0;
\r
1953 drp_audenc_2.Items.Clear();
\r
1954 drp_audenc_2.Items.Add("Vorbis");
\r
1955 if (drp_audenc_2.Enabled)
\r
1956 drp_audenc_2.SelectedIndex = 0;
\r
1958 drp_audenc_3.Items.Clear();
\r
1959 drp_audenc_3.Items.Add("Vorbis");
\r
1960 if (drp_audenc_3.Enabled)
\r
1961 drp_audenc_3.SelectedIndex = 0;
\r
1963 drp_audenc_4.Items.Clear();
\r
1964 drp_audenc_4.Items.Add("Vorbis");
\r
1965 if (drp_audenc_4.Enabled)
\r
1966 drp_audenc_4.SelectedIndex = 0;
\r
1968 else if (path.EndsWith(".mkv"))
\r
1970 drp_audenc_1.Items.Clear();
\r
1971 drp_audenc_1.Items.Add("AAC");
\r
1972 drp_audenc_1.Items.Add("MP3");
\r
1973 drp_audenc_1.Items.Add("AC3");
\r
1974 drp_audenc_1.Items.Add("Vorbis");
\r
1975 if (drp_audenc_1.Text == string.Empty)
\r
1976 drp_audenc_1.SelectedIndex = 0;
\r
1979 drp_audenc_2.Items.Clear();
\r
1980 drp_audenc_2.Items.Add("AAC");
\r
1981 drp_audenc_2.Items.Add("MP3");
\r
1982 drp_audenc_2.Items.Add("AC3");
\r
1983 drp_audenc_2.Items.Add("Vorbis");
\r
1984 if (drp_audenc_2.Enabled)
\r
1986 if (drp_audenc_2.Text == string.Empty)
\r
1987 drp_audenc_2.SelectedIndex = 0;
\r
1990 drp_audenc_3.Items.Clear();
\r
1991 drp_audenc_3.Items.Add("AAC");
\r
1992 drp_audenc_3.Items.Add("MP3");
\r
1993 drp_audenc_3.Items.Add("AC3");
\r
1994 drp_audenc_3.Items.Add("Vorbis");
\r
1995 if (drp_audenc_3.Enabled)
\r
1997 if (drp_audenc_3.Text == string.Empty)
\r
1998 drp_audenc_3.SelectedIndex = 0;
\r
2001 drp_audenc_4.Items.Clear();
\r
2002 drp_audenc_4.Items.Add("AAC");
\r
2003 drp_audenc_4.Items.Add("MP3");
\r
2004 drp_audenc_4.Items.Add("AC3");
\r
2005 drp_audenc_4.Items.Add("Vorbis");
\r
2006 if (drp_audenc_4.Enabled)
\r
2008 if (drp_audenc_4.Text == string.Empty)
\r
2009 drp_audenc_4.SelectedIndex = 0;
\r
2013 public void setVideoByContainer(String path)
\r
2015 string oldval = "";
\r
2017 if ((path.EndsWith(".mp4")) || (path.EndsWith(".m4v")))
\r
2019 oldval = drp_videoEncoder.Text;
\r
2020 drp_videoEncoder.Items.Clear();
\r
2021 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
2022 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
2023 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
2024 if (oldval == "VP3 (Theora)")
\r
2025 drp_videoEncoder.SelectedIndex = 2;
\r
2027 drp_videoEncoder.Text = oldval;
\r
2030 else if (path.EndsWith(".avi"))
\r
2032 oldval = drp_videoEncoder.Text;
\r
2033 drp_videoEncoder.Items.Clear();
\r
2034 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
2035 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
2036 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
2037 if (oldval == "VP3 (Theora)")
\r
2038 drp_videoEncoder.SelectedIndex = 2;
\r
2040 drp_videoEncoder.Text = oldval;
\r
2042 else if (path.EndsWith(".ogm"))
\r
2044 oldval = drp_videoEncoder.Text;
\r
2045 drp_videoEncoder.Items.Clear();
\r
2046 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
2047 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
2048 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
2049 if (oldval == "H.264 (x264)")
\r
2050 drp_videoEncoder.SelectedIndex = 2;
\r
2052 drp_videoEncoder.Text = oldval;
\r
2054 else if (path.EndsWith(".mkv"))
\r
2056 oldval = drp_videoEncoder.Text;
\r
2057 drp_videoEncoder.Items.Clear();
\r
2058 drp_videoEncoder.Items.Add("MPEG-4 (FFmpeg)");
\r
2059 drp_videoEncoder.Items.Add("MPEG-4 (XviD)");
\r
2060 drp_videoEncoder.Items.Add("H.264 (x264)");
\r
2061 drp_videoEncoder.Items.Add("VP3 (Theora)");
\r
2062 drp_videoEncoder.Text = oldval;
\r
2065 public void setBitrateSelections384(ComboBox dropDown)
\r
2067 dropDown.Items.Clear();
\r
2068 dropDown.Items.Add("32");
\r
2069 dropDown.Items.Add("40");
\r
2070 dropDown.Items.Add("48");
\r
2071 dropDown.Items.Add("56");
\r
2072 dropDown.Items.Add("64");
\r
2073 dropDown.Items.Add("80");
\r
2074 dropDown.Items.Add("86");
\r
2075 dropDown.Items.Add("112");
\r
2076 dropDown.Items.Add("128");
\r
2077 dropDown.Items.Add("160");
\r
2078 dropDown.Items.Add("192");
\r
2079 dropDown.Items.Add("224");
\r
2080 dropDown.Items.Add("256");
\r
2081 dropDown.Items.Add("320");
\r
2082 dropDown.Items.Add("384");
\r
2084 public void setBitrateSelections320(ComboBox dropDown)
\r
2086 dropDown.Items.Clear();
\r
2087 dropDown.Items.Add("32");
\r
2088 dropDown.Items.Add("40");
\r
2089 dropDown.Items.Add("48");
\r
2090 dropDown.Items.Add("56");
\r
2091 dropDown.Items.Add("64");
\r
2092 dropDown.Items.Add("80");
\r
2093 dropDown.Items.Add("86");
\r
2094 dropDown.Items.Add("112");
\r
2095 dropDown.Items.Add("128");
\r
2096 dropDown.Items.Add("160");
\r
2097 dropDown.Items.Add("192");
\r
2098 dropDown.Items.Add("224");
\r
2099 dropDown.Items.Add("256");
\r
2100 dropDown.Items.Add("320");
\r
2102 public void setBitrateSelections160(ComboBox dropDown)
\r
2104 dropDown.Items.Clear();
\r
2105 dropDown.Items.Add("32");
\r
2106 dropDown.Items.Add("40");
\r
2107 dropDown.Items.Add("48");
\r
2108 dropDown.Items.Add("56");
\r
2109 dropDown.Items.Add("64");
\r
2110 dropDown.Items.Add("80");
\r
2111 dropDown.Items.Add("86");
\r
2112 dropDown.Items.Add("112");
\r
2113 dropDown.Items.Add("128");
\r
2114 dropDown.Items.Add("160");
\r
2121 private delegate void UpdateUIHandler();
\r
2123 // Encoding Functions
\r
2124 private void procMonitor(object state)
\r
2126 // Make sure we are not already encoding and if we are then display an error.
\r
2127 if (hbProc != null)
\r
2128 hbProc.CloseMainWindow();
\r
2131 hbProc = cliObj.runCli(this, (string)state);
\r
2132 hbProc.WaitForExit();
\r
2133 setEncodeLabelFinished();
\r
2136 // If the window is minimized, display the notification in a popup.
\r
2137 if (FormWindowState.Minimized == this.WindowState)
\r
2139 notifyIcon.BalloonTipText = lbl_encode.Text;
\r
2140 notifyIcon.ShowBalloonTip(500);
\r
2143 // After the encode is done, we may want to shutdown, suspend etc.
\r
2144 cliObj.addCLIQueryToLog((string)state);
\r
2145 cliObj.copyLog((string)state); // Make a copy of the log in the users desired location if necessary
\r
2146 cliObj.afterEncodeAction();
\r
2149 private void setEncodeLabelFinished()
\r
2151 if (this.InvokeRequired)
\r
2153 this.BeginInvoke(new UpdateUIHandler(setEncodeLabelFinished));
\r
2156 lbl_encode.Text = "
\83G
\83\93\83R
\81[
\83h
\8a®
\97¹";
\r
2157 btn_start.Text = "
\95Ï
\8a·
\8aJ
\8en";
\r
2158 btn_start.ToolTipText = "
\83G
\83\93\83R
\81[
\83h
\8f\88\97\9d\82ð
\8aJ
\8en
\82µ
\82Ü
\82·";
\r
2159 btn_start.Image = Properties.Resources.Play;
\r
2165 #region Public Methods
\r
2167 /// Access the preset Handler and setup the preset panel.
\r
2169 public void loadPresetPanel()
\r
2171 if (presetHandler.CheckIfPresetsAreOutOfDate())
\r
2172 if (!Properties.Settings.Default.presetNotification)
\r
2173 MessageBox.Show(splash,
\r
2174 "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",
\r
2175 "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
\r
2177 presetHandler.GetPresetPanel(ref treeView_presets);
\r
2178 treeView_presets.Update();
\r
2184 /// If the queue is being processed, prompt the user to confirm application close.
\r
2186 /// <param name="e"></param>
\r
2187 protected override void OnFormClosing(FormClosingEventArgs e)
\r
2189 // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.
\r
2190 if ((encodeQueue.isEncoding) && (!encodeQueue.PauseRequested) && (encodeQueue.Count > 0))
\r
2192 DialogResult result = MessageBox.Show("HandBrake has queue items to process. Closing HandBrake will not stop the current encoding, but will stop processing the queue.\n\nDo you want to close HandBrake?",
\r
2193 "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
\r
2194 if (result == DialogResult.No)
\r
2197 base.OnFormClosing(e);
\r
2201 #region In-GUI Encode Status (Experimental)
\r
2202 private void encodeMonitorThread()
\r
2206 Parser encode = new Parser(encodeQueue.hbProcess.StandardOutput.BaseStream);
\r
2207 encode.OnEncodeProgress += encodeOnEncodeProgress;
\r
2208 while (!encode.EndOfStream)
\r
2209 encode.readEncodeStatus();
\r
2211 catch (Exception exc)
\r
2213 MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
2216 private void encodeOnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)
\r
2218 if (this.InvokeRequired)
\r
2220 this.BeginInvoke(new EncodeProgressEventHandler(encodeOnEncodeProgress),
\r
2221 new object[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });
\r
2224 lbl_encode.Text = string.Format("Encode Progress: {0}%, FPS: {1}, Avg FPS: {2}, Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);
\r
2229 private enum SourceType
\r
2238 // This is the END of the road ****************************************
\r