diff --git a/Avalonia.Gif/Avalonia.Gif.csproj b/Avalonia.Gif/Avalonia.Gif.csproj index 6a363589..dbf0defd 100644 --- a/Avalonia.Gif/Avalonia.Gif.csproj +++ b/Avalonia.Gif/Avalonia.Gif.csproj @@ -10,7 +10,7 @@ true - + diff --git a/CHANGELOG.md b/CHANGELOG.md index cb439da1..e70bc12b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,106 @@ All notable changes to Stability Matrix will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html). +## v2.10.0 +### Added +- Added Reference-Only mode for Inference ControlNet, used for guiding the sampler with an image without a pretrained model. Part of the latent and attention layers will be connected to the reference image, similar to Image to Image or Inpainting. +- Inference ControlNet module now supports over 42 preprocessors, a new button next to the preprocessors dropdown allows previewing the output of the selected preprocessor on the image. +- Added resolution selection for Inference ControlNet module, this controls preprocessor resolution too. +- Added Layer Diffuse sampler addon to Inference, allows generating foreground with transparency with SD1.5 and SDXL. +- Added support for deep links from the new Stability Matrix Chrome extension +- Added OpenArt.AI workflow browser for ComfyUI workflows +- Added more metadata to the image dialog info flyout +- Added Output Sharing toggle in Advanced Options during install flow +### Changed +- Revamped the Packages page to enable running multiple packages at the same time +- Changed the Outputs Page to use a TreeView for the directory selection instead of a dropdown selector +- Model download location selector now searches all subfolders +- Inference Primary Sampler Addons (i.e. ControlNet, FreeU) are now inherited by Hires Fix Samplers, this can be overriden from the Hires Fix module's settings menu by disabling the "Inherit Primary Sampler Addons" option. +- Revisited the way images are loaded on the outputs page, with improvements to loading speed & not freezing the UI while loading +- Updated translations for French, Spanish, and Turkish +- Changed to a new image control for pages with many images +- (Internal) Updated to Avalonia 11.0.10 +### Fixed +- Fixed [#559](https://github.com/LykosAI/StabilityMatrix/issues/559) - "Unable to load bitmap from provided data" error in Checkpoints page +- Fixed [#522](https://github.com/LykosAI/StabilityMatrix/issues/522) - Incorrect output directory path for latest Auto1111 +- Fixed [#529](https://github.com/LykosAI/StabilityMatrix/issues/529) - OneTrainer requesting input during update +- Fixed Civitai model browser error when sorting by Installed with more than 100 installed models +- Fixed CLIP Install errors due to setuptools distutils conflict, added default environment variable setting `SETUPTOOLS_USE_DISTUTILS=stdlib` +- Fixed progress bars not displaying properly during package installs & updates +- Fixed ComfyUI extension updates not running install.py / updating requirements.txt +- Improved performance when deleting many images from the Outputs page +- Fixed ComfyUI torch downgrading to 2.1.2 when updating +- Fixed Inference HiresFix module "Inherit Primary Sampler Addons" setting not effectively disabling when unchecked +- Fixed model download location options for VAEs in the CivitAI Model Browser +### Removed +- Removed the main Launch page, as it is no longer needed with the new Packages page + +## v2.10.0-pre.2 +### Added +- Added more metadata to the image dialog info flyout +- Added Restart button to console page +### Changed +- Model download location selector now searches all subfolders +### Fixed +- Fixed Civitai model browser not showing images when "Show NSFW" is disabled +- Fixed crash when Installed Workflows page is opened with no Workflows folder +- Fixed progress bars not displaying properly during package installs & updates +- Fixed ComfyUI extension updates not running install.py / updating requirements.txt + +## v2.10.0-pre.1 +### Added +- Added OpenArt.AI workflow browser for ComfyUI workflows +- Added Output Sharing toggle in Advanced Options during install flow +### Changed +- Changed to a new image control for pages with many images +- Removed Symlink option for InvokeAI due to changes with InvokeAI v4.0+ +- Output sharing is now enabled by default for new installations +- (Internal) Updated to Avalonia 11.0.10 +### Fixed +- Improved performance when deleting many images from the Outputs page +- Fixed ComfyUI torch downgrading to 2.1.2 when updating +- Fixed [#529](https://github.com/LykosAI/StabilityMatrix/issues/529) - OneTrainer requesting input during update +- Fixed "Could not find entry point for InvokeAI" error on InvokeAI v4.0+ + +## v2.10.0-dev.3 +### Added +- Added support for deep links from the new Stability Matrix Chrome extension +### Changed +- Due to changes on the CivitAI API, you can no longer select a specific page in the CivitAI Model Browser +- Due to the above API changes, new pages are now loaded via "infinite scrolling" +### Fixed +- Fixed Inference HiresFix module "Inherit Primary Sampler Addons" setting not effectively disabling when unchecked +- Fixed model download location options for VAEs in the CivitAI Model Browser +- Fixed crash on startup when library directory is not set +- Fixed One-Click install progress dialog not disappearing after completion +- Fixed ComfyUI with Inference pop-up during one-click install appearing below the visible scroll area +- Fixed no packages being available for one-click install on PCs without a GPU +- Fixed models not being removed from the installed models cache when deleting them from the Checkpoints page +- Fixed missing ratings on some models in the CivitAI Model Browser +- Fixed missing favorite count in the CivitAI Model Browser +- Fixed recommended models not showing all SDXL models + +## v2.10.0-dev.2 +### Added +- Added Reference-Only mode for Inference ControlNet, used for guiding the sampler with an image without a pretrained model. Part of the latent and attention layers will be connected to the reference image, similar to Image to Image or Inpainting. +### Changed +- Inference Primary Sampler Addons (i.e. ControlNet, FreeU) are now inherited by Hires Fix Samplers, this can be overriden from the Hires Fix module's settings menu by disabling the "Inherit Primary Sampler Addons" option. +- Revisited the way images are loaded on the outputs page, with improvements to loading speed & not freezing the UI while loading +### Fixed +- Fixed Outputs page not remembering where the user last was in the TreeView in certain circumstances +- Fixed Inference extension upgrades not being added to missing extensions list for prompted install +- Fixed "The Open Web UI button has moved" teaching tip spam + +## v2.10.0-dev.1 +### Added +- Inference ControlNet module now supports over 42 preprocessors, a new button next to the preprocessors dropdown allows previewing the output of the selected preprocessor on the image. +- Added resolution selection for Inference ControlNet module, this controls preprocessor resolution too. +### Changed +- Revamped the Packages page to enable running multiple packages at the same time +- Changed the Outputs Page to use a TreeView for the directory selection instead of a dropdown selector +### Removed +- Removed the main Launch page, as it is no longer needed with the new Packages page + ## v2.9.3 ### Changed - Removed Symlink option for InvokeAI to prevent InvokeAI from moving models into its own directories (will be replaced with a Config option in a future update) @@ -22,9 +122,6 @@ and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2 - Fixed One-Click install progress dialog not disappearing after completion - Fixed ComfyUI with Inference pop-up during one-click install appearing below the visible scroll area - Fixed no packages being available for one-click install on PCs without a GPU -- Fixed missing ratings on some models in the CivitAI Model Browser -- Fixed missing favorite count in the CivitAI Model Browser -- Fixed recommended models not showing all SDXL models ## v2.9.1 ### Added @@ -82,6 +179,7 @@ and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2 - Added copy image support on linux and macOS for Inference outputs viewer menu ### Fixed - Fixed StableSwarmUI not installing properly on macOS +- Fixed output sharing for Stable Diffusion WebUI Forge - Hopefully actually fixed [#464](https://github.com/LykosAI/StabilityMatrix/issues/464) - error when installing InvokeAI on macOS - Fixed default command line args for SDWebUI Forge on macOS - Fixed output paths and output sharing for SDWebUI Forge diff --git a/README.md b/README.md index a39488a7..3fd70ec3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Build](https://github.com/LykosAI/StabilityMatrix/actions/workflows/build.yml/badge.svg)](https://github.com/LykosAI/StabilityMatrix/actions/workflows/build.yml) [![Discord Server](https://img.shields.io/discord/1115555685476868168?logo=discord&logoColor=white&label=Discord%20Server)](https://discord.com/invite/TUrgfECxHz) +[![Release](https://img.shields.io/github/v/release/LykosAI/StabilityMatrix?label=Latest%20Release&link=https%3A%2F%2Fgithub.com%2FLykosAI%2FStabilityMatrix%2Freleases%2Flatest)][release] [release]: https://github.com/LykosAI/StabilityMatrix/releases/latest [download-win-x64]: https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-win-x64.zip @@ -9,7 +10,7 @@ [download-macos-arm64]: https://github.com/LykosAI/StabilityMatrix/releases/latest/download/StabilityMatrix-macos-arm64.dmg [auto1111]: https://github.com/AUTOMATIC1111/stable-diffusion-webui -[auto1111-directml]: https://github.com/lshqqytiger/stable-diffusion-webui-directml +[sdwebui-directml]: https://github.com/lshqqytiger/stable-diffusion-webui-directml [webui-ux]: https://github.com/anapnoe/stable-diffusion-webui-ux [comfy]: https://github.com/comfyanonymous/ComfyUI [sdnext]: https://github.com/vladmandic/automatic @@ -27,9 +28,13 @@ [civitai]: https://civitai.com/ [huggingface]: https://huggingface.co/ -Multi-Platform Package Manager and Inference UI for Stable Diffusion +![Header image for Stability Matrix, Multi-Platform Package Manager and Inference UI for Stable Diffusion](https://cdn.lykos.ai/static/sm-banner-rounded.webp) -### ✨ New in 2.5 - [Inference](#inference-A-reimagined-built-in-Stable-Diffusion-experience), a built-in interface for Stable Diffusion powered by ComfyUI +[![Windows](https://img.shields.io/badge/Windows%2010,%2011-%230079d5.svg?style=for-the-badge&logo=Windows%2011&logoColor=white)][download-win-x64] +[![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black)][download-linux-x64] +[![macOS](https://img.shields.io/badge/mac%20os%20%28apple%20silicon%29-000000?style=for-the-badge&logo=macos&logoColor=F0F0F0)][download-macos-arm64] + +Multi-Platform Package Manager and Inference UI for Stable Diffusion ### 🖱️ One click install and update for Stable Diffusion Web UI Packages - Supports: @@ -41,31 +46,12 @@ Multi-Platform Package Manager and Inference UI for Stable Diffusion - [InvokeAI][invokeai] - [Kohya's GUI][kohya-ss] - [OneTrainer][onetrainer] -- Manage plugins / extensions for supported packages ([Automatic 1111][auto1111], [Comfy UI][comfy]) +- Manage plugins / extensions for supported packages ([Automatic1111][auto1111], [Comfy UI][comfy], [SD Web UI-UX][webui-ux], and [SD.Next][sdnext]) - Easily install or update Python dependencies for each package - Embedded Git and Python dependencies, with no need for either to be globally installed - Fully portable - move Stability Matrix's Data Directory to a new drive or computer at any time -### 🚀 Launcher with syntax highlighted terminal emulator, routed GUI input prompts -- Launch arguments editor with predefined or custom options for each Package install -- Configurable Environment Variables - -### 🗃️ Checkpoint Manager, configured to be shared by all Package installs -- Option to find CivitAI metadata and preview thumbnails for new local imports - -### ☁️ Model Browser to import from [CivitAI][civitai] and [HuggingFace][huggingface] -- Automatically imports to the associated model folder depending on the model type -- Downloads relevant metadata files and preview image - -![header](https://cdn.lykos.ai/static/sm-banner-rounded.webp) - -[![Release](https://img.shields.io/github/v/release/LykosAI/StabilityMatrix?label=Latest%20Release&link=https%3A%2F%2Fgithub.com%2FLykosAI%2FStabilityMatrix%2Freleases%2Flatest)][release] - -[![Windows](https://img.shields.io/badge/Windows%2010,%2011-%230079d5.svg?style=for-the-badge&logo=Windows%2011&logoColor=white)][download-win-x64] -[![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black)][download-linux-x64] -[![macOS](https://img.shields.io/badge/mac%20os%20%28apple%20silicon%29-000000?style=for-the-badge&logo=macos&logoColor=F0F0F0)][download-macos-arm64] - -### Inference - A reimagined built-in Stable Diffusion experience +### ✨ Inference - A Reimagined Interface for Stable Diffusion, Built-In to Stability Matrix - Powerful auto-completion and syntax highlighting using a formal language grammar - Workspaces open in tabs that save and load from `.smproj` project files @@ -79,13 +65,20 @@ Multi-Platform Package Manager and Inference UI for Stable Diffusion

