1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Icons - Dropped SVG support and fixed filling

This commit is contained in:
Robert 2022-06-06 20:54:39 +02:00
parent dd40bdd544
commit 0d3890e560
30 changed files with 163 additions and 571 deletions

View File

@ -14,7 +14,9 @@
<entry key="Artemis.UI.Avalonia/Screens/Sidebar/Views/SidebarProfileConfigurationView.axaml" value="Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj" /> <entry key="Artemis.UI.Avalonia/Screens/Sidebar/Views/SidebarProfileConfigurationView.axaml" value="Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj" />
<entry key="Artemis.UI.Avalonia/Screens/SidebarView.axaml" value="Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj" /> <entry key="Artemis.UI.Avalonia/Screens/SidebarView.axaml" value="Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj" />
<entry key="Artemis.UI.Avalonia/Views/MainWindow.axaml" value="Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj" /> <entry key="Artemis.UI.Avalonia/Views/MainWindow.axaml" value="Artemis.UI.Avalonia/Artemis.UI.Avalonia.csproj" />
<entry key="Artemis.UI.Shared/Controls/ArtemisIcon.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI.Shared/Controls/EnumComboBox.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI.Shared/Controls/EnumComboBox.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI.Shared/Styles/Border.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI.Shared/Styles/Border.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI.Shared/Styles/TextBlock.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI.Shared/Styles/TextBlock.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI.Windows/App.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" /> <entry key="Artemis.UI.Windows/App.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" />
@ -53,7 +55,8 @@
<entry key="Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" /> <entry key="Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" />
<entry key="Artemis.UI/Screens/ProfileEditor/ProfileEditorTitleBarView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/ProfileEditor/ProfileEditorTitleBarView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/ProfileEditor/ProfileEditorView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/ProfileEditor/ProfileEditorView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/Root/SplashView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/Root/SplashView.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" />
<entry key="Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/Settings/Tabs/GeneralTabView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/Settings/Tabs/GeneralTabView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/Sidebar/ContentDialogs/SidebarCategoryEditView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/Sidebar/ContentDialogs/SidebarCategoryEditView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/Sidebar/Dialogs/ModuleActivationRequirementView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/Sidebar/Dialogs/ModuleActivationRequirementView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
@ -69,7 +72,7 @@
<entry key="Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/VisualScripting/NodeScriptWindowView.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" /> <entry key="Artemis.UI/Screens/VisualScripting/NodeScriptWindowView.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" />
<entry key="Artemis.UI/Screens/VisualScripting/NodeView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/VisualScripting/NodeView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Artemis.UI/Screens/Workshop/WorkshopView.axaml" value="Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Artemis.UI/Screens/Workshop/WorkshopView.axaml" value="Artemis.UI.Windows/Artemis.UI.Windows.csproj" />
<entry key="Avalonia/Artemis.UI/Screens/Debugger/Tabs/Render/RenderDebugView.axaml" value="Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Avalonia/Artemis.UI/Screens/Debugger/Tabs/Render/RenderDebugView.axaml" value="Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
<entry key="Avalonia/Artemis.UI/Styles/Artemis.axaml" value="Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj" /> <entry key="Avalonia/Artemis.UI/Styles/Artemis.axaml" value="Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj" />
</map> </map>

View File

@ -8,10 +8,14 @@ namespace Artemis.Core
/// <summary> /// <summary>
/// Represents the icon of a <see cref="ProfileConfiguration" /> /// Represents the icon of a <see cref="ProfileConfiguration" />
/// </summary> /// </summary>
public class ProfileConfigurationIcon : IStorageModel public class ProfileConfigurationIcon : CorePropertyChanged, IStorageModel
{ {
private readonly ProfileConfigurationEntity _entity; private readonly ProfileConfigurationEntity _entity;
private Stream? _iconStream; private Stream? _iconStream;
private ProfileConfigurationIconType _iconType;
private string? _iconName;
private string? _originalFileName;
private bool _fill;
internal ProfileConfigurationIcon(ProfileConfigurationEntity entity) internal ProfileConfigurationIcon(ProfileConfigurationEntity entity)
{ {
@ -21,17 +25,38 @@ namespace Artemis.Core
/// <summary> /// <summary>
/// Gets the type of icon this profile configuration uses /// Gets the type of icon this profile configuration uses
/// </summary> /// </summary>
public ProfileConfigurationIconType IconType { get; private set; } public ProfileConfigurationIconType IconType
{
get => _iconType;
private set => SetAndNotify(ref _iconType, value);
}
/// <summary> /// <summary>
/// Gets the name of the icon if <see cref="IconType" /> is <see cref="ProfileConfigurationIconType.MaterialIcon" /> /// Gets the name of the icon if <see cref="IconType" /> is <see cref="ProfileConfigurationIconType.MaterialIcon" />
/// </summary> /// </summary>
public string? IconName { get; private set; } public string? IconName
{
get => _iconName;
private set => SetAndNotify(ref _iconName, value);
}
/// <summary> /// <summary>
/// Gets the original file name of the icon (if applicable) /// Gets the original file name of the icon (if applicable)
/// </summary> /// </summary>
public string? OriginalFileName { get; private set; } public string? OriginalFileName
{
get => _originalFileName;
private set => SetAndNotify(ref _originalFileName, value);
}
/// <summary>
/// Gets or sets a boolean indicating whether or not this icon should be filled.
/// </summary>
public bool Fill
{
get => _fill;
set => SetAndNotify(ref _fill, value);
}
/// <summary> /// <summary>
/// Updates the <see cref="IconName" /> to the provided value and changes the <see cref="IconType" /> is /// Updates the <see cref="IconName" /> to the provided value and changes the <see cref="IconType" /> is
@ -68,7 +93,7 @@ namespace Artemis.Core
IconName = null; IconName = null;
OriginalFileName = originalFileName; OriginalFileName = originalFileName;
IconType = OriginalFileName.EndsWith(".svg") ? ProfileConfigurationIconType.SvgImage : ProfileConfigurationIconType.BitmapImage; IconType = ProfileConfigurationIconType.BitmapImage;
OnIconUpdated(); OnIconUpdated();
} }
@ -108,6 +133,7 @@ namespace Artemis.Core
public void Load() public void Load()
{ {
IconType = (ProfileConfigurationIconType) _entity.IconType; IconType = (ProfileConfigurationIconType) _entity.IconType;
Fill = _entity.IconFill;
if (IconType != ProfileConfigurationIconType.MaterialIcon) if (IconType != ProfileConfigurationIconType.MaterialIcon)
return; return;
@ -120,6 +146,7 @@ namespace Artemis.Core
{ {
_entity.IconType = (int) IconType; _entity.IconType = (int) IconType;
_entity.MaterialIcon = IconType == ProfileConfigurationIconType.MaterialIcon ? IconName : null; _entity.MaterialIcon = IconType == ProfileConfigurationIconType.MaterialIcon ? IconName : null;
_entity.IconFill = Fill;
} }
#endregion #endregion
@ -139,10 +166,5 @@ namespace Artemis.Core
/// A bitmap image icon /// A bitmap image icon
/// </summary> /// </summary>
[Description("Bitmap Image")] BitmapImage, [Description("Bitmap Image")] BitmapImage,
/// <summary>
/// An SVG image icon
/// </summary>
[Description("SVG Image")] SvgImage
} }
} }

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
namespace Artemis.Core.LayerBrushes namespace Artemis.Core.LayerBrushes
{ {
@ -42,7 +43,7 @@ namespace Artemis.Core.LayerBrushes
if (!IsEnabled) if (!IsEnabled)
throw new ArtemisPluginException(Plugin, "Can only add a layer brush descriptor when the plugin is enabled"); throw new ArtemisPluginException(Plugin, "Can only add a layer brush descriptor when the plugin is enabled");
if (icon.ToLower().EndsWith(".svg")) if (icon.Contains('.'))
icon = Plugin.ResolveRelativePath(icon); icon = Plugin.ResolveRelativePath(icon);
LayerBrushDescriptor descriptor = new(displayName, description, icon, typeof(T), this); LayerBrushDescriptor descriptor = new(displayName, description, icon, typeof(T), this);
_layerBrushDescriptors.Add(descriptor); _layerBrushDescriptors.Add(descriptor);

View File

@ -43,7 +43,7 @@ namespace Artemis.Core.LayerEffects
if (!IsEnabled) if (!IsEnabled)
throw new ArtemisPluginFeatureException(this, "Can only add a layer effect descriptor when the plugin is enabled"); throw new ArtemisPluginFeatureException(this, "Can only add a layer effect descriptor when the plugin is enabled");
if (icon.ToLower().EndsWith(".svg")) if (icon.Contains('.'))
icon = Plugin.ResolveRelativePath(icon); icon = Plugin.ResolveRelativePath(icon);
LayerEffectDescriptor descriptor = new(displayName, description, icon, typeof(T), this); LayerEffectDescriptor descriptor = new(displayName, description, icon, typeof(T), this);
_layerEffectDescriptors.Add(descriptor); _layerEffectDescriptors.Add(descriptor);

View File

@ -151,7 +151,7 @@ namespace Artemis.Core
{ {
if (Icon == null) if (Icon == null)
return null; return null;
return Icon.EndsWith(".svg") ? Plugin.ResolveRelativePath(Icon) : Icon; return Icon.Contains('.') ? Plugin.ResolveRelativePath(Icon) : Icon;
} }
} }

