Settings shell.
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Messaging;
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Core.Domain.MenuItems;
|
||||
using Wino.Core.Domain.Models;
|
||||
using Wino.Core.Domain.Models.Navigation;
|
||||
using Wino.Core.Domain.Models.Settings;
|
||||
using Wino.Core.ViewModels;
|
||||
using Wino.Messaging.Client.Navigation;
|
||||
using Wino.Messaging.Client.Shell;
|
||||
|
||||
namespace Wino.Mail.WinUI.ViewModels;
|
||||
|
||||
public partial class SettingsShellClient(INavigationService navigationService) :
|
||||
CoreBaseViewModel,
|
||||
IShellClient,
|
||||
IRecipient<ActiveSettingsPageChanged>,
|
||||
IRecipient<LanguageChanged>
|
||||
{
|
||||
public WinoApplicationMode Mode => WinoApplicationMode.Settings;
|
||||
public MenuItemCollection? MenuItems { get; private set; }
|
||||
|
||||
[ObservableProperty]
|
||||
public partial object? SelectedMenuItem { get; set; } = null;
|
||||
|
||||
public bool HandlesNavigationSelection => true;
|
||||
|
||||
protected override void OnDispatcherAssigned()
|
||||
{
|
||||
base.OnDispatcherAssigned();
|
||||
MenuItems ??= new MenuItemCollection(Dispatcher);
|
||||
RebuildMenuItems();
|
||||
}
|
||||
|
||||
public void Activate(ShellModeActivationContext activationContext)
|
||||
{
|
||||
RebuildMenuItems();
|
||||
|
||||
var targetPage = activationContext.Parameter as WinoPage? ?? WinoPage.SettingOptionsPage;
|
||||
SetSelectedRootPage(SettingsNavigationInfoProvider.GetRootPage(targetPage));
|
||||
OnNavigatedTo(NavigationMode.New, activationContext);
|
||||
|
||||
navigationService.Navigate(WinoPage.SettingsPage, targetPage, NavigationReferenceFrame.InnerShellFrame);
|
||||
}
|
||||
|
||||
public void Deactivate()
|
||||
{
|
||||
OnNavigatedFrom(NavigationMode.New, null!);
|
||||
}
|
||||
|
||||
public Task HandleNavigationItemInvokedAsync(IMenuItem? menuItem)
|
||||
{
|
||||
if (menuItem is not SettingsShellPageMenuItem settingsMenuItem)
|
||||
return Task.CompletedTask;
|
||||
|
||||
var currentPage = (SelectedMenuItem as SettingsShellPageMenuItem)?.PageType;
|
||||
if (currentPage == settingsMenuItem.PageType && settingsMenuItem.PageType != WinoPage.SettingOptionsPage)
|
||||
return Task.CompletedTask;
|
||||
|
||||
SetSelectedRootPage(settingsMenuItem.PageType);
|
||||
Messenger.Send(new SettingsRootNavigationRequested(settingsMenuItem.PageType));
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task HandleNavigationSelectionChangedAsync(IMenuItem? menuItem)
|
||||
{
|
||||
if (menuItem is not SettingsShellPageMenuItem settingsMenuItem)
|
||||
return Task.CompletedTask;
|
||||
|
||||
if ((SelectedMenuItem as SettingsShellPageMenuItem)?.PageType == settingsMenuItem.PageType)
|
||||
return Task.CompletedTask;
|
||||
|
||||
SetSelectedRootPage(settingsMenuItem.PageType);
|
||||
Messenger.Send(new SettingsRootNavigationRequested(settingsMenuItem.PageType));
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task KeyboardShortcutHook(KeyboardShortcutTriggerDetails args) => Task.CompletedTask;
|
||||
|
||||
public void Receive(ActiveSettingsPageChanged message)
|
||||
{
|
||||
SetSelectedRootPage(message.RootPage);
|
||||
}
|
||||
|
||||
public void Receive(LanguageChanged message)
|
||||
{
|
||||
var selectedPage = (SelectedMenuItem as SettingsShellPageMenuItem)?.PageType ?? WinoPage.SettingOptionsPage;
|
||||
RebuildMenuItems();
|
||||
SetSelectedRootPage(selectedPage);
|
||||
}
|
||||
|
||||
private void RebuildMenuItems()
|
||||
{
|
||||
if (MenuItems == null)
|
||||
return;
|
||||
|
||||
var selectedPage = (SelectedMenuItem as SettingsShellPageMenuItem)?.PageType ?? WinoPage.SettingOptionsPage;
|
||||
|
||||
MenuItems.Clear();
|
||||
|
||||
foreach (var item in SettingsNavigationInfoProvider.GetNavigationItems())
|
||||
{
|
||||
if (item.IsSeparator)
|
||||
{
|
||||
MenuItems.Add(new SettingsShellSectionMenuItem(item.Title, item.Glyph));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!item.PageType.HasValue)
|
||||
continue;
|
||||
|
||||
MenuItems.Add(new SettingsShellPageMenuItem(item.PageType.Value, item.Title, item.Description, item.Glyph));
|
||||
}
|
||||
|
||||
SetSelectedRootPage(selectedPage);
|
||||
}
|
||||
|
||||
private void SetSelectedRootPage(WinoPage pageType)
|
||||
{
|
||||
if (MenuItems == null)
|
||||
return;
|
||||
|
||||
var rootPage = SettingsNavigationInfoProvider.GetRootPage(pageType);
|
||||
var selectedItem = MenuItems.OfType<SettingsShellPageMenuItem>()
|
||||
.FirstOrDefault(item => item.PageType == rootPage);
|
||||
|
||||
if (ReferenceEquals(SelectedMenuItem, selectedItem))
|
||||
return;
|
||||
|
||||
SelectedMenuItem = selectedItem;
|
||||
}
|
||||
|
||||
protected override void RegisterRecipients()
|
||||
{
|
||||
base.RegisterRecipients();
|
||||
Messenger.Register<ActiveSettingsPageChanged>(this);
|
||||
Messenger.Register<LanguageChanged>(this);
|
||||
}
|
||||
|
||||
protected override void UnregisterRecipients()
|
||||
{
|
||||
base.UnregisterRecipients();
|
||||
Messenger.Unregister<ActiveSettingsPageChanged>(this);
|
||||
Messenger.Unregister<LanguageChanged>(this);
|
||||
}
|
||||
}
|
||||
@@ -54,6 +54,7 @@ public sealed class WinoAppShellViewModel : CoreBaseViewModel, IShellViewModel
|
||||
OnPropertyChanged(nameof(IsMailMode));
|
||||
OnPropertyChanged(nameof(IsCalendarMode));
|
||||
OnPropertyChanged(nameof(IsContactsMode));
|
||||
OnPropertyChanged(nameof(IsSettingsMode));
|
||||
OnPropertyChanged(nameof(SelectedMenuItem));
|
||||
}
|
||||
}
|
||||
@@ -63,6 +64,7 @@ public sealed class WinoAppShellViewModel : CoreBaseViewModel, IShellViewModel
|
||||
public bool IsMailMode => CurrentMode == WinoApplicationMode.Mail;
|
||||
public bool IsCalendarMode => CurrentMode == WinoApplicationMode.Calendar;
|
||||
public bool IsContactsMode => CurrentMode == WinoApplicationMode.Contacts;
|
||||
public bool IsSettingsMode => CurrentMode == WinoApplicationMode.Settings;
|
||||
public MenuItemCollection? CurrentMenuItems => CurrentClient.MenuItems;
|
||||
|
||||
public object? SelectedMenuItem
|
||||
|
||||
Reference in New Issue
Block a user