Browse Source

Merge pull request #177 from PixiEditor/msix

Created MSIX package
Krzysztof Krysiński 4 years ago
parent
commit
a3546a342b
80 changed files with 590 additions and 66 deletions
  1. BIN
      PixiEditor.MSIX/Images/LargeTile.scale-100.png
  2. BIN
      PixiEditor.MSIX/Images/LargeTile.scale-125.png
  3. BIN
      PixiEditor.MSIX/Images/LargeTile.scale-150.png
  4. BIN
      PixiEditor.MSIX/Images/LargeTile.scale-200.png
  5. BIN
      PixiEditor.MSIX/Images/LargeTile.scale-400.png
  6. BIN
      PixiEditor.MSIX/Images/LockScreenLogo.scale-200.png
  7. BIN
      PixiEditor.MSIX/Images/SmallTile.scale-100.png
  8. BIN
      PixiEditor.MSIX/Images/SmallTile.scale-125.png
  9. BIN
      PixiEditor.MSIX/Images/SmallTile.scale-150.png
  10. BIN
      PixiEditor.MSIX/Images/SmallTile.scale-200.png
  11. BIN
      PixiEditor.MSIX/Images/SmallTile.scale-400.png
  12. BIN
      PixiEditor.MSIX/Images/SplashScreen.scale-100.png
  13. BIN
      PixiEditor.MSIX/Images/SplashScreen.scale-125.png
  14. BIN
      PixiEditor.MSIX/Images/SplashScreen.scale-150.png
  15. BIN
      PixiEditor.MSIX/Images/SplashScreen.scale-200.png
  16. BIN
      PixiEditor.MSIX/Images/SplashScreen.scale-400.png
  17. BIN
      PixiEditor.MSIX/Images/Square150x150Logo.scale-100.png
  18. BIN
      PixiEditor.MSIX/Images/Square150x150Logo.scale-125.png
  19. BIN
      PixiEditor.MSIX/Images/Square150x150Logo.scale-150.png
  20. BIN
      PixiEditor.MSIX/Images/Square150x150Logo.scale-200.png
  21. BIN
      PixiEditor.MSIX/Images/Square150x150Logo.scale-400.png
  22. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png
  23. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png
  24. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png
  25. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png
  26. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png
  27. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-16.png
  28. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-256.png
  29. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-32.png
  30. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-48.png
  31. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.scale-100.png
  32. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.scale-125.png
  33. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.scale-150.png
  34. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.scale-200.png
  35. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.scale-400.png
  36. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.targetsize-16.png
  37. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.targetsize-24.png
  38. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.targetsize-24_altform-unplated.png
  39. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.targetsize-256.png
  40. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.targetsize-32.png
  41. BIN
      PixiEditor.MSIX/Images/Square44x44Logo.targetsize-48.png
  42. BIN
      PixiEditor.MSIX/Images/StoreLogo.backup.png
  43. BIN
      PixiEditor.MSIX/Images/StoreLogo.scale-100.png
  44. BIN
      PixiEditor.MSIX/Images/StoreLogo.scale-125.png
  45. BIN
      PixiEditor.MSIX/Images/StoreLogo.scale-150.png
  46. BIN
      PixiEditor.MSIX/Images/StoreLogo.scale-200.png
  47. BIN
      PixiEditor.MSIX/Images/StoreLogo.scale-400.png
  48. BIN
      PixiEditor.MSIX/Images/Wide310x150Logo.scale-100.png
  49. BIN
      PixiEditor.MSIX/Images/Wide310x150Logo.scale-125.png
  50. BIN
      PixiEditor.MSIX/Images/Wide310x150Logo.scale-150.png
  51. BIN
      PixiEditor.MSIX/Images/Wide310x150Logo.scale-200.png
  52. BIN
      PixiEditor.MSIX/Images/Wide310x150Logo.scale-400.png
  53. 66 0
      PixiEditor.MSIX/Package.appxmanifest
  54. 129 0
      PixiEditor.MSIX/PixiEditor.MSIX.wapproj
  55. 152 0
      PixiEditor.sln
  56. 3 6
      PixiEditor/Helpers/AssemblyHelper.cs
  57. 3 1
      PixiEditor/Helpers/Extensions/ParserHelpers.cs
  58. 27 0
      PixiEditor/Helpers/Extensions/StringHelpers.cs
  59. 6 14
      PixiEditor/Models/Tools/Tool.cs
  60. 1 1
      PixiEditor/Models/Tools/Tools/SelectTool.cs
  61. 23 3
      PixiEditor/PixiEditor.csproj
  62. 2 2
      PixiEditor/Properties/AssemblyInfo.cs
  63. 19 0
      PixiEditor/Styles/ThemeStyle.xaml
  64. 12 0
      PixiEditor/ViewModels/SettingsWindowViewModel.cs
  65. 74 0
      PixiEditor/ViewModels/SubViewModels/Main/StylusViewModel.cs
  66. 5 0
      PixiEditor/ViewModels/SubViewModels/Main/ToolsViewModel.cs
  67. 9 3
      PixiEditor/ViewModels/SubViewModels/Main/UpdateViewModel.cs
  68. 1 1
      PixiEditor/ViewModels/SubViewModels/SubViewModel.cs
  69. 7 2
      PixiEditor/ViewModels/ViewModelMain.cs
  70. 1 0
      PixiEditor/Views/Dialogs/ConfirmationPopup.xaml.cs
  71. 5 19
      PixiEditor/Views/Dialogs/HelloTherePopup.xaml.cs
  72. 1 0
      PixiEditor/Views/Dialogs/NewFilePopup.xaml.cs
  73. 1 0
      PixiEditor/Views/Dialogs/ResizeCanvasPopup.xaml.cs
  74. 1 0
      PixiEditor/Views/Dialogs/ResizeDocumentPopup.xaml.cs
  75. 1 0
      PixiEditor/Views/Dialogs/SaveFilePopup.xaml.cs
  76. 3 1
      PixiEditor/Views/Dialogs/SettingsWindow.xaml
  77. 12 4
      PixiEditor/Views/MainWindow.xaml
  78. 23 6
      PixiEditor/Views/MainWindow.xaml.cs
  79. 2 2
      PixiEditorTests/PixiEditorTests.csproj
  80. 1 1
      azure-pipelines.yml

BIN
PixiEditor.MSIX/Images/LargeTile.scale-100.png