-### Searchable launch options +### 🚀 Launcher with syntax highlighted terminal emulator, routed GUI input prompts +- Launch arguments editor with predefined or custom options for each Package install +- Configurable Environment Variables +

-### Model browser powered by [Civit AI][civitai] -- Downloads new models, automatically uses the appropriate shared model directory +### 🗃️ Checkpoint Manager, configured to be shared by all Package installs +- Option to find CivitAI metadata and preview thumbnails for new local imports + +### ☁️ Model Browser to import from [CivitAI][civitai] and [HuggingFace][huggingface] +- Automatically imports to the associated model folder depending on the model type +- Downloads relevant metadata files and preview image - Pause and resume downloads, even after closing the app

diff --git a/StabilityMatrix.Avalonia.Diagnostics/StabilityMatrix.Avalonia.Diagnostics.csproj b/StabilityMatrix.Avalonia.Diagnostics/StabilityMatrix.Avalonia.Diagnostics.csproj index 71efd8bb..2fbf2fd4 100644 --- a/StabilityMatrix.Avalonia.Diagnostics/StabilityMatrix.Avalonia.Diagnostics.csproj +++ b/StabilityMatrix.Avalonia.Diagnostics/StabilityMatrix.Avalonia.Diagnostics.csproj @@ -19,12 +19,12 @@ - - + + - + diff --git a/StabilityMatrix.Avalonia/App.axaml b/StabilityMatrix.Avalonia/App.axaml index cbe8b808..d6db2ffd 100644 --- a/StabilityMatrix.Avalonia/App.axaml +++ b/StabilityMatrix.Avalonia/App.axaml @@ -4,7 +4,7 @@ xmlns:local="using:StabilityMatrix.Avalonia" xmlns:idcr="using:Dock.Avalonia.Controls.Recycling" xmlns:styling="clr-namespace:FluentAvalonia.Styling;assembly=FluentAvalonia" - xmlns:controls="clr-namespace:Avalonia.Labs.Controls;assembly=Avalonia.Labs.Controls" + xmlns:labs="clr-namespace:Avalonia.Labs.Controls;assembly=Avalonia.Labs.Controls" Name="Stability Matrix" RequestedThemeVariant="Dark"> @@ -29,6 +29,7 @@ + @@ -55,6 +56,7 @@ + @@ -80,7 +82,8 @@ - + + + diff --git a/StabilityMatrix.Avalonia/Controls/Inference/LayerDiffuseCard.axaml.cs b/StabilityMatrix.Avalonia/Controls/Inference/LayerDiffuseCard.axaml.cs new file mode 100644 index 00000000..a8973a3f --- /dev/null +++ b/StabilityMatrix.Avalonia/Controls/Inference/LayerDiffuseCard.axaml.cs @@ -0,0 +1,7 @@ +using Avalonia.Controls.Primitives; +using StabilityMatrix.Core.Attributes; + +namespace StabilityMatrix.Avalonia.Controls; + +[Transient] +public class LayerDiffuseCard : TemplatedControl; diff --git a/StabilityMatrix.Avalonia/Controls/Inference/PromptCard.axaml b/StabilityMatrix.Avalonia/Controls/Inference/PromptCard.axaml index 7c53337d..12423e48 100644 --- a/StabilityMatrix.Avalonia/Controls/Inference/PromptCard.axaml +++ b/StabilityMatrix.Avalonia/Controls/Inference/PromptCard.axaml @@ -8,6 +8,8 @@ xmlns:icons="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:vmInference="clr-namespace:StabilityMatrix.Avalonia.ViewModels.Inference" + xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" + xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" x:DataType="vmInference:PromptCardViewModel"> @@ -56,21 +58,29 @@ HorizontalAlignment="Right" Orientation="Horizontal"> - + + + + + + + + + + + + + + diff --git a/StabilityMatrix.Avalonia/Views/InstalledWorkflowsPage.axaml.cs b/StabilityMatrix.Avalonia/Views/InstalledWorkflowsPage.axaml.cs new file mode 100644 index 00000000..191916d2 --- /dev/null +++ b/StabilityMatrix.Avalonia/Views/InstalledWorkflowsPage.axaml.cs @@ -0,0 +1,13 @@ +using StabilityMatrix.Avalonia.Controls; +using StabilityMatrix.Core.Attributes; + +namespace StabilityMatrix.Avalonia.Views; + +[Singleton] +public partial class InstalledWorkflowsPage : UserControlBase +{ + public InstalledWorkflowsPage() + { + InitializeComponent(); + } +} diff --git a/StabilityMatrix.Avalonia/Views/MainWindow.axaml b/StabilityMatrix.Avalonia/Views/MainWindow.axaml index 75613afc..306a1a37 100644 --- a/StabilityMatrix.Avalonia/Views/MainWindow.axaml +++ b/StabilityMatrix.Avalonia/Views/MainWindow.axaml @@ -70,11 +70,13 @@ Grid.RowSpan="2" Name="NavigationView" ItemInvoked="NavigationView_OnItemInvoked" + BackRequested="NavigationView_OnBackRequested" PaneDisplayMode="Left" IsPaneOpen="False" OpenPaneLength="{Binding PaneWidth}" IsSettingsVisible="False" - IsBackEnabled="False" + IsBackEnabled="True" + IsBackButtonVisible="True" MenuItemsSource="{Binding Pages, Mode=OneWay}" FooterMenuItemsSource="{Binding FooterPages, Mode=OneWay}" SelectedItem="{Binding SelectedCategory}"> diff --git a/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs b/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs index 614754a6..eba477f8 100644 --- a/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs +++ b/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Reactive.Linq; using System.Threading; +using AsyncAwaitBestPractices; using AsyncImageLoader; using Avalonia; using Avalonia.Controls; @@ -193,13 +194,52 @@ public partial class MainWindow : AppWindowBase protected override void OnClosing(WindowClosingEventArgs e) { // Show confirmation if package running - var launchPageViewModel = App.Services.GetRequiredService(); - - launchPageViewModel.OnMainWindowClosing(e); + var runningPackageService = App.Services.GetRequiredService(); + if ( + runningPackageService.RunningPackages.Count > 0 + && e.CloseReason is WindowCloseReason.WindowClosing + ) + { + e.Cancel = true; + + var dialog = CreateExitConfirmDialog(); + Dispatcher + .UIThread.InvokeAsync(async () => + { + if ( + (TaskDialogStandardResult)await dialog.ShowAsync(true) == TaskDialogStandardResult.Yes + ) + { + App.Services.GetRequiredService().Hide(); + App.Shutdown(); + } + }) + .SafeFireAndForget(); + } base.OnClosing(e); } + private static TaskDialog CreateExitConfirmDialog() + { + var dialog = DialogHelper.CreateTaskDialog( + Languages.Resources.Label_ConfirmExit, + Languages.Resources.Label_ConfirmExitDetail + ); + + dialog.ShowProgressBar = false; + dialog.FooterVisibility = TaskDialogFooterVisibility.Never; + + dialog.Buttons = new List + { + new("Exit", TaskDialogStandardResult.Yes), + TaskDialogButton.CancelButton + }; + dialog.Buttons[0].IsDefault = true; + + return dialog; + } + /// protected override void OnClosed(EventArgs e) { @@ -406,4 +446,9 @@ public partial class MainWindow : AppWindowBase e.Handled = true; navigationService.GoBack(); } + + private void NavigationView_OnBackRequested(object? sender, NavigationViewBackRequestedEventArgs e) + { + navigationService.GoBack(); + } } diff --git a/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml b/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml new file mode 100644 index 00000000..c4f8189f --- /dev/null +++ b/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml.cs b/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml.cs new file mode 100644 index 00000000..b6a615f3 --- /dev/null +++ b/StabilityMatrix.Avalonia/Views/OpenArtBrowserPage.axaml.cs @@ -0,0 +1,41 @@ +using System; +using AsyncAwaitBestPractices; +using Avalonia.Controls; +using StabilityMatrix.Avalonia.Controls; +using StabilityMatrix.Avalonia.Models; +using StabilityMatrix.Core.Attributes; +using StabilityMatrix.Core.Services; + +namespace StabilityMatrix.Avalonia.Views; + +[Singleton] +public partial class OpenArtBrowserPage : UserControlBase +{ + private readonly ISettingsManager settingsManager; + + public OpenArtBrowserPage(ISettingsManager settingsManager) + { + this.settingsManager = settingsManager; + InitializeComponent(); + } + + private void ScrollViewer_OnScrollChanged(object? sender, ScrollChangedEventArgs e) + { + if (sender is not ScrollViewer scrollViewer) + return; + + if (scrollViewer.Offset.Y == 0) + return; + + var isAtEnd = Math.Abs(scrollViewer.Offset.Y - scrollViewer.ScrollBarMaximum.Y) < 1f; + + if ( + isAtEnd + && settingsManager.Settings.IsWorkflowInfiniteScrollEnabled + && DataContext is IInfinitelyScroll scroll + ) + { + scroll.LoadNextPageAsync().SafeFireAndForget(); + } + } +} diff --git a/StabilityMatrix.Avalonia/Views/OutputsPage.axaml b/StabilityMatrix.Avalonia/Views/OutputsPage.axaml index 3b1a02bb..5b231271 100644 --- a/StabilityMatrix.Avalonia/Views/OutputsPage.axaml +++ b/StabilityMatrix.Avalonia/Views/OutputsPage.axaml @@ -2,15 +2,12 @@ x:Class="StabilityMatrix.Avalonia.Views.OutputsPage" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:avalonia="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia" - xmlns:avaloniaEdit="clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:fluentAvalonia="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mocks="clr-namespace:StabilityMatrix.Avalonia.DesignData" - xmlns:models1="clr-namespace:StabilityMatrix.Avalonia.Models" xmlns:outputsPage="clr-namespace:StabilityMatrix.Avalonia.ViewModels.OutputsPage" xmlns:scroll="clr-namespace:StabilityMatrix.Avalonia.Controls.Scroll" xmlns:selectableImageCard="clr-namespace:StabilityMatrix.Avalonia.Controls.SelectableImageCard" @@ -23,13 +20,33 @@ x:DataType="vm:OutputsPageViewModel" Focusable="True" mc:Ignorable="d"> - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + - - - + - + + + - - - + IsEnabled="{Binding !IsLoading}" + Label="{x:Static lang:Resources.Action_Refresh}"> + + + + + + @@ -160,11 +149,22 @@ + + - + @@ -206,7 +206,8 @@ IconSource="Delete" Text="{x:Static lang:Resources.Action_Delete}" /> - + - - - + + + - - - + + + - - - - - - - + + + + + + + - - + + + - - - - - + + + - - - - - - - - - - - + + + - - - - - - - - - + + + + + + + + + + diff --git a/StabilityMatrix.Avalonia/Views/PackageManager/PackageInstallDetailView.axaml b/StabilityMatrix.Avalonia/Views/PackageManager/PackageInstallDetailView.axaml index 91b2e671..594b03eb 100644 --- a/StabilityMatrix.Avalonia/Views/PackageManager/PackageInstallDetailView.axaml +++ b/StabilityMatrix.Avalonia/Views/PackageManager/PackageInstallDetailView.axaml @@ -2,7 +2,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:viewModels="clr-namespace:StabilityMatrix.Avalonia.ViewModels" xmlns:controls="clr-namespace:StabilityMatrix.Avalonia.Controls" xmlns:designData="clr-namespace:StabilityMatrix.Avalonia.DesignData" xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages" @@ -10,8 +9,8 @@ xmlns:controls1="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core" xmlns:database="clr-namespace:StabilityMatrix.Core.Models.Database;assembly=StabilityMatrix.Core" - xmlns:extensions="clr-namespace:StabilityMatrix.Core.Models.Packages.Extensions;assembly=StabilityMatrix.Core" xmlns:packageManager="clr-namespace:StabilityMatrix.Avalonia.ViewModels.PackageManager" + xmlns:labs="clr-namespace:Avalonia.Labs.Controls;assembly=Avalonia.Labs.Controls" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:DataType="packageManager:PackageInstallDetailViewModel" x:CompileBindings="True" @@ -21,19 +20,21 @@ + Margin="16, 16, 8, 8" + CornerRadius="8" + Source="{Binding SelectedPackage.PreviewImageUri}"> + + - + + Content="{Binding SelectedPackage.LicenseType}" /> - + - - - + + + - - - - - + + + + + + + + - - @@ -215,99 +72,341 @@ TextWrapping="Wrap" Text="{x:Static lang:Resources.Label_UnknownPackage}" /> + + + + + - - + + + + + + + + + + - - + - - + + + + + + + - - + + + + + + + + + - + + IsVisible="{Binding IsProgressVisible}" + RowDefinitions="Auto, *"> + +