b7f6158300
- Removed redundant calls by disabling event handling when an operation is created or moved, as well as before the end of construction - Also removed unused and ordered namespaces
46 lines
1.7 KiB
C#
46 lines
1.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Xml.Serialization;
|
|
using System.Collections.Generic;
|
|
|
|
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];
|
|
}
|
|
}
|
|
}
|
|
}
|