Kaynağa Gözat

Icon generator

Krzysztof Krysiński 2 ay önce
ebeveyn
işleme
848b9f1505
70 değiştirilmiş dosya ile 835 ekleme ve 451 silme
  1. BIN
      src/PixiEditor.UI.Common/Fonts/PixiPerfect.ttf
  2. 31 0
      src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.Extensions.cs
  3. 190 198
      src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml
  4. 188 174
      src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml.cs
  5. 48 0
      src/PixiEditor.UI.Common/Fonts/PixiPerfectStyles.axaml
  6. 155 0
      src/PixiEditor.UI.Common/Fonts/PixiPerfectStyles.axaml.cs
  7. 32 0
      src/PixiEditor.UI.Common/Fonts/defs.svg
  8. 76 0
      src/PixiEditor.UI.Common/Fonts/gen-icons.py
  9. 1 0
      src/PixiEditor.UI.Common/Themes/PixiEditorTheme.axaml
  10. BIN
      src/PixiEditor/Images/Commands/PixiEditor/Links/OpenDocumentation.png
  11. BIN
      src/PixiEditor/Images/Commands/PixiEditor/Links/OpenRepository.png
  12. 1 1
      src/PixiEditor/Models/Commands/Evaluators/IconEvaluator.cs
  13. 2 2
      src/PixiEditor/Models/Services/NewsFeed/News.cs
  14. 1 1
      src/PixiEditor/ViewModels/Dock/ColorPickerDockViewModel.cs
  15. 1 1
      src/PixiEditor/ViewModels/Dock/ColorSlidersDockViewModel.cs
  16. 1 1
      src/PixiEditor/ViewModels/Dock/DocumentPreviewDockViewModel.cs
  17. 1 1
      src/PixiEditor/ViewModels/Dock/LayersDockViewModel.cs
  18. 1 1
      src/PixiEditor/ViewModels/Dock/NodeGraphDockViewModel.cs
  19. 1 1
      src/PixiEditor/ViewModels/Dock/PaletteViewerDockViewModel.cs
  20. 1 1
      src/PixiEditor/ViewModels/Dock/SwatchesDockViewModel.cs
  21. 1 1
      src/PixiEditor/ViewModels/Dock/TimelineDockViewModel.cs
  22. 9 9
      src/PixiEditor/ViewModels/Document/DocumentManagerViewModel.cs
  23. 1 1
      src/PixiEditor/ViewModels/Document/Nodes/Animable/EasingNodeViewModel.cs
  24. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Animable/TimeNodeViewModel.cs
  25. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/ColorNodeViewModel.cs
  26. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineChannelsNodeViewModel.cs
  27. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineColorNodeViewModel.cs
  28. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineVecDNodeViewModel.cs
  29. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineVecINodeViewModel.cs
  30. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateChannelsNodeViewModel.cs
  31. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateColorNodeViewModel.cs
  32. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateVecDNodeViewModel.cs
  33. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateVecINodeViewModel.cs
  34. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/CreateImageNodeViewModel.cs
  35. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Effects/OutlineNodeViewModel.cs
  36. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/ApplyFilterNodeViewModel.cs
  37. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/BlurNodeViewModel.cs
  38. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/ColorMatrixFilterNodeViewModel.cs
  39. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/GrayscaleNodeViewModel.cs
  40. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/KernelFilterNodeViewModel.cs
  41. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/FolderNodeViewModel.cs
  42. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/ImageLayerNodeViewModel.cs
  43. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/LerpColorNodeViewModel.cs
  44. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/MathNodeViewModel.cs
  45. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/MergeNodeViewModel.cs
  46. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/ModifyImageLeftNodeViewModel.cs
  47. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/NoiseNodeViewModel.cs
  48. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/SampleImageNodeViewModel.cs
  49. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/ShaderNodeViewModel.cs
  50. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Shapes/DistributePointsNodeViewModel.cs
  51. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Shapes/EllipseNodeViewModel.cs
  52. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Shapes/RasterizeShapeNodeViewModel.cs
  53. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Shapes/RemoveClosePointsNodeViewModel.cs
  54. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Shapes/TextNodeViewModel.cs
  55. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Shapes/TextOnPathNodeViewModel.cs
  56. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/VectorLayerNodeViewModel.cs
  57. 2 1
      src/PixiEditor/ViewModels/Document/Nodes/Workspace/CustomOutputNodeViewModel.cs
  58. 1 1
      src/PixiEditor/ViewModels/Menu/MenuBuilders/FileExitMenuBuilder.cs
  59. 4 4
      src/PixiEditor/ViewModels/Menu/MenuBuilders/SymmetryMenuBuilder.cs
  60. 2 2
      src/PixiEditor/ViewModels/Menu/MenuBuilders/ToggleGridLinesMenuBuilder.cs
  61. 2 2
      src/PixiEditor/ViewModels/Menu/MenuBuilders/ToggleHighResPreviewMenuBuilder.cs
  62. 2 2
      src/PixiEditor/ViewModels/Menu/MenuBuilders/ToggleSnappingMenuBuilder.cs
  63. 1 1
      src/PixiEditor/ViewModels/SubViewModels/ColorsViewModel.cs
  64. 5 5
      src/PixiEditor/ViewModels/SubViewModels/LayersViewModel.cs
  65. 1 1
      src/PixiEditor/ViewModels/SubViewModels/WindowViewModel.cs
  66. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RasterEllipseToolViewModel.cs
  67. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RasterLineToolViewModel.cs
  68. 1 1
      src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs
  69. 1 1
      src/PixiEditor/Views/Overlays/Handles/IconGlyph.cs
  70. 3 2
      src/PixiEditor/Views/Windows/Settings/SettingsWindow.axaml

BIN
src/PixiEditor.UI.Common/Fonts/PixiPerfect.ttf


+ 31 - 0
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.Extensions.cs

@@ -0,0 +1,31 @@
+using Avalonia.Media;
+using Avalonia.Platform;
+using PixiEditor.UI.Common.Rendering;
+
+namespace PixiEditor.UI.Common.Fonts;
+
+public static class PixiPerfectIconExtensions
+{
+    private static readonly FontFamily pixiPerfectFontFamily =
+        new("avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf#pixiperfect");
+
+
+    public static Stream GetFontStream()
+    {
+        return AssetLoader.Open(new Uri("avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf"));
+    }
+
+    public static IImage ToIcon(string unicode, double size = 18)
+    {
+        if (string.IsNullOrEmpty(unicode)) return null;
+
+        return new IconImage(unicode, pixiPerfectFontFamily, size, Colors.White);
+    }
+
+    public static IImage ToIcon(string unicode, double size, double rotation)
+    {
+        if (string.IsNullOrEmpty(unicode)) return null;
+
+        return new IconImage(unicode, pixiPerfectFontFamily, size, Colors.White, rotation);
+    }
+}

+ 190 - 198
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml

@@ -1,204 +1,196 @@
-<Styles xmlns="https://github.com/avaloniaui"
+<Styles xmlns="https://github.com/avaloniaui"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:system="clr-namespace:System;assembly=System.Runtime">
     <Styles.Resources>
         <ResourceDictionary>
