Browse Source

Added Config mode for Fooocus shared models & updated nuget packages

pull/438/head
JT 10 months ago
parent
commit
f2997610d6
  1. 4
      Avalonia.Gif/Avalonia.Gif.csproj
  2. 6
      CHANGELOG.md
  3. 12
      StabilityMatrix.Avalonia.Diagnostics/StabilityMatrix.Avalonia.Diagnostics.csproj
  4. 2
      StabilityMatrix.Avalonia/Controls/Inference/ControlNetCard.axaml
  5. 2
      StabilityMatrix.Avalonia/Controls/Inference/SelectImageCard.axaml
  6. 2
      StabilityMatrix.Avalonia/Controls/Inference/StackEditableCard.axaml
  7. 6
      StabilityMatrix.Avalonia/Controls/Inference/StackExpander.axaml
  8. 2
      StabilityMatrix.Avalonia/Controls/Inference/UpscalerCard.axaml
  9. 4
      StabilityMatrix.Avalonia/Controls/StarsRating.axaml
  10. 15
      StabilityMatrix.Avalonia/Controls/StarsRating.axaml.cs
  11. 1947
      StabilityMatrix.Avalonia/Languages/Resources.Designer.cs
  12. 186
      StabilityMatrix.Avalonia/Languages/Resources.fr-FR.resx
  13. 3
      StabilityMatrix.Avalonia/Languages/Resources.resx
  14. 36
      StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
  15. 2
      StabilityMatrix.Avalonia/Styles/ControlThemes/BetterComboBoxStyles.axaml
  16. 2
      StabilityMatrix.Avalonia/Styles/ControlThemes/HyperlinkIconButtonStyles.axaml
  17. 2
      StabilityMatrix.Avalonia/Styles/FAComboBoxStyles.axaml
  18. 2
      StabilityMatrix.Avalonia/ViewModels/CheckpointBrowserViewModel.cs
  19. 2
      StabilityMatrix.Avalonia/ViewModels/CheckpointsPageViewModel.cs
  20. 2
      StabilityMatrix.Avalonia/ViewModels/ExtensionViewModel.cs
  21. 2
      StabilityMatrix.Avalonia/ViewModels/InferenceViewModel.cs
  22. 35
      StabilityMatrix.Avalonia/ViewModels/LaunchPageViewModel.cs
  23. 2
      StabilityMatrix.Avalonia/ViewModels/NewCheckpointsPageViewModel.cs
  24. 2
      StabilityMatrix.Avalonia/ViewModels/NewPackageManagerViewModel.cs
  25. 2
      StabilityMatrix.Avalonia/ViewModels/OutputsPageViewModel.cs
  26. 5
      StabilityMatrix.Avalonia/ViewModels/PackageManager/PackageExtensionBrowserViewModel.cs
  27. 2
      StabilityMatrix.Avalonia/ViewModels/PackageManager/PackageInstallDetailViewModel.cs
  28. 2
      StabilityMatrix.Avalonia/ViewModels/PackageManagerViewModel.cs
  29. 11
      StabilityMatrix.Avalonia/ViewModels/Progress/ProgressManagerViewModel.cs
  30. 22
      StabilityMatrix.Avalonia/ViewModels/Settings/AccountSettingsViewModel.cs
  31. 20
      StabilityMatrix.Avalonia/ViewModels/Settings/InferenceSettingsViewModel.cs
  32. 2
      StabilityMatrix.Avalonia/ViewModels/Settings/MainSettingsViewModel.cs
  33. 13
      StabilityMatrix.Avalonia/ViewModels/Settings/UpdateSettingsViewModel.cs
  34. 5
      StabilityMatrix.Avalonia/ViewModels/SettingsViewModel.cs
  35. 2
      StabilityMatrix.Avalonia/Views/Dialogs/PythonPackagesDialog.axaml
  36. 2
      StabilityMatrix.Avalonia/Views/Dialogs/SelectModelVersionDialog.axaml
  37. 2
      StabilityMatrix.Avalonia/Views/Dialogs/UpdateDialog.axaml
  38. 2
      StabilityMatrix.Avalonia/Views/InferencePage.axaml
  39. 2
      StabilityMatrix.Avalonia/Views/MainWindow.axaml
  40. 2
      StabilityMatrix.Avalonia/Views/OutputsPage.axaml
  41. 7
      StabilityMatrix.Avalonia/Views/PackageManager/PackageExtensionBrowserView.axaml
  42. 2
      StabilityMatrix.Avalonia/Views/Settings/AccountSettingsPage.axaml
  43. 2
      StabilityMatrix.Avalonia/Views/Settings/InferenceSettingsPage.axaml
  44. 2
      StabilityMatrix.Avalonia/Views/Settings/MainSettingsPage.axaml
  45. 2
      StabilityMatrix.Avalonia/Views/Settings/UpdateSettingsPage.axaml
  46. 99
      StabilityMatrix.Core/Models/FooocusConfig.cs
  47. 32
      StabilityMatrix.Core/Models/Packages/A3WebUI.cs
  48. 32
      StabilityMatrix.Core/Models/Packages/ComfyUI.cs
  49. 120
      StabilityMatrix.Core/Models/Packages/Fooocus.cs
  50. 32
      StabilityMatrix.Core/StabilityMatrix.Core.csproj
  51. 6
      StabilityMatrix.Tests/StabilityMatrix.Tests.csproj
  52. 1
      StabilityMatrix.UITests/MainWindowTests.cs
  53. 13
      StabilityMatrix.UITests/ModelBrowser/CivitAiBrowserTests.cs
  54. 8
      StabilityMatrix.UITests/StabilityMatrix.UITests.csproj

4
Avalonia.Gif/Avalonia.Gif.csproj

@ -10,8 +10,8 @@
<EnableWindowsTargeting>true</EnableWindowsTargeting> <EnableWindowsTargeting>true</EnableWindowsTargeting>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.0.5" /> <PackageReference Include="Avalonia" Version="11.0.7" />
<PackageReference Include="SkiaSharp" Version="2.88.6" /> <PackageReference Include="SkiaSharp" Version="2.88.7" />
<PackageReference Include="DotNet.Bundle" Version="0.9.13" /> <PackageReference Include="DotNet.Bundle" Version="0.9.13" />
</ItemGroup> </ItemGroup>

6
CHANGELOG.md

@ -6,9 +6,15 @@ 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). and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html).
## v2.8.0-pre.3 ## v2.8.0-pre.3
### Added
- Added "Config" Shared Model Folder option for Fooocus
### Changed
- (Internal) Updated to Avalonia 11.0.7
- Updated French translation (thanks Greg!)
### Fixed ### Fixed
- Webp static images can now be shown alongside existing webp animation support - Webp static images can now be shown alongside existing webp animation support
- Fixed image gallery arrow key navigation requiring clicking before responding - Fixed image gallery arrow key navigation requiring clicking before responding
- Fixed crash when loading extensions list with no internet connection
## v2.8.0-pre.2 ## v2.8.0-pre.2
### Added ### Added

12
StabilityMatrix.Avalonia.Diagnostics/StabilityMatrix.Avalonia.Diagnostics.csproj

@ -19,13 +19,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="11.0.5" /> <PackageReference Include="Avalonia" Version="11.0.7" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.5" /> <PackageReference Include="Avalonia.Controls.DataGrid" Version="11.0.7" />
<PackageReference Include="DotNet.Bundle" Version="0.9.13" /> <PackageReference Include="DotNet.Bundle" Version="0.9.13" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
<PackageReference Include="NLog" Version="5.2.5" /> <PackageReference Include="NLog" Version="5.2.8" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
StabilityMatrix.Avalonia/Controls/Inference/ControlNetCard.axaml

@ -2,7 +2,7 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:StabilityMatrix.Avalonia.Controls" xmlns:controls="using:StabilityMatrix.Avalonia.Controls"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia" xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData"

2
StabilityMatrix.Avalonia/Controls/Inference/SelectImageCard.axaml

@ -3,7 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:StabilityMatrix.Avalonia.Controls" xmlns:controls="using:StabilityMatrix.Avalonia.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mocks="using:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="using:StabilityMatrix.Avalonia.DesignData"
xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:ui="using:FluentAvalonia.UI.Controls"

2
StabilityMatrix.Avalonia/Controls/Inference/StackEditableCard.axaml

@ -4,7 +4,7 @@
xmlns:local="clr-namespace:StabilityMatrix.Avalonia" xmlns:local="clr-namespace:StabilityMatrix.Avalonia"
xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData"
xmlns:vmInference="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference" xmlns:vmInference="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:modules="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference.Modules" xmlns:modules="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference.Modules"
xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia" xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia"

6
StabilityMatrix.Avalonia/Controls/Inference/StackExpander.axaml

