Multi-Platform Package Manager for Stable Diffusion
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

116 lines
4.1 KiB

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Reactive.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Interop;
using StabilityMatrix.Core.Services;
using StabilityMatrix.Helper;
using StabilityMatrix.Services;
using StabilityMatrix.ViewModels;
using Wpf.Ui.Contracts;
using Wpf.Ui.Controls.Navigation;
using Wpf.Ui.Controls.Window;
using Application = System.Windows.Application;
using EventManager = StabilityMatrix.Core.Helper.EventManager;
using ISnackbarService = Wpf.Ui.Contracts.ISnackbarService;
namespace StabilityMatrix
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : FluentWindow
{
private readonly MainWindowViewModel mainWindowViewModel;
private readonly ISettingsManager settingsManager;
public MainWindow(IPageService pageService, IContentDialogService contentDialogService,
MainWindowViewModel mainWindowViewModel, ISettingsManager settingsManager,
ISnackbarService snackbarService, INotificationBarService notificationBarService)
{
InitializeComponent();
this.mainWindowViewModel = mainWindowViewModel;
this.settingsManager = settingsManager;
DataContext = mainWindowViewModel;
RootNavigation.Navigating += (_, _) => Debug.WriteLine("Navigating");
RootNavigation.SetPageService(pageService);
snackbarService.SetSnackbarControl(RootSnackbar);
notificationBarService.SetSnackbarControl(NotificationSnackbar);
contentDialogService.SetContentPresenter(RootContentDialog);
EventManager.Instance.PageChangeRequested += InstanceOnPageChangeRequested;
}
private void InstanceOnPageChangeRequested(object? sender, Type e)
{
RootNavigation.Navigate(e);
}
private async void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
RootNavigation.Navigate(typeof(LaunchPage));
RootNavigation.IsPaneOpen = settingsManager.Settings.IsNavExpanded;
await mainWindowViewModel.OnLoaded();
ObserveSizeChanged();
}
private void RootNavigation_OnPaneOpened(NavigationView sender, RoutedEventArgs args)
{
if (settingsManager.IsLibraryDirSet)
{
settingsManager.Transaction(s => s.IsNavExpanded = true);
}
}
private void RootNavigation_OnPaneClosed(NavigationView sender, RoutedEventArgs args)
{
if (settingsManager.IsLibraryDirSet)
{
settingsManager.Transaction(s => s.IsNavExpanded = false);
}
}
private void MainWindow_OnClosed(object? sender, EventArgs e)
{
Application.Current.Shutdown();
}
private void ObserveSizeChanged()
{
var observableSizeChanges = Observable
.FromEventPattern<SizeChangedEventHandler, SizeChangedEventArgs>(
h => SizeChanged += h,
h => SizeChanged -= h)
.Select(x => x.EventArgs)
.Throttle(TimeSpan.FromMilliseconds(150));
observableSizeChanges
.ObserveOn(SynchronizationContext.Current)
.Subscribe(args =>
{
if (args is {HeightChanged: false, WidthChanged: false}) return;
var interopHelper = new WindowInteropHelper(this);
var placement = ScreenExtensions.GetPlacement(interopHelper.Handle);
settingsManager.Transaction(s => s.Placement = placement.ToString());
});
}
private void MainWindow_OnClosing(object? sender, CancelEventArgs e)
{
var interopHelper = new WindowInteropHelper(this);
var placement = ScreenExtensions.GetPlacement(interopHelper.Handle);
if (settingsManager.IsLibraryDirSet)
{
settingsManager.Transaction(s => s.Placement = placement.ToString());
}
}
}
}