Skip to content

Commit 94066f5

Browse files
authored
Merge pull request #35 from JKamsker/PathGeometry
Add "copy as PathGeometry"
2 parents e470240 + eda0e82 commit 94066f5

File tree

9 files changed

+120
-47
lines changed

9 files changed

+120
-47
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -358,3 +358,4 @@ MigrationBackup/
358358

359359
# XamlStyler
360360
!XamlStyler/
361+
/.nuke/temp

src/IconPacks.Browser/App.xaml

+3-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,9 @@
9797
</Style>
9898

9999
<Style BasedOn="{StaticResource MahApps.Styles.MetroHeader}" TargetType="mah:MetroHeader">
100-
<Setter Property="Padding" Value="2 0 2 5" />
101-
<Setter Property="mah:HeaderedControlHelper.HeaderFontSize" Value="{DynamicResource MahApps.Sizes.Font.Content}" />
100+
<Setter Property="Padding" Value="2 0 2 4" />
101+
<Setter Property="mah:HeaderedControlHelper.HeaderMargin" Value="2 2 2 4" />
102+
<Setter Property="mah:HeaderedControlHelper.HeaderFontSize" Value="{DynamicResource MahApps.Font.Size.Content}" />
102103
</Style>
103104

104105
<Style BasedOn="{StaticResource MahApps.Styles.ColorPicker}" TargetType="mah:ColorPicker">

src/IconPacks.Browser/Controls/SideBar.xaml

+37-33
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<ScrollViewer VerticalScrollBarVisibility="Auto">
2020
<Grid>
2121
<Grid.RowDefinitions>
22-
<RowDefinition Height="300" MinHeight="50" />
22+
<RowDefinition Height="250" MinHeight="50" />
2323
<RowDefinition Height="Auto" />
2424
<RowDefinition Height="Auto" />
2525
</Grid.RowDefinitions>
@@ -83,8 +83,7 @@
8383

8484
<Expander Margin="0 2 0 0" Header="Icon Information">
8585
<StackPanel>
86-
<mah:MetroHeader Padding="2 0"
87-
DataContext="{Binding SelectedIcon}"
86+
<mah:MetroHeader DataContext="{Binding SelectedIcon}"
8887
Header="IconPackName and IconKind">
8988
<ctrls:CopyToClipboardTextBox>
9089
<ctrls:CopyToClipboardTextBox.TextToCopy>
@@ -108,8 +107,7 @@
108107
</Expander>
109108

110109
<Expander Margin="0 5 0 0"
111-
Header="Preview options"
112-
IsExpanded="True">
110+
Header="Preview options">
113111
<StackPanel>
114112
<mah:MetroHeader Header="Iconsize ">
115113
<ComboBox x:Name="ComboBoxIconPreviewSize"
@@ -145,44 +143,52 @@
145143
<mah:MetroHeader>
146144
<mah:MetroHeader.Header>
147145
<StackPanel Orientation="Horizontal">
148-
<StackPanel Orientation="Horizontal">
149-
<iconPacks:PackIconEvaIcons Width="20"
150-
Height="10"
151-
VerticalAlignment="Center"
152-
Kind="Code" />
153-
<TextBlock VerticalAlignment="Center" Text="Copy icon as WPF-Control" />
154-
</StackPanel>
146+
<iconPacks:PackIconPhosphorIcons Width="12"
147+
Height="12"
148+
VerticalAlignment="Center"
149+
Kind="BracketsAngle" />
150+
<Label VerticalAlignment="Center" Margin ="4 0" Padding="0" Content="Copy as WPF-Control" />
155151
</StackPanel>
156152
</mah:MetroHeader.Header>
157153
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardText}" />
158154
</mah:MetroHeader>
159155