BIN
PixiEditor.MSIX/Images/LargeTile.scale-125.png


BIN
PixiEditor.MSIX/Images/LargeTile.scale-150.png


BIN
PixiEditor.MSIX/Images/LargeTile.scale-200.png


BIN
PixiEditor.MSIX/Images/LargeTile.scale-400.png


BIN
PixiEditor.MSIX/Images/LockScreenLogo.scale-200.png


BIN
PixiEditor.MSIX/Images/SmallTile.scale-100.png


BIN
PixiEditor.MSIX/Images/SmallTile.scale-125.png


BIN
PixiEditor.MSIX/Images/SmallTile.scale-150.png


BIN
PixiEditor.MSIX/Images/SmallTile.scale-200.png


BIN
PixiEditor.MSIX/Images/SmallTile.scale-400.png


BIN
PixiEditor.MSIX/Images/SplashScreen.scale-100.png


BIN
PixiEditor.MSIX/Images/SplashScreen.scale-125.png


BIN
PixiEditor.MSIX/Images/SplashScreen.scale-150.png


BIN
PixiEditor.MSIX/Images/SplashScreen.scale-200.png


BIN
PixiEditor.MSIX/Images/SplashScreen.scale-400.png


BIN
PixiEditor.MSIX/Images/Square150x150Logo.scale-100.png


BIN
PixiEditor.MSIX/Images/Square150x150Logo.scale-125.png


BIN
PixiEditor.MSIX/Images/Square150x150Logo.scale-150.png


BIN
PixiEditor.MSIX/Images/Square150x150Logo.scale-200.png


BIN
PixiEditor.MSIX/Images/Square150x150Logo.scale-400.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-16.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-256.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-32.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-48.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.scale-100.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.scale-125.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.scale-150.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.scale-200.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.scale-400.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.targetsize-16.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.targetsize-24.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.targetsize-24_altform-unplated.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.targetsize-256.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.targetsize-32.png


BIN
PixiEditor.MSIX/Images/Square44x44Logo.targetsize-48.png


BIN
PixiEditor.MSIX/Images/StoreLogo.backup.png


BIN
PixiEditor.MSIX/Images/StoreLogo.scale-100.png


BIN
PixiEditor.MSIX/Images/StoreLogo.scale-125.png


BIN
PixiEditor.MSIX/Images/StoreLogo.scale-150.png


BIN
PixiEditor.MSIX/Images/StoreLogo.scale-200.png


BIN
PixiEditor.MSIX/Images/StoreLogo.scale-400.png


BIN
PixiEditor.MSIX/Images/Wide310x150Logo.scale-100.png


BIN
PixiEditor.MSIX/Images/Wide310x150Logo.scale-125.png


BIN
PixiEditor.MSIX/Images/Wide310x150Logo.scale-150.png


BIN
PixiEditor.MSIX/Images/Wide310x150Logo.scale-200.png


BIN
PixiEditor.MSIX/Images/Wide310x150Logo.scale-400.png


+ 66 - 0
PixiEditor.MSIX/Package.appxmanifest

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<Package
+  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
+  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
+  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
+  IgnorableNamespaces="uap rescap">
+
+  <Identity
+    Name="6018c504-49c2-4830-ac0f-fab30b922158"
+    Publisher="CN=PixiEditor"
+    Version="0.2.0.0" />
+
+  <Properties>
+    <DisplayName>PixiEditor</DisplayName>
+    <PublisherDisplayName>PixiEditor</PublisherDisplayName>
+    <Logo>Images\StoreLogo.png</Logo>
+  </Properties>
+
+  <Dependencies>
+    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
+    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
+  </Dependencies>
+
+  <Resources>
+    <Resource Language="x-generate"/>
+  </Resources>
+
+  <Applications>
+    <Application Id="App"
+      Executable="$targetnametoken$.exe"
+      EntryPoint="$targetentrypoint$">
+      <uap:VisualElements
+        DisplayName="PixiEditor"
+        Description="PixiEditor is pixel-art editing software. Create beautiful sprites for your games, animations (coming soon!), and edit images. All packed in an eye-friendly dark theme."
+        BackgroundColor="transparent"
+        Square150x150Logo="Images\Square150x150Logo.png"
+        Square44x44Logo="Images\Square44x44Logo.png">
+        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png"  Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png" ShortName="PixiEditor">
+          <uap:ShowNameOnTiles>
+            <uap:ShowOn Tile="square150x150Logo"/>
+            <uap:ShowOn Tile="wide310x150Logo"/>
+            <uap:ShowOn Tile="square310x310Logo"/>
+          </uap:ShowNameOnTiles>
+        </uap:DefaultTile >
+        <uap:SplashScreen Image="Images\SplashScreen.png" />
+      </uap:VisualElements>
+      <Extensions>
+        <uap:Extension Category="windows.fileTypeAssociation">
+          <uap:FileTypeAssociation Name="pixieditor.pixifile">
+            <uap:SupportedFileTypes>
+              <uap:FileType>.pixi</uap:FileType>
+            </uap:SupportedFileTypes>
+            <uap:DisplayName>PixiEditor</uap:DisplayName>
+            <uap:InfoTip>A file used to save art made in PixiEditor</uap:InfoTip>
+            <uap:EditFlags OpenIsSafe="true"/>
+          </uap:FileTypeAssociation>
+        </uap:Extension>
+      </Extensions>
+    </Application>
+  </Applications>
+
+  <Capabilities>
+    <rescap:Capability Name="runFullTrust" />
+  </Capabilities>
+</Package>