-            <FontFamily x:Key="PixiPerfectIcons">avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf#pixiperfect</FontFamily>
-
-            <system:String x:Key="icon-ghost">&#xe812;</system:String>
-            <system:String x:Key="icon-add-reference">&#xE900;</system:String>
-            <system:String x:Key="icon-add-to-mask">&#xE901;</system:String>
-            <system:String x:Key="icon-alpha-lock">&#xE902;</system:String>
-            <system:String x:Key="icon-alpha-unlock">&#xE903;</system:String>
-            <system:String x:Key="icon-arrow-down">&#xE904;</system:String>
-            <system:String x:Key="icon-arrow-left">&#xE905;</system:String>
-            <system:String x:Key="icon-arrow-right">&#xE906;</system:String>
-            <system:String x:Key="icon-arrow-up">&#xE907;</system:String>
-            <system:String x:Key="icon-book">&#xE908;</system:String>
-            <system:String x:Key="icon-bucket">&#xE909;</system:String>
-            <system:String x:Key="icon-canvas-resize">&#xE90A;</system:String>
-            <system:String x:Key="icon-center">&#xE90B;</system:String>
-            <system:String x:Key="icon-chevron-down">&#xE90C;</system:String>
-            <system:String x:Key="icon-chevron-left">&#xE90D;</system:String>
-            <system:String x:Key="icon-chevron-right">&#xE90E;</system:String>
-            <system:String x:Key="icon-chevrons-down">&#xE964;</system:String>
-            <system:String x:Key="icon-chevrons-left">&#xE964;</system:String>
-            <system:String x:Key="icon-chevrons-right">&#xE966;</system:String>
-            <system:String x:Key="icon-chevrons-up">&#xE967;</system:String>
-            <system:String x:Key="icon-chevron-up">&#xE90F;</system:String>
-            <system:String x:Key="icon-circle">&#xE910;</system:String>
-            <system:String x:Key="icon-clock">&#xE911;</system:String>
-            <system:String x:Key="icon-color-palette">&#xE912;</system:String>
-            <system:String x:Key="icon-color-picker">&#xE913;</system:String>
-            <system:String x:Key="icon-color-sliders">&#xE914;</system:String>
-            <system:String x:Key="icon-colors-swap">&#xE915;</system:String>
-            <system:String x:Key="icon-compass">&#xE916;</system:String>
-            <system:String x:Key="icon-copy">&#xE917;</system:String>
-            <system:String x:Key="icon-corner-up-left">&#xE918;</system:String>
-            <system:String x:Key="icon-corner-up-right">&#xE919;</system:String>
-            <system:String x:Key="icon-create-mask">&#xE91A;</system:String>
-            <system:String x:Key="icon-crop-to-selection">&#xE91B;</system:String>
-            <system:String x:Key="icon-crop">&#xE91C;</system:String>
-            <system:String x:Key="icon-database">&#xE91D;</system:String>
-            <system:String x:Key="icon-deselect">&#xE91E;</system:String>
-            <system:String x:Key="icon-droplet">&#xE91F;</system:String>
-            <system:String x:Key="icon-duplicate-file">&#xE920;</system:String>
-            <system:String x:Key="icon-duplicate">&#xE921;</system:String>
-            <system:String x:Key="icon-edit">&#xE922;</system:String>
-            <system:String x:Key="icon-exit">&#xE923;</system:String>
-            <system:String x:Key="icon-eye-off">&#xE924;</system:String>
-            <system:String x:Key="icon-eye">&#xE925;</system:String>
-            <system:String x:Key="icon-file-minus90">&#xE926;</system:String>
-            <system:String x:Key="icon-file-plus">&#xE927;</system:String>
-            <system:String x:Key="icon-file-text">&#xE928;</system:String>
-            <system:String x:Key="icon-file">&#xE929;</system:String>
-            <system:String x:Key="icon-file90">&#xE92A;</system:String>
-            <system:String x:Key="icon-file180">&#xE92B;</system:String>
-            <system:String x:Key="icon-folder-plus">&#xE92C;</system:String>
-            <system:String x:Key="icon-folder">&#xE92D;</system:String>
-            <system:String x:Key="icon-globe">&#xE92E;</system:String>
-            <system:String x:Key="icon-grid">&#xE92F;</system:String>
-            <system:String x:Key="icon-gridlines">&#xE941;</system:String>
-            <system:String x:Key="icon-home">&#xE930;</system:String>
-            <system:String x:Key="icon-image-90">&#xE931;</system:String>
-            <system:String x:Key="icon-image">&#xE932;</system:String>
-            <system:String x:Key="icon-image90">&#xE933;</system:String>
-            <system:String x:Key="icon-image180">&#xE934;</system:String>
-            <system:String x:Key="icon-info">&#xE935;</system:String>
-            <system:String x:Key="icon-intersect">&#xE936;</system:String>
-            <system:String x:Key="icon-invert">&#xE937;</system:String>
-            <system:String x:Key="icon-lasso">&#xE938;</system:String>
-            <system:String x:Key="icon-layers">&#xE939;</system:String>
-            <system:String x:Key="icon-line">&#xE93A;</system:String>
-            <system:String x:Key="icon-lock">&#xE93B;</system:String>
-            <system:String x:Key="icon-log-out">&#xE93C;</system:String>
-            <system:String x:Key="icon-magic-wand">&#xE93D;</system:String>
-            <system:String x:Key="icon-minimize">&#xE93E;</system:String>
-            <system:String x:Key="icon-merge">&#xE93F;</system:String>
-            <system:String x:Key="icon-mouse-pointer">&#xE940;</system:String>
-            <system:String x:Key="icon-move-view">&#xE942;</system:String>
-            <system:String x:Key="icon-new-mask">&#xE943;</system:String>
-            <system:String x:Key="icon-paste">&#xE944;</system:String>
-            <system:String x:Key="icon-vector-pen">&#xE945;</system:String>
-            <system:String x:Key="icon-picker">&#xE946;</system:String>
-            <system:String x:Key="icon-plus-square">&#xE947;</system:String>
-            <system:String x:Key="icon-rectangle-selection">&#xE948;</system:String>
-            <system:String x:Key="icon-redo">&#xE949;</system:String>
-            <system:String x:Key="icon-reference-layer">&#xE94A;</system:String>
-            <system:String x:Key="icon-resize">&#xE94B;</system:String>
-            <system:String x:Key="icon-rotate-view">&#xE94C;</system:String>
-            <system:String x:Key="icon-eraser">&#xE94D;</system:String>
-            <system:String x:Key="icon-save">&#xE94E;</system:String>
-            <system:String x:Key="icon-scissors">&#xE94F;</system:String>
-            <system:String x:Key="icon-select-all">&#xE950;</system:String>
-            <system:String x:Key="icon-settings">&#xE951;</system:String>
-            <system:String x:Key="icon-sliders">&#xE952;</system:String>
-            <system:String x:Key="icon-square">&#xE953;</system:String>
-            <system:String x:Key="icon-subtract">&#xE954;</system:String>
-            <system:String x:Key="icon-sun">&#xE955;</system:String>
-            <system:String x:Key="icon-swap">&#xE956;</system:String>
-            <system:String x:Key="icon-tool">&#xE957;</system:String>
-            <system:String x:Key="icon-trash">&#xE958;</system:String>
-            <system:String x:Key="icon-undo">&#xE959;</system:String>
-            <system:String x:Key="icon-unlock">&#xE95A;</system:String>
-            <system:String x:Key="icon-x-flip">&#xE95B;</system:String>
-            <system:String x:Key="icon-x-selected-flip">&#xE95F;</system:String>
-            <system:String x:Key="icon-y-flip">&#xE95E;</system:String>
-            <system:String x:Key="icon-y-selected-flip">&#xE95C;</system:String>
-            <system:String x:Key="icon-x-symmetry">&#xE95D;</system:String>
-            <system:String x:Key="icon-y-symmetry">&#xE960;</system:String>
-            <system:String x:Key="icon-zoom-in">&#xE961;</system:String>
-            <system:String x:Key="icon-zoom-out">&#xE962;</system:String>
-            <system:String x:Key="icon-pen">&#xE971;</system:String>
-            <system:String x:Key="icon-link">&#xE96B;</system:String>
-            <system:String x:Key="icon-upload">&#xE96D;</system:String>
-            <system:String x:Key="icon-search">&#xE976;</system:String>
-            <system:String x:Key="icon-hard-drive">&#xE96C;</system:String>
-            <system:String x:Key="icon-copy-add">&#xe921;</system:String>
-            <system:String x:Key="icon-check">&#xe96a;</system:String>
-            <system:String x:Key="icon-dot">&#xe963;</system:String>
-
-            <system:String x:Key="icon-paste-reference-layer">&#xe977;</system:String>
-            <system:String x:Key="icon-paste-as-new-layer">&#xe978;</system:String>
-            <system:String x:Key="icon-star">&#xe97c;</system:String>
-            <system:String x:Key="icon-star-filled">&#xe979;</system:String>
-            <system:String x:Key="icon-reset">&#xE98A;</system:String>
-            <system:String x:Key="icon-message">&#xE96F;</system:String>
-            <system:String x:Key="icon-download">&#xE969;</system:String>
-            <system:String x:Key="icon-youtube">&#xE975;</system:String>
-            <system:String x:Key="icon-misc">&#xE968;</system:String>
-            <system:String x:Key="icon-write">&#xE970;</system:String>
-            <system:String x:Key="icon-play">&#xE981;</system:String>
-            <system:String x:Key="icon-pause">&#xE980;</system:String>
-            <system:String x:Key="icon-timeline">&#xE983;</system:String>
-            <system:String x:Key="icon-swatches">&#xE982;</system:String>
-            <system:String x:Key="icon-nodes">&#xe984;</system:String>
-            <system:String x:Key="icon-onion">&#xe985;</system:String>
-
-            <system:String x:Key="icon-lowres-circle">&#xe986;</system:String>
-            <system:String x:Key="icon-snapping">&#xe987;</system:String>
-            <system:String x:Key="icon-lowres-square">&#xe988;</system:String>
-            <system:String x:Key="icon-lowres-line">&#xe989;</system:String>
-
-            <system:String x:Key="icon-align-center">&#xE98C;</system:String>
-            <system:String x:Key="icon-bold">&#xE98D;</system:String>
-            <system:String x:Key="icon-text-antialiased">&#xE98E;</system:String>
-            <system:String x:Key="icon-italic">&#xE98F;</system:String>
-            <system:String x:Key="icon-align-stretch">&#xE990;</system:String>
-            <system:String x:Key="icon-align-left">&#xE991;</system:String>
-            <system:String x:Key="icon-letter-spacing">&#xE992;</system:String>
-            <system:String x:Key="icon-line-height">&#xE993;</system:String>
-            <system:String x:Key="icon-text-pixel">&#xE994;</system:String>
-            <system:String x:Key="icon-align-right">&#xE995;</system:String>
-            <system:String x:Key="icon-strikethrough">&#xE996;</system:String>
-            <system:String x:Key="icon-linked-pipette">&#xE997;</system:String>
-            <system:String x:Key="icon-text-underline">&#xE998;</system:String>
-            <system:String x:Key="icon-text-round">&#xE999;</system:String>
-            <system:String x:Key="icon-fullscreen">&#xE98c;</system:String>
-            <system:String x:Key="icon-outline">&#xE99a;</system:String>
-            <system:String x:Key="icon-terminal">&#xE99b;</system:String>
-            <system:String x:Key="icon-cone">&#xE99c;</system:String>
-            <system:String x:Key="icon-camera">&#xE99d;</system:String>
-
+            <FontFamily x:Key="PixiPerfectIcons">avares://PixiEditor.UI.Common/Fonts#pixiperfect</FontFamily>
+            <system:String x:Key="icon-add-reference">&#xE920;</system:String>
+            <system:String x:Key="icon-add-to-mask">&#xE921;</system:String>
+            <system:String x:Key="icon-align-left">&#xE9B1;</system:String>
+            <system:String x:Key="icon-align-right">&#xE9B5;</system:String>
+            <system:String x:Key="icon-align-stretch">&#xE9B0;</system:String>
+            <system:String x:Key="icon-alpha-lock">&#xE922;</system:String>
+            <system:String x:Key="icon-alpha-unlock">&#xE923;</system:String>
+            <system:String x:Key="icon-arrow-down">&#xE924;</system:String>
+            <system:String x:Key="icon-arrow-left">&#xE925;</system:String>
+            <system:String x:Key="icon-arrow-right">&#xE926;</system:String>
+            <system:String x:Key="icon-arrow-up">&#xE927;</system:String>
+            <system:String x:Key="icon-bold">&#xE9AD;</system:String>
+            <system:String x:Key="icon-book">&#xE928;</system:String>
+            <system:String x:Key="icon-bucket">&#xE929;</system:String>
+            <system:String x:Key="icon-camera">&#xE9BD;</system:String>
+            <system:String x:Key="icon-canvas-resize">&#xE92A;</system:String>
+            <system:String x:Key="icon-center">&#xE92B;</system:String>
+            <system:String x:Key="icon-chain">&#xE990;</system:String>
+            <system:String x:Key="icon-check">&#xE98A;</system:String>
+            <system:String x:Key="icon-chevron-down">&#xE92C;</system:String>
+            <system:String x:Key="icon-chevron-left">&#xE92D;</system:String>
+            <system:String x:Key="icon-chevron-right">&#xE92E;</system:String>
+            <system:String x:Key="icon-chevron-up">&#xE92F;</system:String>
+            <system:String x:Key="icon-chevrons-down">&#xE984;</system:String>
+            <system:String x:Key="icon-chevrons-left">&#xE985;</system:String>
+            <system:String x:Key="icon-chevrons-right">&#xE986;</system:String>
+            <system:String x:Key="icon-chevrons-up">&#xE987;</system:String>
+            <system:String x:Key="icon-circle">&#xE930;</system:String>
+            <system:String x:Key="icon-clock">&#xE931;</system:String>
+            <system:String x:Key="icon-closed-grid">&#xE913;</system:String>
+            <system:String x:Key="icon-color-palette">&#xE932;</system:String>
+            <system:String x:Key="icon-color-picker">&#xE933;</system:String>
+            <system:String x:Key="icon-color-sliders">&#xE934;</system:String>
+            <system:String x:Key="icon-colors-swap">&#xE935;</system:String>
+            <system:String x:Key="icon-compass">&#xE936;</system:String>
+            <system:String x:Key="icon-cone">&#xE9BC;</system:String>
+            <system:String x:Key="icon-copy">&#xE937;</system:String>
+            <system:String x:Key="icon-corner-up-left">&#xE938;</system:String>
+            <system:String x:Key="icon-corner-up-right">&#xE939;</system:String>
+            <system:String x:Key="icon-create-image">&#xE906;</system:String>
+            <system:String x:Key="icon-create-mask">&#xE93A;</system:String>
+            <system:String x:Key="icon-crop">&#xE93C;</system:String>
+            <system:String x:Key="icon-crop-to-selection">&#xE93B;</system:String>
+            <system:String x:Key="icon-crossroad">&#xE91D;</system:String>
+            <system:String x:Key="icon-database">&#xE93D;</system:String>
+            <system:String x:Key="icon-deselect">&#xE93E;</system:String>
+            <system:String x:Key="icon-dot">&#xE983;</system:String>
+            <system:String x:Key="icon-download">&#xE99F;</system:String>
+            <system:String x:Key="icon-download-cloud">&#xE989;</system:String>
+            <system:String x:Key="icon-droplet">&#xE93F;</system:String>
+            <system:String x:Key="icon-droplet-filled">&#xE91F;</system:String>
+            <system:String x:Key="icon-duplicate">&#xE941;</system:String>
+            <system:String x:Key="icon-duplicate-file">&#xE940;</system:String>
+            <system:String x:Key="icon-duplicate-image">&#xE907;</system:String>
+            <system:String x:Key="icon-edit">&#xE942;</system:String>
+            <system:String x:Key="icon-eraser">&#xE96D;</system:String>
+            <system:String x:Key="icon-exit">&#xE943;</system:String>
+            <system:String x:Key="icon-eye">&#xE945;</system:String>
+            <system:String x:Key="icon-eye-off">&#xE944;</system:String>
+            <system:String x:Key="icon-file">&#xE949;</system:String>
+            <system:String x:Key="icon-file-90">&#xE94A;</system:String>
+            <system:String x:Key="icon-file-ghost">&#xE99D;</system:String>
+            <system:String x:Key="icon-file-minus90">&#xE946;</system:String>
+            <system:String x:Key="icon-file-plus">&#xE947;</system:String>
+            <system:String x:Key="icon-file-text">&#xE948;</system:String>
+            <system:String x:Key="icon-file180">&#xE94B;</system:String>
+            <system:String x:Key="icon-folder">&#xE94D;</system:String>
+            <system:String x:Key="icon-folder-plus">&#xE94C;</system:String>
+            <system:String x:Key="icon-fullscreen">&#xE9AC;</system:String>
+            <system:String x:Key="icon-ghost">&#xE916;</system:String>
+            <system:String x:Key="icon-github">&#xE99A;</system:String>
+            <system:String x:Key="icon-globe">&#xE94E;</system:String>
+            <system:String x:Key="icon-grid">&#xE94F;</system:String>
+            <system:String x:Key="icon-gridlines">&#xE961;</system:String>
+            <system:String x:Key="icon-hard-drive">&#xE98C;</system:String>
+            <system:String x:Key="icon-help">&#xE99B;</system:String>
+            <system:String x:Key="icon-home">&#xE950;</system:String>
+            <system:String x:Key="icon-image">&#xE952;</system:String>
+            <system:String x:Key="icon-image-minus90">&#xE951;</system:String>
+            <system:String x:Key="icon-image180">&#xE954;</system:String>
+            <system:String x:Key="icon-image90">&#xE953;</system:String>
+            <system:String x:Key="icon-info">&#xE955;</system:String>
+            <system:String x:Key="icon-insert-item">&#xE919;</system:String>
+            <system:String x:Key="icon-intersect">&#xE956;</system:String>
+            <system:String x:Key="icon-invert">&#xE957;</system:String>
+            <system:String x:Key="icon-italic">&#xE9AF;</system:String>
+            <system:String x:Key="icon-item-slot">&#xE90C;</system:String>
+            <system:String x:Key="icon-item-slot-out">&#xE917;</system:String>
+            <system:String x:Key="icon-lasso">&#xE958;</system:String>
+            <system:String x:Key="icon-layers">&#xE959;</system:String>
+            <system:String x:Key="icon-layers-bottom">&#xE96A;</system:String>
+            <system:String x:Key="icon-layers-double">&#xE909;</system:String>
+            <system:String x:Key="icon-layers-top">&#xE994;</system:String>
+            <system:String x:Key="icon-letter-spacing">&#xE9B2;</system:String>
+            <system:String x:Key="icon-line">&#xE95A;</system:String>
+            <system:String x:Key="icon-line-height">&#xE9B3;</system:String>
+            <system:String x:Key="icon-link">&#xE98B;</system:String>
+            <system:String x:Key="icon-linked-pipette">&#xE9B7;</system:String>
+            <system:String x:Key="icon-lock">&#xE95B;</system:String>
+            <system:String x:Key="icon-log-out">&#xE95C;</system:String>
+            <system:String x:Key="icon-long-arrow-up">&#xE91B;</system:String>
+            <system:String x:Key="icon-lowres-circle">&#xE9A6;</system:String>
+            <system:String x:Key="icon-lowres-line">&#xE9A9;</system:String>
+            <system:String x:Key="icon-lowres-square">&#xE9A8;</system:String>
+            <system:String x:Key="icon-magic">&#xE90D;</system:String>
+            <system:String x:Key="icon-magic-wand">&#xE95D;</system:String>
+            <system:String x:Key="icon-mask-ghost">&#xE99E;</system:String>
+            <system:String x:Key="icon-merge">&#xE95F;</system:String>
+            <system:String x:Key="icon-message">&#xE98F;</system:String>
+            <system:String x:Key="icon-minimize">&#xE95E;</system:String>
+            <system:String x:Key="icon-mirror-horizontal">&#xE97F;</system:String>
+            <system:String x:Key="icon-mirror-vertical">&#xE97C;</system:String>
+            <system:String x:Key="icon-mouse-pointer">&#xE960;</system:String>
+            <system:String x:Key="icon-move-view">&#xE962;</system:String>
+            <system:String x:Key="icon-new-mask">&#xE963;</system:String>
+            <system:String x:Key="icon-nodes">&#xE9A4;</system:String>
+            <system:String x:Key="icon-noise">&#xE910;</system:String>
+            <system:String x:Key="icon-numbers-binary-down">&#xE915;</system:String>
+            <system:String x:Key="icon-onion">&#xE9A5;</system:String>
+            <system:String x:Key="icon-outline">&#xE9BA;</system:String>
+            <system:String x:Key="icon-paint-brush">&#xE90A;</system:String>
+            <system:String x:Key="icon-paste">&#xE964;</system:String>
+            <system:String x:Key="icon-paste-as-new-layer">&#xE998;</system:String>
+            <system:String x:Key="icon-paste-reference-layer">&#xE997;</system:String>
+            <system:String x:Key="icon-pause">&#xE9A0;</system:String>
+            <system:String x:Key="icon-pen">&#xE991;</system:String>
+            <system:String x:Key="icon-picker">&#xE966;</system:String>
+            <system:String x:Key="icon-pipette-outline">&#xE90B;</system:String>
+            <system:String x:Key="icon-placeholder">&#xE993;</system:String>
+            <system:String x:Key="icon-play">&#xE9A1;</system:String>
+            <system:String x:Key="icon-plus-minus">&#xE912;</system:String>
+            <system:String x:Key="icon-plus-square">&#xE967;</system:String>
+            <system:String x:Key="icon-points-crossed">&#xE918;</system:String>
+            <system:String x:Key="icon-put-image">&#xE908;</system:String>
+            <system:String x:Key="icon-rectangle-selection">&#xE968;</system:String>
+            <system:String x:Key="icon-redo">&#xE969;</system:String>
+            <system:String x:Key="icon-reset">&#xE9AA;</system:String>
+            <system:String x:Key="icon-resize">&#xE96B;</system:String>
+            <system:String x:Key="icon-rotate-view">&#xE96C;</system:String>
+            <system:String x:Key="icon-save">&#xE96E;</system:String>
+            <system:String x:Key="icon-scissors">&#xE96F;</system:String>
+            <system:String x:Key="icon-search">&#xE996;</system:String>
+            <system:String x:Key="icon-select-all">&#xE970;</system:String>
+            <system:String x:Key="icon-separate-vector">&#xE91C;</system:String>
+            <system:String x:Key="icon-settings">&#xE971;</system:String>
+            <system:String x:Key="icon-shuffle">&#xE992;</system:String>
+            <system:String x:Key="icon-sliders">&#xE972;</system:String>
+            <system:String x:Key="icon-snapping">&#xE9A7;</system:String>
+            <system:String x:Key="icon-spline-chart">&#xE9BE;</system:String>
+            <system:String x:Key="icon-spray">&#xE90E;</system:String>
+            <system:String x:Key="icon-square">&#xE973;</system:String>
+            <system:String x:Key="icon-star">&#xE99C;</system:String>
+            <system:String x:Key="icon-star-filled">&#xE999;</system:String>
+            <system:String x:Key="icon-star-half">&#xE9AB;</system:String>
+            <system:String x:Key="icon-step-back">&#xE9C0;</system:String>
+            <system:String x:Key="icon-step-end">&#xE9C2;</system:String>
+            <system:String x:Key="icon-step-forward">&#xE9C1;</system:String>
+            <system:String x:Key="icon-step-start">&#xE9BF;</system:String>
+            <system:String x:Key="icon-strikethrough">&#xE9B6;</system:String>
+            <system:String x:Key="icon-subtract">&#xE974;</system:String>
+            <system:String x:Key="icon-sun">&#xE975;</system:String>
+            <system:String x:Key="icon-sun-cold">&#xE90F;</system:String>
+            <system:String x:Key="icon-surveillance">&#xE91E;</system:String>
+            <system:String x:Key="icon-swap">&#xE976;</system:String>
+            <system:String x:Key="icon-swatches">&#xE9A2;</system:String>
+            <system:String x:Key="icon-take-item">&#xE914;</system:String>
+            <system:String x:Key="icon-terminal">&#xE9BB;</system:String>
+            <system:String x:Key="icon-text-antialiased">&#xE9AE;</system:String>
+            <system:String x:Key="icon-text-pixel">&#xE9B4;</system:String>
+            <system:String x:Key="icon-text-round">&#xE9B9;</system:String>
+            <system:String x:Key="icon-text-underline">&#xE9B8;</system:String>
+            <system:String x:Key="icon-timeline">&#xE9A3;</system:String>
+            <system:String x:Key="icon-tool">&#xE977;</system:String>
+            <system:String x:Key="icon-trash">&#xE978;</system:String>
+            <system:String x:Key="icon-undo">&#xE979;</system:String>
+            <system:String x:Key="icon-unlock">&#xE97A;</system:String>
+            <system:String x:Key="icon-up-vector">&#xE91A;</system:String>
+            <system:String x:Key="icon-upload">&#xE98D;</system:String>
+            <system:String x:Key="icon-upload-cloud">&#xE98E;</system:String>
+            <system:String x:Key="icon-vector-pen">&#xE965;</system:String>
+            <system:String x:Key="icon-write">&#xE988;</system:String>
+            <system:String x:Key="icon-x-flip">&#xE900;</system:String>
+            <system:String x:Key="icon-x-symmetry">&#xE980;</system:String>
+            <system:String x:Key="icon-y-symmetry">&#xE97D;</system:String>
+            <system:String x:Key="icon-youtube">&#xE995;</system:String>
+            <system:String x:Key="icon-zoom-in">&#xE981;</system:String>
+            <system:String x:Key="icon-zoom-out">&#xE982;</system:String>
         </ResourceDictionary>
     </Styles.Resources>
