Browse Source

Change pattern to CompositeStorageProvider

pull/8548/head
Max Katz 4 years ago
parent
commit
24effcf2ec
  1. 2
      src/Avalonia.FreeDesktop/DBusSystemDialog.cs
  2. 34
      src/Avalonia.X11/NativeDialogs/CompositeStorageProvider.cs
  3. 2
      src/Avalonia.X11/NativeDialogs/GtkNativeFileDialogs.cs
  4. 7
      src/Avalonia.X11/X11Window.cs

2
src/Avalonia.FreeDesktop/DBusSystemDialog.cs

@ -18,7 +18,7 @@ namespace Avalonia.FreeDesktop
private static readonly Lazy<IFileChooser?> s_fileChooser = new(() => DBusHelper.Connection?
.CreateProxy<IFileChooser>("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop"));
internal static async Task<DBusSystemDialog?> TryCreate(IPlatformHandle handle)
internal static async Task<IStorageProvider?> TryCreate(IPlatformHandle handle)
{
if (handle.HandleDescriptor == "XID" && s_fileChooser.Value is { } fileChooser)
{

34
src/Avalonia.X11/NativeDialogs/LinuxStorageProvider.cs → src/Avalonia.X11/NativeDialogs/CompositeStorageProvider.cs

@ -1,17 +1,17 @@
using System;
#nullable enable
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Avalonia.FreeDesktop;
using Avalonia.Platform.Storage;
namespace Avalonia.X11.NativeDialogs;
internal class LinuxStorageProvider : IStorageProvider
internal class CompositeStorageProvider : IStorageProvider
{
private readonly X11Window _window;
public LinuxStorageProvider(X11Window window)
private readonly IEnumerable<Func<Task<IStorageProvider?>>> _factories;
public CompositeStorageProvider(IEnumerable<Func<Task<IStorageProvider?>>> factories)
{
_window = window;
_factories = factories;
}
public bool CanOpen => true;
@ -20,22 +20,14 @@ internal class LinuxStorageProvider : IStorageProvider
private async Task<IStorageProvider> EnsureStorageProvider()
{
var options = AvaloniaLocator.Current.GetService<X11PlatformOptions>() ?? new X11PlatformOptions();
if (options.UseDBusFilePicker)
foreach (var factory in _factories)
{
var dBusDialog = await DBusSystemDialog.TryCreate(_window.Handle);
if (dBusDialog is not null)
var provider = await factory();
if (provider is not null)
{
return dBusDialog;
return provider;
}
}
var gtkDialog = await GtkSystemDialog.TryCreate(_window);
if (gtkDialog is not null)
{
return gtkDialog;
}
throw new InvalidOperationException("Neither DBus nor GTK are available on the system");
}
@ -46,7 +38,7 @@ internal class LinuxStorageProvider : IStorageProvider
return await provider.OpenFilePickerAsync(options).ConfigureAwait(false);
}
public async Task<IStorageFile> SaveFilePickerAsync(FilePickerSaveOptions options)
public async Task<IStorageFile?> SaveFilePickerAsync(FilePickerSaveOptions options)
{
var provider = await EnsureStorageProvider().ConfigureAwait(false);
return await provider.SaveFilePickerAsync(options).ConfigureAwait(false);
@ -58,13 +50,13 @@ internal class LinuxStorageProvider : IStorageProvider
return await provider.OpenFolderPickerAsync(options).ConfigureAwait(false);
}
public async Task<IStorageBookmarkFile> OpenFileBookmarkAsync(string bookmark)
public async Task<IStorageBookmarkFile?> OpenFileBookmarkAsync(string bookmark)
{
var provider = await EnsureStorageProvider().ConfigureAwait(false);
return await provider.OpenFileBookmarkAsync(bookmark).ConfigureAwait(false);
}
public async Task<IStorageBookmarkFolder> OpenFolderBookmarkAsync(string bookmark)
public async Task<IStorageBookmarkFolder?> OpenFolderBookmarkAsync(string bookmark)
{
var provider = await EnsureStorageProvider().ConfigureAwait(false);
return await provider.OpenFolderBookmarkAsync(bookmark).ConfigureAwait(false);

2
src/Avalonia.X11/NativeDialogs/GtkNativeFileDialogs.cs

@ -31,7 +31,7 @@ namespace Avalonia.X11.NativeDialogs
public override bool CanPickFolder => true;
internal static async Task<GtkSystemDialog?> TryCreate(X11Window window)
internal static async Task<IStorageProvider?> TryCreate(X11Window window)
{
_initialized ??= StartGtk();

7
src/Avalonia.X11/X11Window.cs

@ -22,6 +22,7 @@ using Avalonia.Rendering;
using Avalonia.Rendering.Composition;
using Avalonia.Threading;
using Avalonia.X11.Glx;
using Avalonia.X11.NativeDialogs;
using static Avalonia.X11.XLib;
// ReSharper disable IdentifierTypo
// ReSharper disable StringLiteralTypo
@ -215,7 +216,11 @@ namespace Avalonia.X11
_x11.Atoms.XA_CARDINAL, 32, PropertyMode.Replace, ref _xSyncCounter, 1);
}
StorageProvider = new NativeDialogs.LinuxStorageProvider(this);
StorageProvider = new CompositeStorageProvider(new Func<Task<IStorageProvider>>[]
{
() => _platform.Options.UseDBusFilePicker ? DBusSystemDialog.TryCreate(Handle) : Task.FromResult<IStorageProvider>(null),
() => GtkSystemDialog.TryCreate(this),
});
}
class SurfaceInfo : EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo

Loading…
Cancel
Save