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? private static readonly Lazy<IFileChooser?> s_fileChooser = new(() => DBusHelper.Connection?
.CreateProxy<IFileChooser>("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop")); .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) 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.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.FreeDesktop;
using Avalonia.Platform.Storage; using Avalonia.Platform.Storage;
namespace Avalonia.X11.NativeDialogs; namespace Avalonia.X11.NativeDialogs;
internal class LinuxStorageProvider : IStorageProvider internal class CompositeStorageProvider : IStorageProvider
{ {
private readonly X11Window _window; private readonly IEnumerable<Func<Task<IStorageProvider?>>> _factories;
public LinuxStorageProvider(X11Window window) public CompositeStorageProvider(IEnumerable<Func<Task<IStorageProvider?>>> factories)
{ {
_window = window; _factories = factories;
} }
public bool CanOpen => true; public bool CanOpen => true;
@ -20,22 +20,14 @@ internal class LinuxStorageProvider : IStorageProvider
private async Task<IStorageProvider> EnsureStorageProvider() private async Task<IStorageProvider> EnsureStorageProvider()
{ {
var options = AvaloniaLocator.Current.GetService<X11PlatformOptions>() ?? new X11PlatformOptions(); foreach (var factory in _factories)
if (options.UseDBusFilePicker)
{ {
var dBusDialog = await DBusSystemDialog.TryCreate(_window.Handle); var provider = await factory();
if (dBusDialog is not null) 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"); 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); 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); var provider = await EnsureStorageProvider().ConfigureAwait(false);
return await provider.SaveFilePickerAsync(options).ConfigureAwait(false); return await provider.SaveFilePickerAsync(options).ConfigureAwait(false);
@ -58,13 +50,13 @@ internal class LinuxStorageProvider : IStorageProvider
return await provider.OpenFolderPickerAsync(options).ConfigureAwait(false); 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); var provider = await EnsureStorageProvider().ConfigureAwait(false);
return await provider.OpenFileBookmarkAsync(bookmark).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); var provider = await EnsureStorageProvider().ConfigureAwait(false);
return await provider.OpenFolderBookmarkAsync(bookmark).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; public override bool CanPickFolder => true;
internal static async Task<GtkSystemDialog?> TryCreate(X11Window window) internal static async Task<IStorageProvider?> TryCreate(X11Window window)
{ {
_initialized ??= StartGtk(); _initialized ??= StartGtk();

7
src/Avalonia.X11/X11Window.cs

@ -22,6 +22,7 @@ using Avalonia.Rendering;
using Avalonia.Rendering.Composition; using Avalonia.Rendering.Composition;
using Avalonia.Threading; using Avalonia.Threading;
using Avalonia.X11.Glx; using Avalonia.X11.Glx;
using Avalonia.X11.NativeDialogs;
using static Avalonia.X11.XLib; using static Avalonia.X11.XLib;
// ReSharper disable IdentifierTypo // ReSharper disable IdentifierTypo
// ReSharper disable StringLiteralTypo // ReSharper disable StringLiteralTypo
@ -215,7 +216,11 @@ namespace Avalonia.X11
_x11.Atoms.XA_CARDINAL, 32, PropertyMode.Replace, ref _xSyncCounter, 1); _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 class SurfaceInfo : EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo

Loading…
Cancel
Save