bfr/BFR/Operations/Operation.cs

46 lines
1.7 KiB
C#
Raw Normal View History

using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml.Serialization;
using Avalonia;
using BFR.DataModels;
namespace BFR.Operations
{
public abstract class Operation : AvaloniaObject
{
// Needs to be avalonia property to update UI with any potential error.
[XmlIgnore]
public static readonly AvaloniaProperty<string> ErrorProperty = AvaloniaProperty.Register<MainWindow, string>(nameof(Error), defaultValue: "");
[XmlIgnore]
public string Error { get => GetValue(ErrorProperty); set => SetValue(ErrorProperty, value); }
public bool IsEnabled { get; set; } = true;
public abstract string Name { get; }
public abstract string Description { get; }
protected abstract void ApplyToInternal(IList<FileModel> files);
public void ApplyTo(IList<FileModel> files)
{
// Backup of all changes thus far, in case something goes wrong
var backup = files.Select(file => file.Path).ToList();
try
{
if(IsEnabled)
ApplyToInternal(files); // Try to apply operation
Error = ""; // If successul, remove any previous error
}
catch (OperationException e) { Error = e.Message; } // If expected, show user a concise and descriptive message
catch (Exception e) { Error = $"Unexpected {e}"; } // If not, hint with the exception thrown that this is unexpected behaviour
finally
{
if (Error != "") // If something went wrong, restore backup
for (int i = 0; i < files.Count; i++)
files[i].Path = backup[i];
}
}
}
}