104 lines
2.9 KiB
C#
104 lines
2.9 KiB
C#
|
using System.Diagnostics.CodeAnalysis;
|
|||
|
|
|||
|
using Microsoft.UI.Xaml.Controls;
|
|||
|
|
|||
|
using RustTools.Contracts.Services;
|
|||
|
using RustTools.Helpers;
|
|||
|
using RustTools.ViewModels;
|
|||
|
|
|||
|
namespace RustTools.Services;
|
|||
|
|
|||
|
public class NavigationViewService : INavigationViewService
|
|||
|
{
|
|||
|
private readonly INavigationService _navigationService;
|
|||
|
|
|||
|
private readonly IPageService _pageService;
|
|||
|
|
|||
|
private NavigationView? _navigationView;
|
|||
|
|
|||
|
public IList<object>? MenuItems => _navigationView?.MenuItems;
|
|||
|
|
|||
|
public object? SettingsItem => _navigationView?.SettingsItem;
|
|||
|
|
|||
|
public NavigationViewService(INavigationService navigationService, IPageService pageService)
|
|||
|
{
|
|||
|
_navigationService = navigationService;
|
|||
|
_pageService = pageService;
|
|||
|
}
|
|||
|
|
|||
|
[MemberNotNull(nameof(_navigationView))]
|
|||
|
public void Initialize(NavigationView navigationView)
|
|||
|
{
|
|||
|
_navigationView = navigationView;
|
|||
|
_navigationView.BackRequested += OnBackRequested;
|
|||
|
_navigationView.ItemInvoked += OnItemInvoked;
|
|||
|
}
|
|||
|
|
|||
|
public void UnregisterEvents()
|
|||
|
{
|
|||
|
if (_navigationView != null)
|
|||
|
{
|
|||
|
_navigationView.BackRequested -= OnBackRequested;
|
|||
|
_navigationView.ItemInvoked -= OnItemInvoked;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public NavigationViewItem? GetSelectedItem(Type pageType)
|
|||
|
{
|
|||
|
if (_navigationView != null)
|
|||
|
{
|
|||
|
return GetSelectedItem(_navigationView.MenuItems, pageType) ?? GetSelectedItem(_navigationView.FooterMenuItems, pageType);
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
private void OnBackRequested(NavigationView sender, NavigationViewBackRequestedEventArgs args) => _navigationService.GoBack();
|
|||
|
|
|||
|
private void OnItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
|
|||
|
{
|
|||
|
if (args.IsSettingsInvoked)
|
|||
|
{
|
|||
|
_navigationService.NavigateTo(typeof(SettingsViewModel).FullName!);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var selectedItem = args.InvokedItemContainer as NavigationViewItem;
|
|||
|
|
|||
|
if (selectedItem?.GetValue(NavigationHelper.NavigateToProperty) is string pageKey)
|
|||
|
{
|
|||
|
_navigationService.NavigateTo(pageKey);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private NavigationViewItem? GetSelectedItem(IEnumerable<object> menuItems, Type pageType)
|
|||
|
{
|
|||
|
foreach (var item in menuItems.OfType<NavigationViewItem>())
|
|||
|
{
|
|||
|
if (IsMenuItemForPageType(item, pageType))
|
|||
|
{
|
|||
|
return item;
|
|||
|
}
|
|||
|
|
|||
|
var selectedChild = GetSelectedItem(item.MenuItems, pageType);
|
|||
|
if (selectedChild != null)
|
|||
|
{
|
|||
|
return selectedChild;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
private bool IsMenuItemForPageType(NavigationViewItem menuItem, Type sourcePageType)
|
|||
|
{
|
|||
|
if (menuItem.GetValue(NavigationHelper.NavigateToProperty) is string pageKey)
|
|||
|
{
|
|||
|
return _pageService.GetPageType(pageKey) == sourcePageType;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|