Browse Source

Half working browser stuff (Also don't tell anyone but it also includes a half working android version, but we're not actually doing android yet)

CPKreuz 1 năm trước cách đây
mục cha
commit
43318d15b2
32 tập tin đã thay đổi với 557 bổ sung81 xóa
  1. BIN
      src/PixiEditor.AvaloniaUI.Android/Icon.png
  2. 23 0
      src/PixiEditor.AvaloniaUI.Android/MainActivity.cs
  3. 32 0
      src/PixiEditor.AvaloniaUI.Android/PixiEditor.AvaloniaUI.Android.csproj
  4. 5 0
      src/PixiEditor.AvaloniaUI.Android/Properties/AndroidManifest.xml
  5. 44 0
      src/PixiEditor.AvaloniaUI.Android/Resources/AboutResources.txt
  6. 66 0
      src/PixiEditor.AvaloniaUI.Android/Resources/drawable-night-v31/avalonia_anim.xml
  7. 71 0
      src/PixiEditor.AvaloniaUI.Android/Resources/drawable-v31/avalonia_anim.xml
  8. 13 0
      src/PixiEditor.AvaloniaUI.Android/Resources/drawable/splash_screen.xml
  9. 4 0
      src/PixiEditor.AvaloniaUI.Android/Resources/values-night/colors.xml
  10. 21 0
      src/PixiEditor.AvaloniaUI.Android/Resources/values-v31/styles.xml
  11. 4 0
      src/PixiEditor.AvaloniaUI.Android/Resources/values/colors.xml
  12. 12 0
      src/PixiEditor.AvaloniaUI.Android/Resources/values/styles.xml
  13. 15 4
      src/PixiEditor.AvaloniaUI.Browser/Program.cs
  14. 24 2
      src/PixiEditor.AvaloniaUI/App.axaml.cs
  15. 3 2
      src/PixiEditor.AvaloniaUI/Initialization/ClassicDesktopEntry.cs
  16. 16 14
      src/PixiEditor.AvaloniaUI/Models/Commands/XAML/Command.cs
  17. 2 0
      src/PixiEditor.AvaloniaUI/Models/Controllers/ClipboardController.cs
  18. 2 2
      src/PixiEditor.AvaloniaUI/Models/IO/Paths.cs
  19. 5 2
      src/PixiEditor.AvaloniaUI/PixiEditor.AvaloniaUI.csproj
  20. 2 2
      src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentManagerViewModel.cs
  21. 4 4
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ClipboardViewModel.cs
  22. 8 8
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ColorsViewModel.cs
  23. 14 0
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DebugViewModel.cs
  24. 5 0
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DiscordViewModel.cs
  25. 17 13
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/FileViewModel.cs
  26. 3 3
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/LayoutViewModel.cs
  27. 16 0
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/SearchViewModel.cs
  28. 2 2
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/UpdateViewModel.cs
  29. 3 1
      src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/PenToolViewModel.cs
  30. 52 3
      src/PixiEditor.AvaloniaUI/ViewModels/ViewModelMain.cs
  31. 4 0
      src/PixiEditor.AvaloniaUI/Views/Main/MainTitleBar.axaml
  32. 65 19
      src/PixiEditor.sln

BIN
src/PixiEditor.AvaloniaUI.Android/Icon.png


+ 23 - 0
src/PixiEditor.AvaloniaUI.Android/MainActivity.cs

