Browse Source

fix design data for SelectModelVersionDialog, refactored model hash checking, and fixed word wrapping on SelectModelVersionDialog

pull/55/head
JT 1 year ago
parent
commit
5b48b64053
  1. 64
      StabilityMatrix.Avalonia/DesignData/DesignData.cs
  2. 5
      StabilityMatrix.Avalonia/ViewModels/CheckpointBrowserCardViewModel.cs
  3. 13
      StabilityMatrix.Avalonia/ViewModels/Dialogs/CivitFileViewModel.cs
  4. 10
      StabilityMatrix.Avalonia/ViewModels/Dialogs/ModelVersionViewModel.cs
  5. 94
      StabilityMatrix.Avalonia/Views/Dialogs/SelectModelVersionDialog.axaml
  6. 2
      StabilityMatrix.Avalonia/Views/MainWindow.axaml

64
StabilityMatrix.Avalonia/DesignData/DesignData.cs

@ -96,22 +96,6 @@ public static class DesignData
var packageFactory = Services.GetRequiredService<IPackageFactory>();
var notificationService = Services.GetRequiredService<INotificationService>();
// Sample data
var sampleCivitVersions = new List<CivitModelVersion>
{
new()
{
Name = "BB95 Furry Mix",
Description = "v1.0.0",
}
};
var sampleViewModel = new ModelVersionViewModel(settingsManager, sampleCivitVersions[0]);
// Sample data for dialogs
SelectModelVersionViewModel.Versions = new[] {sampleViewModel};
SelectModelVersionViewModel.SelectedVersionViewModel = sampleViewModel;
LaunchOptionsViewModel = Services.GetRequiredService<LaunchOptionsViewModel>();
LaunchOptionsViewModel.Cards = new[]
{
@ -240,7 +224,53 @@ public static class DesignData
public static CheckpointBrowserViewModel CheckpointBrowserViewModel =>
Services.GetRequiredService<CheckpointBrowserViewModel>();
public static SelectModelVersionViewModel SelectModelVersionViewModel =>
Services.GetRequiredService<SelectModelVersionViewModel>();
DialogFactory.Get<SelectModelVersionViewModel>(vm =>
{
// Sample data
var sampleCivitVersions = new List<CivitModelVersion>
{
new()
{
Name = "BB95 Furry Mix",
Description = "v1.0.0",
Files = new List<CivitFile>
{
new()
{
Name = "bb95-v100-uwu-reallylongfilename-v1234576802.safetensors",
Type = CivitFileType.Model,
Metadata = new CivitFileMetadata
{
Format = CivitModelFormat.SafeTensor,
Fp = CivitModelFpType.fp16,
Size = CivitModelSize.pruned
}
},
new()
{
Name = "bb95-v100-uwu-reallylongfilename-v1234576802-fp32.safetensors",
Type = CivitFileType.Model,
Metadata = new CivitFileMetadata
{
Format = CivitModelFormat.SafeTensor,
Fp = CivitModelFpType.fp32,
Size = CivitModelSize.full
},
Hashes = new CivitFileHashes
{
BLAKE3 = "ABCD"
}
}
}
}
};
var sampleViewModel =
new ModelVersionViewModel(new HashSet<string> {"ABCD"}, sampleCivitVersions[0]);
// Sample data for dialogs
vm.Versions = new List<ModelVersionViewModel>{sampleViewModel};
vm.SelectedVersionViewModel = sampleViewModel;
});
public static OneClickInstallViewModel OneClickInstallViewModel =>
Services.GetRequiredService<OneClickInstallViewModel>();
public static SelectDataDirectoryViewModel SelectDataDirectoryViewModel =>

5
StabilityMatrix.Avalonia/ViewModels/CheckpointBrowserCardViewModel.cs

@ -156,11 +156,14 @@ public partial class CheckpointBrowserCardViewModel : ProgressViewModel
IsPrimaryButtonEnabled = false,
IsSecondaryButtonEnabled = false,
IsFooterVisible = false,
MaxDialogWidth = 750,
};
var viewModel = dialogFactory.Get<SelectModelVersionViewModel>();
viewModel.Dialog = dialog;
viewModel.Versions = versions.Select(v => new ModelVersionViewModel(settingsManager, v))
viewModel.Versions = versions.Select(version =>
new ModelVersionViewModel(
settingsManager.Settings.InstalledModelHashes ?? new HashSet<string>(), version))
.ToImmutableArray();
viewModel.SelectedVersionViewModel = viewModel.Versions[0];