156+
<mah:MetroHeader>
157+
<mah:MetroHeader.Header>
158+
<StackPanel Orientation="Horizontal">
159+
<iconPacks:PackIconPhosphorIcons Width="12"
160+
Height="12"
161+
VerticalAlignment="Center"
162+
Kind="Polygon" />
163+
<Label VerticalAlignment="Center" Margin ="4 0" Padding="0" Content="Copy as WPF-PathGeometry" />
164+
</StackPanel>
165+
</mah:MetroHeader.Header>
166+
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardWpfGeometry}" />
167+
</mah:MetroHeader>
168+
160169
<!-- Content Markup -->
161170
<mah:MetroHeader>
162171
<mah:MetroHeader.Header>
163172
<StackPanel Orientation="Horizontal">
164-
<StackPanel Orientation="Horizontal">
165-
<iconPacks:PackIconMaterial Width="20"
166-
Height="10"
167-
VerticalAlignment="Center"
168-
Kind="CodeBraces" />
169-
<TextBlock VerticalAlignment="Center" Text="Copy icon as content" />
170-
</StackPanel>
173+
<iconPacks:PackIconPhosphorIcons Width="12"
174+
Height="12"
175+
VerticalAlignment="Center"
176+
Kind="BracketsCurly" />
177+
<Label VerticalAlignment="Center" Margin ="4 0" Padding="0" Content="Copy as content extension" />
171178
</StackPanel>
172179
</mah:MetroHeader.Header>
173180
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardAsContentText}" />
174181
</mah:MetroHeader>
182+
175183
<!-- Copy as UWP Control -->
176184
<mah:MetroHeader>
177185
<mah:MetroHeader.Header>
178186
<StackPanel Orientation="Horizontal">
179-
<StackPanel Orientation="Horizontal">
180-
<iconPacks:PackIconFontAwesome Width="20"
181-
Height="10"
182-
VerticalAlignment="Center"
183-
Kind="DrawPolygonSolid" />
184-
<TextBlock VerticalAlignment="Center" Text="Copy icon as UWP-Control" />
185-
</StackPanel>
187+
<iconPacks:PackIconPhosphorIcons Width="12"
188+
Height="12"
189+
VerticalAlignment="Center"
190+
Kind="BracketsAngle" />
191+
<Label VerticalAlignment="Center" Margin ="4 0" Padding="0" Content="Copy as UWP-Control" />
186192
</StackPanel>
187193
</mah:MetroHeader.Header>
188194
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardAsPathIconText}" />
@@ -191,13 +197,11 @@
191197
<mah:MetroHeader>
192198
<mah:MetroHeader.Header>
193199
<StackPanel Orientation="Horizontal">
194-
<StackPanel Orientation="Horizontal">
195-
<iconPacks:PackIconMaterial Width="20"
196-
Height="10"
197-
VerticalAlignment="Center"
198-
Kind="Draw" />
199-
<TextBlock VerticalAlignment="Center" Text="Copy path data" />
200-
</StackPanel>
200+
<iconPacks:PackIconPhosphorIcons Width="12"
201+
Height="12"
202+
VerticalAlignment="Center"
203+
Kind="Polygon" />
204+
<Label VerticalAlignment="Center" Margin ="4 0" Padding="0" Content="Copy path data" />
201205
</StackPanel>
202206
</mah:MetroHeader.Header>
203207
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardAsGeometryText}" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<PathGeometry x:Key="@IconKind">@PathData</PathGeometry>

src/IconPacks.Browser/IconPacks.Browser.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141

4242
<ItemGroup>
4343
<_SettingsFiles Remove="Properties\Settings.settings" />
44+
<None Update="ExportTemplates\Clipboard.WPF.Geometry.xml">
45+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
46+
</None>
4447
<None Update="ExportTemplates\Clipboard.Content.xml">
4548
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
4649
</None>

src/IconPacks.Browser/MainWindow.xaml