@ -2,11 +2,11 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:StabilityMatrix.Avalonia.Controls" xmlns:controls="using:StabilityMatrix.Avalonia.Controls"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia"
xmlns:local="clr-namespace:StabilityMatrix.Avalonia" xmlns:local="clr-namespace:StabilityMatrix.Avalonia"
xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:vmInference="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference" xmlns:vmInference="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference"
xmlns:fluent="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
x:DataType="vmInference:StackExpanderViewModel"> x:DataType="vmInference:StackExpanderViewModel">
<Design.PreviewWith> <Design.PreviewWith>
@ -66,7 +66,7 @@
Classes="transparent-full" Classes="transparent-full"
Command="{Binding SettingsCommand}" Command="{Binding SettingsCommand}"
IsVisible="{Binding IsSettingsEnabled}"> IsVisible="{Binding IsSettingsEnabled}">
<fluentIcons:SymbolIcon FontSize="17" Symbol="Settings" /> <fluent:SymbolIcon FontSize="17" Symbol="Settings" />
</Button> </Button>
<!-- Delete button for StackEditableCard --> <!-- Delete button for StackEditableCard -->
<Button <Button
@ -76,7 +76,7 @@
Classes="transparent-red" Classes="transparent-red"
Command="{Binding RemoveFromParentListCommand}" Command="{Binding RemoveFromParentListCommand}"
IsVisible="{Binding IsEditEnabled}"> IsVisible="{Binding IsEditEnabled}">
<fluentIcons:SymbolIcon FontSize="16" Symbol="Delete" /> <fluent:SymbolIcon FontSize="16" Symbol="Delete" />
</Button> </Button>
</Grid> </Grid>
</Expander.Header> </Expander.Header>

2
StabilityMatrix.Avalonia/Controls/Inference/UpscalerCard.axaml

@ -8,7 +8,7 @@
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:vmInference="using:StabilityMatrix.Avalonia.ViewModels.Inference" xmlns:vmInference="using:StabilityMatrix.Avalonia.ViewModels.Inference"
xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia" xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
x:DataType="vmInference:UpscalerCardViewModel"> x:DataType="vmInference:UpscalerCardViewModel">
<Design.PreviewWith> <Design.PreviewWith>
<Grid MinWidth="300"> <Grid MinWidth="300">

4
StabilityMatrix.Avalonia/Controls/StarsRating.axaml

@ -1,8 +1,6 @@
<Styles xmlns="https://github.com/avaloniaui" <Styles xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:StabilityMatrix.Avalonia.Controls" xmlns:controls="using:StabilityMatrix.Avalonia.Controls">
xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia"
xmlns:icons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia">
<Design.PreviewWith> <Design.PreviewWith>
<StackPanel Width="400" Height="400" Spacing="4"> <StackPanel Width="400" Height="400" Spacing="4">
<StackPanel.Styles> <StackPanel.Styles>

15
StabilityMatrix.Avalonia/Controls/StarsRating.axaml.cs

@ -3,17 +3,12 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.Documents;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.Layout; using Avalonia.Layout;
using Avalonia.Markup.Xaml.MarkupExtensions;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.VisualTree; using Avalonia.VisualTree;
using FluentIcons.Avalonia.Fluent;
using FluentIcons.Common; using FluentIcons.Common;
using FluentIcons.FluentAvalonia;
using SpacedGridControl.Avalonia;
using StabilityMatrix.Avalonia.Styles;
namespace StabilityMatrix.Avalonia.Controls; namespace StabilityMatrix.Avalonia.Controls;
@ -36,10 +31,10 @@ public class StarsRating : TemplatedControl
set => SetValue(IsEditableProperty, value); set => SetValue(IsEditableProperty, value);
} }
public static readonly StyledProperty<int> MaximumProperty = AvaloniaProperty.Register< public static readonly StyledProperty<int> MaximumProperty = AvaloniaProperty.Register<StarsRating, int>(
StarsRating, nameof(Maximum),
int 5
>(nameof(Maximum), 5); );
public int Maximum public int Maximum
{ {

1947
StabilityMatrix.Avalonia/Languages/Resources.Designer.cs generated

File diff suppressed because it is too large Load Diff

186
StabilityMatrix.Avalonia/Languages/Resources.fr-FR.resx

@ -142,7 +142,7 @@
<value>Relancer plus tard</value> <value>Relancer plus tard</value>
</data> </data>
<data name="Label_RelaunchRequired" xml:space="preserve"> <data name="Label_RelaunchRequired" xml:space="preserve">
<value>Relance nécessaire</value> <value>Relancement nécessaire</value>
</data> </data>
<data name="Label_UnknownPackage" xml:space="preserve"> <data name="Label_UnknownPackage" xml:space="preserve">
<value>Paquet inconnu</value> <value>Paquet inconnu</value>
@ -250,7 +250,7 @@
<value>Une erreur inattendue s&apos;est produite</value> <value>Une erreur inattendue s&apos;est produite</value>
</data> </data>
<data name="Action_ExitApplication" xml:space="preserve"> <data name="Action_ExitApplication" xml:space="preserve">
<value>Demande de sortie</value> <value>Quitter l&apos;application</value>
</data> </data>
<data name="Label_DisplayName" xml:space="preserve"> <data name="Label_DisplayName" xml:space="preserve">
<value>Nom d&apos;affichage</value> <value>Nom d&apos;affichage</value>
@ -678,4 +678,186 @@
<data name="Action_RestoreDefaultLayout" xml:space="preserve"> <data name="Action_RestoreDefaultLayout" xml:space="preserve">
<value>Rétablir la présentation par défaut</value> <value>Rétablir la présentation par défaut</value>
</data> </data>
<data name="Label_UseSharedOutputFolder" xml:space="preserve">
<value>Partager des générations</value>
</data>
<data name="Action_Copy" xml:space="preserve">
<value>Copier</value>
</data>
<data name="Action_OpenInViewer" xml:space="preserve">
<value>Ouvrir dans la visionneuse d&apos;images</value>
</data>
<data name="Label_NumImagesSelected" xml:space="preserve">
<value>{0} images sélectionnées</value>
</data>
<data name="Label_OutputFolder" xml:space="preserve">
<value>Dossier</value>
<comment>Hey hey :) is this used somewhere else ? if it&apos;s only inside the &quot;output browser&quot;, I suggest to remove &quot;output&quot; from translation, but you&apos;re the boss, lmk :)</comment>
</data>
<data name="Label_OutputType" xml:space="preserve">
<value>Type</value>
</data>
<data name="Action_ClearSelection" xml:space="preserve">
<value>Annuler la sélection</value>
</data>
<data name="Action_SelectAll" xml:space="preserve">
<value>Sélectionner tout</value>
</data>
<data name="Action_SendToInference" xml:space="preserve">
<value>Envoyer à l&apos;inférence</value>
</data>
<data name="Label_TextToImage" xml:space="preserve">
<value>Texte vers image</value>
</data>
<data name="Label_ImageToImage" xml:space="preserve">
<value>Image vers image</value>
</data>
<data name="Label_Upscale" xml:space="preserve">
<value>Amélioration de qualité</value>
</data>
<data name="Label_OutputsPageTitle" xml:space="preserve">
<value>Explorateur des générations</value>
</data>
<data name="Label_OneImageSelected" xml:space="preserve">
<value>1 image sélectionnée</value>
</data>
<data name="Label_PythonPackages" xml:space="preserve">
<value>Paquets Python</value>
</data>
<data name="Action_Consolidate" xml:space="preserve">
<value>Consolider</value>
</data>
<data name="Label_AreYouSure" xml:space="preserve">
<value>Êtes-vous sure ?</value>
</data>
<data name="Label_ConsolidateExplanation" xml:space="preserve">
<value>Cela déplacera toutes les images générées des packages sélectionnés vers le répertoire consolidé du dossier de sorties partagées. Cette action ne peut pas être annulée.</value>
</data>
<data name="Action_Refresh" xml:space="preserve">
<value>Rafraichir</value>
</data>
<data name="Action_Upgrade" xml:space="preserve">
<value>Passer à la version supérieure</value>
<comment>What is this related to ?</comment>
</data>
<data name="Action_Downgrade" xml:space="preserve">
<value>Passer à la version inférieure</value>
<comment>What is this related to ?</comment>
</data>
<data name="Action_OpenGithub" xml:space="preserve">
<value>Ouvrir sur GitHub</value>
</data>
<data name="Label_Connected" xml:space="preserve">
<value>Connecté</value>
</data>
<data name="Action_Disconnect" xml:space="preserve">
<value>Se déconnecter</value>
</data>
<data name="Label_Email" xml:space="preserve">
<value>Email</value>
</data>
<data name="Label_Username" xml:space="preserve">
<value>Nom d&apos;utilisateur</value>
</data>
<data name="Label_Password" xml:space="preserve">
<value>Mot de passe</value>
</data>
<data name="Action_Login" xml:space="preserve">
<value>Ouvrir une session</value>
</data>
<data name="Action_Signup" xml:space="preserve">
<value>S&apos;enregistrer</value>
</data>
<data name="Label_ConfirmPassword" xml:space="preserve">
<value>Confirmer le mot de passe</value>
</data>
<data name="Label_ApiKey" xml:space="preserve">
<value>Clé d&apos;API</value>
</data>
<data name="Label_Accounts" xml:space="preserve">
<value>Comptes</value>
</data>
<data name="Label_Preprocessor" xml:space="preserve">
<value>Préprocesseur</value>
</data>
<data name="Label_Strength" xml:space="preserve">
<value>Force</value>
</data>
<data name="Label_CivitAiLoginRequired" xml:space="preserve">
<value>Vous devez être loggué pour télécharger ce checkpoint. Veuillez entrer une clé d&apos;API CivitAI dans les paramètres.</value>
</data>
<data name="Label_DownloadFailed" xml:space="preserve">
<value>Echec du téléchargement</value>
</data>
<data name="Label_AutoUpdates" xml:space="preserve">
<value>Mises à jour automatiques</value>
</data>
<data name="Label_Updates" xml:space="preserve">
<value>Mises à jour</value>
</data>
<data name="Label_YouAreUpToDate" xml:space="preserve">
<value>Vous êtes à jour</value>
</data>
<data name="TextTemplate_LastChecked" xml:space="preserve">
<value>Dernière vérification: {0}</value>
</data>
<data name="Action_OpenOnHuggingFace" xml:space="preserve">
<value>Ouvrir sur Hugging Face</value>
</data>
<data name="Action_UpdateExistingMetadata" xml:space="preserve">
<value>Mettre à jour les métadonnées existantes</value>
</data>
<data name="Label_General" xml:space="preserve">
<value>Générale</value>
<comment>A general settings category</comment>
</data>
<data name="Label_SystemInformation" xml:space="preserve">
<value>Informations système</value>
</data>
<data name="Label_CivitAi" xml:space="preserve">
<value>CivitAI</value>
</data>
<data name="Label_HuggingFace" xml:space="preserve">
<value>Hugging Face</value>
</data>
<data name="Label_Addons" xml:space="preserve">
<value>Modules complémentaires</value>
<comment>Inference Sampler Addons</comment>
</data>
<data name="Label_Settings" xml:space="preserve">
<value>Paramètres</value>
</data>
<data name="Action_SelectFile" xml:space="preserve">
<value>Sélectionner un fichier</value>
</data>
<data name="Action_ReplaceContents" xml:space="preserve">
<value>Remplacer des contenus</value>
</data>
<data name="Label_WipFeature" xml:space="preserve">
<value>Pas encore disponible</value>
</data>
<data name="Label_WipFeatureDescription" xml:space="preserve">
<value>Fonctionnalité disponible dans une mise à jour future</value>
</data>
<data name="Label_MissingImageFile" xml:space="preserve">
<value>Fichier image manquant</value>
</data>
<data name="Label_ImageToVideo" xml:space="preserve">
<value>Image vers vidéo</value>
</data>
<data name="Label_Fps" xml:space="preserve">
<value>Images par seconde</value>
</data>
<data name="Label_MinCfg" xml:space="preserve">
<value>CFG Min</value>
</data>
<data name="Label_Lossless" xml:space="preserve">
<value>Sans perte</value>
</data>
<data name="Label_VideoOutputMethod" xml:space="preserve">
<value>Méthode</value>
</data>
<data name="Label_VideoQuality" xml:space="preserve">
<value>Qualité</value>
</data>
</root> </root>