+ 129 - 0
PixiEditor.MSIX/PixiEditor.MSIX.wapproj

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
+    <VisualStudioVersion>15.0</VisualStudioVersion>
+  </PropertyGroup>
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|x86">
+      <Configuration>Debug</Configuration>
+      <Platform>x86</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x86">
+      <Configuration>Release</Configuration>
+      <Platform>x86</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|ARM">
+      <Configuration>Debug</Configuration>
+      <Platform>ARM</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|ARM">
+      <Configuration>Release</Configuration>
+      <Platform>ARM</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|ARM64">
+      <Configuration>Debug</Configuration>
+      <Platform>ARM64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|ARM64">
+      <Configuration>Release</Configuration>
+      <Platform>ARM64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|AnyCPU">
+      <Configuration>Debug</Configuration>
+      <Platform>AnyCPU</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|AnyCPU">
+      <Configuration>Release</Configuration>
+      <Platform>AnyCPU</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup>
+    <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
+  </PropertyGroup>
+  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
+  <PropertyGroup>
+    <ProjectGuid>1f97f972-f9e8-4f35-a8b5-3f71408d2230</ProjectGuid>
+    <TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion>
+    <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
+    <DefaultLanguage>en-US</DefaultLanguage>
+    <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
+    <EntryPointProjectUniqueName>..\PixiEditor\PixiEditor.csproj</EntryPointProjectUniqueName>
+    <PackageCertificateThumbprint>4C83B3D55F197ED681F813F8BEB48ACDED28FD6F</PackageCertificateThumbprint>
+    <PackageCertificateKeyFile>PixiEditor.MSIX_TemporaryKey.pfx</PackageCertificateKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <AppxManifest Include="Package.appxmanifest">
+      <SubType>Designer</SubType>
+    </AppxManifest>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Images\LargeTile.scale-100.png" />
+    <Content Include="Images\LargeTile.scale-125.png" />
+    <Content Include="Images\LargeTile.scale-150.png" />
+    <Content Include="Images\LargeTile.scale-200.png" />
+    <Content Include="Images\LargeTile.scale-400.png" />
+    <Content Include="Images\SmallTile.scale-100.png" />
+    <Content Include="Images\SmallTile.scale-125.png" />
+    <Content Include="Images\SmallTile.scale-150.png" />
+    <Content Include="Images\SmallTile.scale-200.png" />
+    <Content Include="Images\SmallTile.scale-400.png" />
+    <Content Include="Images\SplashScreen.scale-100.png" />
+    <Content Include="Images\SplashScreen.scale-125.png" />
+    <Content Include="Images\SplashScreen.scale-150.png" />
+    <Content Include="Images\SplashScreen.scale-200.png" />
+    <Content Include="Images\LockScreenLogo.scale-200.png" />
+    <Content Include="Images\SplashScreen.scale-400.png" />
+    <Content Include="Images\Square150x150Logo.scale-100.png" />
+    <Content Include="Images\Square150x150Logo.scale-125.png" />
+    <Content Include="Images\Square150x150Logo.scale-150.png" />
+    <Content Include="Images\Square150x150Logo.scale-200.png" />
+    <Content Include="Images\Square150x150Logo.scale-400.png" />
+    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-16.png" />
+    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-24.png" />
+    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-256.png" />
+    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-32.png" />
+    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-48.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-16.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-256.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-32.png" />
+    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-48.png" />
+    <Content Include="Images\Square44x44Logo.scale-100.png" />
+    <Content Include="Images\Square44x44Logo.scale-125.png" />
+    <Content Include="Images\Square44x44Logo.scale-150.png" />
+    <Content Include="Images\Square44x44Logo.scale-200.png" />
+    <Content Include="Images\Square44x44Logo.scale-400.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-16.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-24.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-256.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-32.png" />
+    <Content Include="Images\Square44x44Logo.targetsize-48.png" />
+    <Content Include="Images\StoreLogo.scale-100.png" />
+    <Content Include="Images\StoreLogo.scale-125.png" />
+    <Content Include="Images\StoreLogo.scale-150.png" />
+    <Content Include="Images\StoreLogo.scale-200.png" />
+    <Content Include="Images\StoreLogo.scale-400.png" />
+    <Content Include="Images\Wide310x150Logo.scale-100.png" />
+    <Content Include="Images\Wide310x150Logo.scale-125.png" />
+    <Content Include="Images\Wide310x150Logo.scale-150.png" />
+    <Content Include="Images\Wide310x150Logo.scale-200.png" />
+    <Content Include="Images\Wide310x150Logo.scale-400.png" />
+  </ItemGroup>
+  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.19041.1" PrivateAssets="all" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PixiEditor\PixiEditor.csproj">
+      <SkipGetTargetFrameworkProperties>True</SkipGetTargetFrameworkProperties>
+    </ProjectReference>
+  </ItemGroup>
+</Project>

+ 152 - 0
PixiEditor.sln

@@ -18,6 +18,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BuildConfiguration", "Build
 		stylecop.json = stylecop.json
 	EndProjectSection
 EndProject
+Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "PixiEditor.MSIX", "PixiEditor.MSIX\PixiEditor.MSIX.wapproj", "{1F97F972-F9E8-4F35-A8B5-3F71408D2230}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -25,6 +27,16 @@ Global
 		Debug|ARM64 = Debug|ARM64
 		Debug|x64 = Debug|x64
 		Debug|x86 = Debug|x86
+		MSIX Debug|Any CPU = MSIX Debug|Any CPU
+		MSIX Debug|ARM = MSIX Debug|ARM
+		MSIX Debug|ARM64 = MSIX Debug|ARM64
+		MSIX Debug|x64 = MSIX Debug|x64
+		MSIX Debug|x86 = MSIX Debug|x86
+		MSIX|Any CPU = MSIX|Any CPU
+		MSIX|ARM = MSIX|ARM
+		MSIX|ARM64 = MSIX|ARM64
+		MSIX|x64 = MSIX|x64
+		MSIX|x86 = MSIX|x86
 		Release|Any CPU = Release|Any CPU
 		Release|ARM = Release|ARM
 		Release|ARM64 = Release|ARM64
@@ -42,6 +54,26 @@ Global
 		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.Debug|x64.Build.0 = Debug|Any CPU
 		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.Debug|x86.Build.0 = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|Any CPU.ActiveCfg = MSIX Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|Any CPU.Build.0 = MSIX Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|ARM.ActiveCfg = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|ARM.Build.0 = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|Any CPU.ActiveCfg = MSIX|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|Any CPU.Build.0 = MSIX|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|ARM.ActiveCfg = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|ARM.Build.0 = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|ARM64.ActiveCfg = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|ARM64.Build.0 = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|x64.ActiveCfg = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|x64.Build.0 = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|x86.ActiveCfg = Release|Any CPU
+		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.MSIX|x86.Build.0 = Release|Any CPU
 		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.Release|Any CPU.Build.0 = Release|Any CPU
 		{2CCDDE79-06CB-4771-AF85-7B25313EBA30}.Release|ARM.ActiveCfg = Release|Any CPU