+8-8
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@
7171
Height="22"
7272
HorizontalAlignment="Center"
7373
BorderThickness="0"
74-
Command="{x:Static viewModels:MainViewModel.CopyTextToClipboardCommand}"
75-
CommandParameter="{Binding CopyToClipboardText}"
74+
Command="{x:Static viewModels:MainViewModel.CopyToClipboardTextCommand}"
75+
CommandParameter="{Binding}"
7676
Focusable="False"
7777
IsTabStop="False"
7878
Style="{StaticResource CustomMetroCircleButtonStyle}">
@@ -91,8 +91,8 @@
9191
<Button Width="22"
9292
Height="22"
9393
BorderThickness="0"
94-
Command="{x:Static viewModels:MainViewModel.CopyTextToClipboardCommand}"
95-
CommandParameter="{Binding CopyToClipboardAsContentText}"
94+
Command="{x:Static viewModels:MainViewModel.CopyToClipboardAsContentTextCommand}"
95+
CommandParameter="{Binding}"
9696
Focusable="False"
9797
IsTabStop="False"
9898
Style="{StaticResource CustomMetroCircleButtonStyle}">
@@ -106,8 +106,8 @@
106106
<Button Width="22"
107107
Height="22"
108108
BorderThickness="0"
109-
Command="{x:Static viewModels:MainViewModel.CopyTextToClipboardCommand}"
110-
CommandParameter="{Binding CopyToClipboardAsPathIconText}"
109+
Command="{x:Static viewModels:MainViewModel.CopyToClipboardAsPathIconTextCommand}"
110+
CommandParameter="{Binding}"
111111
Focusable="False"
112112
IsTabStop="False"
113113
Style="{StaticResource CustomMetroCircleButtonStyle}">
@@ -121,8 +121,8 @@
121121
<Button Width="22"
122122
Height="22"
123123
BorderThickness="0"
124-
Command="{x:Static viewModels:MainViewModel.CopyTextToClipboardCommand}"
125-
CommandParameter="{Binding CopyToClipboardAsGeometryText}"
124+
Command="{x:Static viewModels:MainViewModel.CopyToClipboardAsGeometryTextCommand}"
125+
CommandParameter="{Binding}"
126126
Focusable="False"
127127
IsTabStop="False"
128128
Style="{StaticResource CustomMetroCircleButtonStyle}">

src/IconPacks.Browser/Model/ExportHelper.cs

+29-2
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,42 @@ internal class ExportHelper
1111
{
1212
// SVG-File
1313
private static string _SvgFileTemplate;
14+
1415
internal static string SvgFileTemplate => _SvgFileTemplate ??= LoadTemplateString("SVG.xml");
1516

1617
// XAML-File (WPF)
1718
private static string _WpfFileTemplate;
19+
1820
internal static string WpfFileTemplate => _WpfFileTemplate ??= LoadTemplateString("WPF.xml");
1921

2022
// XAML-File (WPF)
2123
private static string _UwpFileTemplate;
24+
2225
internal static string UwpFileTemplate => _UwpFileTemplate ??= LoadTemplateString("WPF.xml");
2326

2427
// Clipboard - WPF
2528
private static string _ClipboardWpf;
29+
2630
internal static string ClipboardWpf => _ClipboardWpf ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.WPF.xml"));
2731

32+
// Clipboard - WPF
33+
private static string _ClipboardWpfGeometry;
34+
35+
internal static string ClipboardWpfGeometry => _ClipboardWpfGeometry ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.WPF.Geometry.xml"));
36+
2837
// Clipboard - UWP
2938
private static string _ClipboardUwp;
39+
3040
internal static string ClipboardUwp => _ClipboardUwp ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.UWP.xml"));
3141

3242
// Clipboard - Content
3343
private static string _ClipboardContent;
44+
3445
internal static string ClipboardContent => _ClipboardContent ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.Content.xml"));
3546

3647
// Clipboard - PathData
3748
private static string _ClipboardData;
49+
3850
internal static string ClipboardData => _ClipboardData ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.PathData.xml"));
3951

4052
internal static string FillTemplate(string template, ExportParameters parameters)
@@ -45,7 +57,7 @@ internal static string FillTemplate(string template, ExportParameters parameters
4557
.Replace("@IconPackLicense", parameters.IconPackLicense)
4658
.Replace("@PageWidth", parameters.PageWidth)
4759
.Replace("@PageHeight", parameters.PageHeight)
48-
.Replace("@PathData", parameters.PathData)
60+
.CheckedReplace("@PathData", () => parameters.PathData) // avoid allocation of Lazy<string>
4961
.Replace("@FillColor", parameters.FillColor)
5062
.Replace("@Background", parameters.Background)
5163
.Replace("@StrokeColor", parameters.StrokeColor)
@@ -71,7 +83,7 @@ internal static string LoadTemplateString(string fileName)
7183
internal struct ExportParameters
7284
{
7385
/// <summary>
74-
/// Provides a default set of Export parameters. You should edit this to your needs.
86+
/// Provides a default set of Export parameters. You should edit this to your needs.
7587
/// </summary>
7688
/// <param name="icon"></param>
7789
internal ExportParameters(IIconViewModel icon)
@@ -93,6 +105,8 @@ internal ExportParameters(IIconViewModel icon)
93105

94106
this.IconPackHomepage = metaData?.ProjectUrl;
95107
this.IconPackLicense = metaData?.LicenseUrl;
108+
109+
this.PathData = (icon as IconViewModel)?.GetPackIconControlBase().Data;
96110
}
97111

98112
internal string IconKind { get; set; }
@@ -110,4 +124,17 @@ internal ExportParameters(IIconViewModel icon)
110124
internal string StrokeLineJoin { get; set; }
111125
internal string TransformMatrix { get; set; }
112126
}
127+
128+
internal static class ExportHelperExtensions
129+
{
130+
internal static string CheckedReplace(this string input, string oldValue, Func<string> newValue)
131+
{
132+
if (input.Contains(oldValue))
133+
{
134+
return input.Replace(oldValue, newValue());
135+
}
136+
137+
return input;
138+
}
139+
}
113140
}