View File

@ -161,7 +161,7 @@ namespace Artemis.Core
{ {
if (Icon == null) if (Icon == null)
return null; return null;
return Icon.EndsWith(".svg") ? Plugin.ResolveRelativePath(Icon) : Icon; return Icon.Contains('.') ? Plugin.ResolveRelativePath(Icon) : Icon;
} }
} }

View File

@ -305,9 +305,6 @@ namespace Artemis.Core.Services
if (profileConfiguration.Icon.IconType == ProfileConfigurationIconType.MaterialIcon) if (profileConfiguration.Icon.IconType == ProfileConfigurationIconType.MaterialIcon)
return; return;
// This can happen if the icon was saved before the original file name was stored (pre-Avalonia)
profileConfiguration.Entity.IconOriginalFileName ??= profileConfiguration.Icon.IconType == ProfileConfigurationIconType.BitmapImage ? "icon.png" : "icon.svg";
using Stream? stream = _profileCategoryRepository.GetProfileIconStream(profileConfiguration.Entity.FileIconId); using Stream? stream = _profileCategoryRepository.GetProfileIconStream(profileConfiguration.Entity.FileIconId);
if (stream != null) if (stream != null)
profileConfiguration.Icon.SetIconByStream(profileConfiguration.Entity.IconOriginalFileName, stream); profileConfiguration.Icon.SetIconByStream(profileConfiguration.Entity.IconOriginalFileName, stream);

View File

@ -1,5 +1,4 @@
using System; using System;
using Artemis.Storage.Entities.Profile.Conditions;
using Artemis.Storage.Entities.Profile.Nodes; using Artemis.Storage.Entities.Profile.Nodes;
namespace Artemis.Storage.Entities.Profile namespace Artemis.Storage.Entities.Profile
@ -11,6 +10,7 @@ namespace Artemis.Storage.Entities.Profile
public string IconOriginalFileName { get; set; } public string IconOriginalFileName { get; set; }
public Guid FileIconId { get; set; } public Guid FileIconId { get; set; }
public int IconType { get; set; } public int IconType { get; set; }
public bool IconFill { get; set; }
public int Order { get; set; } public int Order { get; set; }
public bool IsSuspended { get; set; } public bool IsSuspended { get; set; }

View File

