diff --git a/BFR/MainWindow.xaml b/BFR/MainWindow.xaml index cd35980..e98ffcc 100644 --- a/BFR/MainWindow.xaml +++ b/BFR/MainWindow.xaml @@ -260,5 +260,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/BFR/MainWindowUIProperties.cs b/BFR/MainWindowUIProperties.cs index 7ae2a2a..d36b936 100644 --- a/BFR/MainWindowUIProperties.cs +++ b/BFR/MainWindowUIProperties.cs @@ -27,6 +27,7 @@ namespace BFR OperationType.Make(), OperationType.Make(), OperationType.Make(), + OperationType.Make(), }; public static readonly AvaloniaProperty IsCommitButtonEnabledProperty = diff --git a/BFR/Operations/Add.cs b/BFR/Operations/Add.cs new file mode 100644 index 0000000..ca1b4b6 --- /dev/null +++ b/BFR/Operations/Add.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; +using System.Linq; + +using Avalonia; + +using BFR.DataModels; + +namespace BFR.Operations +{ + public class Add : Operation + { + public override string Name => nameof(Add); + public override string Description => "Adds the specified text to the file name."; + + [XmlIgnore] + public static readonly AvaloniaProperty ModeProperty = + AvaloniaProperty.Register(nameof(Mode), AddMode.Prepend); + public AddMode Mode { get => GetValue(ModeProperty); set => SetValue(ModeProperty, value); } + + public AddOperationMode[] Modes => AddOperationMode.Modes; + + public int InsertPosition { get; set; } = 0; + public string Text { get; set; } = ""; + public bool FullName { get; set; } = false; + + protected override void ApplyToInternal(IList files) + { + // Fail conditions: Out of bounds insert + var shortestLength = files.Min(x => FullName ? x.FullName.Length : x.Name.Length); + if (Mode == AddMode.Insert && InsertPosition > shortestLength) throw new OperationException($"Index can't be greater than the shortest file name length ({shortestLength})."); + + // Apply operation + foreach (var file in files) + { + var newName = FullName ? file.FullName : file.Name; + + newName = Mode switch + { + AddMode.Prepend => $"{Text}{newName}", + AddMode.Append => $"{newName}{Text}", + AddMode.Insert => newName.Insert(InsertPosition, Text), + _ => newName + }; + + if (FullName) file.FullName = newName; + else file.Name = newName; + } + } + } +} diff --git a/BFR/Operations/AddMode.cs b/BFR/Operations/AddMode.cs new file mode 100644 index 0000000..b1b6991 --- /dev/null +++ b/BFR/Operations/AddMode.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +using BFR.Helpers; + +namespace BFR.Operations +{ + public class AddOperationMode : OperationMode + { + public bool IsPrepend => Index == AddMode.Prepend; + public bool IsAppend => Index == AddMode.Append; + public bool IsInsert => Index == AddMode.Insert; + + public readonly static AddOperationMode[] Modes = All(); + + public AddOperationMode(AddMode index, string name, string description) : + base(index, name, description) { } + + protected static AddOperationMode[] All() => ((IEnumerable)Enum.GetValues(typeof(AddMode))).Select(x => + new AddOperationMode( + x, + x.GetAttribute().DisplayName, + x.GetAttribute().Description + )).ToArray(); + } + + public enum AddMode + { + [OperationMode(nameof(Prepend), "Inserts before the file name.")] + Prepend, + [OperationMode(nameof(Append), "Inserts after the file name.")] + Append, + [OperationMode(nameof(Insert), "Inserts at the specified index.")] + Insert + } +}