src/IconPacks.Browser/ViewModels/IconPackViewModel.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ public interface IIconViewModel
473473
object Value { get; set; }
474474
MetaDataAttribute MetaData { get; set; }
475475
string CopyToClipboardText { get; }
476+
string CopyToClipboardWpfGeometry { get; }
476477
string CopyToClipboardAsContentText { get; }
477478
string CopyToClipboardAsPathIconText { get; }
478479
string CopyToClipboardAsGeometryText { get; }
@@ -491,12 +492,13 @@ public IconViewModel(Type enumType, Type packType, Enum k, MetaDataAttribute met
491492
}
492493

493494
public string CopyToClipboardText => ExportHelper.FillTemplate(ExportHelper.ClipboardWpf, new ExportParameters(this)); // $"<iconPacks:{IconPackType.Name} Kind=\"{Name}\" />";
495+
public string CopyToClipboardWpfGeometry => ExportHelper.FillTemplate(ExportHelper.ClipboardWpfGeometry, new ExportParameters(this)); // $"<iconPacks:{IconPackType.Name} Kind=\"{Name}\" />";
494496

495497
public string CopyToClipboardAsContentText => ExportHelper.FillTemplate(ExportHelper.ClipboardContent, new ExportParameters(this)); // $"{{iconPacks:{IconPackType.Name.Replace("PackIcon", "")} Kind={Name}}}";
496498

497499
public string CopyToClipboardAsPathIconText => ExportHelper.FillTemplate(ExportHelper.ClipboardUwp, new ExportParameters(this)); // $"<iconPacks:{IconPackType.Name.Replace("PackIcon", "PathIcon")} Kind=\"{Name}\" />";
498500

499-
public string CopyToClipboardAsGeometryText => ExportHelper.FillTemplate(ExportHelper.ClipboardData, new ExportParameters(this) { PathData = GetPackIconControlBase().Data }); // GetPackIconControlBase().Data;
501+
public string CopyToClipboardAsGeometryText => ExportHelper.FillTemplate(ExportHelper.ClipboardData, new ExportParameters(this)); // GetPackIconControlBase().Data;
500502

501503
public string Name { get; set; }
502504

@@ -515,6 +517,7 @@ public IconViewModel(Type enumType, Type packType, Enum k, MetaDataAttribute met
515517
internal PackIconControlBase GetPackIconControlBase()
516518
{
517519
if (Activator.CreateInstance(IconPackType) is not PackIconControlBase iconPack) return null;
520+
518521
var kindProperty = IconPackType.GetProperty("Kind");
519522
if (kindProperty == null) return null;
520523
kindProperty.SetValue(iconPack, Value);

0 commit comments

Comments
 (0)