-
-    <Style Selector="TextBlock.pixi-icon">
-        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
-    </Style>
-
-    <Style Selector="Label.pixi-icon">
-        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
-    </Style>
-
-    <Style Selector="Run.pixi-icon">
-        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
-    </Style>
-
-    <Style Selector="Button.pixi-icon">
-        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
-        <Setter Property="Background" Value="Transparent" />
-        <Setter Property="FontSize" Value="24" />
-        <Setter Property="Padding" Value="0" />
-        <Setter Property="HorizontalContentAlignment" Value="Center" />
-        <Setter Property="VerticalContentAlignment" Value="Center" />
-    </Style>
-
-    <Style Selector="Button.pixi-icon:pointerover">
-        <Setter Property="Background" Value="Transparent" />
-    </Style>
-
-    <Style Selector="ToggleButton.pixi-icon">
-        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
-        <Setter Property="BorderThickness" Value="0" />
-        <Setter Property="Background" Value="Transparent" />
-        <Setter Property="FontSize" Value="24" />
-        <Setter Property="Padding" Value="0" />
-        <Setter Property="HorizontalContentAlignment" Value="Center" />
-        <Setter Property="VerticalContentAlignment" Value="Center" />
-    </Style>
-
-    <Style Selector="ToggleButton.pixi-icon:checked">
-        <Setter Property="Background" Value="{DynamicResource ThemeControlHighBrush}" />
-    </Style>
-</Styles>
+</Styles>

+ 188 - 174
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml.cs

