// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // The Preview View Model // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.ViewModels { using System.Windows; using HandBrake.ApplicationServices.Model; using Services.Interfaces; using System.Collections.ObjectModel; using HandBrake.ApplicationServices.Services.Interfaces; using System.ComponentModel.Composition; using Interfaces; using Caliburn.Micro; /// /// The Preview View Model /// [Export(typeof(IQueueViewModel))] public class QueueViewModel : ViewModelBase, IQueueViewModel { #region Private Fields /// /// Queue Processor Backing field /// private readonly IQueueProcessor queueProcessor; /// /// The Error Service Backing field /// private readonly IErrorService errorService; /// /// Jobs pending backing field /// private string jobsPending; /// /// Job Status Backing field. /// private string jobStatus; /// /// IsEncoding Backing field /// private bool isEncoding; #endregion /// /// Initializes a new instance of the class. /// /// /// The window manager. /// /// /// The Queue Processor Service /// /// /// The Error Service /// public QueueViewModel(IWindowManager windowManager, IQueueProcessor queueProcessor, IErrorService errorService) { this.queueProcessor = queueProcessor; this.errorService = errorService; this.Title = "Queue"; this.JobsPending = "No encodes pending"; this.JobStatus = "There are no jobs currently encoding"; } /// /// Gets QueueJobs. /// public ObservableCollection QueueJobs { get { return this.queueProcessor.QueueManager.Queue; } } /// /// Gets or sets a value indicating whether IsEncoding. /// public bool IsEncoding { get { return this.isEncoding; } set { this.isEncoding = value; this.NotifyOfPropertyChange("IsEncoding"); } } /// /// Gets or sets JobStatus. /// public string JobStatus { get { return this.jobStatus; } set { this.jobStatus = value; this.NotifyOfPropertyChange("JobStatus"); } } /// /// Gets or sets JobsPending. /// public string JobsPending { get { return this.jobsPending; } set { this.jobsPending = value; this.NotifyOfPropertyChange("JobsPending"); } } /// /// Start Encode /// public void StartEncode() { if (this.queueProcessor.QueueManager.Count == 0) { this.errorService.ShowMessageBox("There are no pending jobs.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } this.queueProcessor.Start(); } /// /// Pause Encode /// public void PauseEncode() { this.queueProcessor.Pause(); } /// /// Remove a Job from the queue /// /// /// The Job to remove from the queue /// public void RemoveJob(QueueTask task) { if (task.Status == QueueItemStatus.InProgress) { MessageBoxResult result = this.errorService.ShowMessageBox( "This encode is currently in progress. If you delete it, the encode will be stoped. Are you sure you wish to proceed?", "Warning", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { this.queueProcessor.QueueManager.Remove(task); } } else { this.queueProcessor.QueueManager.Remove(task); } this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count); } /// /// Handle the On Window Load /// public override void OnLoad() { this.queueProcessor.JobProcessingStarted += queueProcessor_JobProcessingStarted; this.queueProcessor.QueueCompleted += queueProcessor_QueueCompleted; this.queueProcessor.QueuePaused += queueProcessor_QueuePaused; this.queueProcessor.QueueManager.QueueChanged += QueueManager_QueueChanged; // Setup the window to the correct state. this.IsEncoding = queueProcessor.EncodeService.IsEncoding; this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count); base.OnLoad(); } /// /// Close this window. /// public void Close() { this.TryClose(); } /// /// Override the OnActive to run the Screen Loading code in the view model base. /// protected override void OnActivate() { this.Load(); base.OnActivate(); } /// /// Handle the Queue Paused Event /// /// /// The sender. /// /// /// The EventArgs. /// private void queueProcessor_QueuePaused(object sender, System.EventArgs e) { this.JobStatus = "Queue Paused"; this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count); } /// /// Handle the Queue Completed Event /// /// /// The sender. /// /// /// The EventArgs. /// private void queueProcessor_QueueCompleted(object sender, System.EventArgs e) { this.JobStatus = "Queue Completed"; this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count); } /// /// Handle teh Job Processing Started Event /// /// /// The sender. /// /// /// The QueueProgressEventArgs. /// private void queueProcessor_JobProcessingStarted(object sender, HandBrake.ApplicationServices.EventArgs.QueueProgressEventArgs e) { this.JobStatus = "Queue Started"; this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count); this.queueProcessor.EncodeService.EncodeStatusChanged += EncodeService_EncodeStatusChanged; } /// /// Handle the Encode Status Changed Event. /// /// /// The sender. /// /// /// The EncodeProgressEventArgs. /// private void EncodeService_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.EncodeProgressEventArgs e) { this.JobStatus = string.Format( "Encoding: Pass {0} of {1}, {2:00.00}%, FPS: {3:000.0}, Avg FPS: {4:000.0}, Time Remaining: {5}, Elapsed: {6:hh\\:mm\\:ss}", e.Task, e.TaskCount, e.PercentComplete, e.CurrentFrameRate, e.AverageFrameRate, e.EstimatedTimeLeft, e.ElapsedTime); } /// /// Handle the Queue Changed Event. /// /// /// The sender. /// /// /// The e. /// private void QueueManager_QueueChanged(object sender, System.EventArgs e) { // TODO } } }