@ -123,17 +123,6 @@
"SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178"
} }
}, },
"Avalonia.Svg.Skia": {
"type": "Transitive",
"resolved": "0.10.12",
"contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==",
"dependencies": {
"Avalonia": "0.10.12",
"Avalonia.Skia": "0.10.12",
"SkiaSharp": "2.88.0-preview.178",
"Svg.Skia": "0.5.12"
}
},
"Avalonia.Win32": { "Avalonia.Win32": {
"type": "Transitive", "type": "Transitive",
"resolved": "0.10.13", "resolved": "0.10.13",
@ -215,11 +204,6 @@
"Unosquare.Swan.Lite": "3.0.0" "Unosquare.Swan.Lite": "3.0.0"
} }
}, },
"Fizzler": {
"type": "Transitive",
"resolved": "1.2.0",
"contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg=="
},
"FluentAvaloniaUI": { "FluentAvaloniaUI": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.3.4", "resolved": "1.3.4",
@ -722,11 +706,6 @@
"Serilog": "2.10.0" "Serilog": "2.10.0"
} }
}, },
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ=="
},
"SkiaSharp": { "SkiaSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -737,15 +716,6 @@
"System.Memory": "4.5.3" "System.Memory": "4.5.3"
} }
}, },
"SkiaSharp.HarfBuzz": {
"type": "Transitive",
"resolved": "2.88.0-preview.178",
"contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==",
"dependencies": {
"HarfBuzzSharp": "2.8.2-preview.178",
"SkiaSharp": "2.88.0-preview.178"
}
},
"SkiaSharp.NativeAssets.Linux": { "SkiaSharp.NativeAssets.Linux": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -783,37 +753,6 @@
"Splat": "14.1.45" "Splat": "14.1.45"
} }
}, },
"Svg.Custom": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==",
"dependencies": {
"Fizzler": "1.2.0",
"System.Memory": "4.5.3",
"System.ObjectModel": "4.3.0",
"System.ValueTuple": "4.5.0"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==",
"dependencies": {
"ShimSkiaSharp": "0.5.12",
"Svg.Custom": "0.5.12"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==",
"dependencies": {
"SkiaSharp": "2.88.0-preview.178",
"SkiaSharp.HarfBuzz": "2.88.0-preview.178",
"Svg.Custom": "0.5.12",
"Svg.Model": "0.5.12"
}
},
"System.AppContext": { "System.AppContext": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1777,7 +1716,6 @@
"Avalonia.Desktop": "0.10.13", "Avalonia.Desktop": "0.10.13",
"Avalonia.Diagnostics": "0.10.13", "Avalonia.Diagnostics": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",
@ -1798,7 +1736,6 @@
"Artemis.Core": "1.0.0", "Artemis.Core": "1.0.0",
"Avalonia": "0.10.13", "Avalonia": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",

View File

@ -123,17 +123,6 @@
"SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178"
} }
}, },
"Avalonia.Svg.Skia": {
"type": "Transitive",
"resolved": "0.10.12",
"contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==",
"dependencies": {
"Avalonia": "0.10.12",
"Avalonia.Skia": "0.10.12",
"SkiaSharp": "2.88.0-preview.178",
"Svg.Skia": "0.5.12"
}
},
"Avalonia.Win32": { "Avalonia.Win32": {
"type": "Transitive", "type": "Transitive",
"resolved": "0.10.13", "resolved": "0.10.13",
@ -215,11 +204,6 @@
"Unosquare.Swan.Lite": "3.0.0" "Unosquare.Swan.Lite": "3.0.0"
} }
}, },
"Fizzler": {
"type": "Transitive",
"resolved": "1.2.0",
"contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg=="
},
"FluentAvaloniaUI": { "FluentAvaloniaUI": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.3.4", "resolved": "1.3.4",
@ -722,11 +706,6 @@
"Serilog": "2.10.0" "Serilog": "2.10.0"
} }
}, },
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ=="
},
"SkiaSharp": { "SkiaSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -737,15 +716,6 @@
"System.Memory": "4.5.3" "System.Memory": "4.5.3"
} }
}, },
"SkiaSharp.HarfBuzz": {
"type": "Transitive",
"resolved": "2.88.0-preview.178",
"contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==",
"dependencies": {
"HarfBuzzSharp": "2.8.2-preview.178",
"SkiaSharp": "2.88.0-preview.178"
}
},
"SkiaSharp.NativeAssets.Linux": { "SkiaSharp.NativeAssets.Linux": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -783,37 +753,6 @@
"Splat": "14.1.45" "Splat": "14.1.45"
} }
}, },
"Svg.Custom": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==",
"dependencies": {
"Fizzler": "1.2.0",
"System.Memory": "4.5.3",
"System.ObjectModel": "4.3.0",
"System.ValueTuple": "4.5.0"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==",
"dependencies": {
"ShimSkiaSharp": "0.5.12",
"Svg.Custom": "0.5.12"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==",
"dependencies": {
"SkiaSharp": "2.88.0-preview.178",
"SkiaSharp.HarfBuzz": "2.88.0-preview.178",
"Svg.Custom": "0.5.12",
"Svg.Model": "0.5.12"
}
},
"System.AppContext": { "System.AppContext": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1777,7 +1716,6 @@
"Avalonia.Desktop": "0.10.13", "Avalonia.Desktop": "0.10.13",
"Avalonia.Diagnostics": "0.10.13", "Avalonia.Diagnostics": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",
@ -1798,7 +1736,6 @@
"Artemis.Core": "1.0.0", "Artemis.Core": "1.0.0",
"Avalonia": "0.10.13", "Avalonia": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",

View File

@ -17,7 +17,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Avalonia" Version="0.10.13" /> <PackageReference Include="Avalonia" Version="0.10.13" />
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.13" /> <PackageReference Include="Avalonia.ReactiveUI" Version="0.10.13" />
<PackageReference Include="Avalonia.Svg.Skia" Version="0.10.12" />
<PackageReference Include="Avalonia.Xaml.Behaviors" Version="0.10.13.3" /> <PackageReference Include="Avalonia.Xaml.Behaviors" Version="0.10.13.3" />
<PackageReference Include="DynamicData" Version="7.5.4" /> <PackageReference Include="DynamicData" Version="7.5.4" />
<PackageReference Include="FluentAvaloniaUI" Version="1.3.4" /> <PackageReference Include="FluentAvaloniaUI" Version="1.3.4" />

View File

@ -1,10 +1,12 @@
using System; using System;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Layout;
using Avalonia.LogicalTree; using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Imaging; using Avalonia.Media.Imaging;
using Avalonia.Svg.Skia; using Avalonia.Visuals.Media.Imaging;
using Material.Icons; using Material.Icons;
using Material.Icons.Avalonia; using Material.Icons.Avalonia;
@ -45,20 +47,29 @@ namespace Artemis.UI.Shared
{ {
// An enum defined as a string // An enum defined as a string
if (Enum.TryParse(iconString, true, out MaterialIconKind parsedIcon)) if (Enum.TryParse(iconString, true, out MaterialIconKind parsedIcon))
{
Content = new MaterialIcon {Kind = parsedIcon, Width = Bounds.Width, Height = Bounds.Height}; Content = new MaterialIcon {Kind = parsedIcon, Width = Bounds.Width, Height = Bounds.Height};
} // An URI pointing to an image
// An URI pointing to an SVG
else if (iconString.EndsWith(".svg"))
{
SvgSource source = new();
source.Load(iconString);
Content = new Image {Source = new SvgImage {Source = source}};
}
// An URI pointing to a different kind of image
else else
{ {
Content = new Image {Source = new Bitmap(iconString), Width = Bounds.Width, Height = Bounds.Height}; if (!Fill)
{
Content = new Image
{
Source = new Bitmap(iconString),
VerticalAlignment = VerticalAlignment.Stretch,
HorizontalAlignment = HorizontalAlignment.Stretch
};
}
else
{
Content = new Border
{
Background = TextBlock.GetForeground(this),
VerticalAlignment = VerticalAlignment.Stretch,
HorizontalAlignment = HorizontalAlignment.Stretch,
OpacityMask = new ImageBrush(new Bitmap(iconString)) {BitmapInterpolationMode = BitmapInterpolationMode.MediumQuality}
};
}
} }
} }
} }
@ -108,6 +119,23 @@ namespace Artemis.UI.Shared
set => SetValue(IconProperty, value); set => SetValue(IconProperty, value);
} }
/// <summary>
/// Gets or sets a boolean indicating whether or not the icon should be filled in with the primary text color of the
/// theme
/// </summary>
public static readonly StyledProperty<bool> FillProperty =
AvaloniaProperty.Register<ArtemisIcon, bool>(nameof(Icon), defaultValue: true, notifying: IconChanging);
/// <summary>
/// Gets or sets a boolean indicating whether or not the icon should be filled in with the primary text color of the
/// theme
/// </summary>
public bool Fill
{
get => GetValue(FillProperty);
set => SetValue(FillProperty, value);
}
#endregion #endregion
} }
} }

View File