@@ -1,176 +1,190 @@
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Layout;
-using Avalonia.Media;
-using Avalonia.Platform;
-using PixiEditor.UI.Common.Rendering;
-
-namespace PixiEditor.UI.Common.Fonts;
-
-//TODO: Make autogenerated from PixiPerfectIcons.axaml
-public static class PixiPerfectIcons
+public static partial class PixiPerfectIcons
 {
-    private static readonly FontFamily pixiPerfectFontFamily = new("avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf#PixiPerfect");
-    
-    public const string AddReference = "\ue900";
-    public const string AddToMask = "\ue901";
-    public const string AlphaLock = "\ue902";
-    public const string AlphaUnlock = "\ue903";
-    public const string ArrowDown = "\ue904";
-    public const string ArrowLeft = "\ue905";
-    public const string ArrowRight = "\ue906";
-    public const string ArrowUp = "\ue907";
-    public const string Book = "\ue908";
-    public const string Bucket = "\ue909";
-    public const string CanvasResize = "\ue90a";
-    public const string Center = "\ue90b";
-    public const string ChevronDown = "\ue90c";
-    public const string ChevronLeft = "\ue90d";
-    public const string ChevronRight = "\ue90e";
-    public const string ChevronUp = "\ue90f";
-    public const string Circle = "\ue910";
-    public const string Clock = "\ue911";
-    public const string ColorPalette = "\ue912";
-    public const string ColorPicker = "\ue913";
-    public const string ColorSliders = "\ue914";
-    public const string ColorsSwap = "\ue915";
-    public const string Compass = "\ue916";
-    public const string Copy = "\ue917";
-    public const string CornerUpLeft = "\ue918";
-    public const string CornerUpRight = "\ue919";
-    public const string CreateMask = "\ue91a";
-    public const string CropToSelection = "\ue91b";
-    public const string Crop = "\ue91c";
-    public const string Database = "\ue91d";
-    public const string Deselect = "\ue91e";
-    public const string Droplet = "\ue91f";
-    public const string DuplicateFile = "\ue920";
-    public const string Duplicate = "\ue921";
-    public const string Edit = "\ue922";
-    public const string Exit = "\ue923";
-    public const string EyeOff = "\ue924";
-    public const string Eye = "\ue925";
-    public const string RotateFileMinus90 = "\ue926";
-    public const string FilePlus = "\ue927";
-    public const string FileText = "\ue928";
-    public const string File = "\ue929";
-    public const string RotateFile90 = "\ue92a";
-    public const string RotateFile180 = "\ue92b";
-
-    public const string FolderPlus = "\ue92c";
-    public const string Folder = "\ue92d";
-    public const string Globe = "\ue92e";
-    public const string Grid = "\uE92F";
-    public const string GridLines = "\uE941";
-    public const string Home = "\ue930";
-    public const string RotateImageMinus90 = "\ue931";
-    public const string Image = "\ue932";
-    public const string RotateImage90 = "\ue933";
-    public const string RotateImage180 = "\ue934";
-    public const string Info = "\ue935";
-    public const string Intersect = "\ue936";
-    public const string Invert = "\ue937";
-    public const string Lasso = "\ue938";
-    public const string Layers = "\ue939";
-    public const string Line = "\ue93a";
-    public const string Lock = "\uE93B";
-    public const string LogOut = "\uE93C";
-    public const string MagicWand = "\uE93D";
-    public const string Minimize = "\uE93E";
-    public const string Merge = "\uE93F";
-    public const string MousePointer = "\uE940";
-    public const string MoveView = "\uE942";
-    public const string NewMask = "\uE943";
-    public const string Paste = "\uE944";
-    public const string VectorPen = "\uE945";
-    public const string Picker = "\uE946";
-    public const string PlusSquare = "\uE947";
-    public const string RectangleSelection = "\uE948";
-    public const string Redo = "\uE949";
-    public const string ReferenceLayer = "\uE94A";
-    public const string Resize = "\uE94B";
-    public const string RotateView = "\uE94C";
-    public const string Eraser = "\uE94D";
-    public const string Save = "\uE94E";
-    public const string Scissors = "\uE94F";
-    public const string SelectAll = "\uE950";
-    public const string Settings = "\uE951";
-    public const string Sliders = "\uE952";
-    public const string Square = "\uE953";
-    public const string Subtract = "\uE954";
-    public const string Sun = "\uE955";
-    public const string Swap = "\uE956";
-    public const string Tool = "\uE957";
-    public const string Trash = "\uE958";
-    public const string Undo = "\uE959";
-    public const string Unlock = "\uE95A";
-    public const string XFlip = "\uE95E";
-    public const string XSelectedFlip = "\uE95F";
-    public const string XSymmetry = "\uE95D";
-    public const string YFlip = "\uE95B";
-    public const string YSelectedFlip = "\uE95C";
-    public const string YSymmetry = "\uE960";
-    public const string ZoomIn = "\uE961";
-    public const string ZoomOut = "\uE962";
-    public const string PasteReferenceLayer = "\ue977";
-    public const string PasteAsNewLayer = "\ue978";
-    public const string CopyAdd = "\ue921";
-    public const string Message = "\uE96F";
-    public const string Download = "\uE969";
-    public const string YouTube = "\uE975";
-    public const string Write = "\uE968";
-    public const string Misc = "\uE970";
-    public const string Play = "\uE981";
-    public const string Pause = "\uE980";
-    public const string Swatches = "\uE982";
-    public const string Timeline = "\uE983";
-    public const string Dot = "\uE963";
-    public const string Nodes = "\uE984";
-    public const string Onion = "\uE965";
-        
-    public const string Reset = "\uE98A";
-    public const string ToggleLayerVisible = "\u25a1;"; // TODO: Create a toggle layer visible icon
-    public const string ToggleMask = "\u25a1;"; // TODO: Create a toggle mask icon
-    public const string Pen = "\uE971";
-    public const string LowResCircle = "\uE986";
-    public const string Snapping = "\ue987";
-    public const string LowResSquare = "\uE988";
-    public const string LowResLine = "\uE989";
-
-    public const string AlignCenter = "\uE98C";
-    public const string Bold = "\uE98D";
-    public const string TextAntialiased = "\uE98E";
-    public const string Italic = "\uE98F";
-    public const string AlignStretch = "\uE990";
-    public const string AlignLeft = "\uE991";
-    public const string LetterSpacing = "\uE992";
-    public const string LineHeight = "\uE993";
-    public const string TextPixel = "\uE994";
-    public const string AlignRight = "\uE995";
-    public const string Strikethrough = "\uE996";
-    public const string LinkedPipette = "\uE997";
-    public const string TextUnderline = "\uE998";
-    public const string TextRound = "\uE999";
-    public const string Cone = "\uE99c";
-    public const string Camera = "\uE99d";
-    public const string ChartSpline = "\ue99e";
-
-    public static Stream GetFontStream()
-    {
-        return AssetLoader.Open(new Uri("avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf"));
-    }
-
-    public static IImage ToIcon(string unicode, double size = 18)
-    {
-        if(string.IsNullOrEmpty(unicode)) return null;
-
-        return new IconImage(unicode, pixiPerfectFontFamily, size, Colors.White);
-    }
-    
-    public static IImage ToIcon(string unicode, double size, double rotation)
-    {
-        if(string.IsNullOrEmpty(unicode)) return null;
-
-        return new IconImage(unicode, pixiPerfectFontFamily, size, Colors.White, rotation);
-    }
+    public const string AddReference = "\uE920";
+    public const string AddToMask = "\uE921";
+    public const string AlignLeft = "\uE9B1";
+    public const string AlignRight = "\uE9B5";
+    public const string AlignStretch = "\uE9B0";
+    public const string AlphaLock = "\uE922";
+    public const string AlphaUnlock = "\uE923";
+    public const string ArrowDown = "\uE924";
+    public const string ArrowLeft = "\uE925";
+    public const string ArrowRight = "\uE926";
+    public const string ArrowUp = "\uE927";
+    public const string Bold = "\uE9AD";
+    public const string Book = "\uE928";
+    public const string Bucket = "\uE929";
+    public const string Camera = "\uE9BD";
+    public const string CanvasResize = "\uE92A";
+    public const string Center = "\uE92B";
+    public const string Chain = "\uE990";
+    public const string Check = "\uE98A";
+    public const string ChevronDown = "\uE92C";
+    public const string ChevronLeft = "\uE92D";
+    public const string ChevronRight = "\uE92E";
+    public const string ChevronUp = "\uE92F";
+    public const string ChevronsDown = "\uE984";
+    public const string ChevronsLeft = "\uE985";
+    public const string ChevronsRight = "\uE986";
+    public const string ChevronsUp = "\uE987";
+    public const string Circle = "\uE930";
+    public const string Clock = "\uE931";
+    public const string ClosedGrid = "\uE913";
+    public const string ColorPalette = "\uE932";
+    public const string ColorPicker = "\uE933";
+    public const string ColorSliders = "\uE934";
+    public const string ColorsSwap = "\uE935";
+    public const string Compass = "\uE936";
+    public const string Cone = "\uE9BC";
+    public const string Copy = "\uE937";
+    public const string CornerUpLeft = "\uE938";
+    public const string CornerUpRight = "\uE939";
+    public const string CreateImage = "\uE906";
+    public const string CreateMask = "\uE93A";
+    public const string Crop = "\uE93C";
+    public const string CropToSelection = "\uE93B";
+    public const string Crossroad = "\uE91D";
+    public const string Database = "\uE93D";
+    public const string Deselect = "\uE93E";
+    public const string Dot = "\uE983";
+    public const string Download = "\uE99F";
+    public const string DownloadCloud = "\uE989";
+    public const string Droplet = "\uE93F";
+    public const string DropletFilled = "\uE91F";
+    public const string Duplicate = "\uE941";
+    public const string DuplicateFile = "\uE940";
+    public const string DuplicateImage = "\uE907";
+    public const string Edit = "\uE942";
+    public const string Eraser = "\uE96D";
+    public const string Exit = "\uE943";
+    public const string Eye = "\uE945";
+    public const string EyeOff = "\uE944";
+    public const string File = "\uE949";
+    public const string File90 = "\uE94A";
+    public const string FileGhost = "\uE99D";
+    public const string FileMinus90 = "\uE946";
+    public const string FilePlus = "\uE947";
+    public const string FileText = "\uE948";
+    public const string File180 = "\uE94B";
+    public const string Folder = "\uE94D";
+    public const string FolderPlus = "\uE94C";
+    public const string Fullscreen = "\uE9AC";
+    public const string Ghost = "\uE916";
+    public const string Github = "\uE99A";
+    public const string Globe = "\uE94E";
+    public const string Grid = "\uE94F";
+    public const string Gridlines = "\uE961";
+    public const string HardDrive = "\uE98C";
+    public const string Help = "\uE99B";
+    public const string Home = "\uE950";
+    public const string Image = "\uE952";
+    public const string ImageMinus90 = "\uE951";
+    public const string Image180 = "\uE954";
+    public const string Image90 = "\uE953";
+    public const string Info = "\uE955";
+    public const string InsertItem = "\uE919";
+    public const string Intersect = "\uE956";
+    public const string Invert = "\uE957";
+    public const string Italic = "\uE9AF";
+    public const string ItemSlot = "\uE90C";
+    public const string ItemSlotOut = "\uE917";
+    public const string Lasso = "\uE958";
+    public const string Layers = "\uE959";
+    public const string LayersBottom = "\uE96A";
+    public const string LayersDouble = "\uE909";
+    public const string LayersTop = "\uE994";
+    public const string LetterSpacing = "\uE9B2";
+    public const string Line = "\uE95A";
+    public const string LineHeight = "\uE9B3";
+    public const string Link = "\uE98B";
+    public const string LinkedPipette = "\uE9B7";
+    public const string Lock = "\uE95B";
+    public const string LogOut = "\uE95C";
+    public const string LongArrowUp = "\uE91B";
+    public const string LowresCircle = "\uE9A6";
+    public const string LowresLine = "\uE9A9";
+    public const string LowresSquare = "\uE9A8";
+    public const string Magic = "\uE90D";
+    public const string MagicWand = "\uE95D";
+    public const string MaskGhost = "\uE99E";
+    public const string Merge = "\uE95F";
+    public const string Message = "\uE98F";
+    public const string Minimize = "\uE95E";
+    public const string MirrorHorizontal = "\uE97F";
+    public const string MirrorVertical = "\uE97C";
+    public const string MousePointer = "\uE960";
+    public const string MoveView = "\uE962";
+    public const string NewMask = "\uE963";
+    public const string Nodes = "\uE9A4";
+    public const string Noise = "\uE910";
+    public const string NumbersBinaryDown = "\uE915";
+    public const string Onion = "\uE9A5";
+    public const string Outline = "\uE9BA";
+    public const string PaintBrush = "\uE90A";
+    public const string Paste = "\uE964";
+    public const string PasteAsNewLayer = "\uE998";
+    public const string PasteReferenceLayer = "\uE997";
+    public const string Pause = "\uE9A0";
+    public const string Pen = "\uE991";
+    public const string Picker = "\uE966";
+    public const string PipetteOutline = "\uE90B";
+    public const string Placeholder = "\uE993";
+    public const string Play = "\uE9A1";
+    public const string PlusMinus = "\uE912";
+    public const string PlusSquare = "\uE967";
+    public const string PointsCrossed = "\uE918";
+    public const string PutImage = "\uE908";
+    public const string RectangleSelection = "\uE968";
+    public const string Redo = "\uE969";
+    public const string Reset = "\uE9AA";
+    public const string Resize = "\uE96B";
+    public const string RotateView = "\uE96C";
+    public const string Save = "\uE96E";
+    public const string Scissors = "\uE96F";
+    public const string Search = "\uE996";
+    public const string SelectAll = "\uE970";
+    public const string SeparateVector = "\uE91C";
+    public const string Settings = "\uE971";
+    public const string Shuffle = "\uE992";
+    public const string Sliders = "\uE972";
+    public const string Snapping = "\uE9A7";
+    public const string SplineChart = "\uE9BE";
+    public const string Spray = "\uE90E";
+    public const string Square = "\uE973";
+    public const string Star = "\uE99C";
+    public const string StarFilled = "\uE999";
+    public const string StarHalf = "\uE9AB";
+    public const string StepBack = "\uE9C0";
+    public const string StepEnd = "\uE9C2";
+    public const string StepForward = "\uE9C1";
+    public const string StepStart = "\uE9BF";
+    public const string Strikethrough = "\uE9B6";
+    public const string Subtract = "\uE974";
+    public const string Sun = "\uE975";
+    public const string SunCold = "\uE90F";
+    public const string Surveillance = "\uE91E";
+    public const string Swap = "\uE976";
+    public const string Swatches = "\uE9A2";
+    public const string TakeItem = "\uE914";
+    public const string Terminal = "\uE9BB";
+    public const string TextAntialiased = "\uE9AE";
+    public const string TextPixel = "\uE9B4";
+    public const string TextRound = "\uE9B9";
+    public const string TextUnderline = "\uE9B8";
+    public const string Timeline = "\uE9A3";
+    public const string Tool = "\uE977";
+    public const string Trash = "\uE978";
+    public const string Undo = "\uE979";
+    public const string Unlock = "\uE97A";
+    public const string UpVector = "\uE91A";
+    public const string Upload = "\uE98D";
+    public const string UploadCloud = "\uE98E";
+    public const string VectorPen = "\uE965";
+    public const string Write = "\uE988";
+    public const string XFlip = "\uE900";
+    public const string XSymmetry = "\uE980";
+    public const string YSymmetry = "\uE97D";
+    public const string Youtube = "\uE995";
+    public const string ZoomIn = "\uE981";
+    public const string ZoomOut = "\uE982";
 }

