Skip to content

Commit 2850541

Browse files
committed
2 parents 1aa9a37 + e6e3a27 commit 2850541

17 files changed

+295
-314
lines changed

.config/.csharpierrc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"printWidth": 120,
2+
"printWidth": 110,
33
"preprocessorSymbolSets": ["", "DEBUG", "DEBUG,CODE_STYLE"]
44
}

.config/dotnet-tools.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
]
1616
},
1717
"csharpier": {
18-
"version": "0.26.4",
18+
"version": "0.26.7",
1919
"commands": [
2020
"dotnet-csharpier"
2121
]
2222
}
2323
}
24-
}
24+
}

.csharpierrc.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
printWidth: 110

CHANGELOG.md

+10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ All notable changes to Stability Matrix will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html).
77

8+
## v2.7.4
9+
### Changed
10+
- Improved low disk space handling
11+
### Fixed
12+
- Fixed denoise strength in Inference Text to Image
13+
- Fixed PathTooLongException for IPAdapter folders when using ComfyUI in Symlink mode
14+
- Fixed configs and symlinks not being cleaned up when switched to the opposite mode
15+
- Fixed model indexing stopping when encountering paths longer than 1021 bytes in length
16+
- Fixed repeated nested folders being created in `Models/ControlNet` when using ComfyUI in Symlink mode. Existing folders will be repaired to their original structure on launch.
17+
818
## v2.7.3
919
### Added
1020
- Added missing IPAdapter and CLIP Vision folder links for ComfyUI

StabilityMatrix.Avalonia/ViewModels/Dialogs/SelectModelVersionViewModel.cs

+37-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Collections.ObjectModel;
4+
using System.IO;
35
using System.Linq;
46
using Avalonia.Media.Imaging;
57
using Avalonia.Threading;
@@ -8,6 +10,8 @@
810
using StabilityMatrix.Avalonia.Models;
911
using StabilityMatrix.Avalonia.ViewModels.Base;
1012
using StabilityMatrix.Core.Attributes;
13+
using StabilityMatrix.Core.Helper;
14+
using StabilityMatrix.Core.Models.FileInterfaces;
1115
using StabilityMatrix.Core.Services;
1216

1317
namespace StabilityMatrix.Avalonia.ViewModels.Dialogs;
@@ -49,12 +53,12 @@ public partial class SelectModelVersionViewModel : ContentDialogViewModelBase
4953
[NotifyPropertyChangedFor(nameof(DisplayedPageNumber))]
5054
private int selectedImageIndex;
5155

56+
[ObservableProperty]
57+
private string importTooltip = string.Empty;
58+
5259
public int DisplayedPageNumber => SelectedImageIndex + 1;
5360

54-
public SelectModelVersionViewModel(
55-
ISettingsManager settingsManager,
56-
IDownloadService downloadService
57-
)
61+
public SelectModelVersionViewModel(ISettingsManager settingsManager, IDownloadService downloadService)
5862
{
5963
this.settingsManager = settingsManager;
6064
this.downloadService = downloadService;
@@ -70,7 +74,9 @@ partial void OnSelectedVersionViewModelChanged(ModelVersionViewModel? value)
7074
{
7175
var nsfwEnabled = settingsManager.Settings.ModelBrowserNsfwEnabled;
7276
var allImages = value
73-
?.ModelVersion?.Images?.Where(img => nsfwEnabled || img.Nsfw == "None")
77+
?.ModelVersion
78+
?.Images
79+
?.Where(img => nsfwEnabled || img.Nsfw == "None")
7480
?.Select(x => new ImageSource(x.Url))
7581
.ToList();
7682

@@ -84,18 +90,35 @@ partial void OnSelectedVersionViewModelChanged(ModelVersionViewModel? value)
8490
CanGoToNextImage = allImages.Count > 1;
8591
}
8692

87-
Dispatcher.UIThread.Post(() =>
88-
{
89-
CanGoToPreviousImage = false;
90-
SelectedFile = SelectedVersionViewModel?.CivitFileViewModels.FirstOrDefault();
91-
ImageUrls = new ObservableCollection<ImageSource>(allImages);
92-
SelectedImageIndex = 0;
93-
});
93+
Dispatcher
94+
.UIThread
95+
.Post(() =>
96+
{
97+
CanGoToPreviousImage = false;
98+
SelectedFile = SelectedVersionViewModel?.CivitFileViewModels.FirstOrDefault();
99+
ImageUrls = new ObservableCollection<ImageSource>(allImages);
100+
SelectedImageIndex = 0;
101+
});
94102
}
95103

96104
partial void OnSelectedFileChanged(CivitFileViewModel? value)
97105
{
98-
IsImportEnabled = value?.CivitFile != null;
106+
var canImport = true;
107+
if (settingsManager.IsLibraryDirSet)
108+
{
109+
var fileSizeBytes = value?.CivitFile.SizeKb * 1024;
110+
var freeSizeBytes = SystemInfo.GetDiskFreeSpaceBytes(settingsManager.ModelsDirectory);
111+
canImport = fileSizeBytes < freeSizeBytes;
112+
ImportTooltip = canImport
113+
? $"Free space after download: {Size.FormatBytes(Convert.ToUInt64(freeSizeBytes - fileSizeBytes))}"
114+
: $"Not enough space on disk. Need {Size.FormatBytes(Convert.ToUInt64(fileSizeBytes))} but only have {Size.FormatBytes(Convert.ToUInt64(freeSizeBytes))}";
115+
}
116+
else
117+
{
118+
ImportTooltip = "Please set the library directory in settings";
119+
}
120+
121+
IsImportEnabled = value?.CivitFile != null && canImport;
99122
}
100123