@ -3,10 +3,13 @@ using System.IO;
using Artemis.Core; using Artemis.Core;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Layout;
using Avalonia.LogicalTree; using Avalonia.LogicalTree;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Imaging; using Avalonia.Media.Imaging;
using Avalonia.Svg.Skia; using Avalonia.Threading;
using Avalonia.Visuals.Media.Imaging;
using Material.Icons; using Material.Icons;
using Material.Icons.Avalonia; using Material.Icons.Avalonia;
@ -15,8 +18,10 @@ namespace Artemis.UI.Shared
/// <summary> /// <summary>
/// Represents a control that can display the icon of a specific <see cref="ProfileConfiguration"/>. /// Represents a control that can display the icon of a specific <see cref="ProfileConfiguration"/>.
/// </summary> /// </summary>
public class ProfileConfigurationIcon : UserControl public class ProfileConfigurationIcon : UserControl, IDisposable
{ {
private Stream? _stream;
/// <summary> /// <summary>
/// Creates a new instance of the <see cref="ProfileConfigurationIcon" /> class. /// Creates a new instance of the <see cref="ProfileConfigurationIcon" /> class.
/// </summary> /// </summary>
@ -27,11 +32,11 @@ namespace Artemis.UI.Shared
PropertyChanged += OnPropertyChanged; PropertyChanged += OnPropertyChanged;
} }
private void Update() private void Update()
{ {
if (ConfigurationIcon == null) if (ConfigurationIcon == null)
return; return;
Dispose();
try try
{ {
@ -40,37 +45,40 @@ namespace Artemis.UI.Shared
Content = Enum.TryParse(ConfigurationIcon.IconName, true, out MaterialIconKind parsedIcon) Content = Enum.TryParse(ConfigurationIcon.IconName, true, out MaterialIconKind parsedIcon)
? new MaterialIcon {Kind = parsedIcon!} ? new MaterialIcon {Kind = parsedIcon!}
: new MaterialIcon {Kind = MaterialIconKind.QuestionMark}; : new MaterialIcon {Kind = MaterialIconKind.QuestionMark};
return;
}
Stream? stream = ConfigurationIcon.GetIconStream();
if (stream == null)
{
Content = new MaterialIcon {Kind = MaterialIconKind.QuestionMark};
return;
}
if (ConfigurationIcon.IconType == ProfileConfigurationIconType.SvgImage)
{
SvgSource source = new();
source.Load(stream);
Content = new Image {Source = new SvgImage {Source = source}};
}
else if (ConfigurationIcon.IconType == ProfileConfigurationIconType.BitmapImage)
{
Content = new Image {Source = new Bitmap(ConfigurationIcon.GetIconStream())};
} }
else else
{ {
Content = new MaterialIcon {Kind = MaterialIconKind.QuestionMark}; Stream? stream = ConfigurationIcon.GetIconStream();
if (stream == null)
Content = new MaterialIcon {Kind = MaterialIconKind.QuestionMark};
else
LoadFromBitmap(ConfigurationIcon, stream);
} }
} }
catch catch (Exception)
{ {
Content = new MaterialIcon {Kind = MaterialIconKind.QuestionMark}; Content = new MaterialIcon {Kind = MaterialIconKind.QuestionMark};
} }
} }
private void LoadFromBitmap(Core.ProfileConfigurationIcon configurationIcon, Stream stream)
{
_stream = stream;
if (!configurationIcon.Fill)
{
Content = new Image {Source = new Bitmap(stream)};
return;
}
Content = new Border
{
Background = TextBlock.GetForeground(this),
VerticalAlignment = VerticalAlignment.Stretch,
HorizontalAlignment = HorizontalAlignment.Stretch,
OpacityMask = new ImageBrush(new Bitmap(stream)) {BitmapInterpolationMode = BitmapInterpolationMode.MediumQuality}
};
}
private void InitializeComponent() private void InitializeComponent()
{ {
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
@ -81,8 +89,7 @@ namespace Artemis.UI.Shared
if (ConfigurationIcon != null) if (ConfigurationIcon != null)
ConfigurationIcon.IconUpdated -= ConfigurationIconOnIconUpdated; ConfigurationIcon.IconUpdated -= ConfigurationIconOnIconUpdated;
if (Content is Image image && image.Source is IDisposable disposable) Dispose();
disposable.Dispose();
} }
private void OnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) private void OnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
@ -95,12 +102,12 @@ namespace Artemis.UI.Shared
if (e.NewValue is Core.ProfileConfigurationIcon newIcon) if (e.NewValue is Core.ProfileConfigurationIcon newIcon)
newIcon.IconUpdated += ConfigurationIconOnIconUpdated; newIcon.IconUpdated += ConfigurationIconOnIconUpdated;
Update(); Dispatcher.UIThread.Post(Update, DispatcherPriority.ApplicationIdle);
} }
private void ConfigurationIconOnIconUpdated(object? sender, EventArgs e) private void ConfigurationIconOnIconUpdated(object? sender, EventArgs e)
{ {
Update(); Dispatcher.UIThread.Post(Update, DispatcherPriority.ApplicationIdle);
} }
#region Properties #region Properties
@ -111,6 +118,7 @@ namespace Artemis.UI.Shared
public static readonly StyledProperty<Core.ProfileConfigurationIcon?> ConfigurationIconProperty = public static readonly StyledProperty<Core.ProfileConfigurationIcon?> ConfigurationIconProperty =
AvaloniaProperty.Register<ProfileConfigurationIcon, Core.ProfileConfigurationIcon?>(nameof(ConfigurationIcon)); AvaloniaProperty.Register<ProfileConfigurationIcon, Core.ProfileConfigurationIcon?>(nameof(ConfigurationIcon));
/// <summary> /// <summary>
/// Gets or sets the <see cref="Core.ProfileConfigurationIcon" /> to display /// Gets or sets the <see cref="Core.ProfileConfigurationIcon" /> to display
/// </summary> /// </summary>
@ -121,5 +129,17 @@ namespace Artemis.UI.Shared
} }
#endregion #endregion
/// <inheritdoc />
public void Dispose()
{
if (Content is Image {Source: IDisposable d})
{
d.Dispose();
Content = null;
}
_stream?.Dispose();
}
} }
} }

View File

