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

Shared UI - Added icons control supporting PackIcons and SVGs

This commit is contained in:
SpoinkyNL 2020-10-15 00:36:24 +02:00
parent 3bbb04dd17
commit e6417585b5
5 changed files with 124 additions and 1 deletions

View File

@ -40,6 +40,7 @@
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.19" />
<PackageReference Include="Ninject" Version="3.3.4" />
<PackageReference Include="Ninject.Extensions.Conventions" Version="3.3.0" />
<PackageReference Include="SharpVectors.Reloaded" Version="1.6.0" />
<PackageReference Include="SkiaSharp" Version="1.68.3" />
<PackageReference Include="SkiaSharp.Views.WPF" Version="1.68.3" />
<PackageReference Include="Stylet" Version="1.3.4" />

View File

@ -0,0 +1,30 @@
<UserControl x:Class="Artemis.UI.Shared.Controls.ArtemisIcon"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.UI.Shared.Controls"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:system="clr-namespace:System;assembly=System.Runtime"
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<ContentControl Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Icon}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Focusable="False">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type system:Uri}">
<Rectangle Fill="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Foreground}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Uniform">
<VisualBrush.Visual>
<svgc:SvgViewbox Source="{Binding}" Name="SvgDisplay"/>
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.OpacityMask>
</Rectangle>
</DataTemplate>
<DataTemplate DataType="{x:Type materialDesign:PackIconKind}">
<materialDesign:PackIcon Kind="{Binding}" Width="Auto" Height="Auto"/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</UserControl>

View File

@ -0,0 +1,88 @@
using System;
using System.Windows;
using System.Windows.Controls;
using MaterialDesignThemes.Wpf;
namespace Artemis.UI.Shared.Controls
{
/// <summary>
/// Interaction logic for ArtemisIcon.xaml
/// </summary>
public partial class ArtemisIcon : UserControl
{
public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(object), typeof(ArtemisIcon),
new FrameworkPropertyMetadata(IconPropertyChangedCallback));
public static readonly DependencyProperty PackIconProperty = DependencyProperty.Register(nameof(PackIcon), typeof(PackIconKind?), typeof(ArtemisIcon),
new FrameworkPropertyMetadata(IconPropertyChangedCallback));
public static readonly DependencyProperty SvgSourceProperty = DependencyProperty.Register(nameof(SvgSource), typeof(Uri), typeof(ArtemisIcon),
new FrameworkPropertyMetadata(IconPropertyChangedCallback));
private bool _inCallback;
public ArtemisIcon()
{
InitializeComponent();
}
/// <summary>
/// Gets or sets the currently displayed icon as either a <see cref="PackIconKind" /> or an <see cref="Uri" /> pointing
/// to an SVG
/// </summary>
public object Icon
{
get => GetValue(IconProperty);
set => SetValue(IconProperty, value);
}
/// <summary>
/// Gets or sets the <see cref="PackIconKind" />
/// </summary>
public PackIconKind? PackIcon
{
get => (PackIconKind?) GetValue(PackIconProperty);
set => SetValue(PackIconProperty, value);
}
/// <summary>
/// Gets or sets the <see cref="Uri" /> pointing to the SVG
/// </summary>
public Uri SvgSource
{
get => (Uri) GetValue(SvgSourceProperty);
set => SetValue(SvgSourceProperty, value);
}
private static void IconPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ArtemisIcon artemisIcon = (ArtemisIcon) d;
if (artemisIcon._inCallback)
return;
try
{
artemisIcon._inCallback = true;
if (artemisIcon.PackIcon != null)
{
artemisIcon.Icon = artemisIcon.PackIcon;
}
else if (artemisIcon.SvgSource != null)
{
artemisIcon.Icon = artemisIcon.SvgSource;
}
else if (artemisIcon.Icon is string iconString)
{
if (Uri.TryCreate(iconString, UriKind.Absolute, out Uri uriResult))
artemisIcon.Icon = uriResult;
else if (Enum.TryParse(typeof(PackIconKind), iconString, true, out object result))
artemisIcon.Icon = result;
}
}
finally
{
artemisIcon._inCallback = false;
}
}
}
}

View File

@ -88,6 +88,7 @@
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\Fonts\RobotoMono-Regular.ttf" />
<Resource Include="Resources\Images\Logo\bow.svg" />
<Resource Include="Resources\Images\Logo\logo-512.ico" />
<Resource Include="Resources\Images\Logo\logo-512.png" />
</ItemGroup>
@ -304,6 +305,7 @@
</ItemGroup>
<ItemGroup>
<None Remove="Resources\Fonts\RobotoMono-Regular.ttf" />
<None Remove="Resources\Images\Logo\bow.svg" />
<None Remove="Resources\Images\Logo\logo-512.ico" />
<None Remove="Resources\Images\Sidebar\sidebar-header.png" />
</ItemGroup>

View File

@ -6,6 +6,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:home="clr-namespace:Artemis.UI.Screens.Home"
xmlns:controls="clr-namespace:Artemis.UI.Shared.Controls;assembly=Artemis.UI.Shared"
mc:Ignorable="d"
d:DesignHeight="574.026"
d:DesignWidth="1029.87"
@ -35,7 +36,8 @@
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="/Resources/Images/Logo/logo-512.png" Stretch="Uniform" Width="100" Height="100" />
<controls:ArtemisIcon SvgSource="/Resources/Images/Logo/bow.svg" Width="100" Height="100"/>
<StackPanel Grid.Column="1" Margin="24 0 0 0" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignHeadline4TextBlock}" TextWrapping="Wrap">Welcome to Artemis, RGB on steroids.</TextBlock>
<Button Style="{StaticResource MaterialDesignFlatButton}"