maui-linux/Handlers/NavigationPageHandler.cs

154 lines
4.9 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.Maui.Handlers;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Platform;
using SkiaSharp;
namespace Microsoft.Maui.Platform.Linux.Handlers;
/// <summary>
/// Handler for NavigationPage on Linux using Skia rendering.
/// </summary>
public partial class NavigationPageHandler : ViewHandler<NavigationPage, SkiaNavigationPage>
{
public static IPropertyMapper<NavigationPage, NavigationPageHandler> Mapper =
new PropertyMapper<NavigationPage, NavigationPageHandler>(ViewHandler.ViewMapper)
{
[nameof(NavigationPage.BarBackgroundColor)] = MapBarBackgroundColor,
[nameof(NavigationPage.BarBackground)] = MapBarBackground,
[nameof(NavigationPage.BarTextColor)] = MapBarTextColor,
[nameof(IView.Background)] = MapBackground,
};
public static CommandMapper<NavigationPage, NavigationPageHandler> CommandMapper =
new(ViewHandler.ViewCommandMapper)
{
[nameof(IStackNavigationView.RequestNavigation)] = MapRequestNavigation,
};
public NavigationPageHandler() : base(Mapper, CommandMapper)
{
}
public NavigationPageHandler(IPropertyMapper? mapper, CommandMapper? commandMapper = null)
: base(mapper ?? Mapper, commandMapper ?? CommandMapper)
{
}
protected override SkiaNavigationPage CreatePlatformView()
{
return new SkiaNavigationPage();
}
protected override void ConnectHandler(SkiaNavigationPage platformView)
{
base.ConnectHandler(platformView);
platformView.Pushed += OnPushed;
platformView.Popped += OnPopped;
platformView.PoppedToRoot += OnPoppedToRoot;
// Set initial root page if exists
if (VirtualView.CurrentPage != null)
{
SetupInitialPage();
}
}
protected override void DisconnectHandler(SkiaNavigationPage platformView)
{
platformView.Pushed -= OnPushed;
platformView.Popped -= OnPopped;
platformView.PoppedToRoot -= OnPoppedToRoot;
base.DisconnectHandler(platformView);
}
private void SetupInitialPage()
{
var currentPage = VirtualView.CurrentPage;
if (currentPage?.Handler?.PlatformView is SkiaPage skiaPage)
{
PlatformView.SetRootPage(skiaPage);
}
}
private void OnPushed(object? sender, NavigationEventArgs e)
{
// Navigation was completed on platform side
}
private void OnPopped(object? sender, NavigationEventArgs e)
{
// Sync back to virtual view if needed
}
private void OnPoppedToRoot(object? sender, NavigationEventArgs e)
{
// Navigation was reset
}
public static void MapBarBackgroundColor(NavigationPageHandler handler, NavigationPage navigationPage)
{
if (handler.PlatformView is null) return;
if (navigationPage.BarBackgroundColor is not null)
{
handler.PlatformView.BarBackgroundColor = navigationPage.BarBackgroundColor.ToSKColor();
}
}
public static void MapBarBackground(NavigationPageHandler handler, NavigationPage navigationPage)
{
if (handler.PlatformView is null) return;
if (navigationPage.BarBackground is SolidColorBrush solidBrush)
{
handler.PlatformView.BarBackgroundColor = solidBrush.Color.ToSKColor();
}
}
public static void MapBarTextColor(NavigationPageHandler handler, NavigationPage navigationPage)
{
if (handler.PlatformView is null) return;
if (navigationPage.BarTextColor is not null)
{
handler.PlatformView.BarTextColor = navigationPage.BarTextColor.ToSKColor();
}
}
public static void MapBackground(NavigationPageHandler handler, NavigationPage navigationPage)
{
if (handler.PlatformView is null) return;
if (navigationPage.Background is SolidColorBrush solidBrush)
{
handler.PlatformView.BackgroundColor = solidBrush.Color.ToSKColor();
}
}
public static void MapRequestNavigation(NavigationPageHandler handler, NavigationPage navigationPage, object? args)
{
if (handler.PlatformView is null || args is not NavigationRequest request)
return;
// Handle navigation request
foreach (var page in request.NavigationStack)
{
if (page.Handler?.PlatformView is SkiaPage skiaPage)
{
if (handler.PlatformView.StackDepth == 0)
{
handler.PlatformView.SetRootPage(skiaPage);
}
else
{
handler.PlatformView.Push(skiaPage, request.Animated);
}
}
}
}
}