@ -28,18 +28,6 @@
"System.Reactive": "5.0.0" "System.Reactive": "5.0.0"
} }
}, },
"Avalonia.Svg.Skia": {
"type": "Direct",
"requested": "[0.10.12, )",
"resolved": "0.10.12",
"contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==",
"dependencies": {
"Avalonia": "0.10.12",
"Avalonia.Skia": "0.10.12",
"SkiaSharp": "2.88.0-preview.178",
"Svg.Skia": "0.5.12"
}
},
"Avalonia.Xaml.Behaviors": { "Avalonia.Xaml.Behaviors": {
"type": "Direct", "type": "Direct",
"requested": "[0.10.13.3, )", "requested": "[0.10.13.3, )",
@ -257,11 +245,6 @@
"Unosquare.Swan.Lite": "3.0.0" "Unosquare.Swan.Lite": "3.0.0"
} }
}, },
"Fizzler": {
"type": "Transitive",
"resolved": "1.2.0",
"contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg=="
},
"HarfBuzzSharp": { "HarfBuzzSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.8.2-preview.178", "resolved": "2.8.2-preview.178",
@ -694,20 +677,6 @@
"Serilog": "2.10.0" "Serilog": "2.10.0"
} }
}, },
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ=="
},
"SkiaSharp.HarfBuzz": {
"type": "Transitive",
"resolved": "2.88.0-preview.178",
"contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==",
"dependencies": {
"HarfBuzzSharp": "2.8.2-preview.178",
"SkiaSharp": "2.88.0-preview.178"
}
},
"SkiaSharp.NativeAssets.Linux": { "SkiaSharp.NativeAssets.Linux": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -736,37 +705,6 @@
"resolved": "14.1.45", "resolved": "14.1.45",
"contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw=="
}, },
"Svg.Custom": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==",
"dependencies": {
"Fizzler": "1.2.0",
"System.Memory": "4.5.3",
"System.ObjectModel": "4.3.0",
"System.ValueTuple": "4.5.0"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==",
"dependencies": {
"ShimSkiaSharp": "0.5.12",
"Svg.Custom": "0.5.12"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==",
"dependencies": {
"SkiaSharp": "2.88.0-preview.178",
"SkiaSharp.HarfBuzz": "2.88.0-preview.178",
"Svg.Custom": "0.5.12",
"Svg.Model": "0.5.12"
}
},
"System.AppContext": { "System.AppContext": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",

View File

@ -160,17 +160,6 @@
"SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178"
} }
}, },
"Avalonia.Svg.Skia": {
"type": "Transitive",
"resolved": "0.10.12",
"contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==",
"dependencies": {
"Avalonia": "0.10.12",
"Avalonia.Skia": "0.10.12",
"SkiaSharp": "2.88.0-preview.178",
"Svg.Skia": "0.5.12"
}
},
"Avalonia.X11": { "Avalonia.X11": {
"type": "Transitive", "type": "Transitive",
"resolved": "0.10.13", "resolved": "0.10.13",
@ -241,11 +230,6 @@
"Unosquare.Swan.Lite": "3.0.0" "Unosquare.Swan.Lite": "3.0.0"
} }
}, },
"Fizzler": {
"type": "Transitive",
"resolved": "1.2.0",
"contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg=="
},
"FluentAvaloniaUI": { "FluentAvaloniaUI": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.3.4", "resolved": "1.3.4",
@ -757,11 +741,6 @@
"System.ValueTuple": "4.4.0" "System.ValueTuple": "4.4.0"
} }
}, },
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ=="
},
"SkiaSharp": { "SkiaSharp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -772,15 +751,6 @@
"System.Memory": "4.5.3" "System.Memory": "4.5.3"
} }
}, },
"SkiaSharp.HarfBuzz": {
"type": "Transitive",
"resolved": "2.88.0-preview.178",
"contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==",
"dependencies": {
"HarfBuzzSharp": "2.8.2-preview.178",
"SkiaSharp": "2.88.0-preview.178"
}
},
"SkiaSharp.NativeAssets.Linux": { "SkiaSharp.NativeAssets.Linux": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -818,37 +788,6 @@
"Splat": "14.1.45" "Splat": "14.1.45"
} }
}, },
"Svg.Custom": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==",
"dependencies": {
"Fizzler": "1.2.0",
"System.Memory": "4.5.3",
"System.ObjectModel": "4.3.0",
"System.ValueTuple": "4.5.0"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==",
"dependencies": {
"ShimSkiaSharp": "0.5.12",
"Svg.Custom": "0.5.12"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==",
"dependencies": {
"SkiaSharp": "2.88.0-preview.178",
"SkiaSharp.HarfBuzz": "2.88.0-preview.178",
"Svg.Custom": "0.5.12",
"Svg.Model": "0.5.12"
}
},
"System.AppContext": { "System.AppContext": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1812,7 +1751,6 @@
"Avalonia.Desktop": "0.10.13", "Avalonia.Desktop": "0.10.13",
"Avalonia.Diagnostics": "0.10.13", "Avalonia.Diagnostics": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",
@ -1833,7 +1771,6 @@
"Artemis.Core": "1.0.0", "Artemis.Core": "1.0.0",
"Avalonia": "0.10.13", "Avalonia": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",

View File

@ -21,7 +21,6 @@
<PackageReference Include="Avalonia.Desktop" Version="0.10.13" /> <PackageReference Include="Avalonia.Desktop" Version="0.10.13" />
<PackageReference Include="Avalonia.Diagnostics" Version="0.10.13" /> <PackageReference Include="Avalonia.Diagnostics" Version="0.10.13" />
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.13" /> <PackageReference Include="Avalonia.ReactiveUI" Version="0.10.13" />
<PackageReference Include="Avalonia.Svg.Skia" Version="0.10.12" />
<PackageReference Include="Avalonia.Xaml.Behaviors" Version="0.10.13.3" /> <PackageReference Include="Avalonia.Xaml.Behaviors" Version="0.10.13.3" />
<PackageReference Include="DynamicData" Version="7.5.4" /> <PackageReference Include="DynamicData" Version="7.5.4" />
<PackageReference Include="FluentAvaloniaUI" Version="1.3.4" /> <PackageReference Include="FluentAvaloniaUI" Version="1.3.4" />
@ -41,16 +40,12 @@
<ProjectReference Include="..\Artemis.VisualScripting\Artemis.VisualScripting.csproj" /> <ProjectReference Include="..\Artemis.VisualScripting\Artemis.VisualScripting.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Assets\Images\Logo\bow-black.ico" />
<Content Include="Assets\Images\Logo\bow-white.ico" /> <Content Include="Assets\Images\Logo\bow-white.ico" />
<Content Include="Assets\Images\Logo\bow.ico" /> <Content Include="Assets\Images\Logo\bow.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Resource Include="Assets\Images\Logo\bow-black.ico" /> <Resource Include="Assets\Images\Logo\bow-black.ico" />
<Resource Include="Assets\Images\Logo\bow-white.ico" /> <Resource Include="Assets\Images\Logo\bow-white.ico" />
<Resource Include="Assets\Images\Logo\bow-white.svg" />
<Resource Include="Assets\Images\Logo\bow.ico" />
<Resource Include="Assets\Images\Logo\bow.svg" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Update="DefaultTypes\PropertyInput\StringPropertyInputView.axaml.cs"> <Compile Update="DefaultTypes\PropertyInput\StringPropertyInputView.axaml.cs">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs>
<style>.cls-1,.cls-2{fill:#fff;}.cls-2{fill-rule:evenodd;}</style>
</defs>
<g id="Layer_10" data-name="Layer 10">
<path class="cls-1" d="M52.32,17.68l-2.83,5a1.16,1.16,0,0,1-2,0l-.57-1-.54.32c-.22-.44-.46-.88-.71-1.31s-.66-1.1-1-1.63l.53-.3-.63-1.06a1.16,1.16,0,0,1,1-1.74l5.75,0A1.15,1.15,0,0,1,52.32,17.68Z"/>
<path class="cls-1" d="M24.71,25.63l-4.84,2.58-.53.28a38.15,38.15,0,0,1-5.54-2.18c-4.51-1.49-1.48-7,1.93-4.31.34.22.69.44,1,.64.59.35,1.21.67,1.82,1A25.88,25.88,0,0,0,24.71,25.63Z"/>
<path class="cls-1" d="M30.83,36.22c-.15.43-.28.86-.41,1.29a25.74,25.74,0,0,0-.81,4.09,26.72,26.72,0,0,0-.17,3.1c0,.37,0,.75,0,1.12A2.45,2.45,0,0,1,25,47.72c-.56-1-.22-2-.18-3.08s.21-2,.39-3c.12-.74.27-1.47.43-2.2l.53-.33,3.63-2.26Z"/>
<path class="cls-1" d="M35,28.71l-.91.57L31.3,31,24,35.59l-4.45,2.78-2.22,1.37a2.6,2.6,0,0,1-1.26.34,2.45,2.45,0,0,1-.8-4.72l.58-.31,1.3-.69,4.67-2.5,7.6-4.05,2.94-1.57.94-.5a17.91,17.91,0,0,1,1,1.55C34.57,27.75,34.82,28.23,35,28.71Z"/>
<path class="cls-2" d="M39.29,53.89a2.56,2.56,0,0,1-1.09.74l-.34.08a.13.13,0,0,1-.09,0,1.84,1.84,0,0,1-.33,0,2.41,2.41,0,0,1-1.84-4,22.32,22.32,0,0,0,5-18.09c0-.24-.08-.48-.13-.72s-.1-.48-.16-.73-.11-.48-.18-.72-.12-.45-.2-.68a20.49,20.49,0,0,0-.7-1.94c-.06-.18-.14-.34-.21-.51a21.83,21.83,0,0,0-1.09-2.16c-.14-.22-.27-.45-.4-.66-.25-.4-.51-.78-.77-1.16s-.63-.85-1-1.26l-.48-.56c-.35-.4-.72-.78-1.09-1.14a6.51,6.51,0,0,0-.54-.51l-.45-.4a22.08,22.08,0,0,0-3-2.2c-.17-.11-.36-.21-.54-.31s-.42-.24-.63-.35l-.46-.23a19.7,19.7,0,0,0-2.31-1l-.44-.15-.1,0c-.53-.18-1.07-.34-1.63-.48l-.25-.06a19.61,19.61,0,0,0-2-.39c-.35-.06-.7-.1-1-.13s-.8-.07-1.2-.08-.65,0-1,0h0a22.18,22.18,0,0,0-4,.36,3.28,3.28,0,0,1-.43,0,2.42,2.42,0,0,1-.42-4.8A26,26,0,0,1,18,9.26h.62c.43,0,.86,0,1.28,0l1,.07,1.07.11c.52.07,1,.14,1.53.24.23,0,.46.08.7.13l.14,0c.35.08.69.15,1,.25a20.61,20.61,0,0,1,2.16.65c.48.16.94.33,1.4.52h0c.33.14.67.28,1,.44s.58.27.86.42l.27.13c.28.14.56.29.82.45s.64.36,1,.55c.49.31,1,.62,1.45,1l.15.11c.31.22.62.46.93.7l.11.08c.36.28.71.58,1.06.89l0,0c.33.28.64.57,1,.88s.64.62.94.95c.1.1.19.21.29.32.26.29.52.58.77.88,0,0,0,.05.06.09.28.34.55.68.81,1s.55.75.82,1.15l.28.44c.21.33.42.67.62,1A27.14,27.14,0,0,1,39.29,53.89Z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,43 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512">
<defs>
<style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:url(#linear-gradient-2);}.cls-3{fill:url(#linear-gradient-3);}.cls-4{fill:url(#linear-gradient-4);}.cls-5{fill:url(#linear-gradient-5);}.cls-6{fill:url(#linear-gradient-6);}.cls-7{fill:url(#linear-gradient-7);}.cls-8{fill-rule:evenodd;fill:url(#linear-gradient-8);}</style>
<linearGradient id="linear-gradient" x1="151.25" y1="94.74" x2="810.05" y2="369.54" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#f19d25"/>
<stop offset="0.12" stop-color="#f63d3d"/>
<stop offset="0.28" stop-color="#c93cec"/>
<stop offset="0.44" stop-color="#2667f4"/>
<stop offset="0.56" stop-color="#1cb6e7"/>
<stop offset="0.7" stop-color="#2df4b5"/>
<stop offset="0.87" stop-color="#70ea37"/>
<stop offset="1" stop-color="#cfe726"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="132.17" y1="204.4" x2="234.7" y2="230.88" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#ef3d3d"/>
<stop offset="1" stop-color="#b72222"/>
</linearGradient>
<linearGradient id="linear-gradient-3" x1="217.07" y1="354.42" x2="253.03" y2="258.52" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#2b75f6"/>
<stop offset="1" stop-color="#1452aa"/>
</linearGradient>
<linearGradient id="linear-gradient-4" x1="105.18" y1="320.77" x2="311.18" y2="203.81" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#22f15e"/>
<stop offset="1" stop-color="#29af4d"/>
</linearGradient>
<linearGradient id="linear-gradient-5" x1="112.68" y1="187.21" x2="771.48" y2="462.01" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-6" x1="88.75" y1="244.59" x2="747.54" y2="519.39" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-7" x1="102.97" y1="210.49" x2="761.77" y2="485.29" xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-8" x1="141.26" y1="116.54" x2="347.22" y2="356.89" gradientTransform="translate(11.74 6.94)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#009385"/>
<stop offset="1" stop-color="#045e53"/>
</linearGradient>
</defs>
<g id="Teal_Bow" data-name="Teal Bow">
<g id="TealRainbow">
<path class="cls-1" d="M375.54,156.66,340,157a7.14,7.14,0,0,0-6.1,10.76l3.85,6.55-16.8,9.84c2.18,3.26,4.26,6.61,6.24,10,1.54,2.67,3,5.37,4.39,8.09l16.82-9.85,3.53,6a7.14,7.14,0,0,0,12.37-.1l17.53-30.94A7.15,7.15,0,0,0,375.54,156.66Z"/>
<path class="cls-5" d="M235.3,221.27l-34.52,18.41c-6.08-1-12.11-2.36-18.05-4a230.91,230.91,0,0,1-39.4-14.9c-27.91-9.26-9.21-43.22,11.93-26.76,2.11,1.41,4.28,2.76,6.48,4,3.65,2.15,7.42,4.09,11.24,5.91a156.68,156.68,0,0,0,42.24,13.31A130.42,130.42,0,0,0,239.63,219Z"/>
<path class="cls-6" d="M257,258.59l4.09-2.55a135.41,135.41,0,0,0-14.8,34.07,160.44,160.44,0,0,0-5,25.32,158,158,0,0,0-1.06,19.21c0,2.32.11,4.63.26,6.94,4.06,16.9-18.44,27-27.64,11.76-3.51-6-1.35-12.66-1.14-19.08.58-6.21,1.35-12.39,2.39-18.55a200.68,200.68,0,0,1,9.63-36.38l10.53-6.56Z"/>
<path class="cls-7" d="M284,219.06c-1.92-3.33-4-6.55-6.21-9.68h0l-9.46,5.54a17.12,17.12,0,0,0-2.69,1.52l-7.34,3.92L240,230.1q-23.52,12.53-47,25.08L164,270.62l-8,4.27c-1.21.65-2.43,1.29-3.64,1.95C132.81,285.25,146.31,314,165.2,304l13.72-8.55,27.53-17.15,45.22-28.18,17.55-10.94,7-4.39a15.73,15.73,0,0,0,3.58-2.29h0l8.56-5Q286.34,223.21,284,219.06Z"/>
<path class="cls-8" d="M169.2,115.38A169,169,0,0,0,143.28,118a15,15,0,0,0,5.26,29.44A137.81,137.81,0,0,1,278.31,372.15a14.95,14.95,0,0,0,22.82,19.31A167.69,167.69,0,0,0,169.2,115.38Z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -2,7 +2,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:svg="clr-namespace:Avalonia.Svg.Skia;assembly=Avalonia.Svg.Skia"
xmlns:root="clr-namespace:Artemis.UI.Screens.Root" xmlns:root="clr-namespace:Artemis.UI.Screens.Root"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Artemis.UI.Screens.Root.SplashView" x:Class="Artemis.UI.Screens.Root.SplashView"
@ -16,11 +15,7 @@
ExtendClientAreaToDecorationsHint="True" ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaTitleBarHeightHint="450"> ExtendClientAreaTitleBarHeightHint="450">
<Grid RowDefinitions="250,50,Auto,*" IsHitTestVisible="False"> <Grid RowDefinitions="250,50,Auto,*" IsHitTestVisible="False">
<Image Grid.Column="0" Stretch="Uniform" Width="200"> <Image Grid.Column="0" Stretch="Uniform" Width="200" Height="150" Source="/Assets/Images/Logo/bow.png" VerticalAlignment="Bottom"/>
<Image.Source>
<svg:SvgImage Source="/Assets/Images/Logo/bow.svg" />
</Image.Source>
</Image>
<TextBlock Grid.Row="1" <TextBlock Grid.Row="1"
Classes="h5" Classes="h5"
HorizontalAlignment="Center" HorizontalAlignment="Center"

View File

@ -2,7 +2,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:svg="clr-namespace:Avalonia.Svg.Skia;assembly=Avalonia.Svg.Skia"
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="1400" mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="1400"
@ -10,11 +9,7 @@
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<StackPanel Margin="15" MaxWidth="800"> <StackPanel Margin="15" MaxWidth="800">
<Grid RowDefinitions="*,*" ColumnDefinitions="Auto,*,Auto"> <Grid RowDefinitions="*,*" ColumnDefinitions="Auto,*,Auto">
<Image Grid.Column="0" Grid.RowSpan="2" Width="140" Height="140" VerticalAlignment="Center"> <Image Grid.Column="0" Grid.RowSpan="2" Width="65" Height="65" VerticalAlignment="Center" Source="/Assets/Images/Logo/bow.png" Margin="0 0 20 0"/>
<Image.Source>
<svg:SvgImage Source="/Assets/Images/Logo/bow.svg" />
</Image.Source>
</Image>
<TextBlock Grid.Row="0" Grid.Column="1" FontSize="36" VerticalAlignment="Bottom"> <TextBlock Grid.Row="0" Grid.Column="1" FontSize="36" VerticalAlignment="Bottom">
Artemis 2 Artemis 2
</TextBlock> </TextBlock>

View File

@ -72,34 +72,31 @@
IsChecked="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.MaterialIcon}}" /> IsChecked="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.MaterialIcon}}" />
<RadioButton Content="Bitmap image" <RadioButton Content="Bitmap image"
IsChecked="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.BitmapImage}}" /> IsChecked="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.BitmapImage}}" />
<RadioButton Content="SVG image"
IsChecked="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.SvgImage}}" />
</WrapPanel> </WrapPanel>
<StackPanel Orientation="Horizontal" <StackPanel Orientation="Horizontal"
IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.BitmapImage}}"> IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.BitmapImage}}">
<Border Background="{DynamicResource CheckerboardBrush}" CornerRadius="{DynamicResource CardCornerRadius}" Width="78" Height="78">
<Border IsVisible="{CompiledBinding ProfileConfiguration.Icon.Fill}" Background="{DynamicResource CheckerboardBrush}" CornerRadius="{DynamicResource CardCornerRadius}" Width="78" Height="78">
<Border Name="FillPreview" Background="{DynamicResource TextFillColorPrimary}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="10">
<Border.OpacityMask>
<ImageBrush Source="{CompiledBinding SelectedBitmapSource}" BitmapInterpolationMode="HighQuality" />
</Border.OpacityMask>
</Border>
</Border>
<Border IsVisible="{CompiledBinding !ProfileConfiguration.Icon.Fill}" Background="{DynamicResource CheckerboardBrush}" CornerRadius="{DynamicResource CardCornerRadius}" Width="78" Height="78">
<Image Source="{CompiledBinding SelectedBitmapSource}" Margin="10" /> <Image Source="{CompiledBinding SelectedBitmapSource}" Margin="10" />
</Border> </Border>
<Button Command="{CompiledBinding BrowseBitmapFile}" <Button Command="{CompiledBinding BrowseBitmapFile}"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
Margin="10 0" Margin="10 0"
IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.BitmapImage}}"> IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.BitmapImage}}">
Browse bitmap file Browse bitmap file
</Button> </Button>
<CheckBox VerticalAlignment="Bottom" IsChecked="{CompiledBinding ProfileConfiguration.Icon.Fill}">Fill</CheckBox>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal"
IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.SvgImage}}">
<Border Background="{DynamicResource CheckerboardBrush}" CornerRadius="{DynamicResource CardCornerRadius}" Width="78" Height="78">
<Image Margin="10" Source="{CompiledBinding SelectedSvgSource}" />
</Border>
<Button Command="{CompiledBinding BrowseSvgFile}"
VerticalAlignment="Bottom"
Margin="10 0"
IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.SvgImage}}">
Browse SVG file
</Button>
</StackPanel>
<StackPanel Orientation="Horizontal" <StackPanel Orientation="Horizontal"
IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.MaterialIcon}}"> IsVisible="{CompiledBinding IconType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static core:ProfileConfigurationIconType.MaterialIcon}}">
<Border Background="{DynamicResource CheckerboardBrush}" CornerRadius="{DynamicResource CardCornerRadius}" Width="78" Height="78"> <Border Background="{DynamicResource CheckerboardBrush}" CornerRadius="{DynamicResource CardCornerRadius}" Width="78" Height="78">