3
StabilityMatrix.Avalonia/Languages/Resources.resx

@ -933,4 +933,7 @@
<data name="Label_Installed" xml:space="preserve"> <data name="Label_Installed" xml:space="preserve">
<value>Installed</value> <value>Installed</value>
</data> </data>
<data name="Label_NoExtensionsFound" xml:space="preserve">
<value>No extensions found.</value>
</data>
</root> </root>

36
StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj

@ -32,19 +32,19 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AsyncImageLoader.Avalonia" Version="3.2.1" /> <PackageReference Include="AsyncImageLoader.Avalonia" Version="3.2.1" />
<PackageReference Include="AutoComplete.Net" Version="1.2211.2014.42"/> <PackageReference Include="AutoComplete.Net" Version="1.2211.2014.42"/>
<PackageReference Include="Avalonia.AvaloniaEdit" Version="11.0.5" /> <PackageReference Include="Avalonia.AvaloniaEdit" Version="11.0.6" />
<PackageReference Include="Avalonia.Controls.PanAndZoom" Version="11.0.0.2" /> <PackageReference Include="Avalonia.Controls.PanAndZoom" Version="11.0.0.2" />
<PackageReference Include="Avalonia" Version="11.0.5" /> <PackageReference Include="Avalonia" Version="11.0.7" />
<PackageReference Include="Avalonia.Desktop" Version="11.0.5" /> <PackageReference Include="Avalonia.Desktop" Version="11.0.7" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.0.5" /> <PackageReference Include="Avalonia.Fonts.Inter" Version="11.0.7" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.--> <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.5" /> <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.7" />
<PackageReference Include="Avalonia.HtmlRenderer" Version="11.0.0" /> <PackageReference Include="Avalonia.HtmlRenderer" Version="11.0.0" />
<PackageReference Include="Avalonia.Labs.Controls" Version="11.0.2" /> <PackageReference Include="Avalonia.Labs.Controls" Version="11.0.3" />
<PackageReference Include="Avalonia.Xaml.Behaviors" Version="11.0.5" /> <PackageReference Include="Avalonia.Xaml.Behaviors" Version="11.0.6" />
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.0.5" /> <PackageReference Include="AvaloniaEdit.TextMate" Version="11.0.6" />
<PackageReference Include="bodong.Avalonia.PropertyGrid" Version="11.0.5.1" /> <PackageReference Include="bodong.Avalonia.PropertyGrid" Version="11.0.6.3" />
<PackageReference Include="bodong.PropertyModels" Version="11.0.5.1" /> <PackageReference Include="bodong.PropertyModels" Version="11.0.6.2" />
<PackageReference Include="CommandLineParser" Version="2.9.1" /> <PackageReference Include="CommandLineParser" Version="2.9.1" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="DiscordRichPresence" Version="1.2.1.24" /> <PackageReference Include="DiscordRichPresence" Version="1.2.1.24" />
@ -55,9 +55,9 @@
<PackageReference Include="DotNet.Bundle" Version="0.9.13" /> <PackageReference Include="DotNet.Bundle" Version="0.9.13" />
<PackageReference Include="Exceptionless.DateTimeExtensions" Version="3.4.3" /> <PackageReference Include="Exceptionless.DateTimeExtensions" Version="3.4.3" />
<PackageReference Include="FluentAvalonia.BreadcrumbBar" Version="2.0.2" /> <PackageReference Include="FluentAvalonia.BreadcrumbBar" Version="2.0.2" />
<PackageReference Include="FluentAvaloniaUI" Version="2.0.4" /> <PackageReference Include="FluentAvaloniaUI" Version="2.0.5" />
<PackageReference Include="FluentIcons.Avalonia" Version="1.1.224" /> <PackageReference Include="FluentIcons.Avalonia" Version="1.1.225" />
<PackageReference Include="FluentIcons.FluentAvalonia" Version="1.1.224" /> <PackageReference Include="FluentIcons.Avalonia.Fluent" Version="1.1.225" />
<PackageReference Include="FuzzySharp" Version="2.0.2" /> <PackageReference Include="FuzzySharp" Version="2.0.2" />
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" /> <PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
<PackageReference Include="Markdown.Avalonia" Version="11.0.2" /> <PackageReference Include="Markdown.Avalonia" Version="11.0.2" />
@ -68,17 +68,17 @@
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageReference Include="Nito.AsyncEx" Version="5.1.2" /> <PackageReference Include="Nito.AsyncEx" Version="5.1.2" />
<PackageReference Include="NLog" Version="5.2.7" /> <PackageReference Include="NLog" Version="5.2.8" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.7" /> <PackageReference Include="NLog.Extensions.Logging" Version="5.3.8" />
<PackageReference Include="NSubstitute" Version="5.1.0" /> <PackageReference Include="NSubstitute" Version="5.1.0" />
<PackageReference Include="Polly" Version="8.2.0" /> <PackageReference Include="Polly" Version="8.2.1" />
<PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" /> <PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" />
<PackageReference Include="Polly.Extensions.Http" Version="3.0.0" /> <PackageReference Include="Polly.Extensions.Http" Version="3.0.0" />
<PackageReference Include="Projektanker.Icons.Avalonia.FontAwesome" Version="9.0.1" /> <PackageReference Include="Projektanker.Icons.Avalonia.FontAwesome" Version="9.0.1" />
<PackageReference Include="RockLib.Reflection.Optimized" Version="2.0.0" /> <PackageReference Include="RockLib.Reflection.Optimized" Version="3.0.0" />
<PackageReference Include="Sentry" Version="3.41.3" /> <PackageReference Include="Sentry" Version="3.41.3" />
<PackageReference Include="Sentry.NLog" Version="3.41.3" /> <PackageReference Include="Sentry.NLog" Version="3.41.3" />
<PackageReference Include="SpacedGrid-Avalonia" Version="11.0.0" /> <PackageReference Include="SpacedGrid-Avalonia" Version="11.0.0" />

2
StabilityMatrix.Avalonia/Styles/ControlThemes/BetterComboBoxStyles.axaml

@ -2,7 +2,7 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:mocks="using:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="using:StabilityMatrix.Avalonia.DesignData"
xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core" xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core"
xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia" xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia"

2
StabilityMatrix.Avalonia/Styles/ControlThemes/HyperlinkIconButtonStyles.axaml

@ -2,7 +2,7 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:ui="using:FluentAvalonia.UI.Controls"> xmlns:ui="using:FluentAvalonia.UI.Controls">
<Design.PreviewWith> <Design.PreviewWith>

2
StabilityMatrix.Avalonia/Styles/FAComboBoxStyles.axaml

@ -2,7 +2,7 @@
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:mocks="using:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="using:StabilityMatrix.Avalonia.DesignData"
xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core" xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core"
xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia" xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia"

2
StabilityMatrix.Avalonia/ViewModels/CheckpointBrowserViewModel.cs

@ -12,7 +12,7 @@ using StabilityMatrix.Avalonia.Views;
using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Attributes;
using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Helper;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

2
StabilityMatrix.Avalonia/ViewModels/CheckpointsPageViewModel.cs

@ -26,7 +26,7 @@ using StabilityMatrix.Core.Models.Progress;
using StabilityMatrix.Core.Processes; using StabilityMatrix.Core.Processes;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
using TeachingTip = StabilityMatrix.Core.Models.Settings.TeachingTip; using TeachingTip = StabilityMatrix.Core.Models.Settings.TeachingTip;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

2
StabilityMatrix.Avalonia/ViewModels/ExtensionViewModel.cs

