refactor: page factory and less mvvm-breaking

This commit is contained in:
estrogen elf
2025-06-23 09:37:30 -05:00
parent c78f75a332
commit 471559d987
12 changed files with 118 additions and 90 deletions

View File

@@ -4,7 +4,18 @@ using Avalonia.Interactivity;
using Avalonia.Media;
using FluentAvalonia.UI.Controls;
using FluentAvalonia.UI.Windowing;
using Needlework.Net.ViewModels.MainWindow;
using Needlework.Net.ViewModels.Pages;
using Needlework.Net.ViewModels.Pages.About;
using Needlework.Net.ViewModels.Pages.Console;
using Needlework.Net.ViewModels.Pages.Endpoints;
using Needlework.Net.ViewModels.Pages.Home;
using Needlework.Net.ViewModels.Pages.Schemas;
using Needlework.Net.ViewModels.Pages.Settings;
using Needlework.Net.ViewModels.Pages.WebSocket;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Needlework.Net.Views.MainWindow;
@@ -13,34 +24,74 @@ public partial class MainWindowView : AppWindow
public MainWindowView()
{
InitializeComponent();
}
public MainWindowView(MainWindowViewModel mainWindowViewModel, PageFactory pageFactory)
{
InitializeComponent();
DataContext = mainWindowViewModel;
TitleBar.ExtendsContentIntoTitleBar = true;
TitleBar.TitleBarHitTestType = TitleBarHitTestType.Complex;
TransparencyLevelHint = [WindowTransparencyLevel.Mica, WindowTransparencyLevel.None];
Background = IsWindows11 ? null : Background;
NavigationView.MenuItems = [.. new List<PageBase>()
{
pageFactory.GetPage<HomeViewModel>(),
pageFactory.GetPage<EndpointsViewModel>(),
pageFactory.GetPage<ConsoleViewModel>(),
pageFactory.GetPage<WebSocketViewModel>(),
pageFactory.GetPage<SchemasViewModel>(),
pageFactory.GetPage<SettingsViewModel>(),
pageFactory.GetPage<AboutViewModel>(),
}
.Select(ToNavigationViewItem)];
NavigationView.GetObservable(NavigationView.SelectedItemProperty)
.Subscribe(value =>
{
if (value is NavigationViewItem item)
{
CurrentPageContentControl.Content = item.Tag;
}
});
NavigationView.SelectedItem = NavigationView.MenuItems.Cast<NavigationViewItem>()
.First();
SchemaAutoCompleteBox.MinimumPopulateDelay = TimeSpan.FromSeconds(1);
SchemaAutoCompleteBox.MinimumPrefixLength = 3;
App.Current!.TryGetResource("TextFillColorPrimaryBrush", ActualThemeVariant, out var brush);
CloseCommandBarButton.IconSource = new ImageIconSource
{
Source = new Projektanker.Icons.Avalonia.IconImage()
{
Value = "fa-solid fa-file-circle-xmark",
Brush = new SolidColorBrush(Application.Current!.ActualThemeVariant.Key switch
Brush = (SolidColorBrush)brush!
}
};
}
private NavigationViewItem ToNavigationViewItem(PageBase page)
{
App.Current!.TryGetResource("TextFillColorPrimaryBrush", ActualThemeVariant, out var brush);
return new NavigationViewItem()
{
Content = page.DisplayName,
Tag = page,
IconSource = new ImageIconSource
{
Source = new Projektanker.Icons.Avalonia.IconImage()
{
"Light" => Colors.Black,
"Dark" => Colors.White,
_ => Colors.Gray
})
Value = page.Icon,
Brush = (SolidColorBrush)brush!
}
}
};
}
protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
if (VisualRoot is AppWindow aw)
{
TitleBarHost.ColumnDefinitions[3].Width = new GridLength(aw.TitleBar.RightInset, GridUnitType.Pixel);