@@ -62,6 +94,26 @@ Global
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x64.Build.0 = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x86.Build.0 = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|ARM.ActiveCfg = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|ARM.Build.0 = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|Any CPU.ActiveCfg = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|Any CPU.Build.0 = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|ARM.ActiveCfg = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|ARM.Build.0 = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|ARM64.ActiveCfg = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|ARM64.Build.0 = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|x64.ActiveCfg = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|x64.Build.0 = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|x86.ActiveCfg = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.MSIX|x86.Build.0 = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|Any CPU.Build.0 = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|ARM.ActiveCfg = Release|Any CPU
@@ -82,6 +134,26 @@ Global
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Debug|x64.Build.0 = Debug|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Debug|x86.Build.0 = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|ARM.ActiveCfg = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|ARM.Build.0 = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|Any CPU.ActiveCfg = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|Any CPU.Build.0 = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|ARM.ActiveCfg = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|ARM.Build.0 = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|ARM64.ActiveCfg = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|ARM64.Build.0 = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|x64.ActiveCfg = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|x64.Build.0 = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|x86.ActiveCfg = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.MSIX|x86.Build.0 = Release|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|Any CPU.Build.0 = Release|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|ARM.ActiveCfg = Release|Any CPU
@@ -102,6 +174,26 @@ Global
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Debug|x64.Build.0 = Debug|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Debug|x86.Build.0 = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|ARM.ActiveCfg = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|ARM.Build.0 = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|ARM64.ActiveCfg = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|ARM64.Build.0 = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|Any CPU.ActiveCfg = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|Any CPU.Build.0 = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|ARM.ActiveCfg = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|ARM.Build.0 = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|ARM64.ActiveCfg = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|ARM64.Build.0 = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|x64.ActiveCfg = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|x64.Build.0 = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|x86.ActiveCfg = Release|Any CPU
+		{5193C1C1-8362-40FD-802B-E097E8C88082}.MSIX|x86.Build.0 = Release|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Release|Any CPU.Build.0 = Release|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Release|ARM.ActiveCfg = Release|Any CPU
@@ -112,6 +204,66 @@ Global
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Release|x64.Build.0 = Release|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Release|x86.ActiveCfg = Release|Any CPU
 		{5193C1C1-8362-40FD-802B-E097E8C88082}.Release|x86.Build.0 = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|ARM.ActiveCfg = Debug|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|ARM.Build.0 = Debug|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|ARM.Deploy.0 = Debug|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|ARM64.ActiveCfg = Debug|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|ARM64.Build.0 = Debug|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|ARM64.Deploy.0 = Debug|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|x64.ActiveCfg = Debug|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|x64.Build.0 = Debug|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|x64.Deploy.0 = Debug|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|x86.ActiveCfg = Debug|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|x86.Build.0 = Debug|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Debug|x86.Deploy.0 = Debug|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|ARM.ActiveCfg = Debug|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|ARM.Build.0 = Debug|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|ARM.Deploy.0 = Debug|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|ARM64.ActiveCfg = Debug|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|ARM64.Build.0 = Debug|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|ARM64.Deploy.0 = Debug|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|x64.ActiveCfg = Debug|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|x64.Build.0 = Debug|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|x64.Deploy.0 = Debug|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|x86.ActiveCfg = Debug|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|x86.Build.0 = Debug|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX Debug|x86.Deploy.0 = Debug|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|Any CPU.ActiveCfg = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|Any CPU.Build.0 = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|Any CPU.Deploy.0 = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|ARM.ActiveCfg = Release|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|ARM.Build.0 = Release|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|ARM.Deploy.0 = Release|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|ARM64.ActiveCfg = Release|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|ARM64.Build.0 = Release|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|ARM64.Deploy.0 = Release|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|x64.ActiveCfg = Release|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|x64.Build.0 = Release|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|x64.Deploy.0 = Release|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|x86.ActiveCfg = Release|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|x86.Build.0 = Release|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.MSIX|x86.Deploy.0 = Release|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|Any CPU.Deploy.0 = Release|Any CPU
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|ARM.ActiveCfg = Release|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|ARM.Build.0 = Release|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|ARM.Deploy.0 = Release|ARM
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|ARM64.ActiveCfg = Release|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|ARM64.Build.0 = Release|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|ARM64.Deploy.0 = Release|ARM64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|x64.ActiveCfg = Release|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|x64.Build.0 = Release|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|x64.Deploy.0 = Release|x64
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|x86.ActiveCfg = Release|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|x86.Build.0 = Release|x86
+		{1F97F972-F9E8-4F35-A8B5-3F71408D2230}.Release|x86.Deploy.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 3 - 6
PixiEditor/Helpers/AssemblyHelper.cs

@@ -8,11 +8,8 @@ namespace PixiEditor.Helpers
 {
     public static class AssemblyHelper
     {
-        public static string GetCurrentAssemblyVersion()
-        {
-            var assembly = Assembly.GetExecutingAssembly();
-            FileVersionInfo info = FileVersionInfo.GetVersionInfo(assembly.Location);
-            return info.FileVersion;
-        }
+        public static Version GetCurrentAssemblyVersion() => Assembly.GetExecutingAssembly().GetName().Version;
+
+        public static string GetCurrentAssemblyVersion(Func<Version, string> toString) => toString(GetCurrentAssemblyVersion());
     }
 }

+ 3 - 1
PixiEditor/Helpers/Extensions/ParserHelpers.cs

@@ -39,7 +39,9 @@ namespace PixiEditor.Helpers.Extensions
                     {
                         IsVisible = serLayer.IsVisible,
                         Offset = new Thickness(serLayer.OffsetX, serLayer.OffsetY, 0, 0),
-                        Opacity = serLayer.Opacity
+                        Opacity = serLayer.Opacity,
+                        MaxHeight = serializableDocument.Height,
+                        MaxWidth = serializableDocument.Width,
                     };
                 layers.Add(layer);
             }

+ 27 - 0
PixiEditor/Helpers/Extensions/StringHelpers.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PixiEditor.Helpers.Extensions
+{
+    public static class StringHelpers
+    {
+        public static string AddSpacesBeforeUppercaseLetters(this string text)
+        {
+            if (string.IsNullOrWhiteSpace(text))
+                return "";
+
+            StringBuilder newText = new StringBuilder(text.Length * 2);
+            newText.Append(text[0]);
+            for (int i = 1; i < text.Length; i++)
+            {
+                if (char.IsUpper(text[i]) && text[i - 1] != ' ')
+                    newText.Append(' ');
+                newText.Append(text[i]);
+            }
+            return newText.ToString();
+        }
+    }
+}