@ -4,7 +4,7 @@ using StabilityMatrix.Core.Models.Packages.Extensions;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;
public partial class ExtensionViewModel() : ViewModelBase public partial class ExtensionViewModel : ViewModelBase
{ {
[ObservableProperty] [ObservableProperty]
private bool isSelected; private bool isSelected;

2
StabilityMatrix.Avalonia/ViewModels/InferenceViewModel.cs

@ -35,7 +35,7 @@ using StabilityMatrix.Core.Services;
using InferenceTabViewModelBase = StabilityMatrix.Avalonia.ViewModels.Base.InferenceTabViewModelBase; using InferenceTabViewModelBase = StabilityMatrix.Avalonia.ViewModels.Base.InferenceTabViewModelBase;
using Path = System.IO.Path; using Path = System.IO.Path;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

35
StabilityMatrix.Avalonia/ViewModels/LaunchPageViewModel.cs

@ -35,7 +35,7 @@ using StabilityMatrix.Core.Processes;
using StabilityMatrix.Core.Python; using StabilityMatrix.Core.Python;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;
@ -58,8 +58,7 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
private static partial Regex InputYesNoRegex(); private static partial Regex InputYesNoRegex();
public override string Title => "Launch"; public override string Title => "Launch";
public override IconSource IconSource => public override IconSource IconSource => new SymbolIconSource { Symbol = Symbol.Rocket, IsFilled = true };
new SymbolIconSource { Symbol = Symbol.Rocket, IsFilled = true };
public ConsoleViewModel Console { get; } = new(); public ConsoleViewModel Console { get; } = new();
@ -154,8 +153,7 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
}; };
} }
private void OnTeachingTooltipNeeded(object? sender, EventArgs e) => private void OnTeachingTooltipNeeded(object? sender, EventArgs e) => IsLaunchTeachingTipsOpen = true;
IsLaunchTeachingTipsOpen = true;
private void OnInstalledPackagesChanged(object? sender, EventArgs e) => OnLoaded(); private void OnInstalledPackagesChanged(object? sender, EventArgs e) => OnLoaded();
@ -353,9 +351,7 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
// Open a config page // Open a config page
var userLaunchArgs = settingsManager.GetLaunchArgs(activeInstall.Id); var userLaunchArgs = settingsManager.GetLaunchArgs(activeInstall.Id);
var viewModel = dialogFactory.Get<LaunchOptionsViewModel>(); var viewModel = dialogFactory.Get<LaunchOptionsViewModel>();
viewModel.Cards = LaunchOptionCard viewModel.Cards = LaunchOptionCard.FromDefinitions(definitions, userLaunchArgs).ToImmutableArray();
.FromDefinitions(definitions, userLaunchArgs)
.ToImmutableArray();
logger.LogDebug("Launching config dialog with cards: {CardsCount}", viewModel.Cards.Count); logger.LogDebug("Launching config dialog with cards: {CardsCount}", viewModel.Cards.Count);
@ -454,14 +450,10 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
private void OnProcessExited(object? sender, int exitCode) private void OnProcessExited(object? sender, int exitCode)
{ {
EventManager.Instance.OnRunningPackageStatusChanged(null); EventManager.Instance.OnRunningPackageStatusChanged(null);
Dispatcher.UIThread Dispatcher
.InvokeAsync(async () => .UIThread.InvokeAsync(async () =>
{ {
logger.LogTrace( logger.LogTrace("Process exited ({Code}) at {Time:g}", exitCode, DateTimeOffset.Now);
"Process exited ({Code}) at {Time:g}",
exitCode,
DateTimeOffset.Now
);
// Need to wait for streams to finish before detaching handlers // Need to wait for streams to finish before detaching handlers
if (sender is BaseGitPackage { VenvRunner: not null } package) if (sender is BaseGitPackage { VenvRunner: not null } package)
@ -477,10 +469,7 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
} }
catch (OperationCanceledException e) catch (OperationCanceledException e)
{ {
logger.LogWarning( logger.LogWarning("Waiting for process EOF timed out: {Message}", e.Message);
"Waiting for process EOF timed out: {Message}",
e.Message
);
} }
} }
} }
@ -499,9 +488,7 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
// Need to reset cursor in case its in some weird position // Need to reset cursor in case its in some weird position
// from progress bars // from progress bars
await Console.ResetWriteCursor(); await Console.ResetWriteCursor();
Console.PostLine( Console.PostLine($"{Environment.NewLine}Process finished with exit code {exitCode}");
$"{Environment.NewLine}Process finished with exit code {exitCode}"
);
}) })
.SafeFireAndForget(); .SafeFireAndForget();
} }
@ -538,8 +525,8 @@ public partial class LaunchPageViewModel : PageViewModelBase, IDisposable, IAsyn
e.Cancel = true; e.Cancel = true;
var dialog = CreateExitConfirmDialog(); var dialog = CreateExitConfirmDialog();
Dispatcher.UIThread Dispatcher
.InvokeAsync(async () => .UIThread.InvokeAsync(async () =>
{ {
if ( if (
(TaskDialogStandardResult)await dialog.ShowAsync(true) (TaskDialogStandardResult)await dialog.ShowAsync(true)

2
StabilityMatrix.Avalonia/ViewModels/NewCheckpointsPageViewModel.cs

@ -29,7 +29,7 @@ using StabilityMatrix.Core.Models;
using StabilityMatrix.Core.Models.Api; using StabilityMatrix.Core.Models.Api;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

2
StabilityMatrix.Avalonia/ViewModels/NewPackageManagerViewModel.cs

@ -10,7 +10,7 @@ using StabilityMatrix.Avalonia.ViewModels.PackageManager;
using StabilityMatrix.Avalonia.Views; using StabilityMatrix.Avalonia.Views;
using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Attributes;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

2
StabilityMatrix.Avalonia/ViewModels/OutputsPageViewModel.cs

@ -39,7 +39,7 @@ using StabilityMatrix.Core.Processes;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Size = StabilityMatrix.Core.Models.Settings.Size; using Size = StabilityMatrix.Core.Models.Settings.Size;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

5
StabilityMatrix.Avalonia/ViewModels/PackageManager/PackageExtensionBrowserViewModel.cs

@ -46,6 +46,7 @@ public partial class PackageExtensionBrowserViewModel : ViewModelBase, IDisposab
public PackagePair? PackagePair { get; set; } public PackagePair? PackagePair { get; set; }
[ObservableProperty] [ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShowNoExtensionsFoundMessage))]
private bool isLoading; private bool isLoading;
private SourceCache<PackageExtension, string> availableExtensionsSource = private SourceCache<PackageExtension, string> availableExtensionsSource =
@ -78,6 +79,9 @@ public partial class PackageExtensionBrowserViewModel : ViewModelBase, IDisposab
public IObservableCollection<InstalledPackageExtension> InstalledExtensions { get; } = public IObservableCollection<InstalledPackageExtension> InstalledExtensions { get; } =
new ObservableCollectionExtended<InstalledPackageExtension>(); new ObservableCollectionExtended<InstalledPackageExtension>();
[ObservableProperty]
private bool showNoExtensionsFoundMessage;
public PackageExtensionBrowserViewModel( public PackageExtensionBrowserViewModel(
INotificationService notificationService, INotificationService notificationService,
ISettingsManager settingsManager, ISettingsManager settingsManager,
@ -316,6 +320,7 @@ public partial class PackageExtensionBrowserViewModel : ViewModelBase, IDisposab
finally finally
{ {
IsLoading = false; IsLoading = false;
ShowNoExtensionsFoundMessage = AvailableItemsSearchCollection.FilteredItems.Count == 0;
} }
} }

2
StabilityMatrix.Avalonia/ViewModels/PackageManager/PackageInstallDetailViewModel.cs

@ -26,7 +26,7 @@ using StabilityMatrix.Core.Models.Packages;
using StabilityMatrix.Core.Python; using StabilityMatrix.Core.Python;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using PackageInstallDetailView = StabilityMatrix.Avalonia.Views.PackageManager.PackageInstallDetailView; using PackageInstallDetailView = StabilityMatrix.Avalonia.Views.PackageManager.PackageInstallDetailView;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels.PackageManager; namespace StabilityMatrix.Avalonia.ViewModels.PackageManager;

2
StabilityMatrix.Avalonia/ViewModels/PackageManagerViewModel.cs

@ -30,7 +30,7 @@ using StabilityMatrix.Core.Models.PackageModification;
using StabilityMatrix.Core.Models.Packages; using StabilityMatrix.Core.Models.Packages;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;

11
StabilityMatrix.Avalonia/ViewModels/Progress/ProgressManagerViewModel.cs

@ -23,7 +23,7 @@ using StabilityMatrix.Core.Models.PackageModification;
using StabilityMatrix.Core.Models.Progress; using StabilityMatrix.Core.Models.Progress;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels.Progress; namespace StabilityMatrix.Avalonia.ViewModels.Progress;
@ -61,10 +61,7 @@ public partial class ProgressManagerViewModel : PageViewModelBase
EventManager.Instance.ToggleProgressFlyout += (_, _) => IsOpen = !IsOpen; EventManager.Instance.ToggleProgressFlyout += (_, _) => IsOpen = !IsOpen;
} }
private void InstanceOnPackageInstallProgressAdded( private void InstanceOnPackageInstallProgressAdded(object? sender, IPackageModificationRunner runner)
object? sender,
IPackageModificationRunner runner
)
{ {
AddPackageInstall(runner).SafeFireAndForget(); AddPackageInstall(runner).SafeFireAndForget();
} }
@ -181,9 +178,7 @@ public partial class ProgressManagerViewModel : PageViewModelBase
); );
ProgressItems.Add(vm); ProgressItems.Add(vm);
return packageModificationRunner.ShowDialogOnStart return packageModificationRunner.ShowDialogOnStart ? vm.ShowProgressDialog() : Task.CompletedTask;
? vm.ShowProgressDialog()
: Task.CompletedTask;
} }
private void ShowFailedNotification(string title, string message) private void ShowFailedNotification(string title, string message)

