summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--win/CS/HandBrakeWPF/HandBrakeWPF.csproj9
-rw-r--r--win/CS/HandBrakeWPF/Properties/Resources.Designer.cs4
-rw-r--r--win/CS/HandBrakeWPF/Properties/Resources.resx4
-rw-r--r--win/CS/HandBrakeWPF/Services/EncodeServiceWrapper.cs7
-rw-r--r--win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs1
-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
-rw-r--r--win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml3
-rw-r--r--win/CS/HandBrakeWPF/Views/PreviewView.xaml89
-rw-r--r--win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs27
-rw-r--r--win/CS/HandBrakeWPF/Views/StaticPreviewView.xaml55
14 files changed, 455 insertions, 634 deletions
diff --git a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj
index a0beeab50..d42ef184b 100644
--- a/win/CS/HandBrakeWPF/HandBrakeWPF.csproj
+++ b/win/CS/HandBrakeWPF/HandBrakeWPF.csproj
@@ -301,7 +301,6 @@
<Compile Include="ViewModels\Interfaces\IAddPresetViewModel.cs" />
<Compile Include="ViewModels\Interfaces\IAudioViewModel.cs" />
<Compile Include="ViewModels\Interfaces\IQueueViewModel.cs" />
- <Compile Include="ViewModels\Interfaces\IPreviewViewModel.cs" />
<Compile Include="ViewModels\Interfaces\IErrorViewModel.cs" />
<Compile Include="ViewModels\Interfaces\ILogViewModel.cs" />
<Compile Include="ViewModels\Interfaces\IAboutViewModel.cs" />
@@ -309,7 +308,6 @@
<Compile Include="ViewModels\Interfaces\IOptionsViewModel.cs" />
<Compile Include="ViewModels\Interfaces\IViewModelBase.cs" />
<Compile Include="ViewModels\LogViewModel.cs" />
- <Compile Include="ViewModels\PreviewViewModel.cs" />
<Compile Include="ViewModels\QueueViewModel.cs" />
<Compile Include="ViewModels\OptionsViewModel.cs" />
<Compile Include="ViewModels\ViewModelBase.cs" />
@@ -345,9 +343,6 @@
<Compile Include="Views\LogView.xaml.cs">
<DependentUpon>LogView.xaml</DependentUpon>
</Compile>
- <Compile Include="Views\PreviewView.xaml.cs">
- <DependentUpon>PreviewView.xaml</DependentUpon>
- </Compile>
<Compile Include="Views\QueueView.xaml.cs">
<DependentUpon>QueueView.xaml</DependentUpon>
</Compile>
@@ -494,10 +489,6 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
- <Page Include="Views\PreviewView.xaml">
- <Generator>MSBuild:Compile</Generator>
- <SubType>Designer</SubType>
- </Page>
<Page Include="Views\QueueView.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
index 7693e2722..b098b2075 100644
--- a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
+++ b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
@@ -826,7 +826,7 @@ namespace HandBrakeWPF.Properties {
}
/// <summary>
- /// Looks up a localized string similar to *** EXPERIMENTAL *** Still Preview.
+ /// Looks up a localized string similar to Preview.
/// </summary>
public static string Preview {
get {
@@ -835,7 +835,7 @@ namespace HandBrakeWPF.Properties {
}
/// <summary>
- /// Looks up a localized string similar to *** EXPERIMENTAL *** Still Preview (Scaled).
+ /// Looks up a localized string similar to Preview (Scaled).
/// </summary>
public static string Preview_Scaled {
get {
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.resx b/win/CS/HandBrakeWPF/Properties/Resources.resx
index fa9de5a2a..54cb3ab98 100644
--- a/win/CS/HandBrakeWPF/Properties/Resources.resx
+++ b/win/CS/HandBrakeWPF/Properties/Resources.resx
@@ -509,10 +509,10 @@ Do you wish to proceed?</value>
<value>The entered destination contained illegal characters. You must fix the path and filename before continuing.</value>
</data>
<data name="Preview" xml:space="preserve">
- <value>*** EXPERIMENTAL *** Still Preview</value>
+ <value>Preview</value>
</data>
<data name="Preview_Scaled" xml:space="preserve">
- <value> *** EXPERIMENTAL *** Still Preview (Scaled)</value>
+ <value>Preview (Scaled)</value>
</data>
<data name="PictureSettings_OutputResolution" xml:space="preserve">
<value>Output: {0}</value>
diff --git a/win/CS/HandBrakeWPF/Services/EncodeServiceWrapper.cs b/win/CS/HandBrakeWPF/Services/EncodeServiceWrapper.cs
index b63cd3d68..6a3ab8070 100644
--- a/win/CS/HandBrakeWPF/Services/EncodeServiceWrapper.cs
+++ b/win/CS/HandBrakeWPF/Services/EncodeServiceWrapper.cs
@@ -3,7 +3,7 @@
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
// </copyright>
// <summary>
-// We have multiple implementations of IEncode. This is a wrapper class for the GUI so that the
+// We have multiple implementations of IEncode. This is a wrapper class for the GUI so that the
// implementation used is controllable via user settings.
// Over time, this class will go away when the LibHB and process isolation code matures.
// </summary>
@@ -19,7 +19,6 @@ namespace HandBrakeWPF.Services
using HandBrake.ApplicationServices.Services.Encode;
using HandBrake.ApplicationServices.Services.Encode.EventArgs;
using HandBrake.ApplicationServices.Services.Encode.Interfaces;
- using HandBrake.ApplicationServices.Services.Interfaces;
using HandBrakeWPF.Services.Interfaces;
@@ -71,8 +70,8 @@ namespace HandBrakeWPF.Services
{
// Try to recover from errors.
throw new GeneralApplicationException(
- "Unable to initialise LibHB or Background worker service",
- "Falling back to using HandBrakeCLI.exe. Setting has been reset",
+ "Unable to initialise LibHB or Background worker service",
+ "Falling back to using HandBrakeCLI.exe. Setting has been reset",
exc);
}
}
diff --git a/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs b/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs
index 435228315..b2605e790 100644
--- a/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs
+++ b/win/CS/HandBrakeWPF/Startup/CastleBootstrapper.cs
@@ -80,7 +80,6 @@ namespace HandBrakeWPF.Startup
this.windsorContainer.Register(Component.For<IShellViewModel>().ImplementedBy<ShellViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IQueueViewModel>().ImplementedBy<QueueViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IAddPresetViewModel>().ImplementedBy<AddPresetViewModel>().LifeStyle.Is(LifestyleType.Transient));
- this.windsorContainer.Register(Component.For<IPreviewViewModel>().ImplementedBy<PreviewViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<ILogViewModel>().ImplementedBy<LogViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IAboutViewModel>().ImplementedBy<AboutViewModel>().LifeStyle.Is(LifestyleType.Singleton));
this.windsorContainer.Register(Component.For<IOptionsViewModel>().ImplementedBy<OptionsViewModel>().LifeStyle.Is(LifestyleType.Singleton));
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
diff --git a/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml b/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml
index 23f9885c7..9285cba82 100644
--- a/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml
+++ b/win/CS/HandBrakeWPF/Views/PictureSettingsView.xaml
@@ -168,9 +168,6 @@
<Label Content="{Binding DisplaySize}" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" Margin="0,0,0,5"
Visibility="{Binding ShowDisplaySize, Converter={StaticResource boolToVisConverter}}" />
-
- <Button Content="Preview" Grid.Row="1" Margin="5,0,0,0"
- cal:Message.Attach="[Event Click] = [Action PreviewImage]" HorizontalAlignment="Left" />
</Grid>
</StackPanel>
diff --git a/win/CS/HandBrakeWPF/Views/PreviewView.xaml b/win/CS/HandBrakeWPF/Views/PreviewView.xaml
deleted file mode 100644
index c38a5dc2c..000000000
--- a/win/CS/HandBrakeWPF/Views/PreviewView.xaml
+++ /dev/null
@@ -1,89 +0,0 @@
-<Window x:Class="HandBrakeWPF.Views.PreviewView"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:cal="http://www.caliburnproject.org"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- Title="{Binding Title}"
- Width="390"
- Style="{StaticResource windowStyle}"
- ResizeMode="NoResize"
- SizeToContent="Height"
- WindowStartupLocation="CenterScreen"
- TextOptions.TextFormattingMode="Display"
- mc:Ignorable="d">
-
- <Window.Resources>
- <Style TargetType="Button">
- <Setter Property="FontWeight" Value="Bold" />
- <Setter Property="Padding" Value="5,1" />
- <Setter Property="FontSize" Value="11.5" />
- <Setter Property="VerticalAlignment" Value="Center" />
- </Style>
- </Window.Resources>
-
- <StackPanel Orientation="Vertical">
-
- <StackPanel Height="34"
- Margin="0,0,0,10"
- Orientation="Horizontal">
-
- <StackPanel.Style>
- <Style TargetType="StackPanel">
- <Style.Triggers>
- <DataTrigger Binding="{Binding UseSystemColours}" Value="False">
- <Setter Property="Background" Value="White" />
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </StackPanel.Style>
-
- <Image Width="32"
- Height="32"
- Margin="10,0,5,0"
- VerticalAlignment="Center"
- Source="Images/picture_small.png" />
- <StackPanel VerticalAlignment="Center" Orientation="Vertical">
- <TextBlock FontWeight="Bold" Text="Create a video preview" />
- </StackPanel>
- </StackPanel>
-
- <StackPanel Margin="10,0,0,0" Orientation="Horizontal">
- <TextBlock Margin="0,0,5,0"
- VerticalAlignment="Center"
- Text="Start at Preview:" />
- <ComboBox Width="60"
- ItemsSource="{Binding StartPoints}"
- SelectedItem="{Binding StartAt}" />
-
- <TextBlock Margin="10,0,5,0"
- VerticalAlignment="Center"
- Text="Duration:" />
- <ComboBox Width="60"
- ItemsSource="{Binding AvailableDurations}"
- SelectedItem="{Binding Duration}" />
- </StackPanel>
-
- <Grid Margin="10,10,10,0">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="Auto" MinWidth="50" />
- </Grid.ColumnDefinitions>
- <ProgressBar MinHeight="22" Maximum="100" Minimum="0" Value="{Binding PercentageValue}" Grid.Column="0" />
- <TextBlock Margin="5,0,0,0" Text="{Binding Percentage}" Grid.Column="1" />
- </Grid>
-
- <StackPanel Margin="10,10,0,10" Orientation="Horizontal">
- <CheckBox VerticalAlignment="Center"
- Content="Use system default player"
- IsChecked="{Binding UseSystemDefaultPlayer}" />
- <Button Margin="10,0,0,0"
- HorizontalAlignment="Right"
- VerticalAlignment="Center"
- cal:Message.Attach="[Event Click] = [Action Play]"
- Content="Play"
- IsDefault="True"
- Padding="8,2" />
- </StackPanel>
- </StackPanel>
-</Window>
diff --git a/win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs b/win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs
deleted file mode 100644
index a8203245a..000000000
--- a/win/CS/HandBrakeWPF/Views/PreviewView.xaml.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// --------------------------------------------------------------------------------------------------------------------
-// <copyright file="PreviewView.xaml.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>
-// Interaction logic for VideoView.xaml
-// </summary>
-// --------------------------------------------------------------------------------------------------------------------
-
-namespace HandBrakeWPF.Views
-{
- using System.Windows;
-
- /// <summary>
- /// Interaction logic for VideoView.xaml
- /// </summary>
- public partial class PreviewView : Window
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="PreviewView"/> class.
- /// </summary>
- public PreviewView()
- {
- InitializeComponent();
- }
- }
-}
diff --git a/win/CS/HandBrakeWPF/Views/StaticPreviewView.xaml b/win/CS/HandBrakeWPF/Views/StaticPreviewView.xaml
index df437bd77..64783a087 100644
--- a/win/CS/HandBrakeWPF/Views/StaticPreviewView.xaml
+++ b/win/CS/HandBrakeWPF/Views/StaticPreviewView.xaml
@@ -10,7 +10,7 @@
WindowStartupLocation="CenterScreen"
cal:Message.Attach="[Event SizeChanged] = [Action PreviewSizeChanged($eventArgs)]"
Title="{Binding Title}">
-
+
<Window.Resources>
<converters:BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
</Window.Resources>
@@ -21,12 +21,55 @@
</StackPanel>
<Image Source="{Binding PreviewImage}" MaxWidth="{Binding Width}" MaxHeight="{Binding Height}" />
- <Slider Maximum="{Binding TotalPreviews}" Minimum="0"
+
+
+ <Border BorderBrush="WhiteSmoke" BorderThickness="1,1,1,1" CornerRadius="8,8,8,8" Padding="8"
+ VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="20" MinWidth="400" Background="Black" Opacity="0.70">
+ <Grid>
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions></Grid.ColumnDefinitions>
+ <Slider Maximum="{Binding TotalPreviews}" Minimum="0"
Value="{Binding SelectedPreviewImage}"
- VerticalAlignment="Bottom"
- HorizontalAlignment="Center"
- Margin="0,0,0,20" Width="150"
- Background="Transparent"
+ VerticalAlignment="Center"
+ HorizontalAlignment="Stretch"
+ Background="Transparent" TickPlacement="TopLeft"
+ Margin="0,0,0,5"
/>
+
+ <StackPanel Orientation="Horizontal" Grid.Row="1" HorizontalAlignment="Left">
+ <Button Content="Live Preview" Padding="8,2" cal:Message.Attach="[Event Click] = [Action Play]" />
+ <TextBlock Margin="10,0,5,0" VerticalAlignment="Center" Foreground="White" Text="Duration:" />
+ <ComboBox Width="60"
+ ItemsSource="{Binding AvailableDurations}"
+ SelectedItem="{Binding Duration}" />
+
+ <CheckBox VerticalAlignment="Center" Content="Use system default player" Foreground="White" Margin="10,0,0,0" IsChecked="{Binding UseSystemDefaultPlayer}" />
+ </StackPanel>
+
+ <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="0,5,0,0">
+
+ </StackPanel>
+
+ <Grid Margin="0,10,10,0" Grid.Row="2" Visibility="{Binding IsEncoding, Converter={StaticResource booleanToVisibilityConverter}}">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="23*" />
+ <ColumnDefinition Width="289*"/>
+ <ColumnDefinition Width="Auto" MinWidth="50" />
+ </Grid.ColumnDefinitions>
+ <ProgressBar MinHeight="5" Maximum="100" Minimum="0" Value="{Binding PercentageValue}" Grid.Column="0" Grid.ColumnSpan="2" />
+ <TextBlock Margin="5,0,0,0" Text="{Binding Percentage}" Grid.Column="2" HorizontalAlignment="Right" Foreground="White" />
+ </Grid>
+
+
+
+
+ </Grid>
+
+ </Border>
+
</Grid>
</Window>