@@ -0,0 +1,23 @@
+using Android.App;
+using Android.Content.PM;
+using Avalonia;
+using Avalonia.Android;
+using Avalonia.ReactiveUI;
+
+namespace PixiEditor.AvaloniaUI.Android;
+
+[Activity(
+    Label = "PixiEditor.Android",
+    Theme = "@style/MyTheme.NoActionBar",
+    Icon = "@drawable/icon",
+    MainLauncher = true,
+    ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
+public class MainActivity : AvaloniaMainActivity<App>
+{
+    protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
+    {
+        return base.CustomizeAppBuilder(builder)
+            .WithInterFont()
+            .UseReactiveUI();
+    }
+}

+ 32 - 0
src/PixiEditor.AvaloniaUI.Android/PixiEditor.AvaloniaUI.Android.csproj

@@ -0,0 +1,32 @@
+<Project Sdk="Microsoft.NET.Sdk">
+<PropertyGroup>
+  <OutputType>Exe</OutputType>
+  <TargetFramework>net8.0-android</TargetFramework>
+  <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
+  <Nullable>enable</Nullable>
+  <ApplicationId>com.PixiEditor.PixiEditor.Pixi</ApplicationId>
+  <ApplicationVersion>1</ApplicationVersion>
+  <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
+  <AndroidPackageFormat>apk</AndroidPackageFormat>
+  <AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
+</PropertyGroup>
+<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+  <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
+</PropertyGroup>
+
+<ItemGroup>
+  <AndroidResource Include="Icon.png">
+    <Link>Resources\drawable\Icon.png</Link>
+  </AndroidResource>
+</ItemGroup>
+
+<ItemGroup>
+  <PackageReference Include="Avalonia.Android" Version="$(AvaloniaVersion)" />
+  <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.10" />
+  <PackageReference Include="Xamarin.AndroidX.Core.SplashScreen" Version="1.0.1.1" />
+</ItemGroup>
+
+<ItemGroup>
+  <ProjectReference Include="..\PixiEditor.AvaloniaUI\PixiEditor.AvaloniaUI.csproj" />
+</ItemGroup>
+</Project>

+ 5 - 0
src/PixiEditor.AvaloniaUI.Android/Properties/AndroidManifest.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
+	<uses-permission android:name="android.permission.INTERNET" />
+	<application android:label="PixiEditor" android:icon="@drawable/Icon" />
+</manifest>

+ 44 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/AboutResources.txt

@@ -0,0 +1,44 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included 
+in your application as resource files.  Various Android APIs are designed to 
+operate on the resource IDs instead of dealing with images, strings or binary blobs 
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.axml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+    drawable/
+        icon.png
+
+    layout/
+        main.axml
+
+    values/
+        strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource".  The native Android APIs do not operate directly with filenames, but 
+instead operate on resource IDs.  When you compile an Android application that uses resources, 
+the build system will package the resources for distribution and generate a class called "R" 
+(this is an Android convention) that contains the tokens for each one of the resources 
+included. For example, for the above Resources layout, this is what the R class would expose:
+
+public class R {
+    public class drawable {
+        public const int icon = 0x123;
+    }
+
+    public class layout {
+        public const int main = 0x456;
+    }
+
+    public class strings {
+        public const int first_string = 0xabc;
+        public const int second_string = 0xbcd;
+    }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main 
+to reference the layout/main.axml file, or R.strings.first_string to reference the first 
+string in the dictionary file values/strings.xml.

+ 66 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/drawable-night-v31/avalonia_anim.xml

@@ -0,0 +1,66 @@
+<animated-vector
+  xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:aapt="http://schemas.android.com/aapt">
+  <aapt:attr name="android:drawable">
+    <vector
+      android:name="vector"
+      android:width="128dp"
+      android:height="128dp"
+      android:viewportWidth="128"
+      android:viewportHeight="128">
+      <group
+        android:name="wrapper"
+        android:translateX="21"
+        android:translateY="21">
+        <group android:name="group">
+          <path
+            android:name="path"
+            android:pathData="M 74.853 85.823 L 75.368 85.823 C 80.735 85.823 85.144 81.803 85.761 76.602 L 85.836 41.76 C 85.225 18.593 66.254 0 42.939 0 C 19.24 0 0.028 19.212 0.028 42.912 C 0.028 66.357 18.831 85.418 42.18 85.823 L 74.853 85.823 Z"
+            android:strokeWidth="1"/>
+          <path
+            android:name="path_1"
+            android:pathData="M 43.059 14.614 C 29.551 14.614 18.256 24.082 15.445 36.743 C 18.136 37.498 20.109 39.968 20.109 42.899 C 20.109 45.831 18.136 48.301 15.445 49.055 C 18.256 61.716 29.551 71.184 43.059 71.184 C 47.975 71.184 52.599 69.93 56.628 67.723 L 56.628 70.993 L 71.344 70.993 L 71.344 44.072 C 71.357 43.714 71.344 43.26 71.344 42.899 C 71.344 27.278 58.68 14.614 43.059 14.614 Z M 29.51 42.899 C 29.51 35.416 35.576 29.35 43.059 29.35 C 50.541 29.35 56.607 35.416 56.607 42.899 C 56.607 50.382 50.541 56.448 43.059 56.448 C 35.576 56.448 29.51 50.382 29.51 42.899 Z"
+            android:strokeWidth="1"
+            android:fillType="evenOdd"/>
+          <path
+            android:name="path_2"
+            android:pathData="M 18.105 42.88 C 18.105 45.38 16.078 47.407 13.579 47.407 C 11.079 47.407 9.052 45.38 9.052 42.88 C 9.052 40.381 11.079 38.354 13.579 38.354 C 16.078 38.354 18.105 40.381 18.105 42.88 Z"
+            android:strokeWidth="1"/>
+        </group>
+      </group>
+    </vector>
+  </aapt:attr>
+  <target android:name="path">
+    <aapt:attr name="android:animation">
+      <objectAnimator
+        android:propertyName="fillColor"
+        android:duration="1000"
+        android:valueFrom="#00ffffff"
+        android:valueTo="#161c2d"
+        android:valueType="colorType"
+        android:interpolator="@android:interpolator/fast_out_slow_in"/>
+    </aapt:attr>
+  </target>
+  <target android:name="path_1">
+    <aapt:attr name="android:animation">
+      <objectAnimator
+        android:propertyName="fillColor"
+        android:duration="1000"
+        android:valueFrom="#00ffffff"
+        android:valueTo="#f9f9fb"
+        android:valueType="colorType"
+        android:interpolator="@android:interpolator/fast_out_slow_in"/>
+    </aapt:attr>
+  </target>
+  <target android:name="path_2">
+    <aapt:attr name="android:animation">
+      <objectAnimator
+        android:propertyName="fillColor"
+        android:duration="1000"
+        android:valueFrom="#00ffffff"
+        android:valueTo="#f9f9fb"
+        android:valueType="colorType"
+        android:interpolator="@android:interpolator/fast_out_slow_in"/>
+    </aapt:attr>
+  </target>
+</animated-vector>

+ 71 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/drawable-v31/avalonia_anim.xml

@@ -0,0 +1,71 @@
+<animated-vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt">
+    <aapt:attr name="android:drawable">
+        <vector
+            android:name="vector"
+            android:width="128dp"
+            android:height="128dp"
+            android:viewportWidth="128"
+            android:viewportHeight="128">
+            <group
+                android:name="wrapper"
+                android:translateX="21"
+                android:translateY="21">
+                <group android:name="group">
+                    <path
+                        android:name="path"
+                        android:pathData="M 74.853 85.823 L 75.368 85.823 C 80.735 85.823 85.144 81.803 85.761 76.602 L 85.836 41.76 C 85.225 18.593 66.254 0 42.939 0 C 19.24 0 0.028 19.212 0.028 42.912 C 0.028 66.357 18.831 85.418 42.18 85.823 L 74.853 85.823 Z"
+                        android:fillColor="#00ffffff"
+                        android:strokeWidth="1"/>
+                    <path
+                        android:name="path_1"
+                        android:pathData="M 43.059 14.614 C 29.551 14.614 18.256 24.082 15.445 36.743 C 18.136 37.498 20.109 39.968 20.109 42.899 C 20.109 45.831 18.136 48.301 15.445 49.055 C 18.256 61.716 29.551 71.184 43.059 71.184 C 47.975 71.184 52.599 69.93 56.628 67.723 L 56.628 70.993 L 71.344 70.993 L 71.344 44.072 C 71.357 43.714 71.344 43.26 71.344 42.899 C 71.344 27.278 58.68 14.614 43.059 14.614 Z M 29.51 42.899 C 29.51 35.416 35.576 29.35 43.059 29.35 C 50.541 29.35 56.607 35.416 56.607 42.899 C 56.607 50.382 50.541 56.448 43.059 56.448 C 35.576 56.448 29.51 50.382 29.51 42.899 Z"
+                        android:fillColor="#00ffffff"
+                        android:strokeWidth="1"
+                        android:fillType="evenOdd"/>
+                    <path
+                        android:name="path_2"
+                        android:pathData="M 18.105 42.88 C 18.105 45.38 16.078 47.407 13.579 47.407 C 11.079 47.407 9.052 45.38 9.052 42.88 C 9.052 40.381 11.079 38.354 13.579 38.354 C 16.078 38.354 18.105 40.381 18.105 42.88 Z"
+                        android:fillColor="#00ffffff"
+                        android:strokeWidth="1"/>
+                </group>
+            </group>
+        </vector>
+    </aapt:attr>
+    <target android:name="path_2">
+        <aapt:attr name="android:animation">
+            <objectAnimator
+                android:propertyName="fillColor"
+                android:startOffset="100"
+                android:duration="900"
+                android:valueFrom="#00ffffff"
+                android:valueTo="#161c2d"
+                android:valueType="colorType"
+                android:interpolator="@android:interpolator/fast_out_slow_in"/>
+        </aapt:attr>
+    </target>
+    <target android:name="path">
+        <aapt:attr name="android:animation">
+            <objectAnimator
+                android:propertyName="fillColor"
+                android:duration="500"
+                android:valueFrom="#00ffffff"
+                android:valueTo="#f9f9fb"
+                android:valueType="colorType"
+                android:interpolator="@android:interpolator/fast_out_slow_in"/>
+        </aapt:attr>
+    </target>
+    <target android:name="path_1">
+        <aapt:attr name="android:animation">
+            <objectAnimator
+                android:propertyName="fillColor"
+                android:startOffset="100"
+                android:duration="900"
+                android:valueFrom="#00ffffff"
+                android:valueTo="#161c2d"
+                android:valueType="colorType"
+                android:interpolator="@android:interpolator/fast_out_slow_in"/>
+        </aapt:attr>
+    </target>
+</animated-vector>

+ 13 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/drawable/splash_screen.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+  <item>
+    <color android:color="@color/splash_background"/>
+  </item>
+
+  <item android:drawable="@drawable/icon"
+        android:width="120dp"
+        android:height="120dp"
+        android:gravity="center" />
+
+</layer-list>

+ 4 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/values-night/colors.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <color name="splash_background">#212121</color>
+</resources>

+ 21 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/values-v31/styles.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+  <style name="MyTheme">
+  </style>
+
+  <style name="MyTheme.NoActionBar" parent="@style/Theme.AppCompat.NoActionBar">
+    <item name="android:windowActionBar">false</item>
+    <item name="android:windowBackground">@null</item>
+    <item name="android:windowNoTitle">true</item>
+    <item name="android:windowSplashScreenBackground">@color/splash_background</item>
+    <item name="android:windowSplashScreenAnimatedIcon">@drawable/avalonia_anim</item>
+    <item name="android:windowSplashScreenAnimationDuration">1000</item>
+    <item name="postSplashScreenTheme">@style/MyTheme.Main</item>
+
+  </style>
+  <style name="MyTheme.Main"
+         parent ="MyTheme.NoActionBar">
+    <item name="android:windowIsTranslucent">true</item>
+  </style>
+</resources>

+ 4 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/values/colors.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <color name="splash_background">#FFFFFF</color>
+</resources>

+ 12 - 0
src/PixiEditor.AvaloniaUI.Android/Resources/values/styles.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+  <style name="MyTheme">
+  </style>
+
+  <style name="MyTheme.NoActionBar" parent="@style/Theme.AppCompat.DayNight.NoActionBar">
+    <item name="android:windowActionBar">false</item>
+    <item name="android:windowBackground">@drawable/splash_screen</item>
+    <item name="android:windowNoTitle">true</item>
+  </style>
+</resources>

+ 15 - 4
src/PixiEditor.AvaloniaUI.Browser/Program.cs

@@ -1,4 +1,5 @@
-using System.Runtime.Versioning;
+using System;
+using System.Runtime.Versioning;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using Avalonia;
 using Avalonia;
 using Avalonia.Browser;
 using Avalonia.Browser;
@@ -8,9 +9,19 @@ using PixiEditor.AvaloniaUI;
 
 
 internal partial class Program
 internal partial class Program
 {
 {
-    private static async Task Main(string[] args) => await BuildAvaloniaApp()
-        .WithInterFont()
-        .StartBrowserAppAsync("out");
+    private static async Task Main(string[] args)
+    {
+        try
+        {
+            await BuildAvaloniaApp()
+                .WithInterFont()
+                .StartBrowserAppAsync("out");
+        }
+        catch (Exception e)
+        {
+            Console.WriteLine(e);
+        }
+    }
 
 
     public static AppBuilder BuildAvaloniaApp()
     public static AppBuilder BuildAvaloniaApp()
         => AppBuilder.Configure<App>();
         => AppBuilder.Configure<App>();

+ 24 - 2
src/PixiEditor.AvaloniaUI/App.axaml.cs

@@ -1,7 +1,15 @@
+using System.Threading.Tasks;
 using Avalonia;
 using Avalonia;
 using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Markup.Xaml;
 using Avalonia.Markup.Xaml;
+using Microsoft.Extensions.DependencyInjection;
+using PixiEditor.AvaloniaUI.Helpers;
 using PixiEditor.AvaloniaUI.Initialization;
 using PixiEditor.AvaloniaUI.Initialization;
+using PixiEditor.AvaloniaUI.ViewModels;
+using PixiEditor.AvaloniaUI.Views;
+using PixiEditor.DrawingApi.Core.Bridge;
+using PixiEditor.DrawingApi.Skia;
+using PixiEditor.Platform;
 
 
 namespace PixiEditor.AvaloniaUI;
 namespace PixiEditor.AvaloniaUI;
 
 
@@ -20,8 +28,22 @@ public partial class App : Application
         }
         }
         else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
         else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
         {
         {
-            throw new NotImplementedException();
-            //singleViewPlatform.MainView = new MainView { DataContext = new MainViewModel() };
+            var services = new ServiceCollection()
+                // .AddPlatform()
+                .AddPixiEditor(null);
+
+            //throw new NotImplementedException();
+
+            SkiaDrawingBackend skiaDrawingBackend = new SkiaDrawingBackend();
+            DrawingBackendApi.SetupBackend(skiaDrawingBackend);
+
+            var viewModelMain = new ViewModelMain();
+
+            services.AddSingleton(viewModelMain);
+            
+            viewModelMain.Setup(services.BuildServiceProvider());
+            
+            singleViewPlatform.MainView = new MainView { DataContext = viewModelMain };
         }
         }
 
 
         base.OnFrameworkInitializationCompleted();
         base.OnFrameworkInitializationCompleted();

+ 3 - 2
src/PixiEditor.AvaloniaUI/Initialization/ClassicDesktopEntry.cs

@@ -19,7 +19,7 @@ using PixiEditor.Extensions.Runtime;
 using PixiEditor.OperatingSystem;
 using PixiEditor.OperatingSystem;
 using PixiEditor.Platform;
 using PixiEditor.Platform;
 using PixiEditor.Views;
 using PixiEditor.Views;
-using PixiEditor.Windows;
+// using PixiEditor.Windows;
 using ViewModelMain = PixiEditor.AvaloniaUI.ViewModels.ViewModelMain;
 using ViewModelMain = PixiEditor.AvaloniaUI.ViewModels.ViewModelMain;
 
 
 namespace PixiEditor.AvaloniaUI.Initialization;
 namespace PixiEditor.AvaloniaUI.Initialization;
@@ -135,7 +135,8 @@ internal class ClassicDesktopEntry
 
 
     private IOperatingSystem GetActiveOperatingSystem()
     private IOperatingSystem GetActiveOperatingSystem()
     {
     {
-        return new WindowsOperatingSystem();
+        return null;
+        // return new WindowsOperatingSystem();
     }
     }
 
 
     private bool HandleNewInstance(Dispatcher? dispatcher)
     private bool HandleNewInstance(Dispatcher? dispatcher)

+ 16 - 14
src/PixiEditor.AvaloniaUI/Models/Commands/XAML/Command.cs

@@ -22,25 +22,27 @@ internal class Command : MarkupExtension
 
 
     public override object ProvideValue(IServiceProvider serviceProvider)
     public override object ProvideValue(IServiceProvider serviceProvider)
     {
     {
-        if (Design.IsDesignMode)
-        {
-            var attribute = DesignCommandHelpers.GetCommandAttribute(Name);
-            return GetICommand(
-                new Commands.Command.BasicCommand(null, null)
-                {
-                    InternalName = Name,
-                    DisplayName = attribute.DisplayName,
-                    Description = attribute.Description,
-                    DefaultShortcut = attribute.GetShortcut(),
-                    Shortcut = attribute.GetShortcut()
-                }, false);
-        }
-
+        // if (Design.IsDesignMode)
+        // {
+        //     var attribute = DesignCommandHelpers.GetCommandAttribute(Name);
+        //     return GetICommand(
+        //         new Commands.Command.BasicCommand(null, null)
+        //         {
+        //             InternalName = Name,
+        //             DisplayName = attribute.DisplayName,
+        //             Description = attribute.Description,
+        //             DefaultShortcut = attribute.GetShortcut(),
+        //             Shortcut = attribute.GetShortcut()
+        //         }, false);
+        // }
+        
         if (commandController is null)
         if (commandController is null)
         {
         {
             commandController = CommandController.Current; // TODO: Find a better way to get the current CommandController
             commandController = CommandController.Current; // TODO: Find a better way to get the current CommandController
         }
         }
 
 
+        Console.WriteLine($"Hello PixiEditor kakakakaka, 'commandController != null' => {commandController != null}!");
+
         var command = commandController.Commands[Name];
         var command = commandController.Commands[Name];
         return GetPixiCommand ? command : GetICommand(command, UseProvided);
         return GetPixiCommand ? command : GetICommand(command, UseProvided);
     }
     }

+ 2 - 0
src/PixiEditor.AvaloniaUI/Models/Controllers/ClipboardController.cs

@@ -248,6 +248,8 @@ internal static class ClipboardController
     [Evaluator.CanExecute("PixiEditor.Clipboard.HasImageInClipboard")]
     [Evaluator.CanExecute("PixiEditor.Clipboard.HasImageInClipboard")]
     public static async Task<bool> IsImageInClipboard()
     public static async Task<bool> IsImageInClipboard()
     {
     {
+        return false;
+
         var formats = await Clipboard.GetFormatsAsync();
         var formats = await Clipboard.GetFormatsAsync();
         if (formats == null || formats.Length == 0)
         if (formats == null || formats.Length == 0)
             return false;
             return false;

+ 2 - 2
src/PixiEditor.AvaloniaUI/Models/IO/Paths.cs

@@ -5,9 +5,9 @@ namespace PixiEditor.AvaloniaUI.Models.IO;
 public static class Paths
 public static class Paths
 {
 {
     public static string DataResourceUri { get; } = $"avares://{typeof(Paths).Assembly.GetName().Name}/Data/";
     public static string DataResourceUri { get; } = $"avares://{typeof(Paths).Assembly.GetName().Name}/Data/";
-    public static string DataFullPath { get; } = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Data");
+    public static string DataFullPath { get; } = $"avares://{typeof(Paths).Assembly.GetName().Name}/Data/";
 
 
-    public static string ExtensionsFullPath { get; } = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Extensions");
+    public static string ExtensionsFullPath { get; } = $"avares://{typeof(Paths).Assembly.GetName().Name}/Data/";
 
 
     public static string PathToPalettesFolder { get; } = Path.Join(
     public static string PathToPalettesFolder { get; } = Path.Join(
         Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
         Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),

+ 5 - 2
src/PixiEditor.AvaloniaUI/PixiEditor.AvaloniaUI.csproj

@@ -62,11 +62,14 @@
       <ProjectReference Include="..\PixiEditor.Platform\PixiEditor.Platform.csproj" />
       <ProjectReference Include="..\PixiEditor.Platform\PixiEditor.Platform.csproj" />
       <ProjectReference Include="..\PixiEditor.UI.Common\PixiEditor.UI.Common.csproj" />
       <ProjectReference Include="..\PixiEditor.UI.Common\PixiEditor.UI.Common.csproj" />
       <ProjectReference Include="..\PixiEditor.UpdateModule\PixiEditor.UpdateModule.csproj" />
       <ProjectReference Include="..\PixiEditor.UpdateModule\PixiEditor.UpdateModule.csproj" />
-      <ProjectReference Include="..\PixiEditor.Windows\PixiEditor.Windows.csproj" />
       <ProjectReference Include="..\PixiEditor.Zoombox\PixiEditor.Zoombox.csproj" />
       <ProjectReference Include="..\PixiEditor.Zoombox\PixiEditor.Zoombox.csproj" />
       <ProjectReference Include="..\PixiEditorGen\PixiEditorGen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
       <ProjectReference Include="..\PixiEditorGen\PixiEditorGen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
     </ItemGroup>
     </ItemGroup>
-  
+<!--  -->
+<!--  <ItemGroup Condition="'$(RuntimeIdentifier)' != 'browser-wasm'">-->
+<!--    <ProjectReference Include="..\PixiEditor.Windows\PixiEditor.Windows.csproj" />-->
+<!--  </ItemGroup>-->
+<!--  -->
     <ItemGroup>
     <ItemGroup>
       <AvaloniaResource Include="Images\**" />
       <AvaloniaResource Include="Images\**" />
       <AvaloniaResource Include="Fonts\**" />
       <AvaloniaResource Include="Fonts\**" />

+ 2 - 2
src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentManagerViewModel.cs

@@ -48,9 +48,9 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>, IDocument
 
 
     public bool HasActiveDocument => ActiveDocument != null;
     public bool HasActiveDocument => ActiveDocument != null;
 
 
-    public DocumentManagerViewModel(ViewModelMain owner) : base(owner)
+    public DocumentManagerViewModel(ViewModelMain owner, WindowViewModel windowViewModel) : base(owner)
     {
     {
-        owner.WindowSubViewModel.ActiveViewportChanged += (_, args) => ActiveDocument = args.Document;
+        windowViewModel.ActiveViewportChanged += (_, args) => ActiveDocument = args.Document;
     }
     }
 
 
     public void MakeActiveDocumentNull() => ActiveDocument = null;
     public void MakeActiveDocumentNull() => ActiveDocument = null;

+ 4 - 4
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ClipboardViewModel.cs

@@ -23,10 +23,10 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
     public ClipboardViewModel(ViewModelMain owner)
     public ClipboardViewModel(ViewModelMain owner)
         : base(owner)
         : base(owner)
     {
     {
-        Application.Current.ForDesktopMainWindow((mainWindow) =>
-        {
-            ClipboardController.Initialize(mainWindow.Clipboard);
-        });
+        //Application.Current.ForDesktopMainWindow((mainWindow) =>
+        //{
+        //    ClipboardController.Initialize(mainWindow.Clipboard);
+        //});
     }
     }
 
 
     [Command.Basic("PixiEditor.Clipboard.Cut", "CUT", "CUT_DESCRIPTIVE", CanExecute = "PixiEditor.Selection.IsNotEmpty", Key = Key.X, Modifiers = KeyModifiers.Control)]
     [Command.Basic("PixiEditor.Clipboard.Cut", "CUT", "CUT_DESCRIPTIVE", CanExecute = "PixiEditor.Selection.IsNotEmpty", Key = Key.X, Modifiers = KeyModifiers.Control)]

+ 8 - 8
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ColorsViewModel.cs

@@ -370,13 +370,13 @@ internal class ColorsViewModel : SubViewModel<ViewModelMain>, IColorsHandler
     public void SetupPaletteProviders(IServiceProvider services)
     public void SetupPaletteProviders(IServiceProvider services)
     {
     {
         PaletteProvider = (PaletteProvider)services.GetService<IPaletteProvider>();
         PaletteProvider = (PaletteProvider)services.GetService<IPaletteProvider>();
-        PaletteProvider.AvailableParsers =
-            new ObservableCollection<PaletteFileParser>(services.GetServices<PaletteFileParser>());
-        var dataSources = services.GetServices<PaletteListDataSource>();
-
-        foreach (var dataSource in dataSources)
-        {
-            PaletteProvider.RegisterDataSource(dataSource);
-        }
+        //PaletteProvider.AvailableParsers =
+        //    new ObservableCollection<PaletteFileParser>(services.GetServices<PaletteFileParser>());
+        //var dataSources = services.GetServices<PaletteListDataSource>();
+
+        //foreach (var dataSource in dataSources)
+        //{
+        //    PaletteProvider.RegisterDataSource(dataSource);
+        //}
     }
     }
 }
 }

+ 14 - 0
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DebugViewModel.cs

@@ -7,6 +7,7 @@ using System.Threading.Tasks;
 using Avalonia;
 using Avalonia;
 using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Platform.Storage;
 using Avalonia.Platform.Storage;
+using ChunkyImageLib;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using PixiEditor.AvaloniaUI.Helpers.Extensions;
 using PixiEditor.AvaloniaUI.Helpers.Extensions;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
@@ -15,6 +16,7 @@ using PixiEditor.AvaloniaUI.Models.Dialogs;
 using PixiEditor.AvaloniaUI.Views;
 using PixiEditor.AvaloniaUI.Views;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging.Localization;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging.Localization;
+using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.UserPreferences;
 using PixiEditor.Extensions.Common.UserPreferences;
 using PixiEditor.OperatingSystem;
 using PixiEditor.OperatingSystem;
@@ -226,6 +228,18 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
         new PointerDebugPopup().Show();
         new PointerDebugPopup().Show();
     }
     }
 
 
+    [Command.Basic("PixiEditor.Debug.CreateDebugDocument", "Create debug document", "Create debug document")]
+    public void CreateDebugDocument()
+    {
+        var viewModel = Owner.FileSubViewModel;
+        
+        viewModel.NewDocument(b => b
+            .WithSize(64, 64)
+            .WithLayer(l => l
+                .WithName(new LocalizedString("BASE_LAYER_NAME"))
+                .WithSurface(new Surface(new VecI(64, 64)))));
+    }
+
     [Command.Debug("PixiEditor.Debug.OpenLocalizationDebugWindow", "OPEN_LOCALIZATION_DEBUG_WINDOW", "OPEN_LOCALIZATION_DEBUG_WINDOW")]
     [Command.Debug("PixiEditor.Debug.OpenLocalizationDebugWindow", "OPEN_LOCALIZATION_DEBUG_WINDOW", "OPEN_LOCALIZATION_DEBUG_WINDOW")]
     public void OpenLocalizationDebugWindow()
     public void OpenLocalizationDebugWindow()
     {
     {

+ 5 - 0
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DiscordViewModel.cs

@@ -18,6 +18,9 @@ internal class DiscordViewModel : SubViewModel<ViewModelMain>, IDisposable
         get => client != null;
         get => client != null;
         set
         set
         {
         {
+            client = null;
+            return;
+            
             if (Enabled != value)
             if (Enabled != value)
             {
             {
                 if (value)
                 if (value)
@@ -80,6 +83,8 @@ internal class DiscordViewModel : SubViewModel<ViewModelMain>, IDisposable
     public DiscordViewModel(ViewModelMain owner, string clientId)
     public DiscordViewModel(ViewModelMain owner, string clientId)
         : base(owner)
         : base(owner)
     {
     {
+        return;
+        
         Owner.DocumentManagerSubViewModel.ActiveDocumentChanged += DocumentChanged;
         Owner.DocumentManagerSubViewModel.ActiveDocumentChanged += DocumentChanged;
         this.clientId = clientId;
         this.clientId = clientId;
 
 

+ 17 - 13
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/FileViewModel.cs

@@ -99,19 +99,23 @@ internal class FileViewModel : SubViewModel<ViewModelMain>
 
 
     private void Owner_OnStartupEvent(object sender, System.EventArgs e)
     private void Owner_OnStartupEvent(object sender, System.EventArgs e)
     {
     {
-        List<string> args = StartupArgs.Args;
-        string file = args.FirstOrDefault(x => Importer.IsSupportedFile(x) && File.Exists(x));
-        if (file != null)
-        {
-            OpenFromPath(file);
-        }
-        else if ((Owner.DocumentManagerSubViewModel.Documents.Count == 0 && !args.Contains("--crash")) && !args.Contains("--openedInExisting"))
-        {
-            if (IPreferences.Current.GetPreference("ShowStartupWindow", true))
-            {
-                OpenHelloTherePopup();
-            }
-        }
+        Console.WriteLine("Owner starutp before");
+        
+        // List<string> args = StartupArgs.Args;
+        // string file = args.FirstOrDefault(x => Importer.IsSupportedFile(x) && File.Exists(x));
+        // if (file != null)
+        // {
+        //     OpenFromPath(file);
+        // }
+        // else if ((Owner.DocumentManagerSubViewModel.Documents.Count == 0 && !args.Contains("--crash")) && !args.Contains("--openedInExisting"))
+        // {
+        //     if (IPreferences.Current.GetPreference("ShowStartupWindow", true))
+        //     {
+        //         OpenHelloTherePopup();
+        //     }
+        // }
+        
+        Console.WriteLine("Owner startup after");
     }
     }
 
 
     [Command.Internal("PixiEditor.File.OpenRecent")]
     [Command.Internal("PixiEditor.File.OpenRecent")]

+ 3 - 3
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/LayoutViewModel.cs

@@ -13,11 +13,11 @@ internal class LayoutViewModel : SubViewModel<ViewModelMain>
         private init => SetProperty(ref layoutManagerManager, value);
         private init => SetProperty(ref layoutManagerManager, value);
     }
     }
 
 
-    public LayoutViewModel(ViewModelMain owner) : base(owner)
+    public LayoutViewModel(ViewModelMain owner, WindowViewModel windowViewModel) : base(owner)
     {
     {
         LayoutManager = new();
         LayoutManager = new();
-        owner.WindowSubViewModel.ViewportAdded += WindowSubViewModel_ViewportAdded;
-        owner.WindowSubViewModel.ViewportClosed += WindowSubViewModel_ViewportRemoved;
+        windowViewModel.ViewportAdded += WindowSubViewModel_ViewportAdded;
+        windowViewModel.ViewportClosed += WindowSubViewModel_ViewportRemoved;
     }
     }
 
 
     private void WindowSubViewModel_ViewportAdded(ViewportWindowViewModel obj)
     private void WindowSubViewModel_ViewportAdded(ViewportWindowViewModel obj)

+ 16 - 0
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/SearchViewModel.cs

@@ -1,7 +1,10 @@
 using Avalonia.Input;
 using Avalonia.Input;
+using ChunkyImageLib;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Evaluators;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Evaluators;
 using PixiEditor.AvaloniaUI.Models.Handlers;
 using PixiEditor.AvaloniaUI.Models.Handlers;
+using PixiEditor.DrawingApi.Core.Numerics;
+using PixiEditor.Extensions.Common.Localization;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 
 
@@ -46,6 +49,19 @@ internal class SearchViewModel : SubViewModel<ViewModelMain>, ISearchHandler
         {
         {
             SearchTerm = searchTerm;
             SearchTerm = searchTerm;
         }
         }
+
+        try
+        {
+            Owner.FileSubViewModel.NewDocument(b => b
+                .WithSize(64, 64)
+                .WithLayer(l => l
+                    .WithName(new LocalizedString("BASE_LAYER_NAME"))
+                    .WithSurface(new Surface(new VecI(64, 64)))));
+        }
+        catch (Exception e)
+        {
+            Console.WriteLine(e);
+        }
     }
     }
 
 
     public void OpenSearchWindow(string searchTerm, bool selectAll = true)
     public void OpenSearchWindow(string searchTerm, bool selectAll = true)

+ 2 - 2
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/UpdateViewModel.cs

@@ -243,8 +243,8 @@ internal class UpdateViewModel : SubViewModel<ViewModelMain>
         UpdateChannels.Add(new UpdateChannel("Release", "PixiEditor", "PixiEditor"));
         UpdateChannels.Add(new UpdateChannel("Release", "PixiEditor", "PixiEditor"));
         UpdateChannels.Add(new UpdateChannel("Development", "PixiEditor", "PixiEditor-development-channel"));
         UpdateChannels.Add(new UpdateChannel("Development", "PixiEditor", "PixiEditor-development-channel"));
 #else
 #else
-        string platformName = IPlatform.Current.Name;
-        UpdateChannels.Add(new UpdateChannel(platformName, "", ""));
+        //string platformName = IPlatform.Current.Name;
+        UpdateChannels.Add(new UpdateChannel("Android :)", "", ""));
 #endif
 #endif
 
 
         string updateChannel = IPreferences.Current.GetPreference<string>("UpdateChannel");
         string updateChannel = IPreferences.Current.GetPreference<string>("UpdateChannel");

+ 3 - 1
src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/PenToolViewModel.cs

@@ -1,8 +1,10 @@
 using System.Linq;
 using System.Linq;
 using Avalonia.Input;
 using Avalonia.Input;
+using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Handlers.Tools;
 using PixiEditor.AvaloniaUI.Models.Handlers.Tools;
 using PixiEditor.AvaloniaUI.Models.Input;
 using PixiEditor.AvaloniaUI.Models.Input;
+using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Settings;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Settings;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.AvaloniaUI.Views.Overlays.BrushShapeOverlay;
 using PixiEditor.AvaloniaUI.Views.Overlays.BrushShapeOverlay;
@@ -25,7 +27,7 @@ namespace PixiEditor.AvaloniaUI.ViewModels.Tools.Tools
             Cursor = Cursors.PreciseCursor;
             Cursor = Cursors.PreciseCursor;
             Toolbar = ToolbarFactory.Create<PenToolViewModel, BasicToolbar>(this);
             Toolbar = ToolbarFactory.Create<PenToolViewModel, BasicToolbar>(this);
             
             
-            ViewModelMain.Current.ToolsSubViewModel.SelectedToolChanged += SelectedToolChanged;
+            ViewModelMain.Current.Services.GetRequiredService<ToolsViewModel>().SelectedToolChanged += SelectedToolChanged;
         }
         }
 
 
         public override LocalizedString Tooltip => new LocalizedString("PEN_TOOL_TOOLTIP", Shortcut);
         public override LocalizedString Tooltip => new LocalizedString("PEN_TOOL_TOOLTIP", Shortcut);

+ 52 - 3
src/PixiEditor.AvaloniaUI/ViewModels/ViewModelMain.cs

@@ -1,6 +1,8 @@
 using System.ComponentModel;
 using System.ComponentModel;
 using System.Linq;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using ChunkyImageLib;
 using CommunityToolkit.Mvvm.Input;
 using CommunityToolkit.Mvvm.Input;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.AvaloniaUI.Helpers.Collections;
 using PixiEditor.AvaloniaUI.Helpers.Collections;
@@ -15,6 +17,7 @@ using PixiEditor.AvaloniaUI.ViewModels.SubViewModels.AdditionalContent;
 using PixiEditor.AvaloniaUI.ViewModels.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
+using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.UserPreferences;
 using PixiEditor.Extensions.Common.UserPreferences;
 
 
@@ -98,34 +101,48 @@ internal partial class ViewModelMain : ViewModelBase, ICommandsHandler
     public ActionDisplayList ActionDisplays { get; }
     public ActionDisplayList ActionDisplays { get; }
     public bool UserWantsToClose { get; private set; }
     public bool UserWantsToClose { get; private set; }
 
 
-    public ViewModelMain(IServiceProvider serviceProvider)
+    public ViewModelMain()
     {
     {
         Current = this;
         Current = this;
         ActionDisplays = new ActionDisplayList(() => OnPropertyChanged(nameof(ActiveActionDisplay)));
         ActionDisplays = new ActionDisplayList(() => OnPropertyChanged(nameof(ActiveActionDisplay)));
     }
     }
 
 
     public void Setup(IServiceProvider services)
     public void Setup(IServiceProvider services)
-    {
+ {
         Services = services;
         Services = services;
 
 
+        ShowMessage();
+
         Preferences = services.GetRequiredService<IPreferences>();
         Preferences = services.GetRequiredService<IPreferences>();
         Preferences.Init();
         Preferences.Init();
 
 
+        ShowMessage();
+
         CommandController = services.GetService<CommandController>();
         CommandController = services.GetService<CommandController>();
 
 
+        ShowMessage();
+
         LocalizationProvider = services.GetRequiredService<ILocalizationProvider>();
         LocalizationProvider = services.GetRequiredService<ILocalizationProvider>();
         LocalizationProvider.LoadData();
         LocalizationProvider.LoadData();
 
 
+        ShowMessage();
+
         WindowSubViewModel = services.GetService<WindowViewModel>();
         WindowSubViewModel = services.GetService<WindowViewModel>();
         LayoutSubViewModel = services.GetService<LayoutViewModel>();
         LayoutSubViewModel = services.GetService<LayoutViewModel>();
 
 
+        ShowMessage();
+
         DocumentManagerSubViewModel = services.GetRequiredService<DocumentManagerViewModel>();
         DocumentManagerSubViewModel = services.GetRequiredService<DocumentManagerViewModel>();
         SelectionSubViewModel = services.GetService<SelectionViewModel>();
         SelectionSubViewModel = services.GetService<SelectionViewModel>();
 
 
+        ShowMessage();
+
         FileSubViewModel = services.GetService<FileViewModel>();
         FileSubViewModel = services.GetService<FileViewModel>();
         ToolsSubViewModel = services.GetService<IToolsHandler>();
         ToolsSubViewModel = services.GetService<IToolsHandler>();
         ToolsSubViewModel.SelectedToolChanged += ToolsSubViewModel_SelectedToolChanged;
         ToolsSubViewModel.SelectedToolChanged += ToolsSubViewModel_SelectedToolChanged;
 
 
+        ShowMessage();
+
         IoSubViewModel = services.GetService<IoViewModel>();
         IoSubViewModel = services.GetService<IoViewModel>();
         LayersSubViewModel = services.GetService<LayersViewModel>();
         LayersSubViewModel = services.GetService<LayersViewModel>();
         ClipboardSubViewModel = services.GetService<ClipboardViewModel>();
         ClipboardSubViewModel = services.GetService<ClipboardViewModel>();
@@ -134,32 +151,64 @@ internal partial class ViewModelMain : ViewModelBase, ICommandsHandler
         ColorsSubViewModel = services.GetService<ColorsViewModel>();
         ColorsSubViewModel = services.GetService<ColorsViewModel>();
         ColorsSubViewModel?.SetupPaletteProviders(services);
         ColorsSubViewModel?.SetupPaletteProviders(services);
 
 
+        ShowMessage();
+
         ToolsSubViewModel?.SetupTools(services);
         ToolsSubViewModel?.SetupTools(services);
 
 
+        ShowMessage();
+
         DiscordViewModel = services.GetService<DiscordViewModel>();
         DiscordViewModel = services.GetService<DiscordViewModel>();
         UpdateSubViewModel = services.GetService<UpdateViewModel>();
         UpdateSubViewModel = services.GetService<UpdateViewModel>();
         DebugSubViewModel = services.GetService<DebugViewModel>();
         DebugSubViewModel = services.GetService<DebugViewModel>();
 
 
+        ShowMessage();
+
         StylusSubViewModel = services.GetService<StylusViewModel>();
         StylusSubViewModel = services.GetService<StylusViewModel>();
         RegistrySubViewModel = services.GetService<RegistryViewModel>();
         RegistrySubViewModel = services.GetService<RegistryViewModel>();
 
 
-        AdditionalContentSubViewModel = services.GetService<AdditionalContentViewModel>();
+        ShowMessage();
+
+        //AdditionalContentSubViewModel = services.GetService<AdditionalContentViewModel>();
+
+        ShowMessage();
 
 
         CommandController.Init(services);
         CommandController.Init(services);
         LayoutSubViewModel.LayoutManager.InitLayout(this);
         LayoutSubViewModel.LayoutManager.InitLayout(this);
 
 
+        ShowMessage();
+
         MiscSubViewModel = services.GetService<MiscViewModel>();
         MiscSubViewModel = services.GetService<MiscViewModel>();
 
 
+        ShowMessage();
+
         ShortcutController = new ShortcutController();
         ShortcutController = new ShortcutController();
 
 
+        ShowMessage();
+
         ToolsSubViewModel?.SetupToolsTooltipShortcuts(services);
         ToolsSubViewModel?.SetupToolsTooltipShortcuts(services);
 
 
+        ShowMessage();
+
         SearchSubViewModel = services.GetService<SearchViewModel>();
         SearchSubViewModel = services.GetService<SearchViewModel>();
 
 
+        ShowMessage();
+
         ExtensionsSubViewModel = services.GetService<ExtensionsViewModel>(); // Must be last
         ExtensionsSubViewModel = services.GetService<ExtensionsViewModel>(); // Must be last
 
 
+        ShowMessage();
+        
         DocumentManagerSubViewModel.ActiveDocumentChanged += OnActiveDocumentChanged;
         DocumentManagerSubViewModel.ActiveDocumentChanged += OnActiveDocumentChanged;
+        
+    }
+    
+    static void ShowMessage(
+        string? message = null,
+        [CallerLineNumber] int lineNumber = 0,
+        [CallerMemberName] string? caller = null)
+    {
+        Console.WriteLine($"{message} {lineNumber} {caller}");
     }
     }
+    
 
 
     public bool DocumentIsNotNull(object property)
     public bool DocumentIsNotNull(object property)
     {
     {

+ 4 - 0
src/PixiEditor.AvaloniaUI/Views/Main/MainTitleBar.axaml

@@ -264,6 +264,10 @@
                     Header="Open pointer debug window"
                     Header="Open pointer debug window"
                     xaml:Menu.Command="PixiEditor.Debug.OpenPointerDebugWindow"/>
                     xaml:Menu.Command="PixiEditor.Debug.OpenPointerDebugWindow"/>
                 <Separator/>
                 <Separator/>
+                <MenuItem
+                    Header="Create debug document"
+                    xaml:Menu.Command="PixiEditor.Debug.CreateDebugDocument"/>
+                <Separator/>
                 <MenuItem
                 <MenuItem
                     ui:Translator.Key="OPEN_LOCAL_APPDATA_DIR"
                     ui:Translator.Key="OPEN_LOCAL_APPDATA_DIR"
                     xaml:Menu.Command="PixiEditor.Debug.OpenLocalAppDataDirectory" />
                     xaml:Menu.Command="PixiEditor.Debug.OpenLocalAppDataDirectory" />

+ 65 - 19
src/PixiEditor.sln

@@ -76,37 +76,39 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.AvaloniaUI.Brows
 EndProject
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.AvaloniaUI.Desktop", "PixiEditor.AvaloniaUI.Desktop\PixiEditor.AvaloniaUI.Desktop.csproj", "{8F4FFC91-BE9F-4476-A372-FBD952865F15}"
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.AvaloniaUI.Desktop", "PixiEditor.AvaloniaUI.Desktop\PixiEditor.AvaloniaUI.Desktop.csproj", "{8F4FFC91-BE9F-4476-A372-FBD952865F15}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Tests", "PixiEditor.Tests\PixiEditor.Tests.csproj", "{427CE098-4B13-4E46-8C66-D924140B6CAE}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Tests", "PixiEditor.Tests\PixiEditor.Tests.csproj", "{427CE098-4B13-4E46-8C66-D924140B6CAE}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WasmSampleExtension", "WasmSampleExtension\WasmSampleExtension.csproj", "{F4436A16-9488-4BAB-B2F6-C1806278CE16}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WasmSampleExtension", "WasmSampleExtension\WasmSampleExtension.csproj", "{F4436A16-9488-4BAB-B2F6-C1806278CE16}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Wasm", "PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj", "{71907779-F1D1-4AA6-BA11-E990DB089841}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.Wasm", "PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj", "{71907779-F1D1-4AA6-BA11-E990DB089841}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.WasmRuntime", "PixiEditor.Extensions.WasmRuntime\PixiEditor.Extensions.WasmRuntime.csproj", "{B30622ED-9177-4930-8E64-2B2352D4D8DC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.WasmRuntime", "PixiEditor.Extensions.WasmRuntime\PixiEditor.Extensions.WasmRuntime.csproj", "{B30622ED-9177-4930-8E64-2B2352D4D8DC}"
 EndProject
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Tests", "PixiEditor.Extensions.Tests\PixiEditor.Extensions.Tests.csproj", "{221E745C-D21F-4725-BBB8-DFB2DE5CF61D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.Tests", "PixiEditor.Extensions.Tests\PixiEditor.Extensions.Tests.csproj", "{221E745C-D21F-4725-BBB8-DFB2DE5CF61D}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Wasm.Tests", "PixiEditor.Extensions.Wasm.Tests\PixiEditor.Extensions.Wasm.Tests.csproj", "{9C1A500D-7A3D-49E3-BD39-05867B1D37F1}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.Wasm.Tests", "PixiEditor.Extensions.Wasm.Tests\PixiEditor.Extensions.Wasm.Tests.csproj", "{9C1A500D-7A3D-49E3-BD39-05867B1D37F1}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.WasmRuntime.Tests", "PixiEditor.Extensions.WasmRuntime.Tests\PixiEditor.Extensions.WasmRuntime.Tests.csproj", "{C16EF6F1-4E40-4CC4-9320-99C3C97929D7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.WasmRuntime.Tests", "PixiEditor.Extensions.WasmRuntime.Tests\PixiEditor.Extensions.WasmRuntime.Tests.csproj", "{C16EF6F1-4E40-4CC4-9320-99C3C97929D7}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.CommonApi", "PixiEditor.Extensions.CommonApi\PixiEditor.Extensions.CommonApi.csproj", "{43C03D0E-EF50-4225-A268-CB9B8E0E8622}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.CommonApi", "PixiEditor.Extensions.CommonApi\PixiEditor.Extensions.CommonApi.csproj", "{43C03D0E-EF50-4225-A268-CB9B8E0E8622}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleExtension.LayoutBuilder", "SampleExtension.LayoutBuilder\SampleExtension.LayoutBuilder.csproj", "{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleExtension.LayoutBuilder", "SampleExtension.LayoutBuilder\SampleExtension.LayoutBuilder.csproj", "{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F}"
 EndProject
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OfficialExtensions", "OfficialExtensions", "{DF94111B-9D40-42D7-9416-4875E846FE8A}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OfficialExtensions", "OfficialExtensions", "{DF94111B-9D40-42D7-9416-4875E846FE8A}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.DevTools", "PixiEditor.DevTools\PixiEditor.DevTools.csproj", "{A0C4E418-467E-40E2-BAD6-35F953BA69E5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.DevTools", "PixiEditor.DevTools\PixiEditor.DevTools.csproj", "{A0C4E418-467E-40E2-BAD6-35F953BA69E5}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.Runtime", "PixiEditor.Extensions.Runtime\PixiEditor.Extensions.Runtime.csproj", "{5848FCF1-E127-4CE3-8A25-F37032819F8D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.Runtime", "PixiEditor.Extensions.Runtime\PixiEditor.Extensions.Runtime.csproj", "{5848FCF1-E127-4CE3-8A25-F37032819F8D}"
 EndProject
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiEditor.Extensions.MSBuildLayoutCompiler", "PixiEditor.Extensions.MSBuildLayoutCompiler\PixiEditor.Extensions.MSBuildLayoutCompiler.csproj", "{174E2684-9C49-460C-A9F1-A6920F00C036}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.Extensions.MSBuildLayoutCompiler", "PixiEditor.Extensions.MSBuildLayoutCompiler\PixiEditor.Extensions.MSBuildLayoutCompiler.csproj", "{174E2684-9C49-460C-A9F1-A6920F00C036}"
 EndProject
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PixiDocks.Avalonia", "..\..\PixiDocks\src\PixiDocks.Avalonia\PixiDocks.Avalonia.csproj", "{6D90B6D9-2B6B-4CCA-A522-047546C2147A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiDocks.Avalonia", "..\..\PixiDocks\src\PixiDocks.Avalonia\PixiDocks.Avalonia.csproj", "{6D90B6D9-2B6B-4CCA-A522-047546C2147A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PixiEditor.AvaloniaUI.Android", "PixiEditor.AvaloniaUI.Android\PixiEditor.AvaloniaUI.Android.csproj", "{00D63E92-2967-49D8-A92F-931B4405DFF9}"
 EndProject
 EndProject
 Global
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -1831,6 +1833,49 @@ Global
 		{6D90B6D9-2B6B-4CCA-A522-047546C2147A}.Steam|x64.Build.0 = Debug|Any CPU
 		{6D90B6D9-2B6B-4CCA-A522-047546C2147A}.Steam|x64.Build.0 = Debug|Any CPU
 		{6D90B6D9-2B6B-4CCA-A522-047546C2147A}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{6D90B6D9-2B6B-4CCA-A522-047546C2147A}.Steam|x86.ActiveCfg = Debug|Any CPU
 		{6D90B6D9-2B6B-4CCA-A522-047546C2147A}.Steam|x86.Build.0 = Debug|Any CPU
 		{6D90B6D9-2B6B-4CCA-A522-047546C2147A}.Steam|x86.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|x64.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Debug|x86.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevRelease|Any CPU.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevRelease|x64.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevRelease|x64.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevRelease|x86.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevRelease|x86.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevSteam|Any CPU.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevSteam|Any CPU.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevSteam|x64.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevSteam|x64.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevSteam|x86.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.DevSteam|x86.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX Debug|Any CPU.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX Debug|x64.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX Debug|x86.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX Debug|x86.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX|Any CPU.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX|Any CPU.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX|x64.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX|x64.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX|x86.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.MSIX|x86.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Release|x64.ActiveCfg = Release|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Release|x64.Build.0 = Release|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Release|x86.ActiveCfg = Release|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Release|x86.Build.0 = Release|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Steam|Any CPU.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Steam|Any CPU.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Steam|x64.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Steam|x64.Build.0 = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Steam|x86.ActiveCfg = Debug|Any CPU
+		{00D63E92-2967-49D8-A92F-931B4405DFF9}.Steam|x86.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		HideSolutionNode = FALSE
@@ -1854,6 +1899,7 @@ Global
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689} = {9A81B795-66AB-4743-9284-90565941343D}
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689} = {9A81B795-66AB-4743-9284-90565941343D}
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6} = {9A81B795-66AB-4743-9284-90565941343D}
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6} = {9A81B795-66AB-4743-9284-90565941343D}
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE} = {9A81B795-66AB-4743-9284-90565941343D}
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE} = {9A81B795-66AB-4743-9284-90565941343D}
+		{1249EE2B-EB0D-411C-B311-53A7A22B7743} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{CE1C8DC9-E26B-4BBB-AB87-34054DE34814} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{10BF4001-214C-4869-8F78-2B6BDBDC7E7D} = {68C3DA2D-D2EA-426E-A866-0019E425C816}
 		{10BF4001-214C-4869-8F78-2B6BDBDC7E7D} = {68C3DA2D-D2EA-426E-A866-0019E425C816}
 		{FA98BFA6-2E83-41C6-9102-76875B261F51} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{FA98BFA6-2E83-41C6-9102-76875B261F51} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
@@ -1862,20 +1908,20 @@ Global
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{19704B2E-5EED-47CA-9258-89F246F50F19} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{19704B2E-5EED-47CA-9258-89F246F50F19} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
+		{427CE098-4B13-4E46-8C66-D924140B6CAE} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
 		{F4436A16-9488-4BAB-B2F6-C1806278CE16} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{F4436A16-9488-4BAB-B2F6-C1806278CE16} = {E4FF4CE6-5831-450D-8006-0539353C030B}
-		{13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 		{71907779-F1D1-4AA6-BA11-E990DB089841} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{71907779-F1D1-4AA6-BA11-E990DB089841} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
-		{1249EE2B-EB0D-411C-B311-53A7A22B7743} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
+		{13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
+		{221E745C-D21F-4725-BBB8-DFB2DE5CF61D} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
+		{9C1A500D-7A3D-49E3-BD39-05867B1D37F1} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
+		{C16EF6F1-4E40-4CC4-9320-99C3C97929D7} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{6C74CC1F-B514-4150-A46C-84FEA6F9ED7F} = {E4FF4CE6-5831-450D-8006-0539353C030B}
 		{A0C4E418-467E-40E2-BAD6-35F953BA69E5} = {DF94111B-9D40-42D7-9416-4875E846FE8A}
 		{A0C4E418-467E-40E2-BAD6-35F953BA69E5} = {DF94111B-9D40-42D7-9416-4875E846FE8A}
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
-		{221E745C-D21F-4725-BBB8-DFB2DE5CF61D} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
-		{9C1A500D-7A3D-49E3-BD39-05867B1D37F1} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
-		{C16EF6F1-4E40-4CC4-9320-99C3C97929D7} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
-		{427CE098-4B13-4E46-8C66-D924140B6CAE} = {F1FDFA82-0C74-446A-AD7D-DE17EC2CF1E8}
 		{174E2684-9C49-460C-A9F1-A6920F00C036} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
 		{174E2684-9C49-460C-A9F1-A6920F00C036} = {13DD041C-EE2D-4AF8-B43E-D7BFC7415E4D}
+		{00D63E92-2967-49D8-A92F-931B4405DFF9} = {1E816135-76C1-4255-BE3C-BF17895A65AA}
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {D04B4AB0-CA33-42FD-A909-79966F9255C5}
 		SolutionGuid = {D04B4AB0-CA33-42FD-A909-79966F9255C5}