+ 48 - 0
src/PixiEditor.UI.Common/Fonts/PixiPerfectStyles.axaml

@@ -0,0 +1,48 @@
+<Styles xmlns="https://github.com/avaloniaui"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:system="clr-namespace:System;assembly=System.Runtime">
+    <Styles.Resources>
+        <ResourceDictionary>
+            <FontFamily x:Key="PixiPerfectIcons">avares://PixiEditor.UI.Common/Fonts/PixiPerfect.ttf#pixiperfect</FontFamily>
+        </ResourceDictionary>
+    </Styles.Resources>
+
+    <Style Selector="TextBlock.pixi-icon">
+        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
+    </Style>
+
+    <Style Selector="Label.pixi-icon">
+        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
+    </Style>
+
+    <Style Selector="Run.pixi-icon">
+        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
+    </Style>
+
+    <Style Selector="Button.pixi-icon">
+        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
+        <Setter Property="Background" Value="Transparent" />
+        <Setter Property="FontSize" Value="24" />
+        <Setter Property="Padding" Value="0" />
+        <Setter Property="HorizontalContentAlignment" Value="Center" />
+        <Setter Property="VerticalContentAlignment" Value="Center" />
+    </Style>
+
+    <Style Selector="Button.pixi-icon:pointerover">
+        <Setter Property="Background" Value="Transparent" />
+    </Style>
+
+    <Style Selector="ToggleButton.pixi-icon">
+        <Setter Property="FontFamily" Value="{DynamicResource PixiPerfectIcons}" />
+        <Setter Property="BorderThickness" Value="0" />
+        <Setter Property="Background" Value="Transparent" />
+        <Setter Property="FontSize" Value="24" />
+        <Setter Property="Padding" Value="0" />
+        <Setter Property="HorizontalContentAlignment" Value="Center" />
+        <Setter Property="VerticalContentAlignment" Value="Center" />
+    </Style>
+
+    <Style Selector="ToggleButton.pixi-icon:checked">
+        <Setter Property="Background" Value="{DynamicResource ThemeControlHighBrush}" />
+    </Style>
+</Styles>

+ 155 - 0
src/PixiEditor.UI.Common/Fonts/PixiPerfectStyles.axaml.cs

@@ -0,0 +1,155 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Layout;
+using Avalonia.Media;
+using Avalonia.Platform;
+using PixiEditor.UI.Common.Rendering;
+
+namespace PixiEditor.UI.Common.Fonts;
+
+//TODO: Make autogenerated from PixiPerfectIcons.axaml
+public static partial class PixiPerfectIcons
+{
+    public const string AddReference = "\ue900";
+    public const string AddToMask = "\ue901";
+    public const string AlphaLock = "\ue902";
+    public const string AlphaUnlock = "\ue903";
+    public const string ArrowDown = "\ue904";
+    public const string ArrowLeft = "\ue905";
+    public const string ArrowRight = "\ue906";
+    public const string ArrowUp = "\ue907";
+    public const string Book = "\ue908";
+    public const string Bucket = "\ue909";
+    public const string CanvasResize = "\ue90a";
+    public const string Center = "\ue90b";
+    public const string ChevronDown = "\ue90c";
+    public const string ChevronLeft = "\ue90d";
+    public const string ChevronRight = "\ue90e";
+    public const string ChevronUp = "\ue90f";
+    public const string Circle = "\ue910";
+    public const string Clock = "\ue911";
+    public const string ColorPalette = "\ue912";
+    public const string ColorPicker = "\ue913";
+    public const string ColorSliders = "\ue914";
+    public const string ColorsSwap = "\ue915";
+    public const string Compass = "\ue916";
+    public const string Copy = "\ue917";
+    public const string CornerUpLeft = "\ue918";
+    public const string CornerUpRight = "\ue919";
+    public const string CreateMask = "\ue91a";
+    public const string CropToSelection = "\ue91b";
+    public const string Crop = "\ue91c";
+    public const string Database = "\ue91d";
+    public const string Deselect = "\ue91e";
+    public const string Droplet = "\ue91f";
+    public const string DuplicateFile = "\ue920";
+    public const string Duplicate = "\ue921";
+    public const string Edit = "\ue922";
+    public const string Exit = "\ue923";
+    public const string EyeOff = "\ue924";
+    public const string Eye = "\ue925";
+    public const string RotateFileMinus90 = "\ue926";
+    public const string FilePlus = "\ue927";
+    public const string FileText = "\ue928";
+    public const string File = "\ue929";
+    public const string RotateFile90 = "\ue92a";
+    public const string RotateFile180 = "\ue92b";
+
+    public const string FolderPlus = "\ue92c";
+    public const string Folder = "\ue92d";
+    public const string Globe = "\ue92e";
+    public const string Grid = "\uE92F";
+    public const string GridLines = "\uE941";
+    public const string Home = "\ue930";
+    public const string RotateImageMinus90 = "\ue931";
+    public const string Image = "\ue932";
+    public const string RotateImage90 = "\ue933";
+    public const string RotateImage180 = "\ue934";
+    public const string Info = "\ue935";
+    public const string Intersect = "\ue936";
+    public const string Invert = "\ue937";
+    public const string Lasso = "\ue938";
+    public const string Layers = "\ue939";
+    public const string Line = "\ue93a";
+    public const string Lock = "\uE93B";
+    public const string LogOut = "\uE93C";
+    public const string MagicWand = "\uE93D";
+    public const string Minimize = "\uE93E";
+    public const string Merge = "\uE93F";
+    public const string MousePointer = "\uE940";
+    public const string MoveView = "\uE942";
+    public const string NewMask = "\uE943";
+    public const string Paste = "\uE944";
+    public const string VectorPen = "\uE945";
+    public const string Picker = "\uE946";
+    public const string PlusSquare = "\uE947";
+    public const string RectangleSelection = "\uE948";
+    public const string Redo = "\uE949";
+    public const string ReferenceLayer = "\uE94A";
+    public const string Resize = "\uE94B";
+    public const string RotateView = "\uE94C";
+    public const string Eraser = "\uE94D";
+    public const string Save = "\uE94E";
+    public const string Scissors = "\uE94F";
+    public const string SelectAll = "\uE950";
+    public const string Settings = "\uE951";
+    public const string Sliders = "\uE952";
+    public const string Square = "\uE953";
+    public const string Subtract = "\uE954";
+    public const string Sun = "\uE955";
+    public const string Swap = "\uE956";
+    public const string Tool = "\uE957";
+    public const string Trash = "\uE958";
+    public const string Undo = "\uE959";
+    public const string Unlock = "\uE95A";
+    public const string XFlip = "\uE95E";
+    public const string XSelectedFlip = "\uE95F";
+    public const string XSymmetry = "\uE95D";
+    public const string YFlip = "\uE95B";
+    public const string YSelectedFlip = "\uE95C";
+    public const string YSymmetry = "\uE960";
+    public const string ZoomIn = "\uE961";
+    public const string ZoomOut = "\uE962";
+    public const string PasteReferenceLayer = "\ue977";
+    public const string PasteAsNewLayer = "\ue978";
+    public const string CopyAdd = "\ue921";
+    public const string Message = "\uE96F";
+    public const string Download = "\uE969";
+    public const string YouTube = "\uE975";
+    public const string Write = "\uE968";
+    public const string Misc = "\uE970";
+    public const string Play = "\uE981";
+    public const string Pause = "\uE980";
+    public const string Swatches = "\uE982";
+    public const string Timeline = "\uE983";
+    public const string Dot = "\uE963";
+    public const string Nodes = "\uE984";
+    public const string Onion = "\uE965";
+        
+    public const string Reset = "\uE98A";
+    public const string ToggleLayerVisible = "\u25a1;"; // TODO: Create a toggle layer visible icon
+    public const string ToggleMask = "\u25a1;"; // TODO: Create a toggle mask icon
+    public const string Pen = "\uE971";
+    public const string LowResCircle = "\uE986";
+    public const string Snapping = "\ue987";
+    public const string LowResSquare = "\uE988";
+    public const string LowResLine = "\uE989";
+
+    public const string AlignCenter = "\uE98C";
+    public const string Bold = "\uE98D";
+    public const string TextAntialiased = "\uE98E";
+    public const string Italic = "\uE98F";
+    public const string AlignStretch = "\uE990";
+    public const string AlignLeft = "\uE991";
+    public const string LetterSpacing = "\uE992";
+    public const string LineHeight = "\uE993";
+    public const string TextPixel = "\uE994";
+    public const string AlignRight = "\uE995";
+    public const string Strikethrough = "\uE996";
+    public const string LinkedPipette = "\uE997";
+    public const string TextUnderline = "\uE998";
+    public const string TextRound = "\uE999";
+    public const string Cone = "\uE99c";
+    public const string Camera = "\uE99d";
+    public const string ChartSpline = "\ue99e";
+}

Dosya farkı çok büyük olduğundan ihmal edildi
+ 32 - 0
src/PixiEditor.UI.Common/Fonts/defs.svg


+ 76 - 0
src/PixiEditor.UI.Common/Fonts/gen-icons.py

@@ -0,0 +1,76 @@
+import xml.etree.ElementTree as ET
+import re
+
+# Input and output file paths
+SVG_FILE = "defs.svg"
+XAML_FILE = "PixiPerfectIcons.axaml"
+CS_FILE = "PixiPerfectIcons.axaml.cs"
+
+# Parse SVG and extract relevant glyphs
+tree = ET.parse(SVG_FILE)
+root = tree.getroot()[1][0]  # Navigate to the <defs> <font> element
+
+print(root[3].tag)
+
+glyphs = []
+
+# Traverse all glyph nodes
+for glyph in root:
+    if glyph.tag != "{http://www.w3.org/2000/svg}glyph":
+        continue
+    unicode_char = glyph.attrib.get("unicode")
+    glyph_name = glyph.attrib.get("glyph-name")
+    if unicode_char and glyph_name:
+        code_point = f"{ord(unicode_char):04X}"
+        glyphs.append((glyph_name, code_point))
+
+# Sort glyphs by name
+glyphs.sort()
+
+# Utility functions
+def to_kebab_case(name: str) -> str:
+    return "icon-" + re.sub(r"(?<!^)(?=[A-Z])", "-", name).lower()
+
+def to_pascal_case(name: str) -> str:
+    return "".join(part.capitalize() for part in re.split(r"[-_]", name))
+
+# Generate XAML content
+xaml_lines = [
+    '<Styles xmlns="https://github.com/avaloniaui"',
+    '        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"',
+    '        xmlns:system="clr-namespace:System;assembly=System.Runtime">',
+    '    <Styles.Resources>',
+    '        <ResourceDictionary>',
+    '            <FontFamily x:Key="PixiPerfectIcons">avares://PixiEditor.UI.Common/Fonts#pixiperfect</FontFamily>',
+]
+
+for name, code in glyphs:
+    kebab = to_kebab_case(name)
+    xaml_lines.append(f'            <system:String x:Key="{kebab}">&#x{code};</system:String>')
+
+xaml_lines += [
+    '        </ResourceDictionary>',
+    '    </Styles.Resources>',
+    '</Styles>'
+]
+
+# Generate C# content
+cs_lines = [
+    "public static partial class PixiPerfectIcons",
+    "{"
+]
+
+for name, code in glyphs:
+    pascal = to_pascal_case(name)
+    cs_lines.append(f'    public const string {pascal} = "\\u{code}";')
+
+cs_lines.append("}")
+
+# Write output files
+with open(XAML_FILE, "w", encoding="utf-8") as xaml_out:
+    xaml_out.write("\n".join(xaml_lines) + "\n")
+
+with open(CS_FILE, "w", encoding="utf-8") as cs_out:
+    cs_out.write("\n".join(cs_lines) + "\n")
+
+print(f"Generated {XAML_FILE} and {CS_FILE} with {len(glyphs)} icons.")

+ 1 - 0
src/PixiEditor.UI.Common/Themes/PixiEditorTheme.axaml

@@ -11,5 +11,6 @@
 
     <StyleInclude Source="/Styles/PixiEditor.Controls.axaml"/>
     <StyleInclude Source="/Styles/PixiEditor.Styles.axaml"/>
+    <StyleInclude Source="/Fonts/PixiPerfectStyles.axaml"/>
     <StyleInclude Source="/Fonts/PixiPerfectIcons.axaml"/>
 </Styles>

BIN
src/PixiEditor/Images/Commands/PixiEditor/Links/OpenDocumentation.png


BIN
src/PixiEditor/Images/Commands/PixiEditor/Links/OpenRepository.png


+ 1 - 1
src/PixiEditor/Models/Commands/Evaluators/IconEvaluator.cs

