// --------------------------------------------------------------------------------------------------------------------
//
// 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;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Windows;
using Caliburn.Micro;
using HandBrake.ApplicationServices.EventArgs;
using HandBrake.ApplicationServices.Model;
using HandBrake.ApplicationServices.Services.Interfaces;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.ViewModels.Interfaces;
using Ookii.Dialogs.Wpf;
///
/// The Preview View Model
///
[Export(typeof(IQueueViewModel))]
public class QueueViewModel : ViewModelBase, IQueueViewModel
{
#region Constants and Fields
///
/// The Error Service Backing field
///
private readonly IErrorService errorService;
///
/// Queue Processor Backing field
///
private readonly IQueueProcessor queueProcessor;
///
/// IsEncoding Backing field
///
private bool isEncoding;
///
/// Job Status Backing field.
///
private string jobStatus;
///
/// Jobs pending backing field
///
private string jobsPending;
#endregion
#region Constructors and Destructors
///
/// 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";
}
#endregion
#region Properties
///
/// 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(() => this.JobStatus);
}
}
///
/// Gets or sets JobsPending.
///
public string JobsPending
{
get
{
return this.jobsPending;
}
set
{
this.jobsPending = value;
this.NotifyOfPropertyChange(() => this.JobsPending);
}
}
///
/// Gets QueueJobs.
///
public ObservableCollection QueueJobs
{
get
{
return this.queueProcessor.QueueManager.Queue;
}
}
#endregion
#region Public Methods
///
/// Clear the Queue
///
public void Clear()
{
this.queueProcessor.QueueManager.Clear();
}
///
/// Clear Completed Items
///
public void ClearCompleted()
{
this.queueProcessor.QueueManager.ClearCompleted();
}
///
/// Close this window.
///
public void Close()
{
this.TryClose();
}
///
/// Handle the On Window Load
///
public override void OnLoad()
{
this.queueProcessor.JobProcessingStarted += this.queueProcessor_JobProcessingStarted;
this.queueProcessor.QueueCompleted += this.queueProcessor_QueueCompleted;
this.queueProcessor.QueuePaused += this.queueProcessor_QueuePaused;
this.queueProcessor.QueueManager.QueueChanged += this.QueueManager_QueueChanged;
// Setup the window to the correct state.
this.IsEncoding = this.queueProcessor.EncodeService.IsEncoding;
this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count);
base.OnLoad();
}
///
/// 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.EncodeService.Stop();
this.queueProcessor.QueueManager.Remove(task);
}
}
else
{
this.queueProcessor.QueueManager.Remove(task);
}
this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count);
}
///
/// Reset the job state to waiting.
///
///
/// The task.
///
public void RetryJob(QueueTask task)
{
task.Status = QueueItemStatus.Waiting;
}
///
/// 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();
}
///
/// Export the Queue to a file.
///
public void Export()
{
VistaSaveFileDialog dialog = new VistaSaveFileDialog { Filter = "HandBrake Queue Files (*.hbq)|*.hbq"};
dialog.ShowDialog();
this.queueProcessor.QueueManager.BackupQueue(dialog.FileName);
}
///
/// Import a saved queue
///
public void Import()
{
VistaOpenFileDialog dialog = new VistaOpenFileDialog { Filter = "HandBrake Queue Files (*.hbq)|*.hbq", CheckFileExists = true };
dialog.ShowDialog();
this.queueProcessor.QueueManager.RestoreQueue(dialog.FileName);
}
#endregion
#region Methods
///
/// Override the OnActive to run the Screen Loading code in the view model base.
///
protected override void OnActivate()
{
this.Load();
base.OnActivate();
}
///
/// Handle the Encode Status Changed Event.
///
///
/// The sender.
///
///
/// The EncodeProgressEventArgs.
///
private void EncodeService_EncodeStatusChanged(
object sender, 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, EventArgs e)
{
// TODO
}
///
/// Handle teh Job Processing Started Event
///
///
/// The sender.
///
///
/// The QueueProgressEventArgs.
///
private void queueProcessor_JobProcessingStarted(
object sender, QueueProgressEventArgs e)
{
this.JobStatus = "Queue Started";
this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count);
this.queueProcessor.EncodeService.EncodeStatusChanged += this.EncodeService_EncodeStatusChanged;
this.IsEncoding = true;
}
///
/// Handle the Queue Completed Event
///
///
/// The sender.
///
///
/// The EventArgs.
///
private void queueProcessor_QueueCompleted(object sender, EventArgs e)
{
this.JobStatus = "Queue Completed";
this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count);
this.IsEncoding = false;
}
///
/// Handle the Queue Paused Event
///
///
/// The sender.
///
///
/// The EventArgs.
///
private void queueProcessor_QueuePaused(object sender, EventArgs e)
{
this.JobStatus = "Queue Paused";
this.JobsPending = string.Format("{0} jobs pending", this.queueProcessor.QueueManager.Count);
this.IsEncoding = false;
}
#endregion
}
}