Added ContextMenu/Flyout animations. Added platform services. Use bitmap cache for all views.

This commit is contained in:
2025-03-18 09:31:32 -04:00
parent 7c70eb3814
commit 9214e97100
17 changed files with 649 additions and 169 deletions

View File

@@ -0,0 +1,17 @@
using Avalonia.Controls;
using Avalonia.Input.Platform;
namespace Harmonia.UI.Platform;
public class ClipboardLocator : PlatformServiceLocator<IClipboard>, IClipboardLocator
{
protected override IClipboard? GetFromWindow(Window mainWindow)
{
return mainWindow.Clipboard;
}
protected override IClipboard? GetFromTopLevel(TopLevel topLevel)
{
return topLevel.Clipboard;
}
}

View File

@@ -0,0 +1,8 @@
using Avalonia.Input.Platform;
namespace Harmonia.UI.Platform;
public interface IClipboardLocator : IPlatformServiceLocator<IClipboard>
{
}

View File

@@ -0,0 +1,6 @@
namespace Harmonia.UI.Platform;
public interface IPlatformServiceLocator<T>
{
T? Get();
}

View File

@@ -0,0 +1,8 @@
using Avalonia.Platform.Storage;
namespace Harmonia.UI.Platform;
public interface IStorageProviderLocator : IPlatformServiceLocator<IStorageProvider>
{
}

View File

@@ -0,0 +1,40 @@
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls;
using Avalonia.Rendering;
using Avalonia;
using Avalonia.VisualTree;
namespace Harmonia.UI.Platform;
public abstract class PlatformServiceLocator<T> : IPlatformServiceLocator<T>
{
public T? Get()
{
//Desktop
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
if (desktop.MainWindow == null)
return default;
return GetFromWindow(desktop.MainWindow);
}
//Android (and iOS?)
else if (Application.Current?.ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
{
if (singleViewPlatform.MainView == null)
return default;
IRenderRoot? visualRoot = singleViewPlatform.MainView.GetVisualRoot();
if (visualRoot is TopLevel topLevel)
{
return GetFromTopLevel(topLevel);
}
}
return default;
}
protected abstract T? GetFromWindow(Window mainWindow);
protected abstract T? GetFromTopLevel(TopLevel topLevel);
}

View File

@@ -0,0 +1,17 @@
using Avalonia.Controls;
using Avalonia.Platform.Storage;
namespace Harmonia.UI.Platform;
public class StorageProviderLocator : PlatformServiceLocator<IStorageProvider>, IStorageProviderLocator
{
protected override IStorageProvider? GetFromWindow(Window mainWindow)
{
return mainWindow.StorageProvider;
}
protected override IStorageProvider? GetFromTopLevel(TopLevel topLevel)
{
return topLevel.StorageProvider;
}
}