@@ -29,7 +29,7 @@ internal class IconEvaluator : Evaluator<IImage>
         {
             string symbolCode = command.Icon;
 
-            return PixiPerfectIcons.ToIcon(symbolCode);
+            return PixiPerfectIconExtensions.ToIcon(symbolCode);
         }
     }
 }

+ 2 - 2
src/PixiEditor/Models/Services/NewsFeed/News.cs

@@ -15,13 +15,13 @@ internal enum NewsType
 {
     [Description(PixiPerfectIcons.Download)]
     NewVersion,
-    [Description(PixiPerfectIcons.YouTube)]
+    [Description(PixiPerfectIcons.Youtube)]
     YtVideo,
     [Description(PixiPerfectIcons.Write)]
     BlogPost,
     [Description(PixiPerfectIcons.Message)]
     OfficialAnnouncement,
-    [Description(PixiPerfectIcons.Misc)]
+    [Description(PixiPerfectIcons.Info)]
     Misc
 }
 

+ 1 - 1
src/PixiEditor/ViewModels/Dock/ColorPickerDockViewModel.cs

@@ -28,6 +28,6 @@ internal class ColorPickerDockViewModel : DockableViewModel
     public ColorPickerDockViewModel(ColorsViewModel colorsSubVm)
     {
         ColorsSubViewModel = colorsSubVm;
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.ColorPicker);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.ColorPicker);
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Dock/ColorSlidersDockViewModel.cs

@@ -26,6 +26,6 @@ internal class ColorSlidersDockViewModel : DockableViewModel
     public ColorSlidersDockViewModel(ColorsViewModel colorsSubVm)
     {
         ColorsSubViewModel = colorsSubVm;
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.ColorSliders);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.ColorSliders);
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Dock/DocumentPreviewDockViewModel.cs

@@ -36,6 +36,6 @@ internal class DocumentPreviewDockViewModel : DockableViewModel
     {
         ColorsSubViewModel = colorsSubViewModel;
         DocumentManagerSubViewModel = documentManagerViewModel;
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Compass);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Compass);
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Dock/LayersDockViewModel.cs

@@ -35,7 +35,7 @@ internal class LayersDockViewModel : DockableViewModel, IDockableSelectionEvents
     {
         DocumentManager = documentManager;
         DocumentManager.ActiveDocumentChanged += DocumentManager_ActiveDocumentChanged;
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Layers);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Layers);
     }
 
     private void DocumentManager_ActiveDocumentChanged(object? sender, DocumentChangedEventArgs e)

+ 1 - 1
src/PixiEditor/ViewModels/Dock/NodeGraphDockViewModel.cs

@@ -28,7 +28,7 @@ internal class NodeGraphDockViewModel : DockableViewModel, IDockableSelectionEve
     {
         DocumentManagerSubViewModel = document;
 
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Nodes);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Nodes);
     }
 
     void IDockableSelectionEvents.OnSelected()

+ 1 - 1
src/PixiEditor/ViewModels/Dock/PaletteViewerDockViewModel.cs

@@ -33,7 +33,7 @@ internal class PaletteViewerDockViewModel : DockableViewModel
         ColorsSubViewModel = colorsSubViewModel;
         DocumentManagerSubViewModel = documentManagerViewModel;
 
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.ColorPalette);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.ColorPalette);
 
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Dock/SwatchesDockViewModel.cs

@@ -24,6 +24,6 @@ internal class SwatchesDockViewModel : DockableViewModel
     public SwatchesDockViewModel(DocumentManagerViewModel documentManagerViewModel)
     {
         DocumentManagerSubViewModel = documentManagerViewModel;
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Swatches);
+        TabCustomizationSettings.Icon = UI.Common.Fonts.PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Swatches);
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Dock/TimelineDockViewModel.cs

@@ -25,7 +25,7 @@ internal class TimelineDockViewModel : DockableViewModel, IDockableSelectionEven
     public TimelineDockViewModel(DocumentManagerViewModel documentManagerViewModel)
     {
         DocumentManagerSubViewModel = documentManagerViewModel;
-        TabCustomizationSettings.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Timeline);
+        TabCustomizationSettings.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Timeline);
     }
 
     void IDockableSelectionEvents.OnSelected()

+ 9 - 9
src/PixiEditor/ViewModels/Document/DocumentManagerViewModel.cs

@@ -85,18 +85,18 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>, IDocument
         AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Document.FlipImageVertical", FlipType.Vertical, "FLIP_IMG_VERTICALLY",
         "FLIP_IMG_VERTICALLY", CanExecute = "PixiEditor.HasDocument",
-        MenuItemPath = "IMAGE/FLIP/FLIP_IMG_VERTICALLY", MenuItemOrder = 15, Icon = PixiPerfectIcons.YFlip,
+        MenuItemPath = "IMAGE/FLIP/FLIP_IMG_VERTICALLY", MenuItemOrder = 15, Icon = PixiPerfectIcons.Image180,
         AnalyticsTrack = true)]
     public void FlipImage(FlipType type) =>
         ActiveDocument?.Operations.FlipImage(type, activeDocument.AnimationDataViewModel.ActiveFrameBindable);
 
     [Command.Basic("PixiEditor.Document.FlipLayersHorizontal", FlipType.Horizontal, "FLIP_LAYERS_HORIZONTALLY",
         "FLIP_LAYERS_HORIZONTALLY", CanExecute = "PixiEditor.HasDocument",
-        MenuItemPath = "IMAGE/FLIP/FLIP_LAYERS_HORIZONTALLY", MenuItemOrder = 16, Icon = PixiPerfectIcons.XSelectedFlip,
+        MenuItemPath = "IMAGE/FLIP/FLIP_LAYERS_HORIZONTALLY", MenuItemOrder = 16, Icon = PixiPerfectIcons.MirrorHorizontal,
         AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Document.FlipLayersVertical", FlipType.Vertical, "FLIP_LAYERS_VERTICALLY",
         "FLIP_LAYERS_VERTICALLY", CanExecute = "PixiEditor.HasDocument",
-        MenuItemPath = "IMAGE/FLIP/FLIP_LAYERS_VERTICALLY", MenuItemOrder = 17, Icon = PixiPerfectIcons.YSelectedFlip,
+        MenuItemPath = "IMAGE/FLIP/FLIP_LAYERS_VERTICALLY", MenuItemOrder = 17, Icon = PixiPerfectIcons.MirrorVertical,
         AnalyticsTrack = true)]
     public void FlipLayers(FlipType type)
     {
@@ -109,29 +109,29 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>, IDocument
 
     [Command.Basic("PixiEditor.Document.Rotate90Deg", "ROT_IMG_90",
         "ROT_IMG_90", CanExecute = "PixiEditor.HasDocument", Parameter = RotationAngle.D90,
-        MenuItemPath = "IMAGE/ROTATION/ROT_IMG_90_D", MenuItemOrder = 8, Icon = PixiPerfectIcons.RotateImage90,
+        MenuItemPath = "IMAGE/ROTATION/ROT_IMG_90_D", MenuItemOrder = 8, Icon = PixiPerfectIcons.Image90,
         AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Document.Rotate180Deg", "ROT_IMG_180",
         "ROT_IMG_180", CanExecute = "PixiEditor.HasDocument", Parameter = RotationAngle.D180,
-        MenuItemPath = "IMAGE/ROTATION/ROT_IMG_180_D", MenuItemOrder = 9, Icon = PixiPerfectIcons.RotateImage180,
+        MenuItemPath = "IMAGE/ROTATION/ROT_IMG_180_D", MenuItemOrder = 9, Icon = PixiPerfectIcons.Image180,
         AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Document.Rotate270Deg", "ROT_IMG_-90",
         "ROT_IMG_-90", CanExecute = "PixiEditor.HasDocument", Parameter = RotationAngle.D270,
-        MenuItemPath = "IMAGE/ROTATION/ROT_IMG_-90_D", MenuItemOrder = 10, Icon = PixiPerfectIcons.RotateImageMinus90,
+        MenuItemPath = "IMAGE/ROTATION/ROT_IMG_-90_D", MenuItemOrder = 10, Icon = PixiPerfectIcons.ImageMinus90,
         AnalyticsTrack = true)]
     public void RotateImage(RotationAngle angle) => ActiveDocument?.Operations.RotateImage(angle);
 
     [Command.Basic("PixiEditor.Document.Rotate90DegLayers", "ROT_LAYERS_90",
         "ROT_LAYERS_90", CanExecute = "PixiEditor.HasDocument", Parameter = RotationAngle.D90,
-        MenuItemPath = "IMAGE/ROTATION/ROT_LAYERS_90_D", MenuItemOrder = 11, Icon = PixiPerfectIcons.RotateFile90,
+        MenuItemPath = "IMAGE/ROTATION/ROT_LAYERS_90_D", MenuItemOrder = 11, Icon = PixiPerfectIcons.File90,
         AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Document.Rotate180DegLayers", "ROT_LAYERS_180",
         "ROT_LAYERS_180", CanExecute = "PixiEditor.HasDocument", Parameter = RotationAngle.D180,
-        MenuItemPath = "IMAGE/ROTATION/ROT_LAYERS_180_D", MenuItemOrder = 12, Icon = PixiPerfectIcons.RotateFile180,
+        MenuItemPath = "IMAGE/ROTATION/ROT_LAYERS_180_D", MenuItemOrder = 12, Icon = PixiPerfectIcons.File180,
         AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Document.Rotate270DegLayers", "ROT_LAYERS_-90",
         "ROT_LAYERS_-90", CanExecute = "PixiEditor.HasDocument", Parameter = RotationAngle.D270,
-        MenuItemPath = "IMAGE/ROTATION/ROT_LAYERS_-90_D", MenuItemOrder = 13, Icon = PixiPerfectIcons.RotateFileMinus90,
+        MenuItemPath = "IMAGE/ROTATION/ROT_LAYERS_-90_D", MenuItemOrder = 13, Icon = PixiPerfectIcons.FileMinus90,
         AnalyticsTrack = true)]
     public void RotateLayers(RotationAngle angle)
     {

+ 1 - 1
src/PixiEditor/ViewModels/Document/Nodes/Animable/EasingNodeViewModel.cs

@@ -4,7 +4,7 @@ using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Animable;
 
-[NodeViewModel("EASING_NODE", "ANIMATION", PixiPerfectIcons.ChartSpline)]
+[NodeViewModel("EASING_NODE", "ANIMATION", PixiPerfectIcons.SplineChart)]
 internal class EasingNodeViewModel : NodeViewModel<EasingNode>
 {
 

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Animable/TimeNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Animable;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Animable;
 
-[NodeViewModel("TIME_NODE", "ANIMATION", "\uE800")]
+[NodeViewModel("TIME_NODE", "ANIMATION", PixiPerfectIcons.Clock)]
 internal class TimeNodeViewModel : NodeViewModel<TimeNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/ColorNodeViewModel.cs

@@ -1,9 +1,10 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("COLOR_NODE", "COLOR", "\uE912")]
+[NodeViewModel("COLOR_NODE", "COLOR", PixiPerfectIcons.ColorPalette)]
 internal class ColorNodeViewModel : NodeViewModel<ColorNode>
 {
     

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineChannelsNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("COMBINE_CHANNELS_NODE", "IMAGE", "\uE815")]
+[NodeViewModel("COMBINE_CHANNELS_NODE", "IMAGE", PixiPerfectIcons.InsertItem)]
 internal class CombineChannelsNodeViewModel : NodeViewModel<CombineChannelsNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineColorNodeViewModel.cs

@@ -2,10 +2,11 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
 using PixiEditor.Helpers.Extensions;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Handlers;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ViewModels.Nodes.Properties;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("COMBINE_COLOR_NODE", "COLOR", "\uE808")]
+[NodeViewModel("COMBINE_COLOR_NODE", "COLOR", PixiPerfectIcons.ItemSlot)]
 internal class CombineColorNodeViewModel() : CombineSeparateColorNodeViewModel<CombineColorNode>(true);

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineVecDNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("COMBINE_VECD_NODE", "NUMBERS", "\uE816")]
+[NodeViewModel("COMBINE_VECD_NODE", "NUMBERS", PixiPerfectIcons.UpVector)]
 internal class CombineVecDNodeViewModel : NodeViewModel<CombineVecDNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/CombineVecINodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("COMBINE_VECI_NODE", "NUMBERS", "\uE817")]
+[NodeViewModel("COMBINE_VECI_NODE", "NUMBERS", PixiPerfectIcons.LongArrowUp)]
 internal class CombineVecINodeViewModel : NodeViewModel<CombineVecINode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateChannelsNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("SEPARATE_CHANNELS_NODE", "IMAGE", "\uE810")]
