summaryrefslogtreecommitdiffstats
path: root/win/CS
diff options
context:
space:
mode:
authorsr55 <[email protected]>2019-06-07 19:55:56 +0100
committersr55 <[email protected]>2019-06-07 19:56:17 +0100
commit1c88dbe1af5b6c29dc88626dc34e746936f49fe6 (patch)
tree510f4f3d051a4e9ff3c9fc73bb82a8fc2d7afb7d /win/CS
parent703fbc82f6c1d25ec9df123d4257953279e3e8a3 (diff)
WinGui: Re-implement queue import/export functionality for the GUI. Note, this is incompatible with the CLI Queue parser. There is an existing separate option for exporting into a CLI friendly JSON format.
Format subject to change in the future. For now, this is a quick way of getting this functionality back. #898
Diffstat (limited to 'win/CS')
-rw-r--r--win/CS/HandBrakeWPF/Properties/Resources.Designer.cs11
-rw-r--r--win/CS/HandBrakeWPF/Properties/Resources.resx5
-rw-r--r--win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs13
-rw-r--r--win/CS/HandBrakeWPF/Services/Queue/QueueService.cs240
-rw-r--r--win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs25
-rw-r--r--win/CS/HandBrakeWPF/Views/QueueView.xaml4
6 files changed, 74 insertions, 224 deletions
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
index 334c77073..ad6f64130 100644
--- a/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
+++ b/win/CS/HandBrakeWPF/Properties/Resources.Designer.cs
@@ -4093,7 +4093,7 @@ namespace HandBrakeWPF.Properties {
}
/// <summary>
- /// Looks up a localized string similar to Export Queue for CLI.
+ /// Looks up a localized string similar to Export Queue.
/// </summary>
public static string QueueView_Export {
get {
@@ -4102,6 +4102,15 @@ namespace HandBrakeWPF.Properties {
}
/// <summary>
+ /// Looks up a localized string similar to Export Queue (CLI Only).
+ /// </summary>
+ public static string QueueView_ExportCLI {
+ get {
+ return ResourceManager.GetString("QueueView_ExportCLI", resourceCulture);
+ }
+ }
+
+ /// <summary>
/// Looks up a localized string similar to Filesize: .
/// </summary>
public static string QueueView_FileSize {
diff --git a/win/CS/HandBrakeWPF/Properties/Resources.resx b/win/CS/HandBrakeWPF/Properties/Resources.resx
index e77a6371d..079c3a4a7 100644
--- a/win/CS/HandBrakeWPF/Properties/Resources.resx
+++ b/win/CS/HandBrakeWPF/Properties/Resources.resx
@@ -1459,7 +1459,7 @@ This will not affect your current settings in the Subtitle tab.</value>
<value>End Time:</value>
</data>
<data name="QueueView_Export" xml:space="preserve">
- <value>Export Queue for CLI</value>
+ <value>Export Queue</value>
</data>
<data name="QueueView_FileSize" xml:space="preserve">
<value>Filesize: </value>
@@ -2011,4 +2011,7 @@ Where supported, any user presets will have been imported.</value>
<data name="OptionsView_Play" xml:space="preserve">
<value>Play</value>
</data>
+ <data name="QueueView_ExportCLI" xml:space="preserve">
+ <value>Export Queue (CLI Only)</value>
+ </data>
</root> \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs b/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs
index add20a27d..18e74989d 100644
--- a/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs
+++ b/win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs
@@ -102,13 +102,14 @@ namespace HandBrakeWPF.Services.Queue.Interfaces
void BackupQueue(string exportPath);
/// <summary>
- /// Export the Queue the standardised JSON format.
+ /// Export the windows queue in JSON format.
+ /// Note: Note compatible with CLI.
/// </summary>
/// <param name="exportPath">
/// The export path.
/// </param>
void ExportJson(string exportPath);
-
+
/// <summary>
/// Restore a JSON queue file.
/// </summary>
@@ -118,6 +119,14 @@ namespace HandBrakeWPF.Services.Queue.Interfaces
void ImportJson(string path);
/// <summary>
+ /// Export the Queue the standardised JSON format for the CLI
+ /// </summary>
+ /// <param name="exportPath">
+ /// The export path.
+ /// </param>
+ void ExportCliJson(string exportPath);
+
+ /// <summary>
/// Checks the current queue for an existing instance of the specified destination.
/// </summary>
/// <param name="destination">
diff --git a/win/CS/HandBrakeWPF/Services/Queue/QueueService.cs b/win/CS/HandBrakeWPF/Services/Queue/QueueService.cs
index 48c29f4f4..3d8af90b3 100644
--- a/win/CS/HandBrakeWPF/Services/Queue/QueueService.cs
+++ b/win/CS/HandBrakeWPF/Services/Queue/QueueService.cs
@@ -44,29 +44,12 @@ namespace HandBrakeWPF.Services.Queue
public class QueueService : Interfaces.IQueueService
{
- #region Constants and Fields
private static readonly object QueueLock = new object();
private readonly IUserSettingService userSettingService;
private readonly ObservableCollection<QueueTask> queue = new ObservableCollection<QueueTask>();
private readonly string queueFile;
private bool clearCompleted;
- #endregion
-
- #region Constructors and Destructors
-
- /// <summary>
- /// Initializes a new instance of the <see cref="QueueService"/> class.
- /// </summary>
- /// <param name="encodeService">
- /// The encode Service.
- /// </param>
- /// <param name="userSettingService">
- /// The user settings service.
- /// </param>
- /// <exception cref="ArgumentNullException">
- /// Services are not setup
- /// </exception>
public QueueService(IEncode encodeService, IUserSettingService userSettingService)
{
this.userSettingService = userSettingService;
@@ -76,64 +59,18 @@ namespace HandBrakeWPF.Services.Queue
this.queueFile = string.Format("{0}{1}.json", QueueRecoveryHelper.QueueFileName, GeneralUtilities.ProcessId);
}
- #endregion
-
- #region Delegates
-
- /// <summary>
- /// Queue Progress Status
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The QueueProgressEventArgs.
- /// </param>
public delegate void QueueProgressStatus(object sender, QueueProgressEventArgs e);
- /// <summary>
- /// The queue completed.
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The e.
- /// </param>
public delegate void QueueCompletedEventDelegate(object sender, QueueCompletedEventArgs e);
- #endregion
-
- #region Events
-
- /// <summary>
- /// Fires when the Queue has started
- /// </summary>
public event QueueProgressStatus JobProcessingStarted;
- /// <summary>
- /// Fires when a job is Added, Removed or Re-Ordered.
- /// Should be used for triggering an update of the Queue Window.
- /// </summary>
public event EventHandler QueueChanged;
- /// <summary>
- /// Fires when the entire encode queue has completed.
- /// </summary>
public event QueueCompletedEventDelegate QueueCompleted;
- /// <summary>
- /// Fires when a pause to the encode queue has been requested.
- /// </summary>
public event EventHandler QueuePaused;
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets the number of jobs in the queue;
- /// </summary>
public int Count
{
get
@@ -142,9 +79,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// The number of errors detected.
- /// </summary>
public int ErrorCount
{
get
@@ -153,25 +87,12 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Gets the IEncodeService instance.
- /// </summary>
public IEncode EncodeService { get; private set; }
- /// <summary>
- /// Gets a value indicating whether IsProcessing.
- /// </summary>
public bool IsProcessing { get; private set; }
- /// <summary>
- /// Gets or sets Last Processed Job.
- /// This is set when the job is poped of the queue by GetNextJobForProcessing();
- /// </summary>
public QueueTask LastProcessedJob { get; set; }
- /// <summary>
- /// Gets The current queue.
- /// </summary>
public ObservableCollection<QueueTask> Queue
{
get
@@ -180,17 +101,7 @@ namespace HandBrakeWPF.Services.Queue
}
}
- #endregion
-
- #region Public Methods
- /// <summary>
- /// Add a job to the Queue.
- /// This method is Thread Safe.
- /// </summary>
- /// <param name="job">
- /// The encode Job object.
- /// </param>
public void Add(QueueTask job)
{
lock (QueueLock)
@@ -200,12 +111,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Backup any changes to the queue file
- /// </summary>
- /// <param name="exportPath">
- /// If this is not null or empty, this will be used instead of the standard backup location.
- /// </param>
public void BackupQueue(string exportPath)
{
Stopwatch watch = Stopwatch.StartNew();
@@ -237,7 +142,7 @@ namespace HandBrakeWPF.Services.Queue
Debug.WriteLine("Queue Save (ms): " + watch.ElapsedMilliseconds);
}
- public void ExportJson(string exportPath)
+ public void ExportCliJson(string exportPath)
{
List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
List<EncodeTask> workUnits = jobs.Select(job => job.Task).ToList();
@@ -253,38 +158,47 @@ namespace HandBrakeWPF.Services.Queue
}
}
+ public void ExportJson(string exportPath)
+ {
+ List<QueueTask> jobs = this.queue.Where(item => item.Status != QueueItemStatus.Completed).ToList();
+
+ JsonSerializerSettings settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
+
+ string json = JsonConvert.SerializeObject(jobs, Formatting.Indented, settings);
+
+ using (var strm = new StreamWriter(exportPath, false))
+ {
+ strm.Write(json);
+ strm.Close();
+ strm.Dispose();
+ }
+ }
+
public void ImportJson(string path)
{
List<Task> tasks;
using (StreamReader reader = new StreamReader(path))
{
string fileContent = reader.ReadToEnd();
- tasks = QueueFactory.GetQueue(fileContent);
+ if (string.IsNullOrEmpty(fileContent))
+ {
+ return;
+ }
+
+ List<QueueTask> reloadedQueue = JsonConvert.DeserializeObject<List<QueueTask>>(fileContent);
- if (tasks != null)
+ if (reloadedQueue == null)
{
- foreach (Task task in tasks)
- {
- // TODO flesh out.
- EncodeTask encodeTask = EncodeTaskImportFactory.Create(task.Job);
- QueueTask queueTask = new QueueTask();
- queueTask.Task = encodeTask;
+ return;
+ }
- this.queue.Add(queueTask);
- }
+ foreach (QueueTask task in reloadedQueue)
+ {
+ this.queue.Add(task);
}
}
}
- /// <summary>
- /// Checks the current queue for an existing instance of the specified destination.
- /// </summary>
- /// <param name="destination">
- /// The destination of the encode.
- /// </param>
- /// <returns>
- /// Whether or not the supplied destination is already in the queue.
- /// </returns>
public bool CheckForDestinationPathDuplicates(string destination)
{
foreach (QueueTask job in this.queue)
@@ -301,9 +215,6 @@ namespace HandBrakeWPF.Services.Queue
return false;
}
- /// <summary>
- /// Clear down all Queue Items
- /// </summary>
public void Clear()
{
List<QueueTask> deleteList = this.queue.ToList();
@@ -314,9 +225,6 @@ namespace HandBrakeWPF.Services.Queue
this.InvokeQueueChanged(EventArgs.Empty);
}
- /// <summary>
- /// Clear down the Queue´s completed items
- /// </summary>
public void ClearCompleted()
{
Execute.OnUIThread(
@@ -332,13 +240,6 @@ namespace HandBrakeWPF.Services.Queue
});
}
- /// <summary>
- /// Get the first job on the queue for processing.
- /// This also removes the job from the Queue and sets the LastProcessedJob
- /// </summary>
- /// <returns>
- /// An encode Job object.
- /// </returns>
public QueueTask GetNextJobForProcessing()
{
if (this.queue.Count > 0)
@@ -349,12 +250,6 @@ namespace HandBrakeWPF.Services.Queue
return null;
}
- /// <summary>
- /// Moves an item down one position in the queue.
- /// </summary>
- /// <param name="index">
- /// The zero-based location of the job in the queue.
- /// </param>
public void MoveDown(int index)
{
if (index < this.queue.Count - 1)
@@ -368,12 +263,6 @@ namespace HandBrakeWPF.Services.Queue
this.InvokeQueueChanged(EventArgs.Empty);
}
- /// <summary>
- /// Moves an item up one position in the queue.
- /// </summary>
- /// <param name="index">
- /// The zero-based location of the job in the queue.
- /// </param>
public void MoveUp(int index)
{
if (index > 0)
@@ -387,13 +276,6 @@ namespace HandBrakeWPF.Services.Queue
this.InvokeQueueChanged(EventArgs.Empty);
}
- /// <summary>
- /// Remove a job from the Queue.
- /// This method is Thread Safe
- /// </summary>
- /// <param name="job">
- /// The job.
- /// </param>
public void Remove(QueueTask job)
{
lock (QueueLock)
@@ -403,12 +285,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Reset a Queued Item from Error or Completed to Waiting
- /// </summary>
- /// <param name="job">
- /// The job.
- /// </param>
public void ResetJobStatusToWaiting(QueueTask job)
{
if (job.Status != QueueItemStatus.Error && job.Status != QueueItemStatus.Completed)
@@ -420,12 +296,6 @@ namespace HandBrakeWPF.Services.Queue
job.Status = QueueItemStatus.Waiting;
}
- /// <summary>
- /// Restore a Queue from file or from the queue backup file.
- /// </summary>
- /// <param name="importPath">
- /// The import path. String.Empty or null will result in the default file being loaded.
- /// </param>
public void RestoreQueue(string importPath)
{
string appDataPath = DirectoryUtilities.GetUserStoragePath(VersionHelper.IsNightly());
@@ -477,9 +347,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Requests a pause of the encode queue.
- /// </summary>
public void Pause()
{
this.IsProcessing = false;
@@ -497,13 +364,6 @@ namespace HandBrakeWPF.Services.Queue
this.Pause();
}
- /// <summary>
- /// Starts encoding the first job in the queue and continues encoding until all jobs
- /// have been encoded.
- /// </summary>
- /// <param name="isClearCompleted">
- /// The is Clear Completed.
- /// </param>
public void Start(bool isClearCompleted)
{
if (this.IsProcessing)
@@ -540,16 +400,6 @@ namespace HandBrakeWPF.Services.Queue
this.InvokeQueuePaused(EventArgs.Empty);
}
- #endregion
-
- #region Methods
-
- /// <summary>
- /// The on queue completed.
- /// </summary>
- /// <param name="e">
- /// The e.
- /// </param>
protected virtual void OnQueueCompleted(QueueCompletedEventArgs e)
{
QueueCompletedEventDelegate handler = this.QueueCompleted;
@@ -561,15 +411,6 @@ namespace HandBrakeWPF.Services.Queue
this.IsProcessing = false;
}
- /// <summary>
- /// After an encode is complete, move onto the next job.
- /// </summary>
- /// <param name="sender">
- /// The sender.
- /// </param>
- /// <param name="e">
- /// The EncodeCompletedEventArgs.
- /// </param>
private void EncodeServiceEncodeCompleted(object sender, EncodeCompletedEventArgs e)
{
this.LastProcessedJob.Status = QueueItemStatus.Completed;
@@ -601,12 +442,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Invoke the JobProcessingStarted event
- /// </summary>
- /// <param name="e">
- /// The QueueProgressEventArgs.
- /// </param>
private void InvokeJobProcessingStarted(QueueProgressEventArgs e)
{
QueueProgressStatus handler = this.JobProcessingStarted;
@@ -616,12 +451,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Invoke the Queue Changed Event
- /// </summary>
- /// <param name="e">
- /// The e.
- /// </param>
private void InvokeQueueChanged(EventArgs e)
{
try
@@ -640,12 +469,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Invoke the QueuePaused event
- /// </summary>
- /// <param name="e">
- /// The EventArgs.
- /// </param>
private void InvokeQueuePaused(EventArgs e)
{
this.IsProcessing = false;
@@ -657,9 +480,6 @@ namespace HandBrakeWPF.Services.Queue
}
}
- /// <summary>
- /// Run through all the jobs on the queue.
- /// </summary>
private void ProcessNextJob()
{
QueueTask job = this.GetNextJobForProcessing();
@@ -702,7 +522,5 @@ namespace HandBrakeWPF.Services.Queue
this.OnQueueCompleted(new QueueCompletedEventArgs(false));
}
}
-
- #endregion
}
} \ No newline at end of file
diff --git a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
index 15602f79d..0415a8c95 100644
--- a/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
+++ b/win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs
@@ -497,10 +497,7 @@ namespace HandBrakeWPF.ViewModels
this.queueProcessor.Start(userSettingService.GetUserSetting<bool>(UserSettingConstants.ClearCompletedFromQueue));
}
- /// <summary>
- /// Export the Queue to a file.
- /// </summary>
- public void Export()
+ public void ExportCli()
{
SaveFileDialog dialog = new SaveFileDialog
{
@@ -512,13 +509,26 @@ namespace HandBrakeWPF.ViewModels
if (dialog.ShowDialog() == true)
{
+ this.queueProcessor.ExportCliJson(dialog.FileName);
+ }
+ }
+
+ public void Export()
+ {
+ SaveFileDialog dialog = new SaveFileDialog
+ {
+ Filter = "Json (*.json)|*.json",
+ OverwritePrompt = true,
+ DefaultExt = ".json",
+ AddExtension = true
+ };
+
+ if (dialog.ShowDialog() == true)
+ {
this.queueProcessor.ExportJson(dialog.FileName);
}
}
- /// <summary>
- /// Import a saved queue
- /// </summary>
public void Import()
{
OpenFileDialog dialog = new OpenFileDialog { Filter = "Json (*.json)|*.json", CheckFileExists = true };
@@ -558,7 +568,6 @@ namespace HandBrakeWPF.ViewModels
public void OpenSourceDir()
{
this.OpenSourceDirectory(this.SelectedTask);
-
}
public void OpenDestDir()
diff --git a/win/CS/HandBrakeWPF/Views/QueueView.xaml b/win/CS/HandBrakeWPF/Views/QueueView.xaml
index 8ff2831b3..8ad81537e 100644
--- a/win/CS/HandBrakeWPF/Views/QueueView.xaml
+++ b/win/CS/HandBrakeWPF/Views/QueueView.xaml
@@ -81,8 +81,10 @@
<MenuItem cal:Message.Attach="[Event Click] = [Action Clear]" Header="{x:Static Properties:Resources.QueueView_ClearAll}" />
<MenuItem cal:Message.Attach="[Event Click] = [Action RemoveSelectedJobs]" Header="{x:Static Properties:Resources.QueueView_ClearSelected}" />
<Separator />
- <!--<MenuItem cal:Message.Attach="[Event Click] = [Action Import]" Header="{x:Static Properties:Resources.QueueView_Import}" />-->
+ <MenuItem cal:Message.Attach="[Event Click] = [Action Import]" Header="{x:Static Properties:Resources.QueueView_Import}" />
<MenuItem cal:Message.Attach="[Event Click] = [Action Export]" Header="{x:Static Properties:Resources.QueueView_Export}" />
+ <Separator />
+ <MenuItem cal:Message.Attach="[Event Click] = [Action ExportCli]" Header="{x:Static Properties:Resources.QueueView_ExportCLI}" />
</MenuItem>
</Menu>