using System.ComponentModel; using System.IO; using Ookii.Dialogs.Wpf; using PointlessWaymarks.CommonTools; using PointlessWaymarks.LlamaAspects; using PointlessWaymarks.WpfCommon.ChangesAndValidation; using PointlessWaymarks.WpfCommon.Status; namespace PointlessWaymarks.WpfCommon.ExistingDirectoryDataEntry; [NotifyPropertyChanged] [GenerateStatusCommands] public partial class ExistingDirectoryDataEntryContext : IHasChanges, IHasValidationIssues { private ExistingDirectoryDataEntryContext(StatusControlContext statusContext) { PropertyChanged += OnPropertyChanged; StatusContext = statusContext; BuildCommands(); } public Func AfterDirectoryChoice { get; set; } = _ => Task.CompletedTask; public Func> GetInitialDirectory { get; set; } = () => Task.FromResult(""); public string HelpText { get; set; } = string.Empty; public string ReferenceValue { get; set; } = string.Empty; public StatusControlContext StatusContext { get; set; } public string Title { get; set; } = string.Empty; public string UserValue { get; set; } = string.Empty; public List>> ValidationFunctions { get; set; } = []; public string ValidationMessage { get; set; } = string.Empty; public bool HasChanges { get; set; } public bool HasValidationIssues { get; set; } public async Task CheckForChangesAndValidationIssues() { HasChanges = UserValue.TrimNullToEmpty() != ReferenceValue.TrimNullToEmpty(); if (ValidationFunctions.Any()) foreach (var loopValidations in ValidationFunctions) { var validationResult = await loopValidations(UserValue); if (!validationResult.Valid) { HasValidationIssues = true; ValidationMessage = validationResult.Explanation; return; } } HasValidationIssues = false; ValidationMessage = string.Empty; } public static ExistingDirectoryDataEntryContext CreateInstance(StatusControlContext? statusContext) { return new ExistingDirectoryDataEntryContext(statusContext ?? new StatusControlContext()); } private async void OnPropertyChanged(object? sender, PropertyChangedEventArgs e) { if (string.IsNullOrWhiteSpace(e.PropertyName)) return; if (e.PropertyName.Equals(nameof(ReferenceValue)) || e.PropertyName.Equals(nameof(UserValue)) || e.PropertyName.Equals(nameof(ValidationFunctions))) await CheckForChangesAndValidationIssues(); } [BlockingCommand] public async Task PickDirectory() { await ThreadSwitcher.ResumeForegroundAsync(); var initialDirectory = await GetInitialDirectory(); var folderPicker = new VistaFolderBrowserDialog { Description = $"Choose Directory - {Title}", Multiselect = false }; if (!string.IsNullOrWhiteSpace(initialDirectory) && Path.Exists(initialDirectory)) folderPicker.SelectedPath = $"{initialDirectory}\\"; if (folderPicker.ShowDialog() != true) return; UserValue = folderPicker.SelectedPath; await AfterDirectoryChoice(folderPicker.SelectedPath); } }