Skip to content

Commit

Permalink
Add "copy as PathGeometry"
Browse files Browse the repository at this point in the history
  • Loading branch information
JKamsker authored and punker76 committed Jun 6, 2024
1 parent e470240 commit c47c609
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 7 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -358,3 +358,4 @@ MigrationBackup/

# XamlStyler
!XamlStyler/
/.nuke/temp
21 changes: 18 additions & 3 deletions src/IconPacks.Browser/Controls/SideBar.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="300" MinHeight="50" />
<RowDefinition Height="150" MinHeight="50" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
Expand Down Expand Up @@ -81,7 +81,7 @@

<StackPanel Grid.Row="2">

<Expander Margin="0 2 0 0" Header="Icon Information">
<Expander Margin="0 2 0 0" Header="Icon Information" IsExpanded="False">
<StackPanel>
<mah:MetroHeader Padding="2 0"
DataContext="{Binding SelectedIcon}"
Expand Down Expand Up @@ -109,7 +109,7 @@

<Expander Margin="0 5 0 0"
Header="Preview options"
IsExpanded="True">
IsExpanded="False">
<StackPanel>
<mah:MetroHeader Header="Iconsize ">
<ComboBox x:Name="ComboBoxIconPreviewSize"
Expand Down Expand Up @@ -157,6 +157,21 @@
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardText}" />
</mah:MetroHeader>

<mah:MetroHeader>
<mah:MetroHeader.Header>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconEvaIcons Width="20"
Height="10"
VerticalAlignment="Center"
Kind="Code" />
<TextBlock VerticalAlignment="Center" Text="Copy icon as WPF-PathGeometry" />
</StackPanel>
</StackPanel>
</mah:MetroHeader.Header>
<ctrls:CopyToClipboardTextBox FontFamily="Consolas" TextToCopy="{Binding CopyToClipboardWpfGeometry}" />
</mah:MetroHeader>

<!-- Content Markup -->
<mah:MetroHeader>
<mah:MetroHeader.Header>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<PathGeometry x:Key="@IconKind">@PathData</PathGeometry>
3 changes: 3 additions & 0 deletions src/IconPacks.Browser/IconPacks.Browser.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@

<ItemGroup>
<_SettingsFiles Remove="Properties\Settings.settings" />
<None Update="ExportTemplates\Clipboard.WPF.Geometry.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="ExportTemplates\Clipboard.Content.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
Expand Down
44 changes: 41 additions & 3 deletions src/IconPacks.Browser/Model/ExportHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Globalization;
using System.IO;
using System.Windows.Media;

using IconPacks.Browser.Properties;
using IconPacks.Browser.ViewModels;

Expand All @@ -11,30 +12,42 @@ internal class ExportHelper
{
// SVG-File
private static string _SvgFileTemplate;

internal static string SvgFileTemplate => _SvgFileTemplate ??= LoadTemplateString("SVG.xml");

// XAML-File (WPF)
private static string _WpfFileTemplate;

internal static string WpfFileTemplate => _WpfFileTemplate ??= LoadTemplateString("WPF.xml");

// XAML-File (WPF)
private static string _UwpFileTemplate;

internal static string UwpFileTemplate => _UwpFileTemplate ??= LoadTemplateString("WPF.xml");

// Clipboard - WPF
private static string _ClipboardWpf;

internal static string ClipboardWpf => _ClipboardWpf ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.WPF.xml"));

// Clipboard - WPF
private static string _ClipboardWpfGeometry;

internal static string ClipboardWpfGeometry => _ClipboardWpfGeometry ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.WPF.Geometry.xml"));

// Clipboard - UWP
private static string _ClipboardUwp;

internal static string ClipboardUwp => _ClipboardUwp ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.UWP.xml"));

// Clipboard - Content
private static string _ClipboardContent;

internal static string ClipboardContent => _ClipboardContent ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.Content.xml"));

// Clipboard - PathData
private static string _ClipboardData;

internal static string ClipboardData => _ClipboardData ??= File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ExportTemplates", "Clipboard.PathData.xml"));

internal static string FillTemplate(string template, ExportParameters parameters)
Expand All @@ -45,7 +58,7 @@ internal static string FillTemplate(string template, ExportParameters parameters
.Replace("@IconPackLicense", parameters.IconPackLicense)
.Replace("@PageWidth", parameters.PageWidth)
.Replace("@PageHeight", parameters.PageHeight)
.Replace("@PathData", parameters.PathData)
.CheckedReplace("@PathData", () => parameters.PathData) // avoid allocation of Lazy<string>
.Replace("@FillColor", parameters.FillColor)
.Replace("@Background", parameters.Background)
.Replace("@StrokeColor", parameters.StrokeColor)
Expand All @@ -71,7 +84,7 @@ internal static string LoadTemplateString(string fileName)
internal struct ExportParameters
{
/// <summary>
/// Provides a default set of Export parameters. You should edit this to your needs.
/// Provides a default set of Export parameters. You should edit this to your needs.
/// </summary>
/// <param name="icon"></param>
internal ExportParameters(IIconViewModel icon)
Expand All @@ -93,15 +106,27 @@ internal ExportParameters(IIconViewModel icon)

this.IconPackHomepage = metaData?.ProjectUrl;
this.IconPackLicense = metaData?.LicenseUrl;

//this.PathData = (icon as IconViewModel)?.GetPackIconControlBase().Data;
_pathDataLazy = new Lazy<string>(() => (icon as IconViewModel)?.GetPackIconControlBase().Data);
}

private Lazy<string> _pathDataLazy;
private string _pathData;

internal string IconKind { get; set; }
internal string IconPackName { get; set; }
internal string IconPackHomepage { get; set; }
internal string IconPackLicense { get; set; }
internal string PageWidth { get; set; }
internal string PageHeight { get; set; }
internal string PathData { get; set; }

internal string PathData
{
get => _pathData ?? _pathDataLazy.Value;
set => _pathData = value;
}

internal string FillColor { get; set; }
internal string Background { get; set; }
internal string StrokeColor { get; set; }
Expand All @@ -110,4 +135,17 @@ internal ExportParameters(IIconViewModel icon)
internal string StrokeLineJoin { get; set; }
internal string TransformMatrix { get; set; }
}

internal static class ExportHelperExtensions
{
internal static string CheckedReplace(this string input, string oldValue, Func<string> newValue)
{
if (input.Contains(oldValue))
{
return input.Replace(oldValue, newValue());
}

return input;
}
}
}
4 changes: 3 additions & 1 deletion src/IconPacks.Browser/ViewModels/IconPackViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -491,12 +491,13 @@ public IconViewModel(Type enumType, Type packType, Enum k, MetaDataAttribute met
}

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

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

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

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

public string Name { get; set; }

Expand All @@ -515,6 +516,7 @@ public IconViewModel(Type enumType, Type packType, Enum k, MetaDataAttribute met
internal PackIconControlBase GetPackIconControlBase()
{
if (Activator.CreateInstance(IconPackType) is not PackIconControlBase iconPack) return null;

var kindProperty = IconPackType.GetProperty("Kind");
if (kindProperty == null) return null;
kindProperty.SetValue(iconPack, Value);
Expand Down

0 comments on commit c47c609

Please sign in to comment.