View File

@ -1,6 +1,9 @@
using System;
using System.Reactive.Disposables;
using Avalonia; using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI; using ReactiveUI;
namespace Artemis.UI.Screens.Sidebar namespace Artemis.UI.Screens.Sidebar
{ {
@ -9,6 +12,8 @@ namespace Artemis.UI.Screens.Sidebar
public ProfileConfigurationEditView() public ProfileConfigurationEditView()
{ {
InitializeComponent(); InitializeComponent();
this.WhenActivated(d => ViewModel.WhenAnyValue(vm => vm.SelectedBitmapSource).Subscribe(_ => this.Get<Border>("FillPreview").InvalidateVisual()).DisposeWith(d));
#if DEBUG #if DEBUG
this.AttachDevTools(); this.AttachDevTools();
#endif #endif

View File

@ -14,7 +14,6 @@ using Artemis.UI.Shared;
using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services;
using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor;
using Avalonia.Media.Imaging; using Avalonia.Media.Imaging;
using Avalonia.Svg.Skia;
using Avalonia.Threading; using Avalonia.Threading;
using Material.Icons; using Material.Icons;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -39,7 +38,6 @@ namespace Artemis.UI.Screens.Sidebar
private string? _selectedIconPath; private string? _selectedIconPath;
private ProfileIconViewModel? _selectedMaterialIcon; private ProfileIconViewModel? _selectedMaterialIcon;
private ProfileModuleViewModel? _selectedModule; private ProfileModuleViewModel? _selectedModule;
private SvgImage? _selectedSvgSource;
private readonly ObservableAsPropertyHelper<ModuleActivationRequirementsViewModel?> _moduleActivationRequirementsViewModel; private readonly ObservableAsPropertyHelper<ModuleActivationRequirementsViewModel?> _moduleActivationRequirementsViewModel;
public ProfileConfigurationEditViewModel( public ProfileConfigurationEditViewModel(
@ -74,7 +72,6 @@ namespace Artemis.UI.Screens.Sidebar
VisualEditorViewModel = nodeVmFactory.NodeScriptViewModel(_profileConfiguration.ActivationCondition, true); VisualEditorViewModel = nodeVmFactory.NodeScriptViewModel(_profileConfiguration.ActivationCondition, true);
BrowseBitmapFile = ReactiveCommand.CreateFromTask(ExecuteBrowseBitmapFile); BrowseBitmapFile = ReactiveCommand.CreateFromTask(ExecuteBrowseBitmapFile);
BrowseSvgFile = ReactiveCommand.CreateFromTask(ExecuteBrowseSvgFile);
OpenConditionEditor = ReactiveCommand.CreateFromTask(ExecuteOpenConditionEditor); OpenConditionEditor = ReactiveCommand.CreateFromTask(ExecuteOpenConditionEditor);
Confirm = ReactiveCommand.CreateFromTask(ExecuteConfirm); Confirm = ReactiveCommand.CreateFromTask(ExecuteConfirm);
Import = ReactiveCommand.CreateFromTask(ExecuteImport); Import = ReactiveCommand.CreateFromTask(ExecuteImport);
@ -133,7 +130,6 @@ namespace Artemis.UI.Screens.Sidebar
public ReactiveCommand<Unit, Unit> OpenConditionEditor { get; } public ReactiveCommand<Unit, Unit> OpenConditionEditor { get; }
public ReactiveCommand<Unit, Unit> BrowseBitmapFile { get; } public ReactiveCommand<Unit, Unit> BrowseBitmapFile { get; }
public ReactiveCommand<Unit, Unit> BrowseSvgFile { get; }
public ReactiveCommand<Unit, Unit> Confirm { get; } public ReactiveCommand<Unit, Unit> Confirm { get; }
public ReactiveCommand<Unit, Unit> Import { get; } public ReactiveCommand<Unit, Unit> Import { get; }
public ReactiveCommand<Unit, Unit> Delete { get; } public ReactiveCommand<Unit, Unit> Delete { get; }
@ -237,27 +233,18 @@ namespace Artemis.UI.Screens.Sidebar
set => RaiseAndSetIfChanged(ref _selectedBitmapSource, value); set => RaiseAndSetIfChanged(ref _selectedBitmapSource, value);
} }
public SvgImage? SelectedSvgSource
{
get => _selectedSvgSource;
set => RaiseAndSetIfChanged(ref _selectedSvgSource, value);
}
private void LoadIcon() private void LoadIcon()
{ {
// Preselect the icon based on streams if needed // Preselect the icon based on streams if needed
if (_profileConfiguration.Icon.IconType == ProfileConfigurationIconType.BitmapImage) if (_profileConfiguration.Icon.IconType == ProfileConfigurationIconType.BitmapImage)
{ {
SelectedBitmapSource = new Bitmap(_profileConfiguration.Icon.GetIconStream()); try
}
else if (_profileConfiguration.Icon.IconType == ProfileConfigurationIconType.SvgImage)
{
Stream? iconStream = _profileConfiguration.Icon.GetIconStream();
if (iconStream != null)
{ {
SvgSource newSource = new(); SelectedBitmapSource = new Bitmap(_profileConfiguration.Icon.GetIconStream());
newSource.Load(iconStream); }
SelectedSvgSource = new SvgImage {Source = newSource}; catch (Exception e)
{
_windowService.ShowConfirmContentDialog("Failed to load profile icon", e.Message, "Meh", null);
} }
} }
@ -300,22 +287,6 @@ namespace Artemis.UI.Screens.Sidebar
_selectedIconPath = result[0]; _selectedIconPath = result[0];
} }
private async Task ExecuteBrowseSvgFile()
{
string[]? result = await _windowService.CreateOpenFileDialog()
.HavingFilter(f => f.WithExtension("svg").WithName("SVG image"))
.ShowAsync();
if (result == null)
return;
SvgSource newSource = new();
newSource.Load(result[0]);
SelectedSvgSource = new SvgImage {Source = newSource};
_selectedIconPath = result[0];
}
private async Task ExecuteOpenConditionEditor() private async Task ExecuteOpenConditionEditor()
{ {
await _windowService.ShowDialogAsync<NodeScriptWindowViewModel, bool>(("nodeScript", ProfileConfiguration.ActivationCondition)); await _windowService.ShowDialogAsync<NodeScriptWindowViewModel, bool>(("nodeScript", ProfileConfiguration.ActivationCondition));

View File

@ -4,7 +4,6 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:svg="clr-namespace:Avalonia.Svg.Skia;assembly=Avalonia.Svg.Skia"
mc:Ignorable="d" d:DesignWidth="240" d:DesignHeight="450" mc:Ignorable="d" d:DesignWidth="240" d:DesignHeight="450"
x:Class="Artemis.UI.Screens.Sidebar.SidebarView"> x:Class="Artemis.UI.Screens.Sidebar.SidebarView">
<UserControl.Styles> <UserControl.Styles>
@ -12,11 +11,7 @@
</UserControl.Styles> </UserControl.Styles>
<Grid RowDefinitions="60,Auto,Auto,*,Auto,Auto"> <Grid RowDefinitions="60,Auto,Auto,*,Auto,Auto">
<Grid Grid.Row="0" IsHitTestVisible="False" ColumnDefinitions="Auto,*"> <Grid Grid.Row="0" IsHitTestVisible="False" ColumnDefinitions="Auto,*">
<Image Grid.Column="0"> <Image Grid.Column="0" Margin="12" Source="/Assets/Images/Logo/bow.png" RenderOptions.BitmapInterpolationMode="HighQuality"/>
<Image.Source>
<svg:SvgImage Source="/Assets/Images/Logo/bow.svg" />
</Image.Source>
</Image>
<TextBlock Grid.Column="1" <TextBlock Grid.Column="1"
FontSize="24" FontSize="24"
VerticalAlignment="Center" VerticalAlignment="Center"

View File

@ -62,18 +62,6 @@
"System.Reactive": "5.0.0" "System.Reactive": "5.0.0"
} }
}, },
"Avalonia.Svg.Skia": {
"type": "Direct",
"requested": "[0.10.12, )",
"resolved": "0.10.12",
"contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==",
"dependencies": {
"Avalonia": "0.10.12",
"Avalonia.Skia": "0.10.12",
"SkiaSharp": "2.88.0-preview.178",
"Svg.Skia": "0.5.12"
}
},
"Avalonia.Xaml.Behaviors": { "Avalonia.Xaml.Behaviors": {
"type": "Direct", "type": "Direct",
"requested": "[0.10.13.3, )", "requested": "[0.10.13.3, )",
@ -307,11 +295,6 @@
"Unosquare.Swan.Lite": "3.0.0" "Unosquare.Swan.Lite": "3.0.0"
} }
}, },
"Fizzler": {
"type": "Transitive",
"resolved": "1.2.0",
"contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg=="
},
"Flurl": { "Flurl": {
"type": "Transitive", "type": "Transitive",
"resolved": "3.0.2", "resolved": "3.0.2",
@ -754,20 +737,6 @@
"Serilog": "2.10.0" "Serilog": "2.10.0"
} }
}, },
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ=="
},
"SkiaSharp.HarfBuzz": {
"type": "Transitive",
"resolved": "2.88.0-preview.178",
"contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==",
"dependencies": {
"HarfBuzzSharp": "2.8.2-preview.178",
"SkiaSharp": "2.88.0-preview.178"
}
},
"SkiaSharp.NativeAssets.Linux": { "SkiaSharp.NativeAssets.Linux": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -796,37 +765,6 @@
"resolved": "14.1.45", "resolved": "14.1.45",
"contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw=="
}, },
"Svg.Custom": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==",
"dependencies": {
"Fizzler": "1.2.0",
"System.Memory": "4.5.3",
"System.ObjectModel": "4.3.0",
"System.ValueTuple": "4.5.0"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==",
"dependencies": {
"ShimSkiaSharp": "0.5.12",
"Svg.Custom": "0.5.12"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==",
"dependencies": {
"SkiaSharp": "2.88.0-preview.178",
"SkiaSharp.HarfBuzz": "2.88.0-preview.178",
"Svg.Custom": "0.5.12",
"Svg.Model": "0.5.12"
}
},
"System.AppContext": { "System.AppContext": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1785,7 +1723,6 @@
"Artemis.Core": "1.0.0", "Artemis.Core": "1.0.0",
"Avalonia": "0.10.13", "Avalonia": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",

View File

@ -163,17 +163,6 @@
"SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178"
} }
}, },
"Avalonia.Svg.Skia": {
"type": "Transitive",
"resolved": "0.10.12",
"contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==",
"dependencies": {
"Avalonia": "0.10.12",
"Avalonia.Skia": "0.10.12",
"SkiaSharp": "2.88.0-preview.178",
"Svg.Skia": "0.5.12"
}
},
"Avalonia.Win32": { "Avalonia.Win32": {
"type": "Transitive", "type": "Transitive",
"resolved": "0.10.13", "resolved": "0.10.13",
@ -245,11 +234,6 @@
"Unosquare.Swan.Lite": "3.0.0" "Unosquare.Swan.Lite": "3.0.0"
} }
}, },
"Fizzler": {
"type": "Transitive",
"resolved": "1.2.0",
"contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg=="
},
"FluentAvaloniaUI": { "FluentAvaloniaUI": {
"type": "Transitive", "type": "Transitive",
"resolved": "1.3.4", "resolved": "1.3.4",
@ -704,20 +688,6 @@
"Serilog": "2.10.0" "Serilog": "2.10.0"
} }
}, },
"ShimSkiaSharp": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ=="
},
"SkiaSharp.HarfBuzz": {
"type": "Transitive",
"resolved": "2.88.0-preview.178",
"contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==",
"dependencies": {
"HarfBuzzSharp": "2.8.2-preview.178",
"SkiaSharp": "2.88.0-preview.178"
}
},
"SkiaSharp.NativeAssets.Linux": { "SkiaSharp.NativeAssets.Linux": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.88.0-preview.178", "resolved": "2.88.0-preview.178",
@ -746,37 +716,6 @@
"resolved": "14.1.45", "resolved": "14.1.45",
"contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw=="
}, },
"Svg.Custom": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==",
"dependencies": {
"Fizzler": "1.2.0",
"System.Memory": "4.5.3",
"System.ObjectModel": "4.3.0",
"System.ValueTuple": "4.5.0"
}
},
"Svg.Model": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==",
"dependencies": {
"ShimSkiaSharp": "0.5.12",
"Svg.Custom": "0.5.12"
}
},
"Svg.Skia": {
"type": "Transitive",
"resolved": "0.5.12",
"contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==",
"dependencies": {
"SkiaSharp": "2.88.0-preview.178",
"SkiaSharp.HarfBuzz": "2.88.0-preview.178",
"Svg.Custom": "0.5.12",
"Svg.Model": "0.5.12"
}
},
"System.AppContext": { "System.AppContext": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.3.0", "resolved": "4.3.0",
@ -1735,7 +1674,6 @@
"Artemis.Core": "1.0.0", "Artemis.Core": "1.0.0",
"Avalonia": "0.10.13", "Avalonia": "0.10.13",
"Avalonia.ReactiveUI": "0.10.13", "Avalonia.ReactiveUI": "0.10.13",
"Avalonia.Svg.Skia": "0.10.12",
"Avalonia.Xaml.Behaviors": "0.10.13.3", "Avalonia.Xaml.Behaviors": "0.10.13.3",
"DynamicData": "7.5.4", "DynamicData": "7.5.4",
"FluentAvaloniaUI": "1.3.4", "FluentAvaloniaUI": "1.3.4",