+ 6 - 14
PixiEditor/Models/Tools/Tool.cs

@@ -1,6 +1,8 @@
 using System;
+using System.Text;
 using System.Windows.Input;
 using PixiEditor.Helpers;
+using PixiEditor.Helpers.Extensions;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Position;
 using PixiEditor.Models.Tools.ToolSettings;
@@ -10,24 +12,14 @@ namespace PixiEditor.Models.Tools
 {
     public abstract class Tool : NotifyableObject
     {
-        protected string name;
         private bool isActive;
         private string actionDisplay = string.Empty;
 
-        public string ToolName
-        {
-            get
-            {
-                if (string.IsNullOrWhiteSpace(name))
-                {
-                    return GetType().Name.Replace("Tool", string.Empty);
-                }
-
-                return name;
-            }
-        }
+        public virtual string ToolName => GetType().Name.Replace("Tool", string.Empty);
+
+        public virtual string DisplayName => ToolName.AddSpacesBeforeUppercaseLetters();
 
-        public string ImagePath => $"/Images/{ToolName}Image.png";
+        public virtual string ImagePath => $"/Images/{ToolName}Image.png";
 
         public bool HideHighlight { get; set; } = false;
 

+ 1 - 1
PixiEditor/Models/Tools/Tools/SelectTool.cs

@@ -20,6 +20,7 @@ namespace PixiEditor.Models.Tools.Tools
     public class SelectTool : ReadonlyTool
     {
         private IEnumerable<Coordinates> oldSelectedPoints;
+        private RectangleTool rectangleTool = new RectangleTool();
 
         private static Selection ActiveSelection { get => ViewModelMain.Current.BitmapManager.ActiveDocument.ActiveSelection; }
 
@@ -57,7 +58,6 @@ namespace PixiEditor.Models.Tools.Tools
 
         public IEnumerable<Coordinates> GetRectangleSelectionForPoints(Coordinates start, Coordinates end)
         {
-            RectangleTool rectangleTool = new RectangleTool();
             List<Coordinates> selection = rectangleTool.CreateRectangle(start, end, 1).ToList();
             selection.AddRange(rectangleTool.CalculateFillForRectangle(start, end, 1));
             return selection;

+ 23 - 3
PixiEditor/PixiEditor.csproj

@@ -14,10 +14,22 @@
     <PackageIcon>icon.ico</PackageIcon>
     <ApplicationIcon>..\icon.ico</ApplicationIcon>
     <Authors>Krzysztof Krysiński, Egor Mozgovoy, CPK</Authors>
+    <Configurations>Debug;Release;MSIX;MSIX Debug</Configurations>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MSIX|AnyCPU'">
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DefineConstants>TRACE;UPDATE</DefineConstants>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MSIX|AnyCPU'">
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DefineConstants>TRACE;RELEASE</DefineConstants>
+    <Optimize>true</Optimize>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -26,6 +38,14 @@
     <DebugSymbols>true</DebugSymbols>
   </PropertyGroup>
 
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='MSIX Debug|AnyCPU'">
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>full</DebugType>
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>false</Optimize>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+  </PropertyGroup>
+
   <ItemGroup>
     <Compile Remove="Styles\AvalonDock\Images\**" />
     <EmbeddedResource Remove="Styles\AvalonDock\Images\**" />
@@ -58,7 +78,7 @@
     </None>
   </ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Dirkster.AvalonDock" Version="4.50.1" />
+    <PackageReference Include="Dirkster.AvalonDock" Version="4.50.3" />
     <PackageReference Include="DiscordRichPresence" Version="1.0.175" />
     <PackageReference Include="Expression.Blend.Sdk">
       <Version>1.0.2</Version>
@@ -66,9 +86,9 @@
     <PackageReference Include="Extended.Wpf.Toolkit" Version="3.8.2" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
     <PackageReference Include="MvvmLightLibs" Version="5.4.1.1" />
-    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
     <PackageReference Include="PixiEditor.ColorPicker" Version="3.1.0" />
-    <PackageReference Include="PixiEditor.Parser" Version="1.0.1.1" />
+    <PackageReference Include="PixiEditor.Parser" Version="1.1.1.1" />
     <PackageReference Include="WriteableBitmapEx">
       <Version>1.6.7</Version>
     </PackageReference>

+ 2 - 2
PixiEditor/Properties/AssemblyInfo.cs

@@ -50,5 +50,5 @@ using System.Windows;
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.2.0.0")]
-[assembly: AssemblyFileVersion("0.2.0.0")]
+[assembly: AssemblyVersion("0.1.5.0")]
+[assembly: AssemblyFileVersion("0.1.5.0")]

+ 19 - 0
PixiEditor/Styles/ThemeStyle.xaml

@@ -120,6 +120,25 @@
         </Setter>
     </Style>
 
+    <Style TargetType="Button" x:Key="ToolSettingsGlyphButton"
+           BasedOn="{StaticResource BaseDarkButton}">
+        <Setter Property="TextBlock.FontFamily" Value="Segoe MDL2 Assets"/>
+        <Setter Property="TextBlock.FontSize" Value="15"/>
+        <Setter Property="TextBlock.Width" Value="30"/>
+
+        <Style.Triggers>
+            <Trigger Property="IsEnabled" Value="True">
+                <Setter Property="Background" Value="Transparent" />
+                <Setter Property="Foreground" Value="White" />
+            </Trigger>
+            <Trigger Property="IsMouseOver" Value="True">
+                <Setter Property="Background" Value="#FF515151" />
+                <Setter Property="Foreground" Value="White" />
+                <Setter Property="Cursor" Value="Hand" />
+            </Trigger>
+        </Style.Triggers>
+    </Style>
+    
 
     <Style TargetType="TextBox" x:Key="DarkTextBoxStyle">
         <Setter Property="Background" Value="#202020" />

+ 12 - 0
PixiEditor/ViewModels/SettingsWindowViewModel.cs

@@ -24,6 +24,18 @@ namespace PixiEditor.ViewModels
             }
         }
 
+        public bool ShowUpdateTab
+        {
+            get
+            {
+#if UPDATE
+                return true;
+#else
+                return false;
+#endif
+            }
+        }
+
         public SettingsViewModel SettingsSubViewModel { get; set; }
 
         public SettingsWindowViewModel()

+ 74 - 0
PixiEditor/ViewModels/SubViewModels/Main/StylusViewModel.cs

@@ -0,0 +1,74 @@
+using System.Windows;
+using System.Windows.Input;
+using PixiEditor.Models.Tools;
+using PixiEditor.Models.Tools.Tools;
+
+namespace PixiEditor.ViewModels.SubViewModels.Main
+{
+    public class StylusViewModel : SubViewModel<ViewModelMain>
+    {
+        public bool ToolSetByStylus { get; set; }
+
+        private Tool PreviousTool { get; set; }
+
+        public StylusViewModel()
+            : this(null)
+        {
+        }
+
+        public StylusViewModel(ViewModelMain owner)
+            : base(owner)
+        {
+            SetOwner(owner);
+        }
+
+        public void SetOwner(ViewModelMain owner)
+        {
+            if (Owner is not null)
+            {
+                throw new System.Exception("StylusViewModel already has an owner");
+            }
+
+            Owner = owner;
+
+            // TODO: Only capture it on the Drawing View Port
+            Window mw = Application.Current.MainWindow;
+
+            mw.PreviewStylusButtonDown += Mw_StylusButtonDown;
+            mw.PreviewStylusButtonUp += Mw_StylusButtonUp;
+            mw.PreviewStylusSystemGesture += Mw_PreviewStylusSystemGesture;
+        }
+
+        private void Mw_PreviewStylusSystemGesture(object sender, StylusSystemGestureEventArgs e)
+        {
+            if (e.SystemGesture == SystemGesture.Drag || e.SystemGesture == SystemGesture.Tap)
+            {
+                return;
+            }
+
+            e.Handled = true;
+        }
+
+        private void Mw_StylusButtonDown(object sender, StylusButtonEventArgs e)
+        {
+            e.Handled = true;
+
+            if (e.StylusButton.Guid == StylusPointProperties.TipButton.Id && e.Inverted)
+            {
+                PreviousTool = Owner.BitmapManager.SelectedTool;
+                Owner.ToolsSubViewModel.SetActiveTool<EraserTool>();
+                ToolSetByStylus = true;
+            }
+        }
+
+        private void Mw_StylusButtonUp(object sender, StylusButtonEventArgs e)
+        {
+            e.Handled = true;
+
+            if (ToolSetByStylus && e.StylusButton.Guid == StylusPointProperties.TipButton.Id && e.Inverted)
+            {
+                Owner.ToolsSubViewModel.SetActiveTool(PreviousTool);
+            }
+        }
+    }
+}

+ 5 - 0
PixiEditor/ViewModels/SubViewModels/Main/ToolsViewModel.cs

@@ -63,6 +63,11 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             LastActionTool = Owner.BitmapManager.SelectedTool;
             Owner.BitmapManager.SetActiveTool(tool);
             SetToolCursor(tool.GetType());
+
+            if (Owner.StylusSubViewModel != null)
+            {
+                Owner.StylusSubViewModel.ToolSetByStylus = false;
+            }
         }
 
         public void SetTool(object parameter)

+ 9 - 3
PixiEditor/ViewModels/SubViewModels/Main/UpdateViewModel.cs

@@ -129,7 +129,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         private static void OpenExeInstaller(string updateExeFile)
         {
-            bool alreadyUpdated = AssemblyHelper.GetCurrentAssemblyVersion() ==
+            bool alreadyUpdated = AssemblyHelper.GetCurrentAssemblyVersion().ToString() ==
                     updateExeFile.Split('-')[1].Split(".exe")[0];
 
             if (!alreadyUpdated)
@@ -161,7 +161,13 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
         }
 
-        private async void Owner_OnStartupEvent(object sender, EventArgs e)
+        private void Owner_OnStartupEvent(object sender, EventArgs e)
+        {
+            ConditionalUPDATE();
+        }
+
+        [Conditional("UPDATE")]
+        private async void ConditionalUPDATE()
         {
             if (IPreferences.Current.GetPreference("CheckUpdatesOnStartup", true))
             {
@@ -180,7 +186,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         private void InitUpdateChecker()
         {
-            string version = AssemblyHelper.GetCurrentAssemblyVersion();
+            string version = AssemblyHelper.GetCurrentAssemblyVersion().ToString();
             UpdateChecker = new UpdateChecker(version);
             VersionText = $"Version {version}";
         }

+ 1 - 1
PixiEditor/ViewModels/SubViewModels/SubViewModel.cs

@@ -3,7 +3,7 @@
     public class SubViewModel<T> : ViewModelBase
         where T : ViewModelBase
     {
-        public T Owner { get; }
+        public T Owner { get; protected set; }
 
         public SubViewModel(T owner)
         {

+ 7 - 2
PixiEditor/ViewModels/ViewModelMain.cs

@@ -68,6 +68,8 @@ namespace PixiEditor.ViewModels
 
         public ShortcutController ShortcutController { get; set; }
 
+        public StylusViewModel StylusSubViewModel { get; set; }
+
         public IPreferences Preferences { get; set; }
 
         public bool IsDebug
@@ -109,6 +111,10 @@ namespace PixiEditor.ViewModels
             ColorsSubViewModel = new ColorsViewModel(this);
             DocumentSubViewModel = new DocumentViewModel(this);
             DiscordViewModel = new DiscordViewModel(this, "764168193685979138");
+            UpdateSubViewModel = new UpdateViewModel(this);
+
+            StylusSubViewModel = services.GetService<StylusViewModel>();
+            StylusSubViewModel?.SetOwner(this);
 
             AddDebugOnlyViewModels();
             AddReleaseOnlyViewModels();
@@ -152,7 +158,7 @@ namespace PixiEditor.ViewModels
                         new Shortcut(Key.O, FileSubViewModel.OpenFileCommand, "Open a Document", modifier: ModifierKeys.Control),
                         new Shortcut(Key.S, FileSubViewModel.ExportFileCommand, "Export as image", modifier: ModifierKeys.Control | ModifierKeys.Shift | ModifierKeys.Alt),
                         new Shortcut(Key.S, FileSubViewModel.SaveDocumentCommand, "Save Document", modifier: ModifierKeys.Control),
-                        new Shortcut(Key.S, FileSubViewModel.SaveDocumentCommand, "Save Docuemnt As New", "AsNew", ModifierKeys.Control | ModifierKeys.Shift),
+                        new Shortcut(Key.S, FileSubViewModel.SaveDocumentCommand, "Save Document As New", "AsNew", ModifierKeys.Control | ModifierKeys.Shift),
                         new Shortcut(Key.N, FileSubViewModel.OpenNewFilePopupCommand, "Create new Document", modifier: ModifierKeys.Control)),
                     new ShortcutGroup(
                         "Layers",
@@ -199,7 +205,6 @@ namespace PixiEditor.ViewModels
         [Conditional("RELEASE")]
         private void AddReleaseOnlyViewModels()
         {
-            UpdateSubViewModel = new UpdateViewModel(this);
         }
 
         private Shortcut CreateToolShortcut<T>(Key key, ModifierKeys modifier = ModifierKeys.None)

+ 1 - 0
PixiEditor/Views/Dialogs/ConfirmationPopup.xaml.cs

@@ -20,6 +20,7 @@ namespace PixiEditor.Views
         public ConfirmationPopup()
         {
             InitializeComponent();
+            Owner = Application.Current.MainWindow;
             CancelCommand = new RelayCommand(Cancel);
             SetResultAndCloseCommand = new RelayCommand(SetResultAndClose);
             DataContext = this;

+ 5 - 19
PixiEditor/Views/Dialogs/HelloTherePopup.xaml.cs

@@ -1,8 +1,6 @@
 using PixiEditor.Helpers;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.ViewModels.SubViewModels.Main;
-using System;
-using System.Diagnostics;
 using System.Reflection;
 using System.Windows;
 using System.Windows.Input;
@@ -22,7 +20,8 @@ namespace PixiEditor.Views.Dialogs
         public static readonly DependencyProperty RecentlyOpenedEmptyProperty =
             DependencyProperty.Register(nameof(RecentlyOpenedEmpty), typeof(bool), typeof(HelloTherePopup));
 
-        public static string VersionText { get => $"v{Assembly.GetExecutingAssembly().GetName().Version.Major}.{Assembly.GetExecutingAssembly().GetName().Version.Minor}"; }
+        public static string VersionText => 
+            $"v{AssemblyHelper.GetCurrentAssemblyVersion(x => $"{x.Major}.{x.Minor}" + (x.Build != 0 ? $".{x.Build}" : ""))}";
 
         public FileViewModel FileViewModel { get => (FileViewModel)GetValue(FileViewModelProperty); set => SetValue(FileViewModelProperty, value); }
 
@@ -36,11 +35,12 @@ namespace PixiEditor.Views.Dialogs
 
         public RelayCommand OpenHyperlinkCommand { get => FileViewModel.Owner.MiscSubViewModel.OpenHyperlinkCommand; }
 
-        private bool isClosing;
+        public bool IsClosing { get; private set; }
 
         public HelloTherePopup(FileViewModel fileViewModel)
         {
             DataContext = this;
+            Owner = Application.Current.MainWindow;
             FileViewModel = fileViewModel;
 
             OpenFileCommand = new RelayCommand(OpenFile);
@@ -50,7 +50,7 @@ namespace PixiEditor.Views.Dialogs
             RecentlyOpenedEmpty = RecentlyOpened.Count == 0;
             RecentlyOpened.CollectionChanged += RecentlyOpened_CollectionChanged;
 
-            Closing += (_, _) => { isClosing = true; };
+            Closing += (_, _) => { IsClosing = true; };
 
             InitializeComponent();
 
@@ -66,25 +66,11 @@ namespace PixiEditor.Views.Dialogs
             }
         }
 
-        protected override void OnDeactivated(EventArgs e)
-        {
-            CloseIfRelease();
-        }
-
         private void RecentlyOpened_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
         {
             RecentlyOpenedEmpty = FileViewModel.RecentlyOpened.Count == 0;
         }
 
-        [Conditional("RELEASE")]
-        private void CloseIfRelease()
-        {
-            if (!isClosing)
-            {
-                Close();
-            }
-        }
-
         private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
         {
             e.CanExecute = true;

+ 1 - 0
PixiEditor/Views/Dialogs/NewFilePopup.xaml.cs

@@ -18,6 +18,7 @@ namespace PixiEditor.Views
         public NewFilePopup()
         {
             InitializeComponent();
+            Owner = Application.Current.MainWindow;
         }
 
         public int FileHeight

+ 1 - 0
PixiEditor/Views/Dialogs/ResizeCanvasPopup.xaml.cs

@@ -25,6 +25,7 @@ namespace PixiEditor.Views
         public ResizeCanvasPopup()
         {
             InitializeComponent();
+            Owner = Application.Current.MainWindow;
         }
 
 

+ 1 - 0
PixiEditor/Views/Dialogs/ResizeDocumentPopup.xaml.cs

@@ -17,6 +17,7 @@ namespace PixiEditor.Views
         public ResizeDocumentPopup()
         {
             InitializeComponent();
+            Owner = Application.Current.MainWindow;
             DataContext = this;
         }
 

+ 1 - 0
PixiEditor/Views/Dialogs/SaveFilePopup.xaml.cs

@@ -20,6 +20,7 @@ namespace PixiEditor.Views
         public SaveFilePopup()
         {
             InitializeComponent();
+            Owner = Application.Current.MainWindow;
             DataContext = dataContext;
         }
 

+ 3 - 1
PixiEditor/Views/Dialogs/SettingsWindow.xaml

@@ -13,6 +13,7 @@
     <Window.Resources>
         <viewmodels:SettingsWindowViewModel x:Key="SettingsWindowViewModel"/>
         <converters:EqualityBoolToVisibilityConverter x:Key="EqualityBoolToVisibilityConverter"/>
+        <BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
     </Window.Resources>
     <WindowChrome.WindowChrome>
         <WindowChrome CaptionHeight="32"
@@ -47,7 +48,8 @@
             <Button Style="{StaticResource AccentDarkRoundButton}" Margin="10 5 10 5"
                     Command="{Binding SelectCategoryCommand}" CommandParameter="General">General</Button>
             <Button Style="{StaticResource AccentDarkRoundButton}" Margin="10 5 10 5" 
-                    Command="{Binding SelectCategoryCommand}" CommandParameter="Updates">Updates</Button>
+                    Command="{Binding SelectCategoryCommand}" CommandParameter="Updates"
+                    Visibility="{Binding ShowUpdateTab, Converter={StaticResource BoolToVisibilityConverter}}">Updates</Button>
             <Button Style="{StaticResource AccentDarkRoundButton}" Margin="10 5 10 5" 
                     Command="{Binding SelectCategoryCommand}" CommandParameter="Discord">Discord</Button>
         </StackPanel>

+ 12 - 4
PixiEditor/Views/MainWindow.xaml

@@ -1,4 +1,4 @@
-<Window x:Class="PixiEditor.MainWindow" MinHeight="500" MinWidth="1100"
+<Window x:Class="PixiEditor.MainWindow" MinHeight="500" MinWidth="700"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@@ -175,8 +175,15 @@
         </DockPanel>
         <StackPanel Background="{StaticResource MainColor}" Orientation="Horizontal" Grid.ColumnSpan="3" Grid.Column="0"
                      Grid.Row="1">
-            <Label Style="{StaticResource BaseLabel}" Margin="10,0,0,0" FontSize="12" VerticalAlignment="Center" Content="{Binding BitmapManager.SelectedTool.ToolName}"/>
-            <Label Style="{StaticResource BaseLabel}" Padding="0" FontSize="12" VerticalAlignment="Center" Content="tool"/>
+            <Button Margin="1,0,0,0" Command="{Binding UndoSubViewModel.UndoCommand}"
+                    ToolTip="Undo"
+                    Style="{StaticResource ToolSettingsGlyphButton}" Content="&#xE7A7;"/>
+            <Button Command="{Binding UndoSubViewModel.RedoCommand}" ToolTip="Redo"
+                    Style="{StaticResource ToolSettingsGlyphButton}" Content="&#xE7A6;"/>
+            <Grid Margin="5,5,10,5" Background="{StaticResource BrighterAccentColor}" Width="5"/>
+            <Label Style="{StaticResource BaseLabel}" FontSize="12"
+                   VerticalAlignment="Center" Content="{Binding BitmapManager.SelectedTool.DisplayName}"
+                   ToolTip="{Binding BitmapManager.SelectedTool.ActionDisplay}"/>
             <ItemsControl ItemsSource="{Binding BitmapManager.SelectedTool.Toolbar.Settings}">
                 <ItemsControl.ItemsPanel>
                     <ItemsPanelTemplate>
@@ -236,7 +243,8 @@
                                         MouseMoveCommand="{Binding XamlAccesibleViewModel.IoSubViewModel.MouseMoveCommand}"
                                         MouseDownCommand="{Binding XamlAccesibleViewModel.IoSubViewModel.MouseDownCommand}"
                                         MouseXOnCanvas="{Binding MouseXOnCanvas, Mode=TwoWay}"
-                                        MouseYOnCanvas="{Binding MouseYOnCanvas, Mode=TwoWay}">
+                                        MouseYOnCanvas="{Binding MouseYOnCanvas, Mode=TwoWay}"
+                                        Stylus.IsTapFeedbackEnabled="False" Stylus.IsTouchFeedbackEnabled="False">
                                         <i:Interaction.Triggers>
                                             <i:EventTrigger EventName="PreviewMouseDown">
                                                 <i:InvokeCommandAction Command="{Binding SetAsActiveOnClickCommand}"/>

+ 23 - 6
PixiEditor/Views/MainWindow.xaml.cs

@@ -5,6 +5,10 @@ using System;
 using System.ComponentModel;
 using System.Windows;
 using System.Windows.Input;
+using PixiEditor.ViewModels.SubViewModels.Main;
+using System.Diagnostics;
+using System.Linq;
+using PixiEditor.Views.Dialogs;
 
 namespace PixiEditor
 {
@@ -13,28 +17,36 @@ namespace PixiEditor
     /// </summary>
     public partial class MainWindow : Window
     {
-        private readonly ViewModelMain viewModel;
+        public new ViewModelMain DataContext { get => (ViewModelMain)base.DataContext; set => base.DataContext = value; }
 
         public MainWindow()
         {
             InitializeComponent();
 
             IServiceCollection services = new ServiceCollection()
-                .AddSingleton<IPreferences>(new PreferencesSettings());
+                .AddSingleton<IPreferences>(new PreferencesSettings())
+                .AddSingleton(new StylusViewModel());
 
             DataContext = new ViewModelMain(services.BuildServiceProvider());
 
             StateChanged += MainWindowStateChangeRaised;
+            Activated += MainWindow_Activated;
+
             MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
-            viewModel = (ViewModelMain)DataContext;
-            viewModel.CloseAction = Close;
+            DataContext.CloseAction = Close;
             Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
         }
 
         protected override void OnClosing(CancelEventArgs e)
         {
-            ((ViewModelMain)DataContext).CloseWindow(e);
-            viewModel.DiscordViewModel.Dispose();
+            DataContext.CloseWindow(e);
+            DataContext.DiscordViewModel.Dispose();
+        }
+
+        [Conditional("RELEASE")]
+        private static void CloseHelloThereIfRelease()
+        {
+            Application.Current.Windows.OfType<HelloTherePopup>().ToList().ForEach(x => { if (!x.IsClosing) x.Close(); });
         }
 
         private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
@@ -62,6 +74,11 @@ namespace PixiEditor
             SystemCommands.CloseWindow(this);
         }
 
+        private void MainWindow_Activated(object sender, EventArgs e)
+        {
+            CloseHelloThereIfRelease();
+        }
+
         private void MainWindowStateChangeRaised(object sender, EventArgs e)
         {
             if (WindowState == WindowState.Maximized)

+ 2 - 2
PixiEditorTests/PixiEditorTests.csproj

@@ -25,8 +25,8 @@
     </PackageReference>
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
-    <PackageReference Include="Moq" Version="4.16.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
+    <PackageReference Include="Moq" Version="4.16.1" />
     <PackageReference Include="OpenCover" Version="4.7.922" />
     <PackageReference Include="xunit" Version="2.4.1" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">

+ 1 - 1
azure-pipelines.yml

@@ -47,4 +47,4 @@ steps:
 - task: CmdLine@2
   inputs:
     script: codecov -f .\PixiEditorTests\PixiEditor_coverage.xml -t $(CODECOV_TOKEN)
-  displayName: Upload to Codecov.io
+  displayName: Upload to Codecov.io