22
StabilityMatrix.Avalonia/ViewModels/Settings/AccountSettingsViewModel.cs

@ -23,7 +23,7 @@ using StabilityMatrix.Core.Models.Api.Lykos;
using StabilityMatrix.Core.Processes; using StabilityMatrix.Core.Processes;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
using TeachingTip = StabilityMatrix.Core.Models.Settings.TeachingTip; using TeachingTip = StabilityMatrix.Core.Models.Settings.TeachingTip;
namespace StabilityMatrix.Avalonia.ViewModels.Settings; namespace StabilityMatrix.Avalonia.ViewModels.Settings;
@ -42,8 +42,7 @@ public partial class AccountSettingsViewModel : PageViewModelBase
public override string Title => "Accounts"; public override string Title => "Accounts";
/// <inheritdoc /> /// <inheritdoc />
public override IconSource IconSource => public override IconSource IconSource => new SymbolIconSource { Symbol = Symbol.Person, IsFilled = true };
new SymbolIconSource { Symbol = Symbol.Person, IsFilled = true };
[ObservableProperty] [ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(ConnectLykosCommand))] [NotifyCanExecuteChangedFor(nameof(ConnectLykosCommand))]
@ -59,12 +58,10 @@ public partial class AccountSettingsViewModel : PageViewModelBase
[ObservableProperty] [ObservableProperty]
[NotifyPropertyChangedFor(nameof(LykosProfileImageUrl))] [NotifyPropertyChangedFor(nameof(LykosProfileImageUrl))]
private LykosAccountStatusUpdateEventArgs lykosStatus = private LykosAccountStatusUpdateEventArgs lykosStatus = LykosAccountStatusUpdateEventArgs.Disconnected;
LykosAccountStatusUpdateEventArgs.Disconnected;
[ObservableProperty] [ObservableProperty]
private CivitAccountStatusUpdateEventArgs civitStatus = private CivitAccountStatusUpdateEventArgs civitStatus = CivitAccountStatusUpdateEventArgs.Disconnected;
CivitAccountStatusUpdateEventArgs.Disconnected;
public AccountSettingsViewModel( public AccountSettingsViewModel(
IAccountsService accountsService, IAccountsService accountsService,
@ -116,11 +113,7 @@ public partial class AccountSettingsViewModel : PageViewModelBase
private async Task<bool> BeforeConnectCheck() private async Task<bool> BeforeConnectCheck()
{ {
// Show credentials storage notice if not seen // Show credentials storage notice if not seen
if ( if (!settingsManager.Settings.SeenTeachingTips.Contains(TeachingTip.AccountsCredentialsStorageNotice))
!settingsManager.Settings.SeenTeachingTips.Contains(
TeachingTip.AccountsCredentialsStorageNotice
)
)
{ {
var dialog = new BetterContentDialog var dialog = new BetterContentDialog
{ {
@ -242,10 +235,7 @@ public partial class AccountSettingsViewModel : PageViewModelBase
); );
dialog.PrimaryButtonText = Resources.Action_Connect; dialog.PrimaryButtonText = Resources.Action_Connect;
if ( if (await dialog.ShowAsync() != ContentDialogResult.Primary || textFields[0].Text is not { } apiToken)
await dialog.ShowAsync() != ContentDialogResult.Primary
|| textFields[0].Text is not { } apiToken
)
{ {
return; return;
} }

20
StabilityMatrix.Avalonia/ViewModels/Settings/InferenceSettingsViewModel.cs

@ -24,7 +24,7 @@ using StabilityMatrix.Core.Models.FileInterfaces;
using StabilityMatrix.Core.Python; using StabilityMatrix.Core.Python;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels.Settings; namespace StabilityMatrix.Avalonia.ViewModels.Settings;
@ -40,7 +40,8 @@ public partial class InferenceSettingsViewModel : PageViewModelBase
public override string Title => "Inference"; public override string Title => "Inference";
/// <inheritdoc /> /// <inheritdoc />
public override IconSource IconSource => new SymbolIconSource { Symbol = Symbol.Settings, IsFilled = true }; public override IconSource IconSource =>
new SymbolIconSource { Symbol = Symbol.Settings, IsFilled = true };
[ObservableProperty] [ObservableProperty]
private bool isPromptCompletionEnabled = true; private bool isPromptCompletionEnabled = true;
@ -64,8 +65,9 @@ public partial class InferenceSettingsViewModel : PageViewModelBase
public IEnumerable<FileNameFormatVar> OutputImageFileNameFormatVars => public IEnumerable<FileNameFormatVar> OutputImageFileNameFormatVars =>
FileNameFormatProvider FileNameFormatProvider
.GetSample() .GetSample()
.Substitutions .Substitutions.Select(
.Select(kv => new FileNameFormatVar { Variable = $"{{{kv.Key}}}", Example = kv.Value.Invoke() }); kv => new FileNameFormatVar { Variable = $"{{{kv.Key}}}", Example = kv.Value.Invoke() }
);
[ObservableProperty] [ObservableProperty]
private bool isImageViewerPixelGridEnabled = true; private bool isImageViewerPixelGridEnabled = true;
@ -114,7 +116,10 @@ public partial class InferenceSettingsViewModel : PageViewModelBase
var provider = FileNameFormatProvider.GetSample(); var provider = FileNameFormatProvider.GetSample();
var template = formatProperty.Value ?? string.Empty; var template = formatProperty.Value ?? string.Empty;
if (!string.IsNullOrEmpty(template) && provider.Validate(template) == ValidationResult.Success) if (
!string.IsNullOrEmpty(template)
&& provider.Validate(template) == ValidationResult.Success
)
{ {
var format = FileNameFormat.Parse(template, provider); var format = FileNameFormat.Parse(template, provider);
OutputImageFileNameFormatSample = format.GetFileName() + ".png"; OutputImageFileNameFormatSample = format.GetFileName() + ".png";
@ -147,7 +152,10 @@ public partial class InferenceSettingsViewModel : PageViewModelBase
/// <summary> /// <summary>
/// Validator for <see cref="OutputImageFileNameFormat"/> /// Validator for <see cref="OutputImageFileNameFormat"/>
/// </summary> /// </summary>
public static ValidationResult ValidateOutputImageFileNameFormat(string? format, ValidationContext context) public static ValidationResult ValidateOutputImageFileNameFormat(
string? format,
ValidationContext context
)
{ {
return FileNameFormatProvider.GetSample().Validate(format ?? string.Empty); return FileNameFormatProvider.GetSample().Validate(format ?? string.Empty);
} }

2
StabilityMatrix.Avalonia/ViewModels/Settings/MainSettingsViewModel.cs

@ -55,7 +55,7 @@ using StabilityMatrix.Core.Processes;
using StabilityMatrix.Core.Python; using StabilityMatrix.Core.Python;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels.Settings; namespace StabilityMatrix.Avalonia.ViewModels.Settings;

13
StabilityMatrix.Avalonia/ViewModels/Settings/UpdateSettingsViewModel.cs

@ -21,7 +21,7 @@ using StabilityMatrix.Core.Processes;
using StabilityMatrix.Core.Services; using StabilityMatrix.Core.Services;
using StabilityMatrix.Core.Updater; using StabilityMatrix.Core.Updater;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels.Settings; namespace StabilityMatrix.Avalonia.ViewModels.Settings;
@ -111,9 +111,7 @@ public partial class UpdateSettingsViewModel : PageViewModelBase
var isBetaChannelsEnabled = args.User?.IsActiveSupporter == true; var isBetaChannelsEnabled = args.User?.IsActiveSupporter == true;
foreach ( foreach (
var card in AvailableUpdateChannelCards.Where( var card in AvailableUpdateChannelCards.Where(c => c.UpdateChannel > UpdateChannel.Stable)
c => c.UpdateChannel > UpdateChannel.Stable
)
) )
{ {
card.IsSelectable = isBetaChannelsEnabled; card.IsSelectable = isBetaChannelsEnabled;
@ -169,8 +167,8 @@ public partial class UpdateSettingsViewModel : PageViewModelBase
public void ShowLoginRequiredDialog() public void ShowLoginRequiredDialog()
{ {
Dispatcher.UIThread Dispatcher
.InvokeAsync(async () => .UIThread.InvokeAsync(async () =>
{ {
var dialog = DialogHelper.CreateTaskDialog( var dialog = DialogHelper.CreateTaskDialog(
"Become a Supporter", "Become a Supporter",
@ -214,7 +212,8 @@ public partial class UpdateSettingsViewModel : PageViewModelBase
// Use maximum version from platforms equal or lower than current // Use maximum version from platforms equal or lower than current
foreach (var card in AvailableUpdateChannelCards) foreach (var card in AvailableUpdateChannelCards)
{ {
card.LatestVersion = value?.UpdateChannels card.LatestVersion = value
?.UpdateChannels
.Where(kv => kv.Key <= card.UpdateChannel) .Where(kv => kv.Key <= card.UpdateChannel)
.Select(kv => kv.Value) .Select(kv => kv.Value)
.MaxBy(info => info.Version, SemVersion.PrecedenceComparer) .MaxBy(info => info.Version, SemVersion.PrecedenceComparer)

5
StabilityMatrix.Avalonia/ViewModels/SettingsViewModel.cs

@ -9,7 +9,7 @@ using StabilityMatrix.Avalonia.ViewModels.Settings;
using StabilityMatrix.Avalonia.Views; using StabilityMatrix.Avalonia.Views;
using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Attributes;
using Symbol = FluentIcons.Common.Symbol; using Symbol = FluentIcons.Common.Symbol;
using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; using SymbolIconSource = FluentIcons.Avalonia.Fluent.SymbolIconSource;
namespace StabilityMatrix.Avalonia.ViewModels; namespace StabilityMatrix.Avalonia.ViewModels;
@ -18,7 +18,8 @@ namespace StabilityMatrix.Avalonia.ViewModels;
public partial class SettingsViewModel : PageViewModelBase public partial class SettingsViewModel : PageViewModelBase
{ {
public override string Title => "Settings"; public override string Title => "Settings";
public override IconSource IconSource => new SymbolIconSource { Symbol = Symbol.Settings, IsFilled = true }; public override IconSource IconSource =>
new SymbolIconSource { Symbol = Symbol.Settings, IsFilled = true };
public IReadOnlyList<PageViewModelBase> SubPages { get; } public IReadOnlyList<PageViewModelBase> SubPages { get; }

2
StabilityMatrix.Avalonia/Views/Dialogs/PythonPackagesDialog.axaml

@ -15,7 +15,7 @@
xmlns:vm="clr-namespace:StabilityMatrix.Avalonia.ViewModels" xmlns:vm="clr-namespace:StabilityMatrix.Avalonia.ViewModels"
xmlns:vmDialogs="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Dialogs" xmlns:vmDialogs="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Dialogs"
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight" xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia" xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia"
d:DataContext="{x:Static mocks:DesignData.PythonPackagesViewModel}" d:DataContext="{x:Static mocks:DesignData.PythonPackagesViewModel}"
d:DesignHeight="450" d:DesignHeight="450"

2
StabilityMatrix.Avalonia/Views/Dialogs/SelectModelVersionDialog.axaml

@ -7,7 +7,7 @@
xmlns:designData="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:designData="clr-namespace:StabilityMatrix.Avalonia.DesignData"
mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="850" mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="850"
x:DataType="dialogs:SelectModelVersionViewModel" x:DataType="dialogs:SelectModelVersionViewModel"
xmlns:fluentAvalonia="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentAvalonia="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:models="clr-namespace:StabilityMatrix.Avalonia.Models" xmlns:models="clr-namespace:StabilityMatrix.Avalonia.Models"
xmlns:avalonia="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia" xmlns:avalonia="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"

2
StabilityMatrix.Avalonia/Views/Dialogs/UpdateDialog.axaml

@ -8,7 +8,7 @@
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight" xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
d:DataContext="{x:Static mocks:DesignData.UpdateViewModel}" d:DataContext="{x:Static mocks:DesignData.UpdateViewModel}"
x:DataType="dialogs:UpdateViewModel" x:DataType="dialogs:UpdateViewModel"
mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="550" mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="550"

2
StabilityMatrix.Avalonia/Views/InferencePage.axaml

@ -5,7 +5,7 @@
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters" xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentIcons="using:FluentIcons.FluentAvalonia" xmlns:fluentIcons="using:FluentIcons.Avalonia.Fluent"
xmlns:icons="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia" xmlns:icons="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

2
StabilityMatrix.Avalonia/Views/MainWindow.axaml

@ -9,7 +9,7 @@
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:base="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Base" xmlns:base="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Base"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="550" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="550"
d:DataContext="{x:Static mocks:DesignData.MainWindowViewModel}" d:DataContext="{x:Static mocks:DesignData.MainWindowViewModel}"
x:DataType="vm:MainWindowViewModel" x:DataType="vm:MainWindowViewModel"

2
StabilityMatrix.Avalonia/Views/OutputsPage.axaml

@ -6,7 +6,7 @@
xmlns:avaloniaEdit="clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit" xmlns:avaloniaEdit="clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentAvalonia="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentAvalonia="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData"

7
StabilityMatrix.Avalonia/Views/PackageManager/PackageExtensionBrowserView.axaml

@ -11,7 +11,7 @@
xmlns:extensions="clr-namespace:StabilityMatrix.Core.Models.Packages.Extensions;assembly=StabilityMatrix.Core" xmlns:extensions="clr-namespace:StabilityMatrix.Core.Models.Packages.Extensions;assembly=StabilityMatrix.Core"
xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia" xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia" xmlns:sg="clr-namespace:SpacedGridControl.Avalonia;assembly=SpacedGridControl.Avalonia"
xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core" xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core"
xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters" xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters"
@ -201,6 +201,11 @@
<ui:SymbolIcon FontSize="16" Symbol="Settings" /> <ui:SymbolIcon FontSize="16" Symbol="Settings" />
</Button> </Button>
</sg:SpacedGrid> </sg:SpacedGrid>
<TextBlock Grid.Row="1"
HorizontalAlignment="Center"
IsVisible="{Binding ShowNoExtensionsFoundMessage}"
Text="{x:Static lang:Resources.Label_NoExtensionsFound}"/>
<ScrollViewer <ScrollViewer
IsVisible="{Binding !IsLoading}" IsVisible="{Binding !IsLoading}"

2
StabilityMatrix.Avalonia/Views/Settings/AccountSettingsPage.axaml

@ -4,7 +4,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData"

2
StabilityMatrix.Avalonia/Views/Settings/InferenceSettingsPage.axaml

@ -4,7 +4,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:inference="clr-namespace:StabilityMatrix.Avalonia.Models.Inference" xmlns:inference="clr-namespace:StabilityMatrix.Avalonia.Models.Inference"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

2
StabilityMatrix.Avalonia/Views/Settings/MainSettingsPage.axaml

@ -6,7 +6,7 @@
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters" xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:hardwareInfo="clr-namespace:StabilityMatrix.Core.Helper.HardwareInfo;assembly=StabilityMatrix.Core" xmlns:hardwareInfo="clr-namespace:StabilityMatrix.Core.Helper.HardwareInfo;assembly=StabilityMatrix.Core"
xmlns:helper="clr-namespace:StabilityMatrix.Core.Helper;assembly=StabilityMatrix.Core" xmlns:helper="clr-namespace:StabilityMatrix.Core.Helper;assembly=StabilityMatrix.Core"
xmlns:inference="clr-namespace:StabilityMatrix.Avalonia.Models.Inference" xmlns:inference="clr-namespace:StabilityMatrix.Avalonia.Models.Inference"

2
StabilityMatrix.Avalonia/Views/Settings/UpdateSettingsPage.axaml

@ -4,7 +4,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:fluentIcons="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia" xmlns:fluentIcons="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData"

99
StabilityMatrix.Core/Models/FooocusConfig.cs

@ -0,0 +1,99 @@
using System.Text.Json.Serialization;
namespace StabilityMatrix.Core.Models;
public class FooocusConfig
{
[JsonPropertyName("path_checkpoints")]
public string PathCheckpoints { get; set; }
[JsonPropertyName("path_loras")]
public string PathLoras { get; set; }
[JsonPropertyName("path_embeddings")]
public string PathEmbeddings { get; set; }
[JsonPropertyName("path_vae_approx")]
public string PathVaeApprox { get; set; }
[JsonPropertyName("path_upscale_models")]
public string PathUpscaleModels { get; set; }
[JsonPropertyName("path_inpaint")]
public string PathInpaint { get; set; }
[JsonPropertyName("path_controlnet")]
public string PathControlnet { get; set; }
[JsonPropertyName("path_clip_vision")]
public string PathClipVision { get; set; }
[JsonPropertyName("path_fooocus_expansion")]
public string PathFooocusExpansion { get; set; }
[JsonPropertyName("path_outputs")]
public string PathOutputs { get; set; }
[JsonPropertyName("default_model")]
public string DefaultModel { get; set; }
[JsonPropertyName("default_refiner")]
public string DefaultRefiner { get; set; }
[JsonPropertyName("default_refiner_switch")]
public double DefaultRefinerSwitch { get; set; }
[JsonPropertyName("default_cfg_scale")]
public long DefaultCfgScale { get; set; }
[JsonPropertyName("default_sample_sharpness")]
public long DefaultSampleSharpness { get; set; }
[JsonPropertyName("default_sampler")]
public string DefaultSampler { get; set; }
[JsonPropertyName("default_scheduler")]
public string DefaultScheduler { get; set; }
[JsonPropertyName("default_styles")]
public string[] DefaultStyles { get; set; }
[JsonPropertyName("default_prompt_negative")]
public string DefaultPromptNegative { get; set; }
[JsonPropertyName("default_prompt")]
public string DefaultPrompt { get; set; }
[JsonPropertyName("default_performance")]
public string DefaultPerformance { get; set; }
[JsonPropertyName("default_advanced_checkbox")]
public bool DefaultAdvancedCheckbox { get; set; }
[JsonPropertyName("default_max_image_number")]
public long DefaultMaxImageNumber { get; set; }
[JsonPropertyName("default_image_number")]
public long DefaultImageNumber { get; set; }
[JsonPropertyName("available_aspect_ratios")]
public string[] AvailableAspectRatios { get; set; }
[JsonPropertyName("default_aspect_ratio")]
public string DefaultAspectRatio { get; set; }
[JsonPropertyName("default_inpaint_engine_version")]
public string DefaultInpaintEngineVersion { get; set; }
[JsonPropertyName("default_cfg_tsnr")]
public long DefaultCfgTsnr { get; set; }
[JsonPropertyName("default_overwrite_step")]
public long DefaultOverwriteStep { get; set; }
[JsonPropertyName("default_overwrite_switch")]
public long DefaultOverwriteSwitch { get; set; }
[JsonPropertyName("example_inpaint_prompts")]
public string[] ExampleInpaintPrompts { get; set; }
}

32
StabilityMatrix.Core/Models/Packages/A3WebUI.cs

@ -292,18 +292,26 @@ public class A3WebUI(
CancellationToken cancellationToken = default CancellationToken cancellationToken = default
) )
{ {
// Get json try
var content = await package {
.DownloadService.GetContentAsync(manifest.Uri.ToString(), cancellationToken) // Get json
.ConfigureAwait(false); var content = await package
.DownloadService.GetContentAsync(manifest.Uri.ToString(), cancellationToken)
// Parse json .ConfigureAwait(false);
var jsonManifest = JsonSerializer.Deserialize<A1111ExtensionManifest>(
content, // Parse json
A1111ExtensionManifestSerializerContext.Default.Options var jsonManifest = JsonSerializer.Deserialize<A1111ExtensionManifest>(
); content,
A1111ExtensionManifestSerializerContext.Default.Options
return jsonManifest?.GetPackageExtensions() ?? Enumerable.Empty<PackageExtension>(); );
return jsonManifest?.GetPackageExtensions() ?? Enumerable.Empty<PackageExtension>();
}
catch (Exception e)
{
Logger.Error(e, "Failed to get extensions from manifest");
return Enumerable.Empty<PackageExtension>();
}
} }
} }
} }

32
StabilityMatrix.Core/Models/Packages/ComfyUI.cs

@ -486,18 +486,26 @@ public class ComfyUI(
CancellationToken cancellationToken = default CancellationToken cancellationToken = default
) )
{ {
// Get json try
var content = await package {
.DownloadService.GetContentAsync(manifest.Uri.ToString(), cancellationToken) // Get json
.ConfigureAwait(false); var content = await package
.DownloadService.GetContentAsync(manifest.Uri.ToString(), cancellationToken)
// Parse json .ConfigureAwait(false);
var jsonManifest = JsonSerializer.Deserialize<ComfyExtensionManifest>(
content, // Parse json
ComfyExtensionManifestSerializerContext.Default.Options var jsonManifest = JsonSerializer.Deserialize<ComfyExtensionManifest>(
); content,
ComfyExtensionManifestSerializerContext.Default.Options
return jsonManifest?.GetPackageExtensions() ?? Enumerable.Empty<PackageExtension>(); );
return jsonManifest?.GetPackageExtensions() ?? Enumerable.Empty<PackageExtension>();
}
catch (Exception e)
{
Logger.Error(e, "Failed to get package extensions");
return Enumerable.Empty<PackageExtension>();
}
} }
/// <inheritdoc /> /// <inheritdoc />

120
StabilityMatrix.Core/Models/Packages/Fooocus.cs

@ -1,5 +1,7 @@
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Diagnostics; using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Attributes;
using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Helper;
@ -32,7 +34,9 @@ public class Fooocus(
public override string LaunchCommand => "launch.py"; public override string LaunchCommand => "launch.py";
public override Uri PreviewImageUri => public override Uri PreviewImageUri =>
new("https://user-images.githubusercontent.com/19834515/261830306-f79c5981-cf80-4ee3-b06b-3fef3f8bfbc7.png"); new(
"https://user-images.githubusercontent.com/19834515/261830306-f79c5981-cf80-4ee3-b06b-3fef3f8bfbc7.png"
);
public override List<LaunchOptionDefinition> LaunchOptions => public override List<LaunchOptionDefinition> LaunchOptions =>
new() new()
@ -81,7 +85,13 @@ public class Fooocus(
MemoryLevel.Medium => "--always-normal-vram", MemoryLevel.Medium => "--always-normal-vram",
_ => null _ => null
}, },
Options = { "--always-high-vram", "--always-normal-vram", "--always-low-vram", "--always-no-vram" } Options =
{
"--always-high-vram",
"--always-normal-vram",
"--always-low-vram",
"--always-no-vram"
}
}, },
new LaunchOptionDefinition new LaunchOptionDefinition
{ {
@ -107,10 +117,10 @@ public class Fooocus(
LaunchOptionDefinition.Extras LaunchOptionDefinition.Extras
}; };
public override SharedFolderMethod RecommendedSharedFolderMethod => SharedFolderMethod.Symlink; public override SharedFolderMethod RecommendedSharedFolderMethod => SharedFolderMethod.Configuration;
public override IEnumerable<SharedFolderMethod> AvailableSharedFolderMethods => public override IEnumerable<SharedFolderMethod> AvailableSharedFolderMethods =>
new[] { SharedFolderMethod.Symlink, SharedFolderMethod.None }; new[] { SharedFolderMethod.Symlink, SharedFolderMethod.Configuration, SharedFolderMethod.None };
public override Dictionary<SharedFolderType, IReadOnlyList<string>> SharedFolders => public override Dictionary<SharedFolderType, IReadOnlyList<string>> SharedFolders =>
new() new()
@ -222,4 +232,106 @@ public class Fooocus(
VenvRunner?.RunDetached(args.TrimEnd(), HandleConsoleOutput, HandleExit); VenvRunner?.RunDetached(args.TrimEnd(), HandleConsoleOutput, HandleExit);
} }
public override Task SetupModelFolders(
DirectoryPath installDirectory,
SharedFolderMethod sharedFolderMethod
)
{
return sharedFolderMethod switch
{
SharedFolderMethod.Symlink
=> base.SetupModelFolders(installDirectory, SharedFolderMethod.Symlink),
SharedFolderMethod.Configuration => SetupModelFoldersConfig(installDirectory),
SharedFolderMethod.None => WriteDefaultConfig(installDirectory),
_ => throw new ArgumentOutOfRangeException(nameof(sharedFolderMethod), sharedFolderMethod, null)
};
}
public override Task RemoveModelFolderLinks(
DirectoryPath installDirectory,
SharedFolderMethod sharedFolderMethod
)
{
return sharedFolderMethod switch
{
SharedFolderMethod.Symlink => base.RemoveModelFolderLinks(installDirectory, sharedFolderMethod),
SharedFolderMethod.Configuration => WriteDefaultConfig(installDirectory),
SharedFolderMethod.None => Task.CompletedTask,
_ => throw new ArgumentOutOfRangeException(nameof(sharedFolderMethod), sharedFolderMethod, null)
};
}
private JsonSerializerOptions jsonSerializerOptions =
new() { WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault };
private async Task SetupModelFoldersConfig(DirectoryPath installDirectory)
{
var fooocusConfigPath = installDirectory.JoinFile("config.txt");
var fooocusConfig = new FooocusConfig();
if (fooocusConfigPath.Exists)
{
var configText = await fooocusConfigPath.ReadAllTextAsync().ConfigureAwait(false);
fooocusConfig = JsonSerializer.Deserialize<FooocusConfig>(configText) ?? new FooocusConfig();
}
else
{
fooocusConfigPath.Create();
}
fooocusConfig.PathCheckpoints = Path.Combine(settingsManager.ModelsDirectory, "StableDiffusion");
fooocusConfig.PathLoras = Path.Combine(settingsManager.ModelsDirectory, "Lora");
fooocusConfig.PathEmbeddings = Path.Combine(settingsManager.ModelsDirectory, "TextualInversion");
fooocusConfig.PathVaeApprox = Path.Combine(settingsManager.ModelsDirectory, "ApproxVAE");
fooocusConfig.PathUpscaleModels = Path.Combine(settingsManager.ModelsDirectory, "ESRGAN");
fooocusConfig.PathInpaint = Path.Combine(installDirectory, "models", "inpaint");
fooocusConfig.PathControlnet = Path.Combine(settingsManager.ModelsDirectory, "ControlNet");
fooocusConfig.PathClipVision = Path.Combine(settingsManager.ModelsDirectory, "CLIP");
fooocusConfig.PathFooocusExpansion = Path.Combine(
installDirectory,
"models",
"prompt_expansion",
"fooocus_expansion"
);
fooocusConfig.PathOutputs = Path.Combine(installDirectory, OutputFolderName);
await fooocusConfigPath
.WriteAllTextAsync(JsonSerializer.Serialize(fooocusConfig, jsonSerializerOptions))
.ConfigureAwait(false);
}
private async Task WriteDefaultConfig(DirectoryPath installDirectory)
{
var fooocusConfigPath = installDirectory.JoinFile("config.txt");
var fooocusConfig = new FooocusConfig();
if (fooocusConfigPath.Exists)
{
var configText = await fooocusConfigPath.ReadAllTextAsync().ConfigureAwait(false);
fooocusConfig = JsonSerializer.Deserialize<FooocusConfig>(configText) ?? new FooocusConfig();
}
else
{
fooocusConfigPath.Create();
}
fooocusConfig.PathCheckpoints = Path.Combine(installDirectory, "models", "checkpoints");
fooocusConfig.PathLoras = Path.Combine(installDirectory, "models", "loras");
fooocusConfig.PathEmbeddings = Path.Combine(installDirectory, "models", "embeddings");
fooocusConfig.PathVaeApprox = Path.Combine(installDirectory, "models", "vae_approx");
fooocusConfig.PathUpscaleModels = Path.Combine(installDirectory, "models", "upscale_models");
fooocusConfig.PathInpaint = Path.Combine(installDirectory, "models", "inpaint");
fooocusConfig.PathControlnet = Path.Combine(installDirectory, "models", "controlnet");
fooocusConfig.PathClipVision = Path.Combine(installDirectory, "models", "clip_vision");
fooocusConfig.PathFooocusExpansion = Path.Combine(
installDirectory,
"models",
"prompt_expansion",
"fooocus_expansion"
);
fooocusConfig.PathOutputs = Path.Combine(installDirectory, OutputFolderName);
await fooocusConfigPath
.WriteAllTextAsync(JsonSerializer.Serialize(fooocusConfig, jsonSerializerOptions))
.ConfigureAwait(false);
}
} }

32
StabilityMatrix.Core/StabilityMatrix.Core.csproj

@ -17,19 +17,19 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AsyncAwaitBestPractices" Version="7.0.0" /> <PackageReference Include="AsyncAwaitBestPractices" Version="7.0.0" />
<PackageReference Include="AutoCtor" Version="2.0.0" /> <PackageReference Include="AutoCtor" Version="2.1.0" />
<PackageReference Include="Blake3" Version="1.0.0" /> <PackageReference Include="Blake3" Version="1.0.0" />
<PackageReference Include="Crc32.NET" Version="1.2.0" /> <PackageReference Include="Crc32.NET" Version="1.2.0" />
<PackageReference Include="CSharpDiscriminatedUnion" Version="2.0.1" /> <PackageReference Include="CSharpDiscriminatedUnion" Version="2.0.1" />
<PackageReference Include="DeviceId" Version="6.5.0" /> <PackageReference Include="DeviceId" Version="6.6.0" />
<PackageReference Include="DeviceId.Linux" Version="6.3.1" /> <PackageReference Include="DeviceId.Linux" Version="6.4.0" />
<PackageReference Include="DeviceId.Mac" Version="6.2.1" /> <PackageReference Include="DeviceId.Mac" Version="6.3.0" />
<PackageReference Include="DeviceId.Windows" Version="6.5.0" /> <PackageReference Include="DeviceId.Windows" Version="6.6.0" />
<PackageReference Include="DeviceId.Windows.Wmi" Version="6.5.1" /> <PackageReference Include="DeviceId.Windows.Wmi" Version="6.6.0" />
<PackageReference Include="DotNet.Bundle" Version="0.9.13" /> <PackageReference Include="DotNet.Bundle" Version="0.9.13" />
<PackageReference Include="DynamicData" Version="8.1.1" /> <PackageReference Include="DynamicData" Version="8.3.27" />
<PackageReference Include="ExifLibNet" Version="2.1.4" /> <PackageReference Include="ExifLibNet" Version="2.1.4" />
<PackageReference Include="Hardware.Info" Version="100.0.0.1" /> <PackageReference Include="Hardware.Info" Version="100.0.1.1" />
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" /> <PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
<PackageReference Include="KGySoft.Drawing.Core" Version="8.0.0" /> <PackageReference Include="KGySoft.Drawing.Core" Version="8.0.0" />
<PackageReference Include="KGySoft.Drawing.SkiaSharp" Version="8.0.0" /> <PackageReference Include="KGySoft.Drawing.SkiaSharp" Version="8.0.0" />
@ -38,23 +38,23 @@
<PackageReference Include="MetadataExtractor" Version="2.8.1" /> <PackageReference Include="MetadataExtractor" Version="2.8.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageReference Include="NLog" Version="5.2.5" /> <PackageReference Include="NLog" Version="5.2.8" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.5" /> <PackageReference Include="NLog.Extensions.Logging" Version="5.3.8" />
<PackageReference Include="NSec.Cryptography" Version="22.4.0" /> <PackageReference Include="NSec.Cryptography" Version="22.4.0" />
<PackageReference Include="Octokit" Version="9.0.0" /> <PackageReference Include="Octokit" Version="9.1.0" />
<PackageReference Include="OneOf" Version="3.0.263" /> <PackageReference Include="OneOf" Version="3.0.263" />
<PackageReference Include="OneOf.SourceGenerator" Version="3.0.263" /> <PackageReference Include="OneOf.SourceGenerator" Version="3.0.263" />
<PackageReference Include="Polly" Version="8.2.0" /> <PackageReference Include="Polly" Version="8.2.1" />
<PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" /> <PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" />
<PackageReference Include="pythonnet" Version="3.0.3" /> <PackageReference Include="pythonnet" Version="3.0.3" />
<PackageReference Include="Refit" Version="7.0.0" /> <PackageReference Include="Refit" Version="7.0.0" />
<PackageReference Include="Refit.HttpClientFactory" Version="7.0.0" /> <PackageReference Include="Refit.HttpClientFactory" Version="7.0.0" />
<PackageReference Include="RockLib.Reflection.Optimized" Version="2.0.0" /> <PackageReference Include="RockLib.Reflection.Optimized" Version="3.0.0" />
<PackageReference Include="Salaros.ConfigParser" Version="0.3.8" /> <PackageReference Include="Salaros.ConfigParser" Version="0.3.8" />
<PackageReference Include="Semver" Version="3.0.0-beta.1" /> <PackageReference Include="Semver" Version="3.0.0-beta.1" />
<PackageReference Include="Sentry.NLog" Version="3.41.0" /> <PackageReference Include="Sentry.NLog" Version="3.41.3" />
<PackageReference Include="SharpCompress" Version="0.34.2" /> <PackageReference Include="SharpCompress" Version="0.36.0" />
<PackageReference Include="SkiaSharp" Version="2.88.6" /> <PackageReference Include="SkiaSharp" Version="2.88.7" />
<PackageReference Include="Websocket.Client" Version="5.0.0" /> <PackageReference Include="Websocket.Client" Version="5.0.0" />
<PackageReference Include="YamlDotNet" Version="13.7.1" /> <PackageReference Include="YamlDotNet" Version="13.7.1" />
<PackageReference Include="Yoh.Text.Json.NamingPolicies" Version="1.0.0" /> <PackageReference Include="Yoh.Text.Json.NamingPolicies" Version="1.0.0" />

6
StabilityMatrix.Tests/StabilityMatrix.Tests.csproj

@ -12,9 +12,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DotNet.Bundle" Version="0.9.13" /> <PackageReference Include="DotNet.Bundle" Version="0.9.13" />
<PackageReference Include="DotNext" Version="4.15.1" /> <PackageReference Include="DotNext" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="8.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.1.1" /> <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.1.1" /> <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
@ -23,7 +23,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="NSubstitute" Version="5.1.0" /> <PackageReference Include="NSubstitute" Version="5.1.0" />
<PackageReference Include="Polly" Version="8.2.0" /> <PackageReference Include="Polly" Version="8.2.1" />
<PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" /> <PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" />
</ItemGroup> </ItemGroup>

1
StabilityMatrix.UITests/MainWindowTests.cs

@ -8,7 +8,6 @@ using StabilityMatrix.UITests.Extensions;
namespace StabilityMatrix.UITests; namespace StabilityMatrix.UITests;
[UsesVerify]
[Collection("TempDir")] [Collection("TempDir")]
[TestCaseOrderer("StabilityMatrix.UITests.PriorityOrderer", "StabilityMatrix.UITests")] [TestCaseOrderer("StabilityMatrix.UITests.PriorityOrderer", "StabilityMatrix.UITests")]
public class MainWindowTests : TestBase public class MainWindowTests : TestBase

13
StabilityMatrix.UITests/ModelBrowser/CivitAiBrowserTests.cs

@ -1,13 +1,4 @@
using Avalonia.Controls; namespace StabilityMatrix.UITests.ModelBrowser;
using Avalonia.Interactivity;
using Avalonia.Threading;
using Avalonia.VisualTree;
using FluentAvalonia.UI.Controls;
using StabilityMatrix.Avalonia.Views;
using StabilityMatrix.UITests.Extensions;
namespace StabilityMatrix.UITests.ModelBrowser;
[UsesVerify]
[Collection("TempDir")] [Collection("TempDir")]
public class CivitAiBrowserTests : TestBase { } public class CivitAiBrowserTests : TestBase;

8
StabilityMatrix.UITests/StabilityMatrix.UITests.csproj

@ -10,16 +10,16 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia.Headless.XUnit" Version="11.0.6" /> <PackageReference Include="Avalonia.Headless.XUnit" Version="11.0.7" />
<PackageReference Include="DotNet.Bundle" Version="0.9.13" /> <PackageReference Include="DotNet.Bundle" Version="0.9.13" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="NSubstitute" Version="5.1.0" /> <PackageReference Include="NSubstitute" Version="5.1.0" />
<PackageReference Include="Verify" Version="22.11.1" /> <PackageReference Include="Verify" Version="23.0.0" />
<PackageReference Include="Verify.CommunityToolkit.Mvvm" Version="0.1.0" /> <PackageReference Include="Verify.CommunityToolkit.Mvvm" Version="0.1.0" />
<PackageReference Include="Verify.Avalonia" Version="1.0.1" /> <PackageReference Include="Verify.Avalonia" Version="1.0.1" />
<PackageReference Include="Verify.Phash" Version="3.1.0" /> <PackageReference Include="Verify.Phash" Version="3.1.0" />
<PackageReference Include="Verify.Xunit" Version="22.11.1" /> <PackageReference Include="Verify.Xunit" Version="23.0.0" />
<PackageReference Include="xunit" Version="2.6.4" /> <PackageReference Include="xunit" Version="2.6.6" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6"> <PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

Loading…
Cancel
Save