13
StabilityMatrix.Avalonia/ViewModels/Dialogs/CivitFileViewModel.cs

@ -1,6 +1,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.Generic;
using CommunityToolkit.Mvvm.ComponentModel;
using StabilityMatrix.Core.Models.Api;
using StabilityMatrix.Core.Services;
namespace StabilityMatrix.Avalonia.ViewModels.Dialogs;
@ -9,11 +10,15 @@ public partial class CivitFileViewModel : ObservableObject
[ObservableProperty] private CivitFile civitFile;
[ObservableProperty] private bool isInstalled;
public CivitFileViewModel(ISettingsManager settingsManager, CivitFile civitFile)
public CivitFileViewModel(HashSet<string> installedModelHashes, CivitFile civitFile)
{
CivitFile = civitFile;
var lastIndexOfPeriod = CivitFile.Name.LastIndexOf(".", StringComparison.Ordinal);
if (lastIndexOfPeriod > 0)
{
CivitFile.Name = CivitFile.Name[..lastIndexOfPeriod];
}
var installedModelHashes = settingsManager.Settings.InstalledModelHashes;
IsInstalled = CivitFile is {Type: CivitFileType.Model, Hashes.BLAKE3: not null} &&
installedModelHashes.Contains(CivitFile.Hashes.BLAKE3);
}

10
StabilityMatrix.Avalonia/ViewModels/Dialogs/ModelVersionViewModel.cs

@ -13,18 +13,16 @@ public partial class ModelVersionViewModel : ObservableObject
[ObservableProperty] private ObservableCollection<CivitFileViewModel> civitFileViewModels;
[ObservableProperty] private bool isInstalled;
public ModelVersionViewModel(ISettingsManager settingsManager, CivitModelVersion modelVersion)
public ModelVersionViewModel(HashSet<string> installedModelHashes, CivitModelVersion modelVersion)
{
ModelVersion = modelVersion;
var installedModelHashes = settingsManager.Settings.InstalledModelHashes;
IsInstalled = ModelVersion.Files?.Any(file =>
file is {Type: CivitFileType.Model, Hashes.BLAKE3: not null} &&
installedModelHashes.Contains(file.Hashes.BLAKE3)) ??
false;
file is {Type: CivitFileType.Model, Hashes.BLAKE3: not null} &&
installedModelHashes.Contains(file.Hashes.BLAKE3)) ?? false;
CivitFileViewModels = new ObservableCollection<CivitFileViewModel>(
ModelVersion.Files?.Select(file => new CivitFileViewModel(settingsManager, file)) ??
ModelVersion.Files?.Select(file => new CivitFileViewModel(installedModelHashes, file)) ??
new List<CivitFileViewModel>());
}
}

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

