diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 320b8bc9..41d9876a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -177,7 +177,7 @@ jobs: platform-id: osx-arm64 app-name: "Stability Matrix.app" out-name: "StabilityMatrix-macos-arm64.dmg" - runs-on: macos-13 + runs-on: macos-14 steps: - uses: actions/checkout@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a04b206..420397c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html). ## v2.10.3 +### Changed +- Centered OpenArt browser cards ### Fixed - Fixed MPS install on macOS for ComfyUI, A1111, SDWebUI Forge, and SDWebUI UX causing torch to be upgraded to dev nightly versions and causing incompatibilities with dependencies. +- Fixed crash when failing to parse Python package details +- Fixed "Auto Scroll to End" not working in some scenarios +- Fixed "Auto Scroll to End" toggle button not scrolling to the end when toggled on +- Fixed/reverted output folder name changes for Automatic1111 +- Fixed xformers being uninstalled with every ComfyUI update +- Fixed missing progress text during package installs ## v2.10.2 ### Changed diff --git a/StabilityMatrix.Avalonia/ViewModels/Dialogs/PythonPackagesItemViewModel.cs b/StabilityMatrix.Avalonia/ViewModels/Dialogs/PythonPackagesItemViewModel.cs index a31e7cf2..81fcbc90 100644 --- a/StabilityMatrix.Avalonia/ViewModels/Dialogs/PythonPackagesItemViewModel.cs +++ b/StabilityMatrix.Avalonia/ViewModels/Dialogs/PythonPackagesItemViewModel.cs @@ -6,6 +6,7 @@ using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; using Semver; using StabilityMatrix.Avalonia.ViewModels.Base; +using StabilityMatrix.Core.Exceptions; using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Models.FileInterfaces; using StabilityMatrix.Core.Python; @@ -114,6 +115,10 @@ public partial class PythonPackagesItemViewModel : ViewModelBase } } } + catch (ProcessException) + { + // Ignore + } finally { IsLoading = false; diff --git a/StabilityMatrix.Avalonia/ViewModels/Progress/PackageInstallProgressItemViewModel.cs b/StabilityMatrix.Avalonia/ViewModels/Progress/PackageInstallProgressItemViewModel.cs index fb74fc17..f977353a 100644 --- a/StabilityMatrix.Avalonia/ViewModels/Progress/PackageInstallProgressItemViewModel.cs +++ b/StabilityMatrix.Avalonia/ViewModels/Progress/PackageInstallProgressItemViewModel.cs @@ -43,7 +43,7 @@ public class PackageInstallProgressItemViewModel : ProgressItemViewModelBase private void PackageModificationRunnerOnProgressChanged(object? sender, ProgressReport e) { Progress.Value = e.Percentage; - Progress.Description = e.Message; + Progress.Description = e.ProcessOutput?.Text ?? e.Message; Progress.IsIndeterminate = e.IsIndeterminate; Progress.Text = packageModificationRunner.CurrentStep?.ProgressTitle; Name = packageModificationRunner.CurrentStep?.ProgressTitle; diff --git a/StabilityMatrix.Avalonia/ViewModels/RunningPackageViewModel.cs b/StabilityMatrix.Avalonia/ViewModels/RunningPackageViewModel.cs index f622cc67..c3cf4eb2 100644 --- a/StabilityMatrix.Avalonia/ViewModels/RunningPackageViewModel.cs +++ b/StabilityMatrix.Avalonia/ViewModels/RunningPackageViewModel.cs @@ -74,6 +74,14 @@ public partial class RunningPackageViewModel : PageViewModelBase, IDisposable, I ); } + public override void OnLoaded() + { + if (AutoScrollToEnd) + { + EventManager.Instance.OnScrollToBottomRequested(); + } + } + private void BasePackageOnExited(object? sender, int e) { IsRunning = false; @@ -104,6 +112,14 @@ public partial class RunningPackageViewModel : PageViewModelBase, IDisposable, I } } + partial void OnAutoScrollToEndChanged(bool value) + { + if (value) + { + EventManager.Instance.OnScrollToBottomRequested(); + } + } + [RelayCommand] private async Task Restart() { diff --git a/StabilityMatrix.Avalonia/Views/CivitAiBrowserPage.axaml b/StabilityMatrix.Avalonia/Views/CivitAiBrowserPage.axaml index 288c0328..a1872104 100644 --- a/StabilityMatrix.Avalonia/Views/CivitAiBrowserPage.axaml +++ b/StabilityMatrix.Avalonia/Views/CivitAiBrowserPage.axaml @@ -33,7 +33,7 @@ - @@ -61,7 +61,7 @@ diff --git a/StabilityMatrix.Avalonia/Views/ConsoleOutputPage.axaml.cs b/StabilityMatrix.Avalonia/Views/ConsoleOutputPage.axaml.cs index 5123da7d..d0777121 100644 --- a/StabilityMatrix.Avalonia/Views/ConsoleOutputPage.axaml.cs +++ b/StabilityMatrix.Avalonia/Views/ConsoleOutputPage.axaml.cs @@ -36,8 +36,8 @@ public partial class ConsoleOutputPage : UserControlBase protected override void OnLoaded(RoutedEventArgs e) { - base.OnLoaded(e); EventManager.Instance.ScrollToBottomRequested += OnScrollToBottomRequested; + base.OnLoaded(e); } private void OnScrollToBottomRequested(object? sender, EventArgs e) diff --git a/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml b/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml index c4f8189f..1989f622 100644 --- a/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml +++ b/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml @@ -305,6 +305,7 @@ diff --git a/StabilityMatrix.Core/Models/Packages/A3WebUI.cs b/StabilityMatrix.Core/Models/Packages/A3WebUI.cs index 16dbf4f7..05258e0a 100644 --- a/StabilityMatrix.Core/Models/Packages/A3WebUI.cs +++ b/StabilityMatrix.Core/Models/Packages/A3WebUI.cs @@ -73,13 +73,13 @@ public class A3WebUI( public override Dictionary>? SharedOutputFolders => new() { - [SharedOutputType.Extras] = new[] { "output/extras-images" }, + [SharedOutputType.Extras] = new[] { "outputs/extras-images" }, [SharedOutputType.Saved] = new[] { "log/images" }, - [SharedOutputType.Img2Img] = new[] { "output/img2img-images" }, - [SharedOutputType.Text2Img] = new[] { "output/txt2img-images" }, - [SharedOutputType.Img2ImgGrids] = new[] { "output/img2img-grids" }, - [SharedOutputType.Text2ImgGrids] = new[] { "output/txt2img-grids" }, - [SharedOutputType.SVD] = new[] { "output/svd" } + [SharedOutputType.Img2Img] = new[] { "outputs/img2img-images" }, + [SharedOutputType.Text2Img] = new[] { "outputs/txt2img-images" }, + [SharedOutputType.Img2ImgGrids] = new[] { "outputs/img2img-grids" }, + [SharedOutputType.Text2ImgGrids] = new[] { "outputs/txt2img-grids" }, + [SharedOutputType.SVD] = new[] { "outputs/svd" } }; [SuppressMessage("ReSharper", "ArrangeObjectCreationWhenTypeNotEvident")] @@ -186,7 +186,7 @@ public class A3WebUI( public override string MainBranch => "master"; - public override string OutputFolderName => "output"; + public override string OutputFolderName => "outputs"; public override IPackageExtensionManager ExtensionManager => new A3WebUiExtensionManager(this); diff --git a/StabilityMatrix.Core/Models/Packages/ComfyUI.cs b/StabilityMatrix.Core/Models/Packages/ComfyUI.cs index f172b29d..8fa0f3c4 100644 --- a/StabilityMatrix.Core/Models/Packages/ComfyUI.cs +++ b/StabilityMatrix.Core/Models/Packages/ComfyUI.cs @@ -245,7 +245,6 @@ public class ComfyUI( excludePattern: "torch" ); - await venvRunner.PipUninstall("xformers", onConsoleOutput).ConfigureAwait(false); await venvRunner.PipInstall(pipArgs, onConsoleOutput).ConfigureAwait(false); progress?.Report(new ProgressReport(1, "Installed Package Requirements", isIndeterminate: false)); diff --git a/StabilityMatrix.Core/Models/Packages/SDWebForge.cs b/StabilityMatrix.Core/Models/Packages/SDWebForge.cs index 7bda64fc..0091b6ff 100644 --- a/StabilityMatrix.Core/Models/Packages/SDWebForge.cs +++ b/StabilityMatrix.Core/Models/Packages/SDWebForge.cs @@ -40,6 +40,17 @@ public class SDWebForge( public override IPackageExtensionManager ExtensionManager => null; public override string OutputFolderName => "output"; public override PackageDifficulty InstallerSortOrder => PackageDifficulty.ReallyRecommended; + public override Dictionary>? SharedOutputFolders => + new() + { + [SharedOutputType.Extras] = new[] { "output/extras-images" }, + [SharedOutputType.Saved] = new[] { "log/images" }, + [SharedOutputType.Img2Img] = new[] { "output/img2img-images" }, + [SharedOutputType.Text2Img] = new[] { "output/txt2img-images" }, + [SharedOutputType.Img2ImgGrids] = new[] { "output/img2img-grids" }, + [SharedOutputType.Text2ImgGrids] = new[] { "output/txt2img-grids" }, + [SharedOutputType.SVD] = new[] { "output/svd" } + }; public override List LaunchOptions => [ diff --git a/StabilityMatrix.Core/Python/PipShowResult.cs b/StabilityMatrix.Core/Python/PipShowResult.cs index 15e86cfc..7e66ccbb 100644 --- a/StabilityMatrix.Core/Python/PipShowResult.cs +++ b/StabilityMatrix.Core/Python/PipShowResult.cs @@ -1,4 +1,5 @@ -using StabilityMatrix.Core.Extensions; +using System.Diagnostics; +using StabilityMatrix.Core.Extensions; namespace StabilityMatrix.Core.Python; @@ -31,6 +32,20 @@ public record PipShowResult .SplitLines(StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries) // Filter warning lines .Where(line => !line.StartsWith("WARNING", StringComparison.OrdinalIgnoreCase)) + .ToList(); + + var indexOfLicense = GetIndexBySubstring(lines, "License:"); + var indexOfLocation = GetIndexBySubstring(lines, "Location:"); + + var licenseText = + indexOfLicense == -1 ? null : string.Join('\n', lines[indexOfLicense..indexOfLocation]); + + if (indexOfLicense != -1) + { + lines.RemoveRange(indexOfLicense, indexOfLocation - indexOfLicense); + } + + var linesDict = lines .Select(line => line.Split(':', 2)) .Where(split => split.Length == 2) .Select(split => new KeyValuePair(split[0].Trim(), split[1].Trim())) @@ -38,22 +53,37 @@ public record PipShowResult return new PipShowResult { - Name = lines["Name"], - Version = lines["Version"], - Summary = lines.GetValueOrDefault("Summary"), - HomePage = lines.GetValueOrDefault("Home-page"), - Author = lines.GetValueOrDefault("Author"), - AuthorEmail = lines.GetValueOrDefault("Author-email"), - License = lines.GetValueOrDefault("License"), - Location = lines.GetValueOrDefault("Location"), - Requires = lines + Name = linesDict["Name"], + Version = linesDict["Version"], + Summary = linesDict.GetValueOrDefault("Summary"), + HomePage = linesDict.GetValueOrDefault("Home-page"), + Author = linesDict.GetValueOrDefault("Author"), + AuthorEmail = linesDict.GetValueOrDefault("Author-email"), + License = licenseText, + Location = linesDict.GetValueOrDefault("Location"), + Requires = linesDict .GetValueOrDefault("Requires") ?.Split(',', StringSplitOptions.TrimEntries) .ToList(), - RequiredBy = lines + RequiredBy = linesDict .GetValueOrDefault("Required-by") ?.Split(',', StringSplitOptions.TrimEntries) .ToList() }; } + + private static int GetIndexBySubstring(List lines, string searchString) + { + var index = -1; + for (var i = 0; i < lines.Count; i++) + { + if (!lines[i].StartsWith(searchString, StringComparison.OrdinalIgnoreCase)) + continue; + + index = i; + break; + } + + return index; + } }