diff options
author | sr55 <[email protected]> | 2019-06-07 19:55:56 +0100 |
---|---|---|
committer | sr55 <[email protected]> | 2019-06-07 19:56:17 +0100 |
commit | 1c88dbe1af5b6c29dc88626dc34e746936f49fe6 (patch) | |
tree | 510f4f3d051a4e9ff3c9fc73bb82a8fc2d7afb7d /win/CS | |
parent | 703fbc82f6c1d25ec9df123d4257953279e3e8a3 (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.cs | 11 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Properties/Resources.resx | 5 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Services/Queue/Interfaces/IQueueService.cs | 13 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Services/Queue/QueueService.cs | 240 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/ViewModels/QueueViewModel.cs | 25 | ||||
-rw-r--r-- | win/CS/HandBrakeWPF/Views/QueueView.xaml | 4 |
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>
|