From aa539c83e67632e594de1308408606415a347357 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sat, 28 Sep 2024 21:55:08 +0100 Subject: [PATCH] Add FolderProvider --- Toolkit.Avalonia/FileProvider.cs | 12 ++++----- Toolkit.Avalonia/FolderProvider.cs | 25 +++++++++++++++++++ .../IServiceCollectionExtensions.cs | 4 +++ Toolkit.Foundation/FileFilter.cs | 2 +- Toolkit.Foundation/FolderFilter.cs | 3 +++ Toolkit.Foundation/IFolderProvider.cs | 6 +++++ Toolkit.Foundation/Result.cs | 19 ++++++++++++++ Toolkit.Foundation/Result1.cs | 19 -------------- Toolkit.Foundation/SelectFoldersHandler.cs | 20 +++++++++++++++ 9 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 Toolkit.Avalonia/FolderProvider.cs create mode 100644 Toolkit.Foundation/FolderFilter.cs create mode 100644 Toolkit.Foundation/IFolderProvider.cs delete mode 100644 Toolkit.Foundation/Result1.cs create mode 100644 Toolkit.Foundation/SelectFoldersHandler.cs diff --git a/Toolkit.Avalonia/FileProvider.cs b/Toolkit.Avalonia/FileProvider.cs index a82184e..a3be506 100644 --- a/Toolkit.Avalonia/FileProvider.cs +++ b/Toolkit.Avalonia/FileProvider.cs @@ -11,21 +11,21 @@ public class FileProvider(ITopLevelProvider topLevelProvider) : { if (topLevelProvider.Get() is TopLevel topLevel) { - IReadOnlyList storageFiles = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions() + IReadOnlyList files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions() { AllowMultiple = filter.AllowMultiple, - FileTypeFilter = new List - { + FileTypeFilter = + [ new(filter.Name) { Patterns = filter.Extensions is { Count: > 0 } ? filter.Extensions.Select(x => $"*.{x}").ToList() : ["*.*"] } - } + ] }); - return storageFiles.Select(file => file.Path.LocalPath).ToList(); + return files.Select(x => x.Path.LocalPath).ToList(); } - return Array.Empty(); + return []; } } \ No newline at end of file diff --git a/Toolkit.Avalonia/FolderProvider.cs b/Toolkit.Avalonia/FolderProvider.cs new file mode 100644 index 0000000..0f6b234 --- /dev/null +++ b/Toolkit.Avalonia/FolderProvider.cs @@ -0,0 +1,25 @@ +using Avalonia.Controls; +using Avalonia.Platform.Storage; +using Toolkit.Foundation; + +namespace Toolkit.Avalonia; + +public class FolderProvider(ITopLevelProvider topLevelProvider) : + IFolderProvider +{ + public async Task> SelectFolders(FolderFilter filter) + { + if (topLevelProvider.Get() is TopLevel topLevel) + { + IReadOnlyList folders = await topLevel.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions() + { + AllowMultiple = filter.AllowMultiple + }); + + + return folders.Select(x => x.Path.LocalPath).ToList(); + } + + return []; + } +} diff --git a/Toolkit.Avalonia/IServiceCollectionExtensions.cs b/Toolkit.Avalonia/IServiceCollectionExtensions.cs index dba5703..d02fe22 100644 --- a/Toolkit.Avalonia/IServiceCollectionExtensions.cs +++ b/Toolkit.Avalonia/IServiceCollectionExtensions.cs @@ -126,6 +126,7 @@ public static class IServiceCollectionExtensions { services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); @@ -139,6 +140,7 @@ public static class IServiceCollectionExtensions services.AddTransient(); services.AddHandler(); + services.AddHandler(); services.AddHandler(nameof(IClassicDesktopStyleApplicationLifetime)); services.AddHandler(nameof(ISingleViewApplicationLifetime)); @@ -157,6 +159,7 @@ public static class IServiceCollectionExtensions { services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); @@ -170,6 +173,7 @@ public static class IServiceCollectionExtensions services.AddTransient(); services.AddHandler(); + services.AddHandler(); services.AddHandler(nameof(ContentControl)); services.AddHandler(nameof(Frame)); diff --git a/Toolkit.Foundation/FileFilter.cs b/Toolkit.Foundation/FileFilter.cs index e2c711e..e37c437 100644 --- a/Toolkit.Foundation/FileFilter.cs +++ b/Toolkit.Foundation/FileFilter.cs @@ -1,3 +1,3 @@ namespace Toolkit.Foundation; -public record FileFilter(string Name, List Extensions, bool AllowMultiple = false); \ No newline at end of file +public record FileFilter(string Name, List Extensions, bool AllowMultiple = false); diff --git a/Toolkit.Foundation/FolderFilter.cs b/Toolkit.Foundation/FolderFilter.cs new file mode 100644 index 0000000..7ff2c9a --- /dev/null +++ b/Toolkit.Foundation/FolderFilter.cs @@ -0,0 +1,3 @@ +namespace Toolkit.Foundation; + +public record FolderFilter(bool AllowMultiple = false); \ No newline at end of file diff --git a/Toolkit.Foundation/IFolderProvider.cs b/Toolkit.Foundation/IFolderProvider.cs new file mode 100644 index 0000000..ce91067 --- /dev/null +++ b/Toolkit.Foundation/IFolderProvider.cs @@ -0,0 +1,6 @@ +namespace Toolkit.Foundation; + +public interface IFolderProvider +{ + Task> SelectFolders(FolderFilter filter); +} \ No newline at end of file diff --git a/Toolkit.Foundation/Result.cs b/Toolkit.Foundation/Result.cs index cf59e5f..8b3dd5f 100644 --- a/Toolkit.Foundation/Result.cs +++ b/Toolkit.Foundation/Result.cs @@ -12,3 +12,22 @@ public record Result : public static implicit operator Result(TValue? value) => Create(value); } + + +public record Result(bool IsSuccess, Error Error) +{ + public bool IsFailure => !IsSuccess; + + public static Result Success() => new(true, Error.None); + + public static Result Success(TValue value) => new(value, true, Error.None); + + public static Result Failure(Error error) => new(false, error); + + public static Result Failure(Error error) => new(default, false, error); + + public static Result Create(bool condition) => condition ? Success() : Failure(Error.ConditionNotMet); + + public static Result Create(TValue? value) => value is not null ? Success(value) : Failure(Error.Null); + +} \ No newline at end of file diff --git a/Toolkit.Foundation/Result1.cs b/Toolkit.Foundation/Result1.cs deleted file mode 100644 index e67f427..0000000 --- a/Toolkit.Foundation/Result1.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Toolkit.Foundation; - -public record Result(bool IsSuccess, Error Error) -{ - public bool IsFailure => !IsSuccess; - - public static Result Success() => new(true, Error.None); - - public static Result Success(TValue value) => new(value, true, Error.None); - - public static Result Failure(Error error) => new(false, error); - - public static Result Failure(Error error) => new(default, false, error); - - public static Result Create(bool condition) => condition ? Success() : Failure(Error.ConditionNotMet); - - public static Result Create(TValue? value) => value is not null ? Success(value) : Failure(Error.Null); - -} diff --git a/Toolkit.Foundation/SelectFoldersHandler.cs b/Toolkit.Foundation/SelectFoldersHandler.cs new file mode 100644 index 0000000..33ee5ea --- /dev/null +++ b/Toolkit.Foundation/SelectFoldersHandler.cs @@ -0,0 +1,20 @@ +namespace Toolkit.Foundation; + +public class SelectFoldersHandler(IFolderProvider folderProvider) : + IHandler, IReadOnlyCollection?> +{ + public async Task?> Handle(SelectionEventArgs args, + CancellationToken cancellationToken) + { + if (args.Sender is FolderFilter filter) + { + if (await folderProvider.SelectFolders(filter) + is { Count: > 0 } folders) + { + return folders; + } + } + + return default; + } +}