Skip to content

Commit c6774f1

Browse files
authored
Adding icon generator to the demo app (#2284)
* Adding icon generator to the demo app * Fixing build warnings
1 parent badc72e commit c6774f1

File tree

5 files changed

+174
-21
lines changed

5 files changed

+174
-21
lines changed

Directory.packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<Project>
22
<ItemGroup>
3+
<PackageVersion Include="BluwolfIcons" Version="1.0.1" />
34
<PackageVersion Include="Dragablz" Version="0.0.3.223" />
45
<PackageVersion Include="Humanizer" Version="2.8.26" />
56
<PackageVersion Include="MahApps.Metro" Version="2.3.0" />
@@ -17,7 +18,7 @@
1718
<PackageVersion Include="ShowMeTheXAML" Version="2.0.0" />
1819
<PackageVersion Include="ShowMeTheXAML.AvalonEdit" Version="2.0.0" />
1920
<PackageVersion Include="ShowMeTheXAML.MSBuild" Version="2.0.0" />
20-
<PackageVersion Include="VirtualizingWrapPanel" Version="1.5.2" />
21+
<PackageVersion Include="VirtualizingWrapPanel" Version="1.5.3" />
2122
<PackageVersion Include="XAMLTest" Version="0.0.9" />
2223
<PackageVersion Include="xunit" Version="2.4.1" />
2324
<PackageVersion Include="xunit.runner.visualstudio" Version="2.4.3" />

MainDemo.Wpf/Converters/ColorToBrushConverter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
namespace MaterialDesignDemo.Converters
77
{
8+
[ValueConversion(typeof(Color), typeof(Brush))]
89
public class ColorToBrushConverter : IValueConverter
910
{
1011
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

MainDemo.Wpf/Domain/IconPackViewModel.cs

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
using System.Threading.Tasks;
55
using System.Windows;
66
using System.Windows.Input;
7+
using System.Windows.Media;
78
using MaterialDesignThemes.Wpf;
9+
using MaterialDesignDemo.Domain;
10+
using Microsoft.Win32;
11+
using BluwolfIcons;
12+
using System.Windows.Media.Imaging;
13+
using System.IO;
814

915
namespace MaterialDesignDemo.Domain
1016
{
@@ -23,12 +29,22 @@ public IconPackViewModel(ISnackbarMessageQueue snackbarMessageQueue)
2329

2430
_packIconKinds = new Lazy<IEnumerable<PackIconKindGroup>>(() =>
2531
Enum.GetNames(typeof(PackIconKind))
26-
.GroupBy(k => (PackIconKind) Enum.Parse(typeof(PackIconKind), k))
32+
.GroupBy(k => (PackIconKind)Enum.Parse(typeof(PackIconKind), k))
2733
.Select(g => new PackIconKindGroup(g))
2834
.OrderBy(x => x.Kind)
2935
.ToList());
36+
37+
var helper = new PaletteHelper();
38+
if (helper.GetThemeManager() is { } themeManager)
39+
{
40+
themeManager.ThemeChanged += ThemeManager_ThemeChanged;
41+
}
42+
SetDefaultIconColors();
3043
}
3144

45+
private void ThemeManager_ThemeChanged(object? sender, ThemeChangedEventArgs e)
46+
=> SetDefaultIconColors();
47+
3248
public ICommand OpenDotComCommand { get; }
3349
public ICommand SearchCommand { get; }
3450
public ICommand CopyToClipboardCommand { get; }
@@ -62,7 +78,9 @@ public string? Kind
6278
set
6379
{
6480
if (SetProperty(ref _kind, value))
65-
PackIconKind = value != null ? (PackIconKind) Enum.Parse(typeof(PackIconKind), value) : default;
81+
{
82+
PackIconKind = value != null ? (PackIconKind)Enum.Parse(typeof(PackIconKind), value) : default;
83+
}
6684
}
6785
}
6886

@@ -73,15 +91,15 @@ public PackIconKind PackIconKind
7391
}
7492

7593
private void OpenDotCom(object obj)
76-
{
77-
Link.OpenInBrowser("https://materialdesignicons.com/");
78-
}
94+
=> Link.OpenInBrowser("https://materialdesignicons.com/");
7995

8096
private async void Search(object obj)
8197
{
8298
var text = obj as string;
8399
if (string.IsNullOrWhiteSpace(text))
100+
{
84101
Kinds = _packIconKinds.Value;
102+
}
85103
else
86104
{
87105
Kinds = await Task.Run(() => _packIconKinds.Value
@@ -96,5 +114,75 @@ private void CopyToClipboard(object obj)
96114
Clipboard.SetDataObject(toBeCopied);
97115
_snackbarMessageQueue.Enqueue(toBeCopied + " copied to clipboard");
98116
}
117+
118+
private void SetDefaultIconColors()
119+
{
120+
var helper = new PaletteHelper();
121+
ITheme theme = helper.GetTheme();
122+
GeneratedIconBackground = theme.Paper;
123+
GeneratedIconForeground = theme.PrimaryMid.Color;
124+
}
125+
126+
private Color _generatedIconBackground;
127+
public Color GeneratedIconBackground
128+
{
129+
get => _generatedIconBackground;
130+
set => SetProperty(ref _generatedIconBackground, value);
131+
}
132+
133+
private Color _generatedIconForeground;
134+
public Color GeneratedIconForeground
135+
{
136+
get => _generatedIconForeground;
137+
set => SetProperty(ref _generatedIconForeground, value);
138+
}
139+
140+
private ICommand? _saveIconCommand;
141+
public ICommand SaveIconCommand => _saveIconCommand ??= new AnotherCommandImplementation(OnSaveIcon);
142+
143+
private void OnSaveIcon(object _)
144+
{
145+
var saveDialog = new SaveFileDialog
146+
{
147+
DefaultExt = ".ico",
148+
Title = "Save Icon (.ico)",
149+
Filter = "Icon Files|*.ico|All Files|*",
150+
CheckPathExists = true,
151+
OverwritePrompt = true,
152+
RestoreDirectory = true
153+
};
154+
if (saveDialog.ShowDialog() != true) return;
155+
156+
var icon = new Icon();
157+
158+
//TODO: Make this size list configurable
159+
foreach (var size in new[] { 256, 128, 64, 48, 32, 24, 16 })
160+
{
161+
RenderTargetBitmap bmp = RenderImage(size);
162+
icon.Images.Add(new BmpIconImage(bmp));
163+
}
164+
165+
icon.Save(saveDialog.FileName);
166+
167+
RenderTargetBitmap RenderImage(int size)
168+
{
169+
var packIcon = new PackIcon
170+
{
171+
Kind = PackIconKind,
172+
Background = new SolidColorBrush(GeneratedIconBackground),
173+
Foreground = new SolidColorBrush(GeneratedIconForeground),
174+
Width = size,
175+
Height = size,
176+
Style = (Style)Application.Current.FindResource(typeof(PackIcon))
177+
};
178+
packIcon.Measure(new Size(size, size));
179+
packIcon.Arrange(new Rect(0, 0, size, size));
180+
packIcon.UpdateLayout();
181+
182+
RenderTargetBitmap bmp = new(size, size, 96, 96, PixelFormats.Pbgra32);
183+
bmp.Render(packIcon);
184+
return bmp;
185+
}
186+
}
99187
}
100188
}

MainDemo.Wpf/IconPack.xaml

Lines changed: 75 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
xmlns:converters="clr-namespace:MaterialDesignDemo.Converters"
1111
xmlns:system="clr-namespace:System;assembly=mscorlib"
1212
xmlns:virtualCollection="clr-namespace:WpfToolkit.Controls;assembly=VirtualizingWrapPanel"
13+
d:DataContext="{d:DesignInstance Type=domain:IconPackViewModel}"
1314
mc:Ignorable="d"
1415
d:DesignHeight="300"
15-
d:DesignWidth="300"
16-
d:DataContext="{d:DesignInstance domain:IconPackViewModel}">
17-
16+
d:DesignWidth="300">
17+
1818
<UserControl.Resources>
1919
<ResourceDictionary>
2020
<ResourceDictionary.MergedDictionaries>
@@ -24,16 +24,17 @@
2424

2525
<materialDesign:NullableToVisibilityConverter x:Key="NullableToVisibilityConverter"/>
2626
<converters:StringJoinConverter x:Key="StringJoinConverter" Separator="{x:Static system:Environment.NewLine}"/>
27+
<converters:ColorToBrushConverter x:Key="ColorToBrushConverter" />
2728
</ResourceDictionary>
2829
</UserControl.Resources>
29-
30+
3031
<Grid>
3132
<Grid.RowDefinitions>
3233
<RowDefinition Height="Auto"/>
3334
<RowDefinition Height="*"/>
3435
<RowDefinition Height="Auto"/>
3536
</Grid.RowDefinitions>
36-
37+
3738
<StackPanel>
3839
<TextBlock
3940
Style="{StaticResource MaterialDesignHeadline3TextBlock}"
@@ -43,13 +44,13 @@
4344
Style="{StaticResource MaterialDesignHeadline5TextBlock}"
4445
Margin="0 8 0 0"
4546
Text="Material Design In XAML Toolkit includes the Material Design Icons collection."/>
46-
47+
4748
<TextBlock Margin="0 12 0 0">
4849
For more information on Material Design Icons see the official website:
4950
<Hyperlink Command="{Binding OpenDotComCommand}">materialdesignicons.com</Hyperlink>
5051
</TextBlock>
5152
</StackPanel>
52-
53+
5354
<ListBox
5455
Grid.Row="1"
5556
Margin="0 8 0 0"
@@ -63,7 +64,7 @@
6364
<virtualCollection:VirtualizingWrapPanel />
6465
</ItemsPanelTemplate>
6566
</ListBox.ItemsPanel>
66-
67+
6768
<ListBox.ItemTemplate>
6869
<DataTemplate DataType="materialDesignDemo:PackIconKindGroup">
6970
<DockPanel
@@ -76,7 +77,7 @@
7677
DockPanel.Dock="Bottom"
7778
TextTrimming="CharacterEllipsis"
7879
HorizontalAlignment="Center"/>
79-
80+
8081
<materialDesign:PackIcon
8182
Kind="{Binding Kind}"
8283
VerticalAlignment="Center"
@@ -87,7 +88,7 @@
8788
</DataTemplate>
8889
</ListBox.ItemTemplate>
8990
</ListBox>
90-
91+
9192
<materialDesign:ColorZone
9293
Mode="PrimaryLight"
9394
Grid.Row="2"
@@ -105,7 +106,7 @@
105106
<ColumnDefinition Width="Auto"/>
106107
<ColumnDefinition Width="*"/>
107108
</Grid.ColumnDefinitions>
108-
109+
109110
<Button
110111
x:Name="SearchButton"
111112
Style="{DynamicResource MaterialDesignToolButton}"
@@ -117,7 +118,7 @@
117118
Kind="Magnify"
118119
Opacity=".56"/>
119120
</Button>
120-
121+
121122
<TextBox
122123
Grid.Column="1"
123124
Margin="5 0 0 0"
@@ -135,7 +136,7 @@
135136
Style="{StaticResource MaterialDesignSubtitle1TextBlock}"
136137
VerticalAlignment="Center"
137138
Text="Usage:"/>
138-
139+
139140
<materialDesign:ColorZone
140141
Mode="Standard"
141142
Margin="8"
@@ -150,12 +151,12 @@
150151
GotFocus="TextBox_OnGotFocus"
151152
Text="{Binding Kind, StringFormat='&lt;materialDesign:PackIcon Kind=&quot;{0}&quot; \/>'}"/>
152153
</materialDesign:ColorZone>
153-
154+
154155
<materialDesign:PackIcon
155156
Kind="{Binding PackIconKind}"
156157
VerticalAlignment="Center"
157158
Visibility="{Binding Kind, Converter={StaticResource NullableToVisibilityConverter}}"/>
158-
159+
159160
<Button
160161
Margin="8 0"
161162
Command="{Binding CopyToClipboardCommand, Mode=OneTime}"
@@ -167,6 +168,65 @@
167168
Margin="8 0 0 0"/>
168169
</StackPanel>
169170
</Button>
171+
172+
<materialDesign:PopupBox StaysOpen="True" >
173+
<materialDesign:PopupBox.ToggleContent>
174+
<materialDesign:PackIcon Kind="FileExport" Width="30" Height="30"
175+
ToolTip="Export pack icon as icon file (.ico)"/>
176+
</materialDesign:PopupBox.ToggleContent>
177+
<StackPanel Width="300" Margin="8,8,8,8">
178+
<Grid>
179+
<Grid.ColumnDefinitions>
180+
<ColumnDefinition />
181+
<ColumnDefinition Width="Auto"/>
182+
</Grid.ColumnDefinitions>
183+
<Grid.RowDefinitions>
184+
<RowDefinition Height="Auto" />
185+
<RowDefinition Height="Auto" />
186+
</Grid.RowDefinitions>
187+
<TextBlock Text="Generate Icon (.ioc file)"
188+
Style="{StaticResource MaterialDesignHeadline6TextBlock}"/>
189+
<Border BorderThickness="1"
190+
BorderBrush="{DynamicResource MaterialDesignBody}"
191+
HorizontalAlignment="Center"
192+
CornerRadius="4"
193+
Padding="2"
194+
Margin="0,0,20,0"
195+
Grid.Column="1"
196+
Grid.RowSpan="2">
197+
<materialDesign:PackIcon
198+
Kind="{Binding PackIconKind}"
199+
Background="{Binding GeneratedIconBackground, Converter={StaticResource ColorToBrushConverter}}"
200+
Foreground="{Binding GeneratedIconForeground, Converter={StaticResource ColorToBrushConverter}}"
201+
Height="40" Width="40"
202+
Visibility="{Binding Kind, Converter={StaticResource NullableToVisibilityConverter}}"/>
203+
</Border>
204+
<StackPanel Orientation="Horizontal" Grid.Row="1" Grid.Column="0">
205+
<RadioButton Content="Foreground" IsChecked="True" x:Name="IconForeground" />
206+
<RadioButton Content="Background" Margin="10,0,0,0"/>
207+
</StackPanel>
208+
</Grid>
209+
210+
<materialDesign:ColorPicker
211+
Margin="0,10"
212+
MinHeight="100">
213+
<materialDesign:ColorPicker.Style>
214+
<Style TargetType="materialDesign:ColorPicker" BasedOn="{StaticResource {x:Type materialDesign:ColorPicker}}">
215+
<Setter Property="Color" Value="{Binding GeneratedIconBackground, Delay=25}" />
216+
<Style.Triggers>
217+
<DataTrigger Binding="{Binding IsChecked, ElementName=IconForeground}" Value="True">
218+
<Setter Property="Color" Value="{Binding GeneratedIconForeground, Delay=25}" />
219+
</DataTrigger>
220+
</Style.Triggers>
221+
</Style>
222+
</materialDesign:ColorPicker.Style>
223+
</materialDesign:ColorPicker>
224+
225+
<Button Content="_Save"
226+
Command="{Binding SaveIconCommand}"
227+
HorizontalAlignment="Right" />
228+
</StackPanel>
229+
</materialDesign:PopupBox>
170230
</StackPanel>
171231
</materialDesign:ColorZone>
172232
</Grid>

MainDemo.Wpf/MaterialDesignDemo.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
<Resource Include="favicon.ico" />
4040
</ItemGroup>
4141
<ItemGroup>
42+
<PackageReference Include="BluwolfIcons">
43+
<NoWarn>NU1701</NoWarn>
44+
</PackageReference>
4245
<PackageReference Include="VirtualizingWrapPanel" />
4346
<PackageReference Include="ShowMeTheXAML" />
4447
<PackageReference Include="ShowMeTheXAML.AvalonEdit" />

0 commit comments

Comments
 (0)