@ -6,7 +6,7 @@
xmlns:api="clr-namespace:StabilityMatrix.Core.Models.Api;assembly=StabilityMatrix.Core"
xmlns:dialogs="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Dialogs"
xmlns:designData="clr-namespace:StabilityMatrix.Avalonia.DesignData"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="450"
x:DataType="dialogs:SelectModelVersionViewModel"
xmlns:icons="https://github.com/projektanker/icons.avalonia"
xmlns:fluentAvalonia="clr-namespace:FluentIcons.FluentAvalonia;assembly=FluentIcons.FluentAvalonia"
@ -15,8 +15,8 @@
<Grid
Margin="8"
MinHeight="450"
MinWidth="700"
RowDefinitions="*,Auto"
MinWidth="700"
RowDefinitions="*,Auto"
ColumnDefinitions="*,Auto,*">
<controls:BetterImage Grid.Column="0" Grid.Row="0" Margin="8"
@ -26,71 +26,95 @@
Source="{Binding PreviewImage}" />
<TreeView Grid.Row="0" Grid.Column="1"
<ListBox Grid.Row="0" Grid.Column="1"
Margin="8"
MaxHeight="450"
ItemsSource="{Binding Versions}"
SelectedItem="{Binding SelectedVersionViewModel}">
<TreeView.ItemTemplate>
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type dialogs:ModelVersionViewModel}">
<StackPanel Orientation="Horizontal"
MinWidth="128"
Margin="-24,4,0,4">
<fluentAvalonia:SymbolIcon Symbol="Checkmark"
Margin="0,4,0,4">
<fluentAvalonia:SymbolIcon Symbol="Checkmark"
Foreground="Lime"
IsVisible="{Binding IsInstalled}"
VerticalAlignment="Center"/>
<TextBlock Margin="8, 0"
VerticalAlignment="Center" />
<TextBlock Margin="4, 0"
Padding="4"
Text="{Binding ModelVersion.Name}" />
</StackPanel>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</ListBox.ItemTemplate>
<ListBox.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ListBox.Template>
</ListBox>
<TreeView Grid.Row="0" Grid.Column="2"
Margin="8"
<ListBox Grid.Row="0" Grid.Column="2"
ItemsSource="{Binding SelectedVersionViewModel.CivitFileViewModels}"
SelectedItem="{Binding SelectedFile}">
<TreeView.ItemTemplate>
<ListBox.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter Margin="8" />
</ScrollViewer>
</ControlTemplate>
</ListBox.Template>
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type dialogs:CivitFileViewModel}">
<StackPanel Orientation="Horizontal" Margin="-24, 4, 4, 4">
<fluentAvalonia:SymbolIcon Symbol="Checkmark"
<Grid RowDefinitions="Auto, Auto" ColumnDefinitions="Auto, *"
Margin="-4,0,0,0">
<fluentAvalonia:SymbolIcon Grid.Row="0" Grid.RowSpan="2"
Grid.Column="0"
Margin="0, 0, 8, 0"
Symbol="Checkmark"
Foreground="Lime"
IsVisible="{Binding IsInstalled}"
VerticalAlignment="Center"/>
<StackPanel Margin="8,0" VerticalAlignment="Top">
<TextBlock Margin="4,4,0,4" Text="{Binding CivitFile.Name}" />
<TextBlock Margin="0,0,0,4" FontSize="11">
<Run Text="{Binding CivitFile.Metadata.Size}" />
<Run Text="{Binding CivitFile.Metadata.Fp}" />
<Run Text="-" />
<Run Text="{Binding CivitFile.FullFilesSize, Mode=OneWay}" />
</TextBlock>
</StackPanel>
</StackPanel>
VerticalAlignment="Center" />
<TextBlock Grid.Row="0" Grid.Column="1"
Text="{Binding CivitFile.Name}"
Margin="0, 4, 0, 4"
TextWrapping="Wrap" />
<TextBlock Grid.Row="1" Grid.Column="1"
FontSize="11"
Margin="0, 4, 0, 4"
TextWrapping="Wrap">
<Run Text="{Binding CivitFile.Metadata.Format}" />
<Run Text="-" />
<Run Text="{Binding CivitFile.Metadata.Size}" />
<Run Text="-" />
<Run Text="{Binding CivitFile.Metadata.Fp}" />
<Run Text="-" />
<Run Text="{Binding CivitFile.FullFilesSize, Mode=OneWay}" />
</TextBlock>
</Grid>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</ListBox.ItemTemplate>
</ListBox>
<StackPanel Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1"
<StackPanel Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button
Content="Cancel"
HorizontalAlignment="Center"
Command="{Binding Cancel}"
Margin="8, 0"/>
Margin="8, 0" />
<Button
Margin="8, 0"
Content="Import"
Command="{Binding Import}"
IsEnabled="{Binding IsImportEnabled}"
Classes="accent"/>
Classes="accent" />
</StackPanel>
</Grid>
</UserControl>

2
StabilityMatrix.Avalonia/Views/MainWindow.axaml

@ -111,7 +111,7 @@
IsVisible="{Binding !!ProgressItems.Count}"
Tapped="FooterDownloadItem_OnTapped">
<ui:NavigationViewItem.ContextFlyout>
<controls:BetterFlyout Placement="Right"
<controls:BetterFlyout Placement="RightEdgeAlignedBottom"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Auto"
Content="{Binding }" />

Loading…
Cancel
Save