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.
 
 
 

153 lines
4.8 KiB

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using FluentAvalonia.UI.Controls;
using StabilityMatrix.Avalonia.Controls;
using StabilityMatrix.Avalonia.Languages;
using StabilityMatrix.Avalonia.Models;
using StabilityMatrix.Avalonia.Services;
using StabilityMatrix.Avalonia.ViewModels.Base;
using StabilityMatrix.Avalonia.Views;
using StabilityMatrix.Avalonia.Views.Dialogs;
using StabilityMatrix.Core.Attributes;
using StabilityMatrix.Core.Helper;
using StabilityMatrix.Core.Helper.Factory;
using StabilityMatrix.Core.Models;
using StabilityMatrix.Core.Models.Packages;
using StabilityMatrix.Core.Services;
namespace StabilityMatrix.Avalonia.ViewModels.Dialogs;
[View(typeof(InferenceConnectionHelpDialog))]
[ManagedService]
[Transient]
public partial class InferenceConnectionHelpViewModel : ContentDialogViewModelBase
{
private readonly ISettingsManager settingsManager;
private readonly INavigationService<MainWindowViewModel> navigationService;
private readonly IPackageFactory packageFactory;
private readonly RunningPackageService runningPackageService;
[ObservableProperty]
private string title = "Hello";
[ObservableProperty]
private IReadOnlyList<InstalledPackage> installedPackages = Array.Empty<InstalledPackage>();
[ObservableProperty]
private InstalledPackage? selectedPackage;
[ObservableProperty]
private bool isFirstTimeWelcome;
/// <summary>
/// When the user has no Comfy packages, and we need to prompt to install
/// </summary>
[ObservableProperty]
private bool isInstallMode;
/// <summary>
/// When the user has Comfy packages, and we need to prompt to launch
/// </summary>
[ObservableProperty]
private bool isLaunchMode;
public InferenceConnectionHelpViewModel(
ISettingsManager settingsManager,
INavigationService<MainWindowViewModel> navigationService,
IPackageFactory packageFactory,
RunningPackageService runningPackageService
)
{
this.settingsManager = settingsManager;
this.navigationService = navigationService;
this.packageFactory = packageFactory;
this.runningPackageService = runningPackageService;
// Get comfy type installed packages
var comfyPackages = this.settingsManager.Settings.InstalledPackages.Where(
p => p.PackageName == "ComfyUI"
)
.ToImmutableArray();
InstalledPackages = comfyPackages;
// If no comfy packages, install mode, otherwise launch mode
if (comfyPackages.Length == 0)
{
IsInstallMode = true;
}
else
{
IsLaunchMode = true;
// Use active package if its comfy, otherwise use the first comfy type
if (
this.settingsManager.Settings.ActiveInstalledPackage is
{ PackageName: "ComfyUI" } activePackage
)
{
SelectedPackage = activePackage;
}
else
{
SelectedPackage ??= comfyPackages[0];
}
}
}
/// <summary>
/// Navigate to the package install page
/// </summary>
[RelayCommand]
private void NavigateToInstall()
{
Dispatcher.UIThread.Post(() =>
{
navigationService.NavigateTo<NewPackageManagerViewModel>(
param: new PackageManagerNavigationOptions
{
OpenInstallerDialog = true,
InstallerSelectedPackage = packageFactory
.GetAllAvailablePackages()
.OfType<ComfyUI>()
.First()
}
);
});
}
/// <summary>
/// Request launch of the selected package
/// </summary>
[RelayCommand]
private async Task LaunchSelectedPackage()
{
if (SelectedPackage is not null)
{
await runningPackageService.StartPackage(SelectedPackage);
}
}
/// <summary>
/// Create a better content dialog for this view model
/// </summary>
public BetterContentDialog CreateDialog()
{
var dialog = new BetterContentDialog
{
Content = new InferenceConnectionHelpDialog { DataContext = this },
PrimaryButtonCommand = IsInstallMode ? NavigateToInstallCommand : LaunchSelectedPackageCommand,
PrimaryButtonText = IsInstallMode ? Resources.Action_Install : Resources.Action_Launch,
CloseButtonText = Resources.Action_Close,
DefaultButton = ContentDialogButton.Primary
};
return dialog;
}
}