101124
public void Cancel()

StabilityMatrix.Avalonia/ViewModels/Inference/InferenceTextToImageViewModel.cs

+22-29
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@ namespace StabilityMatrix.Avalonia.ViewModels.Inference;
2626
[View(typeof(InferenceTextToImageView), IsPersistent = true)]
2727
[ManagedService]
2828
[Transient]
29-
public class InferenceTextToImageViewModel
30-
: InferenceGenerationViewModelBase,
31-
IParametersLoadableState
29+
public class InferenceTextToImageViewModel : InferenceGenerationViewModelBase, IParametersLoadableState
3230
{
3331
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
3432

@@ -81,6 +79,7 @@ IModelIndexService modelIndexService
8179
samplerCard.IsCfgScaleEnabled = true;
8280
samplerCard.IsSamplerSelectionEnabled = true;
8381
samplerCard.IsSchedulerSelectionEnabled = true;
82+
samplerCard.DenoiseStrength = 1.0d;
8483
});
8584

8685
PromptCardViewModel = vmFactory.Get<PromptCardViewModel>();
@@ -162,22 +161,19 @@ protected override void BuildPrompt(BuildPromptEventArgs args)
162161
/// <inheritdoc />
163162
protected override IEnumerable<ImageSource> GetInputImages()
164163
{
165-
var samplerImages = SamplerCardViewModel.ModulesCardViewModel.Cards
164+
var samplerImages = SamplerCardViewModel
165+
.ModulesCardViewModel
166+
.Cards
166167
.OfType<IInputImageProvider>()
167168
.SelectMany(m => m.GetInputImages());
168169

169-
var moduleImages = ModulesCardViewModel.Cards
170-
.OfType<IInputImageProvider>()
171-
.SelectMany(m => m.GetInputImages());
170+
var moduleImages = ModulesCardViewModel.Cards.OfType<IInputImageProvider>().SelectMany(m => m.GetInputImages());
172171

173172
return samplerImages.Concat(moduleImages);
174173
}
175174

176175
/// <inheritdoc />
177-
protected override async Task GenerateImageImpl(
178-
GenerateOverrides overrides,
179-
CancellationToken cancellationToken
180-
)
176+
protected override async Task GenerateImageImpl(GenerateOverrides overrides, CancellationToken cancellationToken)
181177
{
182178
// Validate the prompts
183179
if (!await PromptCardViewModel.ValidatePrompts())
@@ -205,11 +201,7 @@ CancellationToken cancellationToken
205201
{
206202
var seed = seedCard.Seed + i;
207203

208-
var buildPromptArgs = new BuildPromptEventArgs
209-
{
210-
Overrides = overrides,
211-
SeedOverride = seed
212-
};
204+
var buildPromptArgs = new BuildPromptEventArgs { Overrides = overrides, SeedOverride = seed };
213205
BuildPrompt(buildPromptArgs);
214206

215207
var generationArgs = new ImageGenerationEventArgs
@@ -241,6 +233,11 @@ public void LoadStateFromParameters(GenerationParameters parameters)
241233
ModelCardViewModel.LoadStateFromParameters(parameters);
242234

243235
SeedCardViewModel.Seed = Convert.ToInt64(parameters.Seed);
236+
237+
if (Math.Abs(SamplerCardViewModel.DenoiseStrength - 1.0d) > 0.01d)
238+
{
239+
SamplerCardViewModel.DenoiseStrength = 1.0d;
240+
}
244241
}
245242

246243
/// <inheritdoc />
@@ -270,16 +267,12 @@ public override void LoadStateFromJsonObject(JsonObject state, int version)
270267

271268
if (state.TryGetPropertyValue("HiresSampler", out var hiresSamplerState))
272269
{
273-
module
274-
.GetCard<SamplerCardViewModel>()
275-
.LoadStateFromJsonObject(hiresSamplerState!.AsObject());
270+
module.GetCard<SamplerCardViewModel>().LoadStateFromJsonObject(hiresSamplerState!.AsObject());
276271
}
277272

278273
if (state.TryGetPropertyValue("HiresUpscaler", out var hiresUpscalerState))
279274
{
280-
module
281-
.GetCard<UpscalerCardViewModel>()
282-
.LoadStateFromJsonObject(hiresUpscalerState!.AsObject());
275+
module.GetCard<UpscalerCardViewModel>().LoadStateFromJsonObject(hiresUpscalerState!.AsObject());
283276
}
284277
});
285278

@@ -289,17 +282,17 @@ public override void LoadStateFromJsonObject(JsonObject state, int version)
289282

290283
if (state.TryGetPropertyValue("Upscaler", out var upscalerState))
291284
{
292-
module
293-
.GetCard<UpscalerCardViewModel>()
294-
.LoadStateFromJsonObject(upscalerState!.AsObject());
285+
module.GetCard<UpscalerCardViewModel>().LoadStateFromJsonObject(upscalerState!.AsObject());
295286
}
296287
});
297288

298289
// Add FreeU to sampler
299-
SamplerCardViewModel.ModulesCardViewModel.AddModule<FreeUModule>(module =>
300-
{
301-
module.IsEnabled = state.GetPropertyValueOrDefault<bool>("IsFreeUEnabled");
302-
});
290+
SamplerCardViewModel
291+
.ModulesCardViewModel
292+
.AddModule<FreeUModule>(module =>
293+
{
294+
module.IsEnabled = state.GetPropertyValueOrDefault<bool>("IsFreeUEnabled");
295+
});
303296
}
304297

305298
base.LoadStateFromJsonObject(state);

0 commit comments

Comments
 (0)