mirror of
https://github.com/BlossomiShymae/Needlework.Net.git
synced 2025-12-06 10:10:48 +01:00
refactor: page factory and less mvvm-breaking
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user