summaryrefslogtreecommitdiffstats
path: root/win/CS/HandBrakeWPF/ViewModels
diff options
context:
space:
mode:
authorsr55 <[email protected]>2015-01-17 23:03:53 +0000
committersr55 <[email protected]>2015-01-17 23:03:53 +0000
commit9250daa1b69db695007f2b43ae19ec2d66112ef9 (patch)
tree1bf8b813f10f78f6155ba367d23503bdcd03554a /win/CS/HandBrakeWPF/ViewModels
parent7f7da739dc4485771416931aab652b6651737d69 (diff)
WinGui: Combine the Still and Live previews into a single window in the same style as the Mac and Linux GUI's
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6765 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'win/CS/HandBrakeWPF/ViewModels')
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/Interfaces/IPreviewViewModel.cs25
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs24
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs14
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs435
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/StaticPreviewViewModel.cs392
5 files changed, 399 insertions, 491 deletions
diff --git a/win/CS/HandBrakeWPF/ViewModels/Interfaces/IPreviewViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/Interfaces/IPreviewViewModel.cs
deleted file mode 100644
index 748395023..000000000
--- a/win/CS/HandBrakeWPF/ViewModels/Interfaces/IPreviewViewModel.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-// --------------------------------------------------------------------------------------------------------------------
-// <copyright file="IPreviewViewModel.cs" company="HandBrake Project (http://handbrake.fr)">
-// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
-// </copyright>
-// <summary>
-// The Preview View Model Interface
-// </summary>
-// --------------------------------------------------------------------------------------------------------------------
-
-namespace HandBrakeWPF.ViewModels.Interfaces
-{
- using HandBrake.ApplicationServices.Model;
- using HandBrake.ApplicationServices.Services.Encode.Model;
-
- /// <summary>
- /// The Preview View Model Interface
- /// </summary>
- public interface IPreviewViewModel
- {
- /// <summary>
- /// Sets Task.
- /// </summary>
- EncodeTask Task { set; }
- }
-} \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
index 7280bc091..788b2ba0f 100644
--- a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs
@@ -1037,6 +1037,11 @@ namespace HandBrakeWPF.ViewModels
}
}
+ /// <summary>
+ /// Gets or sets the static preview view model.
+ /// </summary>
+ public IStaticPreviewViewModel StaticPreviewViewModel { get; set; }
+
#endregion
#region Load and Shutdown Handling
@@ -1158,18 +1163,11 @@ namespace HandBrakeWPF.ViewModels
/// </summary>
public void OpenPreviewWindow()
{
- Window window = Application.Current.Windows.Cast<Window>().FirstOrDefault(x => x.GetType() == typeof(PreviewView));
- IPreviewViewModel viewModel = IoC.Get<IPreviewViewModel>();
-
- if (window != null)
+ if (!string.IsNullOrEmpty(this.CurrentTask.Source))
{
- viewModel.Task = this.CurrentTask;
- window.Activate();
- }
- else
- {
- viewModel.Task = this.CurrentTask;
- this.WindowManager.ShowWindow(viewModel);
+ this.StaticPreviewViewModel.IsOpen = true;
+ this.StaticPreviewViewModel.UpdatePreviewFrame(this.CurrentTask);
+ this.WindowManager.ShowWindow(this.StaticPreviewViewModel);
}
}
@@ -1845,10 +1843,6 @@ namespace HandBrakeWPF.ViewModels
this.ChaptersViewModel.UpdateTask(this.CurrentTask);
this.AdvancedViewModel.UpdateTask(this.CurrentTask);
- // Tell the Preivew Window
- IPreviewViewModel viewModel = IoC.Get<IPreviewViewModel>();
- viewModel.Task = this.CurrentTask;
-
// Cleanup
this.ShowStatusWindow = false;
this.SourceLabel = this.SourceName;
diff --git a/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
index 1cfe67bae..3a1df33bf 100644
--- a/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/PictureSettingsViewModel.cs
@@ -798,20 +798,6 @@ namespace HandBrakeWPF.ViewModels
this.NotifyOfPropertyChange(() => this.Task);
}
- /// <summary>
- /// The preview image.
- /// Experimental Feature => In-Progress
- /// </summary>
- public void PreviewImage()
- {
- if (!string.IsNullOrEmpty(this.Task.Source))
- {
- this.StaticPreviewViewModel.IsOpen = true;
- this.StaticPreviewViewModel.UpdatePreviewFrame(this.Task);
- this.WindowManager.ShowWindow(this.StaticPreviewViewModel);
- }
- }
-
#endregion
#region Methods
diff --git a/win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs
deleted file mode 100644
index f117b9ef5..000000000
--- a/win/CS/HandBrakeWPF/ViewModels/PreviewViewModel.cs
+++ /dev/null
@@ -1,435 +0,0 @@
-// --------------------------------------------------------------------------------------------------------------------
-// <copyright file="PreviewViewModel.cs" company="HandBrake Project (http://handbrake.fr)">
-// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
-// </copyright>
-// <summary>
-// The About View Model
-// </summary>
-// --------------------------------------------------------------------------------------------------------------------
-
-namespace HandBrakeWPF.ViewModels
-{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Globalization;
- using System.IO;
- using System.Threading;
- using System.Windows;
-
- using HandBrake.ApplicationServices.Model;
- using HandBrake.ApplicationServices.Services.Encode.EventArgs;
- using HandBrake.ApplicationServices.Services.Encode.Interfaces;
- using HandBrake.ApplicationServices.Services.Encode.Model;
- using HandBrake.ApplicationServices.Services.Encode.Model.Models;
- using HandBrake.ApplicationServices.Services.Interfaces;
-
- using HandBrakeWPF.Factories;
- using HandBrakeWPF.Properties;
- using HandBrakeWPF.Services;
- using HandBrakeWPF.Services.Interfaces;
- using HandBrakeWPF.ViewModels.Interfaces;
-
- /// <summary>
- /// The About View Model
- /// </summary>
- public class PreviewViewModel : ViewModelBase, IPreviewViewModel
- {
- #region Constants and Fields
-
- /// <summary>
- /// Backing field for the encode service.
- /// </summary>
- private readonly IEncodeServiceWrapper encodeService;
-
- /// <summary>
- /// The error service
- /// </summary>
- private readonly IErrorService errorService;
-
- /// <summary>
- /// The user Setting Service
- /// </summary>
- private readonly IUserSettingService userSettingService;
-
- /// <summary>
- /// The percentage.
- /// </summary>
- private string percentage;
-
- /// <summary>
- /// The percentage value.
- /// </summary>
- private double percentageValue;
-
- /// <summary>
- /// The Backing field for IsEncoding
- /// </summary>
- private bool isEncoding;
-
- /// <summary>
- /// Backing field for use system default player
- /// </summary>
- private bool useSystemDefaultPlayer;
-
- #endregion
-
- #region Constructors and Destructors
-
- /// <summary>
- /// Initializes a new instance of the <see cref="PreviewViewModel"/> class.
- /// </summary>
- /// <param name="errorService">
- /// The error Service.
- /// </param>
- /// <param name="userSettingService">
- /// The user Setting Service.
- /// </param>
- public PreviewViewModel(IErrorService errorService, IUserSettingService userSettingService)
- {
- // Preview needs a seperate instance rather than the shared singleton. This could maybe do with being refactored at some point
- this.encodeService = new EncodeServiceWrapper(userSettingService);
-
- this.errorService = errorService;
- this.userSettingService = userSettingService;
- this.Title = "Preview";
- this.Percentage = "0.00%";
- this.PercentageValue = 0;
- this.StartAt = 1;
- this.Duration = 30;
- this.CanPlay = true;
-
- UseSystemDefaultPlayer = userSettingService.GetUserSetting<bool>(UserSettingConstants.DefaultPlayer);
- this.Duration = userSettingService.GetUserSetting<int>(UserSettingConstants.LastPreviewDuration);
- }
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets or sets Task.
- /// </summary>
- public EncodeTask Task { get; set; }
-
- /// <summary>
- /// Gets AvailableDurations.
- /// </summary>
- public IEnumerable<int> AvailableDurations
- {
- get
- {
- return new List<int> { 5, 10, 30, 45, 60, 75, 90, 105, 120, 150, 180, 210, 240 };
- }
- }
-
- /// <summary>
- /// Gets or sets Duration.
- /// </summary>
- public int Duration { get; set; }
-
- /// <summary>
- /// Gets or sets Percentage.
- /// </summary>
- public string Percentage
- {
- get
- {
- return this.percentage;
- }
-
- set
- {
- this.percentage = value;
- this.NotifyOfPropertyChange(() => this.Percentage);
- }
- }
-
- /// <summary>
- /// Gets or sets PercentageValue.
- /// </summary>
- public double PercentageValue
- {
- get
- {
- return this.percentageValue;
- }
-
- set
- {
- this.percentageValue = value;
- this.NotifyOfPropertyChange(() => this.PercentageValue);
- }
- }
-
- /// <summary>
- /// Gets or sets StartAt.
- /// </summary>
- public int StartAt { get; set; }
-
- /// <summary>
- /// Gets StartPoints.
- /// </summary>
- public IEnumerable<int> StartPoints
- {
- get
- {
- List<int> startPoints = new List<int>();
- for (int i = 1;
- i <= this.UserSettingService.GetUserSetting<int>(UserSettingConstants.PreviewScanCount);
- i++)
- {
- startPoints.Add(i);
- }
-
- return startPoints;
- }
- }
-
- /// <summary>
- /// Gets or sets a value indicating whether UseSystemDefaultPlayer.
- /// </summary>
- public bool UseSystemDefaultPlayer
- {
- get
- {
- return this.useSystemDefaultPlayer;
- }
- set
- {
- this.useSystemDefaultPlayer = value;
- this.NotifyOfPropertyChange(() => UseSystemDefaultPlayer);
- this.userSettingService.SetUserSetting(UserSettingConstants.DefaultPlayer, value);
- }
- }
-
- /// <summary>
- /// Gets or sets a value indicating whether IsEncoding.
- /// </summary>
- public bool IsEncoding
- {
- get
- {
- return this.isEncoding;
- }
- set
- {
- this.isEncoding = value;
- this.CanPlay = !value;
- this.NotifyOfPropertyChange(() => this.CanPlay);
- this.NotifyOfPropertyChange(() => this.IsEncoding);
- }
- }
-
- /// <summary>
- /// Gets or sets the Currently Playing / Encoding Filename.
- /// </summary>
- public string CurrentlyPlaying { get; set; }
-
- /// <summary>
- /// Gets or sets a value indicating whether can play.
- /// </summary>
- public bool CanPlay { get; set; }
-
- #endregion
-
- #region Public Methods
-
- /// <summary>
- /// Close this window.
- /// </summary>
- public void Close()
- {
- this.TryClose();
- }
-
- /// <summary>
- /// Handle The Initialisation
- /// </summary>
- public override void OnLoad()
- {
- }
-
- /// <summary>
- /// Encode and play a sample
- /// </summary>
- public void Play()
- {
- try
- {
- this.IsEncoding = true;
- if (File.Exists(this.CurrentlyPlaying))
- File.Delete(this.CurrentlyPlaying);
- }
- catch (Exception)
- {
- this.IsEncoding = false;
- this.errorService.ShowMessageBox("Unable to delete previous preview file. You may need to restart the application.",
- Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
- }
-
- if (this.Task == null || string.IsNullOrEmpty(Task.Source))
- {
- this.errorService.ShowMessageBox("You must first scan a source and setup your encode before creating a preview.",
- Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
-
- EncodeTask encodeTask = new EncodeTask(this.Task)
- {
- PreviewDuration = this.Duration,
- PreviewStartAt = this.StartAt,
- PointToPointMode = PointToPointMode.Preview
- };
-
- // Filename handling.
- if (string.IsNullOrEmpty(encodeTask.Destination))
- {
- string filename = Path.ChangeExtension(Path.GetTempFileName(), encodeTask.OutputFormat == OutputFormat.Mkv ? "m4v" : "mkv");
- encodeTask.Destination = filename;
- this.CurrentlyPlaying = filename;
- }
- else
- {
- string directory = Path.GetDirectoryName(encodeTask.Destination) ?? string.Empty;
- string filename = Path.GetFileNameWithoutExtension(encodeTask.Destination);
- string extension = Path.GetExtension(encodeTask.Destination);
- string previewFilename = string.Format("{0}_preview{1}", filename, extension);
- string previewFullPath = Path.Combine(directory, previewFilename);
- encodeTask.Destination = previewFullPath;
- this.CurrentlyPlaying = previewFullPath;
- }
-
- // Setup the encode task as a preview encode
- encodeTask.IsPreviewEncode = true;
- encodeTask.PreviewEncodeStartAt = this.StartAt;
- encodeTask.PreviewEncodeDuration = this.Duration;
- QueueTask task = new QueueTask(encodeTask, HBConfigurationFactory.Create());
- ThreadPool.QueueUserWorkItem(this.CreatePreview, task);
- }
-
- #endregion
-
- #region Private Methods
- /// <summary>
- /// Play the Encoded file
- /// </summary>
- private void PlayFile()
- {
- // Launch VLC and Play video.
- if (this.CurrentlyPlaying != string.Empty)
- {
- if (File.Exists(this.CurrentlyPlaying))
- {
- string args = "\"" + this.CurrentlyPlaying + "\"";
-
- if (this.UseSystemDefaultPlayer)
- {
- Process.Start(args);
- }
- else
- {
- if (!File.Exists(UserSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath)))
- {
- // Attempt to find VLC if it doesn't exist in the default set location.
- string vlcPath;
-
- if (8 == IntPtr.Size || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
- vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
- else
- vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");
-
- if (!string.IsNullOrEmpty(vlcPath))
- {
- vlcPath = Path.Combine(vlcPath, "VideoLAN\\VLC\\vlc.exe");
- }
-
- if (File.Exists(vlcPath))
- {
- UserSettingService.SetUserSetting(UserSettingConstants.VLCPath, vlcPath);
- }
- else
- {
- this.errorService.ShowMessageBox("Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\")",
- Resources.Error, MessageBoxButton.OK, MessageBoxImage.Warning);
- }
- }
-
- if (File.Exists(UserSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath)))
- {
- ProcessStartInfo vlc = new ProcessStartInfo(UserSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath), args);
- Process.Start(vlc);
- }
- }
- }
- else
- {
- this.errorService.ShowMessageBox("Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.",
- Resources.Error, MessageBoxButton.OK, MessageBoxImage.Warning);
- }
- }
- }
-
- /// <summary>
- /// Create the Preview.
- /// </summary>
- /// <param name="state">
- /// The state.
- /// </param>
- private void CreatePreview(object state)
- {
- // Make sure we are not already encoding and if we are then display an error.
- if (encodeService.IsEncoding)
- {
- this.errorService.ShowMessageBox("Handbrake is already encoding a video! Only one file can be encoded at any one time.",
- Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
-
- this.encodeService.EncodeCompleted += this.encodeService_EncodeCompleted;
- this.encodeService.EncodeStatusChanged += this.encodeService_EncodeStatusChanged;
-
- this.encodeService.Start((QueueTask)state);
- this.userSettingService.SetUserSetting(UserSettingConstants.LastPreviewDuration, this.Duration);
- }
- #endregion
-
- #region Event Handlers
- /// <summary>
- /// Handle Encode Progress Events
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The EncodeProgressEventArgs.
- /// </param>
- private void encodeService_EncodeStatusChanged(object sender, EncodeProgressEventArgs e)
- {
- this.Percentage = string.Format("{0} %", Math.Round(e.PercentComplete, 2).ToString(CultureInfo.InvariantCulture));
- this.PercentageValue = e.PercentComplete;
- }
-
- /// <summary>
- /// Handle the Encode Completed Event
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The EncodeCompletedEventArgs.
- /// </param>
- private void encodeService_EncodeCompleted(object sender, EncodeCompletedEventArgs e)
- {
- this.Percentage = "0.00%";
- this.PercentageValue = 0;
- this.IsEncoding = false;
-
- this.encodeService.EncodeCompleted -= this.encodeService_EncodeCompleted;
- this.encodeService.EncodeStatusChanged -= this.encodeService_EncodeStatusChanged;
-
- this.PlayFile();
- }
- #endregion
- }
-} \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/ViewModels/StaticPreviewViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/StaticPreviewViewModel.cs
index 7f94f5d4c..77cd826db 100644
--- a/win/CS/HandBrakeWPF/ViewModels/StaticPreviewViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/StaticPreviewViewModel.cs
@@ -10,17 +10,28 @@
namespace HandBrakeWPF.ViewModels
{
using System;
+ using System.Collections.Generic;
+ using System.Diagnostics;
+ using System.Globalization;
+ using System.IO;
using System.Runtime.ExceptionServices;
+ using System.Threading;
using System.Windows;
using System.Windows.Media.Imaging;
using HandBrake.ApplicationServices.Model;
+ using HandBrake.ApplicationServices.Services.Encode.EventArgs;
+ using HandBrake.ApplicationServices.Services.Encode.Interfaces;
using HandBrake.ApplicationServices.Services.Encode.Model;
+ using HandBrake.ApplicationServices.Services.Encode.Model.Models;
using HandBrake.ApplicationServices.Services.Interfaces;
using HandBrake.ApplicationServices.Services.Scan.Interfaces;
using HandBrake.Interop.Model.Encoding;
using HandBrakeWPF.Factories;
+ using HandBrakeWPF.Properties;
+ using HandBrakeWPF.Services;
+ using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.ViewModels.Interfaces;
/// <summary>
@@ -30,7 +41,7 @@ namespace HandBrakeWPF.ViewModels
{
/*
* TODO
- * - Integrate Video Preview panel.
+ * - Window Size / Scale to screen etc.
*/
#region Fields
@@ -41,6 +52,21 @@ namespace HandBrakeWPF.ViewModels
private readonly IScan scanService;
/// <summary>
+ /// Backing field for the encode service.
+ /// </summary>
+ private readonly IEncodeServiceWrapper encodeService;
+
+ /// <summary>
+ /// The error service
+ /// </summary>
+ private readonly IErrorService errorService;
+
+ /// <summary>
+ /// The user Setting Service
+ /// </summary>
+ private readonly IUserSettingService userSettingService;
+
+ /// <summary>
/// The height.
/// </summary>
private int height;
@@ -65,6 +91,26 @@ namespace HandBrakeWPF.ViewModels
/// </summary>
private bool previewNotAvailable;
+ /// <summary>
+ /// The percentage.
+ /// </summary>
+ private string percentage;
+
+ /// <summary>
+ /// The percentage value.
+ /// </summary>
+ private double percentageValue;
+
+ /// <summary>
+ /// The Backing field for IsEncoding
+ /// </summary>
+ private bool isEncoding;
+
+ /// <summary>
+ /// Backing field for use system default player
+ /// </summary>
+ private bool useSystemDefaultPlayer;
+
#endregion
#region Constructors and Destructors
@@ -75,12 +121,29 @@ namespace HandBrakeWPF.ViewModels
/// <param name="scanService">
/// The scan service.
/// </param>
- public StaticPreviewViewModel(IScan scanService)
+ /// <param name="userSettingService">
+ /// The user Setting Service.
+ /// </param>
+ public StaticPreviewViewModel(IScan scanService, IUserSettingService userSettingService)
{
this.scanService = scanService;
this.selectedPreviewImage = 1;
this.Title = Properties.Resources.Preview;
this.PreviewNotAvailable = true;
+
+ // Live Preview
+ this.userSettingService = userSettingService;
+ this.encodeService = new EncodeServiceWrapper(userSettingService); // Preview needs a seperate instance rather than the shared singleton. This could maybe do with being refactored at some point
+
+ this.Title = "Preview";
+ this.Percentage = "0.00%";
+ this.PercentageValue = 0;
+ this.StartAt = 1;
+ this.Duration = 30;
+ this.CanPlay = true;
+
+ UseSystemDefaultPlayer = userSettingService.GetUserSetting<bool>(UserSettingConstants.DefaultPlayer);
+ this.Duration = userSettingService.GetUserSetting<int>(UserSettingConstants.LastPreviewDuration);
}
#endregion
@@ -208,6 +271,128 @@ namespace HandBrakeWPF.ViewModels
#endregion
+ #region LivePreviewProperties
+
+ /// <summary>
+ /// Gets AvailableDurations.
+ /// </summary>
+ public IEnumerable<int> AvailableDurations
+ {
+ get
+ {
+ return new List<int> { 5, 10, 30, 45, 60, 75, 90, 105, 120, 150, 180, 210, 240 };
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets Duration.
+ /// </summary>
+ public int Duration { get; set; }
+
+ /// <summary>
+ /// Gets or sets Percentage.
+ /// </summary>
+ public string Percentage
+ {
+ get
+ {
+ return this.percentage;
+ }
+
+ set
+ {
+ this.percentage = value;
+ this.NotifyOfPropertyChange(() => this.Percentage);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets PercentageValue.
+ /// </summary>
+ public double PercentageValue
+ {
+ get
+ {
+ return this.percentageValue;
+ }
+
+ set
+ {
+ this.percentageValue = value;
+ this.NotifyOfPropertyChange(() => this.PercentageValue);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets StartAt.
+ /// </summary>
+ public int StartAt { get; set; }
+
+ /// <summary>
+ /// Gets StartPoints.
+ /// </summary>
+ public IEnumerable<int> StartPoints
+ {
+ get
+ {
+ List<int> startPoints = new List<int>();
+ for (int i = 1;
+ i <= this.UserSettingService.GetUserSetting<int>(UserSettingConstants.PreviewScanCount);
+ i++)
+ {
+ startPoints.Add(i);
+ }
+
+ return startPoints;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether UseSystemDefaultPlayer.
+ /// </summary>
+ public bool UseSystemDefaultPlayer
+ {
+ get
+ {
+ return this.useSystemDefaultPlayer;
+ }
+ set
+ {
+ this.useSystemDefaultPlayer = value;
+ this.NotifyOfPropertyChange(() => UseSystemDefaultPlayer);
+ this.userSettingService.SetUserSetting(UserSettingConstants.DefaultPlayer, value);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether IsEncoding.
+ /// </summary>
+ public bool IsEncoding
+ {
+ get
+ {
+ return this.isEncoding;
+ }
+ set
+ {
+ this.isEncoding = value;
+ this.CanPlay = !value;
+ this.NotifyOfPropertyChange(() => this.CanPlay);
+ this.NotifyOfPropertyChange(() => this.IsEncoding);
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the Currently Playing / Encoding Filename.
+ /// </summary>
+ public string CurrentlyPlaying { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether can play.
+ /// </summary>
+ public bool CanPlay { get; set; }
+ #endregion
+
#region Public Methods and Operators
/// <summary>
@@ -275,6 +460,7 @@ namespace HandBrakeWPF.ViewModels
/// </param>
public void PreviewSizeChanged(SizeChangedEventArgs ea)
{
+ // TODO implement window size scaling here.
Rect workArea = SystemParameters.WorkArea;
if (ea.NewSize.Width > workArea.Width)
{
@@ -289,5 +475,207 @@ namespace HandBrakeWPF.ViewModels
}
}
#endregion
+
+ #region Public Method - Live Preview
+
+ #region Public Methods
+
+ /// <summary>
+ /// Close this window.
+ /// </summary>
+ public void Close()
+ {
+ this.TryClose();
+ }
+
+ /// <summary>
+ /// Handle The Initialisation
+ /// </summary>
+ public override void OnLoad()
+ {
+ }
+
+ /// <summary>
+ /// Encode and play a sample
+ /// </summary>
+ public void Play()
+ {
+ try
+ {
+ this.IsEncoding = true;
+ if (File.Exists(this.CurrentlyPlaying))
+ File.Delete(this.CurrentlyPlaying);
+ }
+ catch (Exception)
+ {
+ this.IsEncoding = false;
+ this.errorService.ShowMessageBox("Unable to delete previous preview file. You may need to restart the application.",
+ Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+
+ if (this.Task == null || string.IsNullOrEmpty(Task.Source))
+ {
+ this.errorService.ShowMessageBox("You must first scan a source and setup your encode before creating a preview.",
+ Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
+ return;
+ }
+
+ EncodeTask encodeTask = new EncodeTask(this.Task)
+ {
+ PreviewDuration = this.Duration,
+ PreviewStartAt = this.StartAt,
+ PointToPointMode = PointToPointMode.Preview
+ };
+
+ // Filename handling.
+ if (string.IsNullOrEmpty(encodeTask.Destination))
+ {
+ string filename = Path.ChangeExtension(Path.GetTempFileName(), encodeTask.OutputFormat == OutputFormat.Mkv ? "m4v" : "mkv");
+ encodeTask.Destination = filename;
+ this.CurrentlyPlaying = filename;
+ }
+ else
+ {
+ string directory = Path.GetDirectoryName(encodeTask.Destination) ?? string.Empty;
+ string filename = Path.GetFileNameWithoutExtension(encodeTask.Destination);
+ string extension = Path.GetExtension(encodeTask.Destination);
+ string previewFilename = string.Format("{0}_preview{1}", filename, extension);
+ string previewFullPath = Path.Combine(directory, previewFilename);
+ encodeTask.Destination = previewFullPath;
+ this.CurrentlyPlaying = previewFullPath;
+ }
+
+ // Setup the encode task as a preview encode
+ encodeTask.IsPreviewEncode = true;
+ encodeTask.PreviewEncodeStartAt = this.StartAt;
+ encodeTask.PreviewEncodeDuration = this.Duration;
+ QueueTask task = new QueueTask(encodeTask, HBConfigurationFactory.Create());
+ ThreadPool.QueueUserWorkItem(this.CreatePreview, task);
+ }
+
+ #endregion
+
+ #region Private Methods
+ /// <summary>
+ /// Play the Encoded file
+ /// </summary>
+ private void PlayFile()
+ {
+ // Launch VLC and Play video.
+ if (this.CurrentlyPlaying != string.Empty)
+ {
+ if (File.Exists(this.CurrentlyPlaying))
+ {
+ string args = "\"" + this.CurrentlyPlaying + "\"";
+
+ if (this.UseSystemDefaultPlayer)
+ {
+ Process.Start(args);
+ }
+ else
+ {
+ if (!File.Exists(UserSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath)))
+ {
+ // Attempt to find VLC if it doesn't exist in the default set location.
+ string vlcPath;
+
+ if (8 == IntPtr.Size || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
+ vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ else
+ vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");
+
+ if (!string.IsNullOrEmpty(vlcPath))
+ {
+ vlcPath = Path.Combine(vlcPath, "VideoLAN\\VLC\\vlc.exe");
+ }
+
+ if (File.Exists(vlcPath))
+ {
+ UserSettingService.SetUserSetting(UserSettingConstants.VLCPath, vlcPath);
+ }
+ else
+ {
+ this.errorService.ShowMessageBox("Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\")",
+ Resources.Error, MessageBoxButton.OK, MessageBoxImage.Warning);
+ }
+ }
+
+ if (File.Exists(UserSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath)))
+ {
+ ProcessStartInfo vlc = new ProcessStartInfo(UserSettingService.GetUserSetting<string>(UserSettingConstants.VLCPath), args);
+ Process.Start(vlc);
+ }
+ }
+ }
+ else
+ {
+ this.errorService.ShowMessageBox("Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.",
+ Resources.Error, MessageBoxButton.OK, MessageBoxImage.Warning);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Create the Preview.
+ /// </summary>
+ /// <param name="state">
+ /// The state.
+ /// </param>
+ private void CreatePreview(object state)
+ {
+ // Make sure we are not already encoding and if we are then display an error.
+ if (encodeService.IsEncoding)
+ {
+ this.errorService.ShowMessageBox("Handbrake is already encoding a video! Only one file can be encoded at any one time.",
+ Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
+ return;
+ }
+
+ this.encodeService.EncodeCompleted += this.encodeService_EncodeCompleted;
+ this.encodeService.EncodeStatusChanged += this.encodeService_EncodeStatusChanged;
+
+ this.encodeService.Start((QueueTask)state);
+ this.userSettingService.SetUserSetting(UserSettingConstants.LastPreviewDuration, this.Duration);
+ }
+ #endregion
+
+ #region Event Handlers
+ /// <summary>
+ /// Handle Encode Progress Events
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EncodeProgressEventArgs.
+ /// </param>
+ private void encodeService_EncodeStatusChanged(object sender, EncodeProgressEventArgs e)
+ {
+ this.Percentage = string.Format("{0} %", Math.Round(e.PercentComplete, 2).ToString(CultureInfo.InvariantCulture));
+ this.PercentageValue = e.PercentComplete;
+ }
+
+ /// <summary>
+ /// Handle the Encode Completed Event
+ /// </summary>
+ /// <param name="sender">
+ /// The sender.
+ /// </param>
+ /// <param name="e">
+ /// The EncodeCompletedEventArgs.
+ /// </param>
+ private void encodeService_EncodeCompleted(object sender, EncodeCompletedEventArgs e)
+ {
+ this.Percentage = "0.00%";
+ this.PercentageValue = 0;
+ this.IsEncoding = false;
+
+ this.encodeService.EncodeCompleted -= this.encodeService_EncodeCompleted;
+ this.encodeService.EncodeStatusChanged -= this.encodeService_EncodeStatusChanged;
+
+ this.PlayFile();
+ }
+ #endregion
+ #endregion
}
} \ No newline at end of file