+[NodeViewModel("SEPARATE_CHANNELS_NODE", "IMAGE", PixiPerfectIcons.TakeItem)]
 internal class SeparateChannelsNodeViewModel : NodeViewModel<SeparateChannelsNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateColorNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("SEPARATE_COLOR_NODE", "COLOR", "\uE813")]
+[NodeViewModel("SEPARATE_COLOR_NODE", "COLOR", PixiPerfectIcons.ItemSlotOut)]
 internal class SeparateColorNodeViewModel() : CombineSeparateColorNodeViewModel<SeparateColorNode>(false);

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateVecDNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("SEPARATE_VECD_NODE", "NUMBERS", "\uE818")]
+[NodeViewModel("SEPARATE_VECD_NODE", "NUMBERS", PixiPerfectIcons.SeparateVector)]
 internal class SeparateVecDNodeViewModel : NodeViewModel<SeparateVecDNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CombineSeparate/SeparateVecINodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.CombineSeparate;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.CombineSeparate;
 
-[NodeViewModel("SEPARATE_VECI_NODE", "NUMBERS", "\uE817")]
+[NodeViewModel("SEPARATE_VECI_NODE", "NUMBERS", PixiPerfectIcons.Crossroad)]
 internal class SeparateVecINodeViewModel : NodeViewModel<SeparateVecINode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/CreateImageNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("CREATE_IMAGE_NODE", "IMAGE", "\uE802")]
+[NodeViewModel("CREATE_IMAGE_NODE", "IMAGE", PixiPerfectIcons.CreateImage)]
 internal class CreateImageNodeViewModel : NodeViewModel<CreateImageNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Effects/OutlineNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Effects;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Effects;
 
-[NodeViewModel("OUTLINE_NODE", "EFFECTS", "\ue99a")]
+[NodeViewModel("OUTLINE_NODE", "EFFECTS", PixiPerfectIcons.Outline)]
 internal class OutlineNodeViewModel : NodeViewModel<OutlineNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/ApplyFilterNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.FilterNodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 
-[NodeViewModel("APPLY_FILTER_NODE", "FILTERS", "\uE809")]
+[NodeViewModel("APPLY_FILTER_NODE", "FILTERS", PixiPerfectIcons.Magic)]
 internal class ApplyFilterNodeViewModel : NodeViewModel<ApplyFilterNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/BlurNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.FilterNodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 
-[NodeViewModel("BLUR_FILTER_NODE", "FILTERS", "\uE822")]
+[NodeViewModel("BLUR_FILTER_NODE", "FILTERS", PixiPerfectIcons.DropletFilled)]
 internal class BlurNodeViewModel : NodeViewModel<BlurNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/ColorMatrixFilterNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.FilterNodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 
-[NodeViewModel("COLOR_MATRIX_TRANSFORM_FILTER_NODE", "FILTERS", "\uE811")]
+[NodeViewModel("COLOR_MATRIX_TRANSFORM_FILTER_NODE", "FILTERS", PixiPerfectIcons.NumbersBinaryDown)]
 internal class ColorMatrixFilterNodeViewModel : NodeViewModel<ColorMatrixFilterNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/GrayscaleNodeViewModel.cs

@@ -1,11 +1,12 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.FilterNodes;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Handlers;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 
-[NodeViewModel("GRAYSCALE_FILTER_NODE", "FILTERS", "\ue812")]
+[NodeViewModel("GRAYSCALE_FILTER_NODE", "FILTERS", PixiPerfectIcons.Ghost)]
 internal class GrayscaleNodeViewModel : NodeViewModel<GrayscaleNode>
 {
     private INodePropertyHandler customWeightsProp;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/KernelFilterNodeViewModel.cs

@@ -1,9 +1,10 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.FilterNodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 
-[NodeViewModel("KERNEL_FILTER_NODE", "FILTERS", "\uE80F")]
+[NodeViewModel("KERNEL_FILTER_NODE", "FILTERS", PixiPerfectIcons.ClosedGrid)]
 internal class KernelFilterNodeViewModel : NodeViewModel<KernelFilterNode>
 {
     public override void OnInitialized()

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/FolderNodeViewModel.cs

@@ -1,11 +1,12 @@
 using System.Collections.ObjectModel;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Models.Handlers;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("FOLDER_NODE", "STRUCTURE", "\uE801")]
+[NodeViewModel("FOLDER_NODE", "STRUCTURE", PixiPerfectIcons.Folder)]
 internal class FolderNodeViewModel : StructureMemberViewModel<FolderNode>, IFolderHandler
 {
     public ObservableCollection<IStructureMemberHandler> Children { get; } = new();

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/ImageLayerNodeViewModel.cs

@@ -1,12 +1,13 @@
 using PixiEditor.ChangeableDocument.Actions.Generated;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Models.Handlers;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ViewModels.Tools.Tools;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("IMAGE_LAYER_NODE", "STRUCTURE", "\uE805")]
+[NodeViewModel("IMAGE_LAYER_NODE", "STRUCTURE", PixiPerfectIcons.LayersDouble)]
 internal class ImageLayerNodeViewModel : StructureMemberViewModel<ImageLayerNode>, ITransparencyLockableMember, IRasterLayerHandler
 {
     bool lockTransparency;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/LerpColorNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("LERP_NODE", "NUMBERS", "\uE80B")]
+[NodeViewModel("LERP_NODE", "NUMBERS", PixiPerfectIcons.SunCold)]
 internal class LerpColorNodeViewModel : NodeViewModel<LerpColorNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/MathNodeViewModel.cs

@@ -3,13 +3,14 @@ using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.Extensions.Helpers;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Handlers;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.UI.Common.Localization;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ViewModels.Nodes.Properties;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("MATH_NODE", "NUMBERS", "\uE80E")]
+[NodeViewModel("MATH_NODE", "NUMBERS", PixiPerfectIcons.PlusMinus)]
 internal class MathNodeViewModel : NodeViewModel<MathNode>
 {
     private GenericEnumPropertyViewModel Mode { get; set; }

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/MergeNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("MERGE_NODE", "IMAGE", "\uE803")]
+[NodeViewModel("MERGE_NODE", "IMAGE", PixiPerfectIcons.DuplicateImage)]
 internal class MergeNodeViewModel : NodeViewModel<MergeNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/ModifyImageLeftNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("MODIFY_IMAGE_LEFT_NODE", "IMAGE", "\uE804")]
+[NodeViewModel("MODIFY_IMAGE_LEFT_NODE", "IMAGE", PixiPerfectIcons.PutImage)]
 internal class ModifyImageLeftNodeViewModel : NodeViewModel<ModifyImageLeftNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/NoiseNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("NOISE_NODE", "IMAGE", "\uE80C")]
+[NodeViewModel("NOISE_NODE", "IMAGE", PixiPerfectIcons.Noise)]
 internal class NoiseNodeViewModel : NodeViewModel<NoiseNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/SampleImageNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("SAMPLE_IMAGE", "IMAGE", "\uE807")]
+[NodeViewModel("SAMPLE_IMAGE", "IMAGE", PixiPerfectIcons.PipetteOutline)]
 internal class SampleImageNodeViewModel : NodeViewModel<SampleImageNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/ShaderNodeViewModel.cs

@@ -1,12 +1,13 @@
 using System.Collections.Specialized;
 using Drawie.Backend.Core.Bridge;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ViewModels.Nodes.Properties;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("SHADER_NODE", "EFFECTS", "\ue99b")]
+[NodeViewModel("SHADER_NODE", "EFFECTS", PixiPerfectIcons.Terminal)]
 internal class ShaderNodeViewModel : NodeViewModel<ShaderNode>
 {
     public ShaderNodeViewModel()

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Shapes/DistributePointsNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Shapes;
 
-[NodeViewModel("DISTRIBUTE_POINTS", "SHAPE", "\uE80A")]
+[NodeViewModel("DISTRIBUTE_POINTS", "SHAPE", PixiPerfectIcons.Spray)]
 internal class DistributePointsNodeViewModel : NodeViewModel<DistributePointsNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Shapes/EllipseNodeViewModel.cs

@@ -1,13 +1,14 @@
 using Drawie.Backend.Core.ColorsImpl.Paintables;
 using PixiEditor.ChangeableDocument.Changeables.Graph;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ViewModels.Nodes.Properties;
 using PixiEditor.Views.Nodes.Properties;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Shapes;
 
-[NodeViewModel("ELLIPSE_NODE", "SHAPE", "\uE910")]
+[NodeViewModel("ELLIPSE_NODE", "SHAPE", PixiPerfectIcons.Circle)]
 internal class EllipseNodeViewModel : NodeViewModel<EllipseNode>
 {
 }

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Shapes/RasterizeShapeNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Shapes;
 
-[NodeViewModel("RASTERIZE_SHAPE", "SHAPE", "\uE806")]
+[NodeViewModel("RASTERIZE_SHAPE", "SHAPE", PixiPerfectIcons.PaintBrush)]
 internal class RasterizeShapeNodeViewModel : NodeViewModel<RasterizeShapeNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Shapes/RemoveClosePointsNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Shapes;
 
-[NodeViewModel("REMOVE_CLOSE_POINTS", "SHAPE", "\uE814")]
+[NodeViewModel("REMOVE_CLOSE_POINTS", "SHAPE", PixiPerfectIcons.PointsCrossed)]
 internal class RemoveClosePointsNodeViewModel : NodeViewModel<RemoveClosePointsNode>;

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Shapes/TextNodeViewModel.cs

@@ -1,9 +1,10 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Shapes;
 
-[NodeViewModel("TEXT_NODE", "SHAPE", "\uE999")]
+[NodeViewModel("TEXT_NODE", "SHAPE", PixiPerfectIcons.TextRound)]
 internal class TextNodeViewModel : NodeViewModel<TextNode>
 {
 }

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Shapes/TextOnPathNodeViewModel.cs

@@ -1,9 +1,10 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Shapes;
 
-[NodeViewModel("TEXT_ON_PATH_NODE", "SHAPE", "\uE998")]
+[NodeViewModel("TEXT_ON_PATH_NODE", "SHAPE", PixiPerfectIcons.TextUnderline)]
 internal class TextOnPathNodeViewModel : NodeViewModel<TextOnPathNode>
 {
 }

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/VectorLayerNodeViewModel.cs

@@ -4,12 +4,13 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces.Shapes;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.Models.Handlers;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ViewModels.Tools.Tools;
 
 namespace PixiEditor.ViewModels.Document.Nodes;
 
-[NodeViewModel("VECTOR_LAYER", "STRUCTURE", "\uE816")]
+[NodeViewModel("VECTOR_LAYER", "STRUCTURE", PixiPerfectIcons.VectorPen)]
 internal class VectorLayerNodeViewModel : StructureMemberViewModel<VectorLayerNode>, IVectorLayerHandler
 {
     private Dictionary<Type, Type> quickToolsMap = new Dictionary<Type, Type>()

+ 2 - 1
src/PixiEditor/ViewModels/Document/Nodes/Workspace/CustomOutputNodeViewModel.cs

@@ -1,7 +1,8 @@
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Workspace;
+using PixiEditor.UI.Common.Fonts;
 using PixiEditor.ViewModels.Nodes;
 
 namespace PixiEditor.ViewModels.Document.Nodes.Workspace;
 
-[NodeViewModel("CUSTOM_OUTPUT_NODE", "WORKSPACE", "\uE81A")]
+[NodeViewModel("CUSTOM_OUTPUT_NODE", "WORKSPACE", PixiPerfectIcons.Surveillance)]
 internal class CustomOutputNodeViewModel : NodeViewModel<CustomOutputNode>;

+ 1 - 1
src/PixiEditor/ViewModels/Menu/MenuBuilders/FileExitMenuBuilder.cs

@@ -19,7 +19,7 @@ internal class FileExitMenuBuilder : MenuItemBuilder
                 CommandParameter = MainWindow.Current,
                 Icon = new Image()
                 {
-                    Source = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Exit),
+                    Source = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Exit),
                     Width = Models.Commands.XAML.Menu.IconDimensions,
                     Height = Models.Commands.XAML.Menu.IconDimensions
                 }

+ 4 - 4
src/PixiEditor/ViewModels/Menu/MenuBuilders/SymmetryMenuBuilder.cs

@@ -26,7 +26,7 @@ internal class SymmetryMenuBuilder : MenuItemBuilder
             Translator.SetKey(horizontalSymmetryItem, "HORIZONTAL_LINE_SYMMETRY");
             horizontalSymmetryItem.Icon = new Image()
             {
-                Source = PixiPerfectIcons.ToIcon(PixiPerfectIcons.XSymmetry),
+                Source = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.XSymmetry),
                 Width = Models.Commands.XAML.Menu.IconDimensions,
                 Height = Models.Commands.XAML.Menu.IconDimensions
             };
