Skip to content

Commit

Permalink
Add ability to provide a custom INavigationViewLocator so other OIC c… (
Browse files Browse the repository at this point in the history
#32)

* Add ability to provide a custom INavigationViewLocator so other OIC containers can be used to create views.

* Invoke viewFactoryFactory inside INavigator factory

---------

Co-authored-by: Daniel Meza <daniel.meza-contractor@procore.com>
  • Loading branch information
danielmeza and demezaapc committed Jun 9, 2024
1 parent 10d6d8c commit 44f6ae7
Showing 1 changed file with 23 additions and 3 deletions.
26 changes: 23 additions & 3 deletions src/AvaloniaInside.Shell/AppBuilderExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using Avalonia;
using AvaloniaInside.Shell.Presenters;
using Splat;
Expand All @@ -6,7 +7,7 @@ namespace AvaloniaInside.Shell;

public static class AppBuilderExtensions
{
public static AppBuilder UseShell(this AppBuilder builder) =>
public static AppBuilder UseShell(this AppBuilder builder, Func<INavigationViewLocator>? viewLocatorFactory = null) =>
builder.AfterPlatformServicesSetup(_ =>
{
if (Locator.CurrentMutable is null)
Expand All @@ -16,18 +17,37 @@ public static class AppBuilderExtensions
Locator.CurrentMutable.Register<INavigationRegistrar, NavigationRegistrar>();
Locator.CurrentMutable.Register<IPresenterProvider, PresenterProvider>();
Locator.CurrentMutable.Register<INavigationViewLocator, DefaultNavigationViewLocator>();
if (viewLocatorFactory is null)
{
Locator.CurrentMutable.Register<INavigationViewLocator, DefaultNavigationViewLocator>();
}
Locator.CurrentMutable.Register<INavigationUpdateStrategy>(() =>
new DefaultNavigationUpdateStrategy(Locator.Current.GetService<IPresenterProvider>()!));
Locator.CurrentMutable.Register<INavigator>(() =>
{
var viewLocator = viewLocatorFactory != null ? viewLocatorFactory.Invoke() : Locator.Current.GetService<INavigationViewLocator>()!;
var registrar = Locator.Current.GetService<INavigationRegistrar>()!;
return new Navigator(
registrar,
new RelativeNavigateStrategy(registrar),
Locator.Current.GetService<INavigationUpdateStrategy>()!,
Locator.Current.GetService<INavigationViewLocator>()!);
viewLocator
);
});
});

public static AppBuilder UseShell(this AppBuilder builder, Func<NavigationNode, object> viewFactory)
=> builder.UseShell(() => new DelegateNavigationViewLocator(viewFactory));

private class DelegateNavigationViewLocator(Func<NavigationNode, object> viewFactory)
: INavigationViewLocator
{
public object GetView(NavigationNode navigationItem)
{
return viewFactory(navigationItem);
}
}
}

0 comments on commit 44f6ae7

Please sign in to comment.