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.
 
 
 

101 lines
3.4 KiB

using System.Collections.Concurrent;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NLog;
using StabilityMatrix.Core.Helper;
using StabilityMatrix.Core.Services;
using StabilityMatrix.Helper;
using StabilityMatrix.Models;
namespace StabilityMatrix.ViewModels;
public partial class CheckpointManagerViewModel : ObservableObject
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly ISharedFolders sharedFolders;
private readonly ISettingsManager settingsManager;
private readonly IDialogFactory dialogFactory;
private readonly ModelFinder modelFinder;
private readonly IDownloadService downloadService;
// Toggle button for auto hashing new drag-and-dropped files for connected upgrade
[ObservableProperty] private bool isImportAsConnected;
partial void OnIsImportAsConnectedChanged(bool value)
{
if (settingsManager.IsLibraryDirSet &&
value != settingsManager.Settings.IsImportAsConnected)
{
settingsManager.Transaction(s => s.IsImportAsConnected = value);
}
}
public ObservableCollection<CheckpointFolder> CheckpointFolders { get; set; } = new();
public CheckpointManagerViewModel(
ISharedFolders sharedFolders,
ISettingsManager settingsManager,
IDialogFactory dialogFactory,
IDownloadService downloadService,
ModelFinder modelFinder)
{
this.sharedFolders = sharedFolders;
this.settingsManager = settingsManager;
this.dialogFactory = dialogFactory;
this.downloadService = downloadService;
this.modelFinder = modelFinder;
}
public async Task OnLoaded()
{
// Set UI states
IsImportAsConnected = settingsManager.Settings.IsImportAsConnected;
var modelsDirectory = settingsManager.ModelsDirectory;
// Get all folders within the shared folder root
if (string.IsNullOrWhiteSpace(modelsDirectory))
{
return;
}
// Skip if the shared folder root doesn't exist
if (!Directory.Exists(modelsDirectory))
{
Logger.Debug($"Skipped shared folder index - {modelsDirectory} doesn't exist");
return;
}
var folders = Directory.GetDirectories(modelsDirectory);
CheckpointFolders.Clear();
// Results
var indexedFolders = new ConcurrentBag<CheckpointFolder>();
// Index all folders
var tasks = folders.Select(f => Task.Run(async () =>
{
var checkpointFolder = new CheckpointFolder(dialogFactory, settingsManager, downloadService, modelFinder)
{
Title = Path.GetFileName(f),
DirectoryPath = f
};
await checkpointFolder.IndexAsync();
indexedFolders.Add(checkpointFolder);
})).ToList();
await Task.WhenAll(tasks);
// Add to observable collection by alphabetical order
foreach (var checkpointFolder in indexedFolders.OrderBy(f => f.Title))
{
CheckpointFolders.Add(checkpointFolder);
}
}
[RelayCommand]
private void OpenModelsFolder()
{
Process.Start("explorer.exe", settingsManager.ModelsDirectory);
}
}