@@ -38,7 +38,7 @@ internal class SymmetryMenuBuilder : MenuItemBuilder
             Translator.SetKey(verticalSymmetryItem, "VERTICAL_LINE_SYMMETRY");
             verticalSymmetryItem.Icon = new Image()
             {
-                Source = PixiPerfectIcons.ToIcon(PixiPerfectIcons.YSymmetry),
+                Source = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.YSymmetry),
                 Width = Models.Commands.XAML.Menu.IconDimensions,
                 Height = Models.Commands.XAML.Menu.IconDimensions
             };
@@ -61,7 +61,7 @@ internal class SymmetryMenuBuilder : MenuItemBuilder
             PixelSize iconDimensions = new PixelSize((int)Models.Commands.XAML.Menu.IconDimensions, (int)Models.Commands.XAML.Menu.IconDimensions);
             
             Translator.SetKey(horizontalSymmetryItem, "HORIZONTAL_LINE_SYMMETRY");
-            horizontalSymmetryItem.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.XSymmetry)
+            horizontalSymmetryItem.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.XSymmetry)
                 .ToBitmap(iconDimensions);
 
             BindItem(horizontalSymmetryItem, "DocumentManagerSubViewModel.ActiveDocument.HorizontalSymmetryAxisEnabledBindable",
@@ -79,7 +79,7 @@ internal class SymmetryMenuBuilder : MenuItemBuilder
             NativeMenuItem verticalSymmetryItem = new NativeMenuItem();
             Translator.SetKey(verticalSymmetryItem, "VERTICAL_LINE_SYMMETRY");
             verticalSymmetryItem.ToggleType = NativeMenuItemToggleType.CheckBox;
-            verticalSymmetryItem.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.YSymmetry)
+            verticalSymmetryItem.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.YSymmetry)
                 .ToBitmap(iconDimensions);
 
             BindItem(verticalSymmetryItem, "DocumentManagerSubViewModel.ActiveDocument.VerticalSymmetryAxisEnabledBindable",

+ 2 - 2
src/PixiEditor/ViewModels/Menu/MenuBuilders/ToggleGridLinesMenuBuilder.cs

@@ -22,7 +22,7 @@ internal class ToggleGridLinesMenuBuilder : MenuItemBuilder
             Translator.SetKey(gridLinesItem, "TOGGLE_GRIDLINES");
             gridLinesItem.Icon = new Image()
             {
-                Source = PixiPerfectIcons.ToIcon(PixiPerfectIcons.GridLines),
+                Source = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Gridlines),
                 Width = Models.Commands.XAML.Menu.IconDimensions,
                 Height = Models.Commands.XAML.Menu.IconDimensions
             };
@@ -41,7 +41,7 @@ internal class ToggleGridLinesMenuBuilder : MenuItemBuilder
             gridLinesItem.ToggleType = NativeMenuItemToggleType.CheckBox;
             Translator.SetKey(gridLinesItem, "TOGGLE_GRIDLINES");
 
-            gridLinesItem.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.GridLines).ToBitmap(IconDimensions);
+            gridLinesItem.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Gridlines).ToBitmap(IconDimensions);
             BindItem(gridLinesItem);
             viewItem.Menu.Items.Add(gridLinesItem);
         }

+ 2 - 2
src/PixiEditor/ViewModels/Menu/MenuBuilders/ToggleHighResPreviewMenuBuilder.cs

@@ -20,7 +20,7 @@ internal class ToggleHighResPreviewMenuBuilder : MenuItemBuilder
             Translator.SetKey(snappingItem, "TOGGLE_HIGH_RES_PREVIEW");
             snappingItem.Icon = new Image()
             {
-                Source = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Circle),
+                Source = UI.Common.Fonts.PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Circle),
                 Width = Models.Commands.XAML.Menu.IconDimensions,
                 Height = Models.Commands.XAML.Menu.IconDimensions
             };
@@ -39,7 +39,7 @@ internal class ToggleHighResPreviewMenuBuilder : MenuItemBuilder
             gridLinesItem.ToggleType = NativeMenuItemToggleType.CheckBox;
             Translator.SetKey(gridLinesItem, "TOGGLE_HIGH_RES_PREVIEW");
 
-            gridLinesItem.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Circle).ToBitmap(IconDimensions);
+            gridLinesItem.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Circle).ToBitmap(IconDimensions);
             BindItem(gridLinesItem);
             viewItem.Menu.Items.Add(gridLinesItem);
         }

+ 2 - 2
src/PixiEditor/ViewModels/Menu/MenuBuilders/ToggleSnappingMenuBuilder.cs

@@ -20,7 +20,7 @@ internal class ToggleSnappingMenuBuilder : MenuItemBuilder
             Translator.SetKey(snappingItem, "TOGGLE_SNAPPING");
             snappingItem.Icon = new Image()
             {
-                Source = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Snapping),
+                Source = UI.Common.Fonts.PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Snapping),
                 Width = Models.Commands.XAML.Menu.IconDimensions,
                 Height = Models.Commands.XAML.Menu.IconDimensions
             };
@@ -39,7 +39,7 @@ internal class ToggleSnappingMenuBuilder : MenuItemBuilder
             gridLinesItem.ToggleType = NativeMenuItemToggleType.CheckBox;
             Translator.SetKey(gridLinesItem, "TOGGLE_SNAPPING");
 
-            gridLinesItem.Icon = PixiPerfectIcons.ToIcon(PixiPerfectIcons.Snapping).ToBitmap(IconDimensions);
+            gridLinesItem.Icon = PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.Snapping).ToBitmap(IconDimensions);
             BindItem(gridLinesItem);
             viewItem.Menu.Items.Add(gridLinesItem);
         }

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/ColorsViewModel.cs

@@ -411,7 +411,7 @@ internal class ColorsViewModel : SubViewModel<ViewModelMain>, IColorsHandler
 
     [Commands_Command.Basic("PixiEditor.Colors.AddPrimaryToPalettes", "ADD_PRIMARY_COLOR_TO_PALETTE",
         "ADD_PRIMARY_COLOR_TO_PALETTE_DESCRIPTIVE", CanExecute = "PixiEditor.HasDocument",
-        Icon = PixiPerfectIcons.CopyAdd, AnalyticsTrack = true)]
+        Icon = PixiPerfectIcons.Duplicate, AnalyticsTrack = true)]
     public void AddPrimaryColorToPalette()
     {
         var palette = Owner.DocumentManagerSubViewModel.ActiveDocument.Palette;

+ 5 - 5
src/PixiEditor/ViewModels/SubViewModels/LayersViewModel.cs

@@ -393,7 +393,7 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
 
     [Command.Basic("PixiEditor.Layer.ToggleMask", "TOGGLE_MASK", "TOGGLE_MASK",
         CanExecute = "PixiEditor.Layer.ActiveLayerHasMask",
-        Icon = PixiPerfectIcons.ToggleMask, AnalyticsTrack = true)]
+        Icon = PixiPerfectIcons.MaskGhost, AnalyticsTrack = true)]
     public void ToggleMask()
     {
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
@@ -418,7 +418,7 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
 
     [Command.Basic("PixiEditor.Layer.ToggleVisible", "TOGGLE_VISIBILITY", "TOGGLE_VISIBILITY",
         CanExecute = "PixiEditor.HasDocument",
-        Icon = PixiPerfectIcons.ToggleLayerVisible, AnalyticsTrack = true)]
+        Icon = PixiPerfectIcons.FileGhost, AnalyticsTrack = true)]
     public void ToggleVisible()
     {
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
@@ -614,7 +614,7 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
 
     [Command.Basic("PixiEditor.Layer.Rasterize", "RASTERIZE_ACTIVE_LAYER", "RASTERIZE_ACTIVE_LAYER_DESCRIPTIVE",
         CanExecute = "PixiEditor.Layer.AnySelectedLayerIsRasterizable",
-        Icon = PixiPerfectIcons.LowResCircle, MenuItemPath = "LAYER/VECTOR/RASTERIZE_ACTIVE_LAYER",
+        Icon = PixiPerfectIcons.LowresCircle, MenuItemPath = "LAYER/VECTOR/RASTERIZE_ACTIVE_LAYER",
         AnalyticsTrack = true)]
     public void RasterizeActiveLayer()
     {
@@ -708,9 +708,9 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
         if (doc is null || doc.ReferenceLayerViewModel.IsTopMost)
         {
-            return PixiPerfectIcons.ToIcon(PixiPerfectIcons.ReferenceLayer);
+            return PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.LayersTop);
         }
 
-        return PixiPerfectIcons.ToIcon(PixiPerfectIcons.ReferenceLayer, 18, 180);
+        return PixiPerfectIconExtensions.ToIcon(PixiPerfectIcons.LayersBottom, 18, 180);
     }
 }

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/WindowViewModel.cs

@@ -108,7 +108,7 @@ internal class WindowViewModel : SubViewModel<ViewModelMain>, IWindowHandler
 
     [Commands_Command.Basic("PixiEditor.Window.FlipHorizontally", "FLIP_VIEWPORT_HORIZONTALLY",
         "FLIP_VIEWPORT_HORIZONTALLY", CanExecute = "PixiEditor.HasDocument",
-        Icon = PixiPerfectIcons.YFlip, AnalyticsTrack = true)]
+        Icon = PixiPerfectIcons.Image180, AnalyticsTrack = true)]
     public void FlipViewportHorizontally()
     {
         if (ActiveWindow is ViewportWindowViewModel viewport)

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterEllipseToolViewModel.cs

@@ -24,7 +24,7 @@ internal class RasterEllipseToolViewModel : ShapeTool, IRasterEllipseToolHandler
     public override Type[]? SupportedLayerTypes { get; } = { typeof(IRasterLayerHandler) };
     public override LocalizedString Tooltip => new LocalizedString("ELLIPSE_TOOL_TOOLTIP", Shortcut);
 
-    public override string DefaultIcon => PixiPerfectIcons.LowResCircle;
+    public override string DefaultIcon => PixiPerfectIcons.LowresCircle;
 
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterLineToolViewModel.cs

@@ -21,7 +21,7 @@ internal class RasterLineToolViewModel : ShapeTool, ILineToolHandler
     public override LocalizedString Tooltip => new LocalizedString("LINE_TOOL_TOOLTIP", Shortcut);
 
     public override Type[]? SupportedLayerTypes { get; } = { typeof(IRasterLayerHandler) };
-    public override string DefaultIcon => PixiPerfectIcons.LowResLine;
+    public override string DefaultIcon => PixiPerfectIcons.LowresLine;
 
     [Settings.Inherited] public double ToolSize => GetValue<double>();
 

+ 1 - 1
src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs

@@ -22,7 +22,7 @@ internal class RasterRectangleToolViewModel : ShapeTool, IRasterRectangleToolHan
 
     public bool Filled { get; set; } = false;
 
-    public override string DefaultIcon => PixiPerfectIcons.LowResSquare;
+    public override string DefaultIcon => PixiPerfectIcons.LowresSquare;
 
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
 

+ 1 - 1
src/PixiEditor/Views/Overlays/Handles/IconGlyph.cs

@@ -20,7 +20,7 @@ public class IconGlyph : HandleGlyph
     public IconGlyph(string icon, Font font = null, Paint customPaint = null)
     {
         Icon = icon;
-        pixiPerfectFont ??= Font.FromStream(PixiPerfectIcons.GetFontStream());
+        pixiPerfectFont ??= Font.FromStream(PixiPerfectIconExtensions.GetFontStream());
         targetFont = font ?? pixiPerfectFont;
         if (customPaint != null)
         {

+ 3 - 2
src/PixiEditor/Views/Windows/Settings/SettingsWindow.axaml

@@ -321,8 +321,9 @@
                                               IsEnabled="{Binding Path=ShowUpdateTab}"
                                               ItemsSource="{Binding SettingsSubViewModel.Update.UpdateChannels}"
                                               SelectedValue="{Binding SettingsSubViewModel.Update.UpdateChannelName}" />
-                                    <Image Cursor="Help"
-                                           Source="/Images/Commands/PixiEditor/Links/OpenDocumentation.png"
+                                    <TextBlock Cursor="Help"
+                                           Classes="pixi-icon"
+                                           Text="{DynamicResource icon-help}"
                                            VerticalAlignment="Center"
                                            ToolTip.ShowDelay="0"
                                            IsVisible="{Binding !ShowUpdateTab}"

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor