From 59991f47d5474d7411bf1d0e5cb78123e4d5d58e Mon Sep 17 00:00:00 2001 From: Misaki Date: Tue, 3 Feb 2026 21:49:14 +0900 Subject: [PATCH] Update editor --- Ghost.Data/Repository/AssetsRepository.cs | 6 - Ghost.Editor.Core/AppState/AppStateMachine.cs | 97 -------- Ghost.Editor.Core/AppState/IAppState.cs | 28 --- Ghost.Editor.Core/AppState/StateKey.cs | 8 - .../AssetHandle/AssetDatabase.FileOps.cs | 2 +- .../AssetHandle/AssetDatabase.Loader.cs | 3 +- .../AssetHandle/AssetDatabase.SQLite.cs | 17 +- .../AssetHandle/AssetDatabase.cs | 8 +- .../{Inspector => Contracts}/IInspectable.cs | 2 +- .../Contracts/IInspectorService.cs | 32 +++ .../INotificationService.cs | 3 +- .../Contracts/IPreviewService.cs | 12 + .../IProgressService.cs | 2 +- Ghost.Editor.Core/EditorApplication.cs | 39 +++ Ghost.Editor.Core/EditorInjectionAttribute.cs | 28 +++ Ghost.Editor.Core/Ghost.Editor.Core.csproj | 1 - .../Inspector/IInspectorService.cs | 12 - .../Inspector/InspectorService.cs | 19 -- .../SceneGraph/SceneGraphNode.cs | 2 +- .../Services/InspectorService.cs | 21 ++ .../NotificationService.cs | 4 +- Ghost.Editor.Core/Services/PreviewService.cs | 35 +++ .../{Progress => Services}/ProgressService.cs | 3 +- .../Utilities/EditorApplication.cs | 26 -- Ghost.Editor.Core/Utilities/FileExtensions.cs | 4 +- Ghost.Editor.Core/Utilities/TypeCache.cs | 6 + Ghost.Editor/ActivationHandler.cs | 63 ++++- Ghost.Editor/App.xaml | 3 +- Ghost.Editor/App.xaml.cs | 89 +++++-- .../Assets/EditorIcons/document-0.png | Bin 0 -> 453 bytes .../Assets/EditorIcons/document-1.png | Bin 0 -> 869 bytes Ghost.Editor/Assets/EditorIcons/folder-0.png | Bin 0 -> 465 bytes Ghost.Editor/Assets/EditorIcons/folder-1.png | Bin 0 -> 884 bytes Ghost.Editor/Assets/EditorIcons/image-0.png | Bin 0 -> 727 bytes Ghost.Editor/Assets/EditorIcons/image-1.png | Bin 0 -> 1404 bytes Ghost.Editor/Assets/Icon.scale-100.png | Bin 1151 -> 1374 bytes Ghost.Editor/Assets/Icon.scale-125.png | Bin 1346 -> 1788 bytes Ghost.Editor/Assets/Icon.scale-150.png | Bin 1666 -> 2057 bytes Ghost.Editor/Assets/Icon.scale-200.png | Bin 2208 -> 2866 bytes Ghost.Editor/Assets/Icon.scale-400.png | Bin 4478 -> 5588 bytes Ghost.Editor/Assets/Icon.targetsize-16.png | Bin 433 -> 580 bytes Ghost.Editor/Assets/Icon.targetsize-24.png | Bin 583 -> 825 bytes Ghost.Editor/Assets/Icon.targetsize-256.png | Bin 6991 -> 6111 bytes Ghost.Editor/Assets/Icon.targetsize-32.png | Bin 852 -> 1092 bytes Ghost.Editor/Assets/Icon.targetsize-48.png | Bin 1223 -> 1599 bytes Ghost.Editor/Assets/icon.ico | Bin 0 -> 174430 bytes Ghost.Editor/Assets/icon.svg | 22 ++ ...n.targetsize-16_altform-lightunplated.png} | Bin ...> icon.targetsize-16_altform-unplated.png} | Bin ...n.targetsize-24_altform-lightunplated.png} | Bin ...> icon.targetsize-24_altform-unplated.png} | Bin ....targetsize-256_altform-lightunplated.png} | Bin ... icon.targetsize-256_altform-unplated.png} | Bin ...n.targetsize-32_altform-lightunplated.png} | Bin ...> icon.targetsize-32_altform-unplated.png} | Bin ...n.targetsize-48_altform-lightunplated.png} | Bin ...> icon.targetsize-48_altform-unplated.png} | Bin Ghost.Editor/Controls/ViewModelPage.cs | 38 --- Ghost.Editor/Core/AppState/EditorState.cs | 60 ----- Ghost.Editor/Core/AppState/LandingState.cs | 42 ---- Ghost.Editor/Ghost.Editor.csproj | 111 ++++++++- Ghost.Editor/Models/LaunchArguments.cs | 35 +++ Ghost.Editor/Package.appxmanifest | 2 +- Ghost.Editor/Themes/Generic.xaml | 54 +++++ Ghost.Editor/Themes/Override.xaml | 20 -- .../ExplorerItemToIconPathConverter.cs | 26 ++ Ghost.Editor/Utilities/HostHelpers.Page.cs | 50 ---- .../View/Controls/ProjectBrowser.xaml | 224 ++++++++++++++++++ .../View/Controls/ProjectBrowser.xaml.cs | 122 ++++++++++ .../Pages/EngineEditor/HierarchyPage.xaml.cs | 6 +- .../View/Pages/Landing/CreateProjectPage.xaml | 142 ----------- .../Pages/Landing/CreateProjectPage.xaml.cs | 32 --- .../View/Pages/Landing/OpenProjectPage.xaml | 165 ------------- .../Pages/Landing/OpenProjectPage.xaml.cs | 72 ------ .../View/Windows/EngineEditorWindow.xaml | 42 ++-- .../View/Windows/EngineEditorWindow.xaml.cs | 28 +-- Ghost.Editor/View/Windows/LandingWindow.xaml | 76 ------ .../View/Windows/LandingWindow.xaml.cs | 59 ----- Ghost.Editor/View/Windows/SplashWindow.xaml | 79 ++++++ .../View/Windows/SplashWindow.xaml.cs | 33 +++ .../Controls/ProjectBrowserViewModel.cs | 108 +++++++++ .../Pages/EngineEditor/InspectorViewModel.cs | 7 +- .../Pages/EngineEditor/ProjectViewModel.cs | 9 +- .../Pages/Landing/CreateProjectViewModel.cs | 91 ------- .../Pages/Landing/OpenProjectViewModel.cs | 106 --------- .../Windows/EngineEditorViewModel.cs | 6 - Ghost.Engine/EngineCore.cs | 2 +- GhostEngine.slnx | 1 - 88 files changed, 1157 insertions(+), 1288 deletions(-) delete mode 100644 Ghost.Data/Repository/AssetsRepository.cs delete mode 100644 Ghost.Editor.Core/AppState/AppStateMachine.cs delete mode 100644 Ghost.Editor.Core/AppState/IAppState.cs delete mode 100644 Ghost.Editor.Core/AppState/StateKey.cs rename Ghost.Editor.Core/{Inspector => Contracts}/IInspectable.cs (84%) create mode 100644 Ghost.Editor.Core/Contracts/IInspectorService.cs rename Ghost.Editor.Core/{Notifications => Contracts}/INotificationService.cs (76%) create mode 100644 Ghost.Editor.Core/Contracts/IPreviewService.cs rename Ghost.Editor.Core/{Progress => Contracts}/IProgressService.cs (85%) create mode 100644 Ghost.Editor.Core/EditorApplication.cs create mode 100644 Ghost.Editor.Core/EditorInjectionAttribute.cs delete mode 100644 Ghost.Editor.Core/Inspector/IInspectorService.cs delete mode 100644 Ghost.Editor.Core/Inspector/InspectorService.cs create mode 100644 Ghost.Editor.Core/Services/InspectorService.cs rename Ghost.Editor.Core/{Notifications => Services}/NotificationService.cs (91%) create mode 100644 Ghost.Editor.Core/Services/PreviewService.cs rename Ghost.Editor.Core/{Progress => Services}/ProgressService.cs (96%) delete mode 100644 Ghost.Editor.Core/Utilities/EditorApplication.cs create mode 100644 Ghost.Editor/Assets/EditorIcons/document-0.png create mode 100644 Ghost.Editor/Assets/EditorIcons/document-1.png create mode 100644 Ghost.Editor/Assets/EditorIcons/folder-0.png create mode 100644 Ghost.Editor/Assets/EditorIcons/folder-1.png create mode 100644 Ghost.Editor/Assets/EditorIcons/image-0.png create mode 100644 Ghost.Editor/Assets/EditorIcons/image-1.png create mode 100644 Ghost.Editor/Assets/icon.ico create mode 100644 Ghost.Editor/Assets/icon.svg rename Ghost.Editor/Assets/{Icon.altform-lightunplated_targetsize-16.png => icon.targetsize-16_altform-lightunplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-unplated_targetsize-16.png => icon.targetsize-16_altform-unplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-lightunplated_targetsize-24.png => icon.targetsize-24_altform-lightunplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-unplated_targetsize-24.png => icon.targetsize-24_altform-unplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-lightunplated_targetsize-256.png => icon.targetsize-256_altform-lightunplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-unplated_targetsize-256.png => icon.targetsize-256_altform-unplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-lightunplated_targetsize-32.png => icon.targetsize-32_altform-lightunplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-unplated_targetsize-32.png => icon.targetsize-32_altform-unplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-lightunplated_targetsize-48.png => icon.targetsize-48_altform-lightunplated.png} (100%) rename Ghost.Editor/Assets/{Icon.altform-unplated_targetsize-48.png => icon.targetsize-48_altform-unplated.png} (100%) delete mode 100644 Ghost.Editor/Controls/ViewModelPage.cs delete mode 100644 Ghost.Editor/Core/AppState/EditorState.cs delete mode 100644 Ghost.Editor/Core/AppState/LandingState.cs create mode 100644 Ghost.Editor/Models/LaunchArguments.cs create mode 100644 Ghost.Editor/Themes/Generic.xaml delete mode 100644 Ghost.Editor/Themes/Override.xaml create mode 100644 Ghost.Editor/Utilities/Converters/ExplorerItemToIconPathConverter.cs delete mode 100644 Ghost.Editor/Utilities/HostHelpers.Page.cs create mode 100644 Ghost.Editor/View/Controls/ProjectBrowser.xaml create mode 100644 Ghost.Editor/View/Controls/ProjectBrowser.xaml.cs delete mode 100644 Ghost.Editor/View/Pages/Landing/CreateProjectPage.xaml delete mode 100644 Ghost.Editor/View/Pages/Landing/CreateProjectPage.xaml.cs delete mode 100644 Ghost.Editor/View/Pages/Landing/OpenProjectPage.xaml delete mode 100644 Ghost.Editor/View/Pages/Landing/OpenProjectPage.xaml.cs delete mode 100644 Ghost.Editor/View/Windows/LandingWindow.xaml delete mode 100644 Ghost.Editor/View/Windows/LandingWindow.xaml.cs create mode 100644 Ghost.Editor/View/Windows/SplashWindow.xaml create mode 100644 Ghost.Editor/View/Windows/SplashWindow.xaml.cs create mode 100644 Ghost.Editor/ViewModels/Controls/ProjectBrowserViewModel.cs delete mode 100644 Ghost.Editor/ViewModels/Pages/Landing/CreateProjectViewModel.cs delete mode 100644 Ghost.Editor/ViewModels/Pages/Landing/OpenProjectViewModel.cs diff --git a/Ghost.Data/Repository/AssetsRepository.cs b/Ghost.Data/Repository/AssetsRepository.cs deleted file mode 100644 index b986fe5..0000000 --- a/Ghost.Data/Repository/AssetsRepository.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Ghost.Data.Repository; - -internal class AssetsRepository -{ - -} diff --git a/Ghost.Editor.Core/AppState/AppStateMachine.cs b/Ghost.Editor.Core/AppState/AppStateMachine.cs deleted file mode 100644 index 3dea32d..0000000 --- a/Ghost.Editor.Core/AppState/AppStateMachine.cs +++ /dev/null @@ -1,97 +0,0 @@ -using Ghost.Core; - -namespace Ghost.Editor.Core.AppState; - -internal partial class AppStateMachine : IDisposable, IAsyncDisposable -{ - private Dictionary> _states = new(); - private IAppState? _current; - - private bool _disposed; - - public void RegisterState(StateKey key, Func stateFactory) - { - _states[key] = new(stateFactory); - } - - public async Task TransitionToAsync(StateKey stateKey, object? parameter = null) - { - var previous = _current; - if (!_states.TryGetValue(stateKey, out var next)) - { - return Result.Failure($"State '{stateKey}' not found."); - } - - Result result; - if (previous != null) - { - result = await previous.OnExitingAsync(); - if (result.IsFailure) - { - return result; - } - } - - result = await next.Value.OnEnteringAsync(parameter); - if (result.IsFailure) - { - if (previous != null) - { - await previous.OnEnteredAsync(parameter); - } - - return result; - } - - if (previous != null) - { - result = await previous.OnExitedAsync(); - if (result.IsFailure) - { - await next.Value.OnExitedAsync(); - await previous.OnEnteredAsync(parameter); - return result; - } - } - - result = await next.Value.OnEnteredAsync(parameter); - if (result.IsFailure) - { - await next.Value.OnExitedAsync(); - - if (previous != null) - { - await previous.OnEnteredAsync(parameter); - } - - return result; - } - - _current = next.Value; - - return Result.Success(); - } - - public void Dispose() - { - DisposeAsync().AsTask().Wait(); - } - - public async ValueTask DisposeAsync() - { - if (_disposed) - { - return; - } - - _states.Clear(); - if (_current != null) - { - await _current.OnExitingAsync(); - await _current.OnExitedAsync(); - } - - _current = null; - _disposed = true; - } -} \ No newline at end of file diff --git a/Ghost.Editor.Core/AppState/IAppState.cs b/Ghost.Editor.Core/AppState/IAppState.cs deleted file mode 100644 index 572fa0c..0000000 --- a/Ghost.Editor.Core/AppState/IAppState.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Ghost.Core; - -namespace Ghost.Editor.Core.AppState; - -internal interface IAppState -{ - /// - /// Called when exiting the state. - /// - public ValueTask OnExitingAsync(); - - /// - /// Called when entering the state, right after OnEnteringAsync. - /// can be used to pass data into the state, such as a project to load. - /// - public ValueTask OnEnteringAsync(object? parameter); - - /// - /// Called when exiting the state, specifically for pose transitions. - /// - public ValueTask OnExitedAsync(); - - /// - /// Called when entered the state, specifically after the state has been fully initialized and is ready for interaction. - /// - /// can be used to pass data into the state, such as a project to load. - public ValueTask OnEnteredAsync(object? parameter); -} \ No newline at end of file diff --git a/Ghost.Editor.Core/AppState/StateKey.cs b/Ghost.Editor.Core/AppState/StateKey.cs deleted file mode 100644 index c1126fb..0000000 --- a/Ghost.Editor.Core/AppState/StateKey.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Ghost.Editor.Core.AppState; - -internal enum StateKey -{ - None, - Landing, - EngineEditor, -} \ No newline at end of file diff --git a/Ghost.Editor.Core/AssetHandle/AssetDatabase.FileOps.cs b/Ghost.Editor.Core/AssetHandle/AssetDatabase.FileOps.cs index 258e079..7c3d0f0 100644 --- a/Ghost.Editor.Core/AssetHandle/AssetDatabase.FileOps.cs +++ b/Ghost.Editor.Core/AssetHandle/AssetDatabase.FileOps.cs @@ -208,7 +208,7 @@ public static partial class AssetDatabase /// /// Move an asset to a new location by path. /// - /// Current path of the asset. + /// CurrentApplication path of the asset. /// New path for the asset (relative or absolute). /// Result indicating success or failure. public static ValueTask MoveAssetAsync(string oldPath, string newPath, CancellationToken token = default) diff --git a/Ghost.Editor.Core/AssetHandle/AssetDatabase.Loader.cs b/Ghost.Editor.Core/AssetHandle/AssetDatabase.Loader.cs index 3ff3ecb..006ca74 100644 --- a/Ghost.Editor.Core/AssetHandle/AssetDatabase.Loader.cs +++ b/Ghost.Editor.Core/AssetHandle/AssetDatabase.Loader.cs @@ -1,5 +1,4 @@ using Ghost.Core; -using Ghost.Data.Services; using System.Collections.Concurrent; using System.Text.Json; @@ -26,7 +25,7 @@ public static partial class AssetDatabase return Result.Failure("AssetsDirectory not initialized"); } - var cacheDir = Path.Combine(AssetsDirectory.Parent!.FullName, ProjectService.CACHE_FOLDER, "ImportedAssets"); + var cacheDir = Path.Combine(AssetsDirectory.Parent!.FullName, EditorApplication.CACHES_FOLDER_NAME, "ImportedAssets"); if (!Directory.Exists(cacheDir)) { Directory.CreateDirectory(cacheDir); diff --git a/Ghost.Editor.Core/AssetHandle/AssetDatabase.SQLite.cs b/Ghost.Editor.Core/AssetHandle/AssetDatabase.SQLite.cs index b802e53..e781fcb 100644 --- a/Ghost.Editor.Core/AssetHandle/AssetDatabase.SQLite.cs +++ b/Ghost.Editor.Core/AssetHandle/AssetDatabase.SQLite.cs @@ -1,5 +1,4 @@ using Ghost.Core; -using Ghost.Data.Services; using Microsoft.Data.Sqlite; using System.Text.Json; @@ -19,7 +18,7 @@ public static partial class AssetDatabase throw new InvalidOperationException("AssetsDirectory is not set. Initialize() must be called first."); } - var dbPath = Path.Combine(AssetsDirectory.Parent!.FullName, ProjectService.CACHE_FOLDER, "AssetDatabase.db"); + var dbPath = Path.Combine(AssetsDirectory.Parent!.FullName, EditorApplication.CACHES_FOLDER_NAME, "AssetDatabase.db"); var cacheDir = Path.GetDirectoryName(dbPath); if (!Directory.Exists(cacheDir)) { @@ -301,7 +300,7 @@ public static partial class AssetDatabase var sqlPattern = namePattern.Replace('*', '%').Replace('?', '_'); await using var cmd = s_dbConnection.CreateCommand(); - + // Extract just the filename from the path for matching // SQLite doesn't have a built-in path manipulation, so we search in the full path // and filter by checking if the pattern matches the filename part @@ -319,12 +318,12 @@ public static partial class AssetDatabase // Extract filename and check if it matches the pattern var fileName = Path.GetFileName(path); - + // Convert pattern to regex for proper matching var regexPattern = "^" + System.Text.RegularExpressions.Regex.Escape(namePattern) .Replace("\\*", ".*") .Replace("\\?", ".") + "$"; - + if (System.Text.RegularExpressions.Regex.IsMatch(fileName, regexPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { if (Guid.TryParse(guidStr, out var guid)) @@ -377,10 +376,10 @@ public static partial class AssetDatabase } // Remove orphaned entries - foreach (var guid in orphanedGuids) - { - await RemoveAssetFromDatabaseAsync(guid, token); - } + foreach (var guid in orphanedGuids) + { + await RemoveAssetFromDatabaseAsync(guid, token); + } } catch { diff --git a/Ghost.Editor.Core/AssetHandle/AssetDatabase.cs b/Ghost.Editor.Core/AssetHandle/AssetDatabase.cs index 87f9e25..883ccf1 100644 --- a/Ghost.Editor.Core/AssetHandle/AssetDatabase.cs +++ b/Ghost.Editor.Core/AssetHandle/AssetDatabase.cs @@ -1,5 +1,4 @@ using Ghost.Core; -using Ghost.Data.Services; using System.Collections.Concurrent; using System.Text.Json; using System.Text.Json.Serialization; @@ -92,12 +91,7 @@ public static partial class AssetDatabase s_initialized = true; } - if (ProjectService.CurrentProject.Metadata == null) - { - throw new InvalidOperationException("Project metadata is not initialized. Ensure that the project is loaded before accessing the AssetDatabase."); - } - - AssetsDirectory = new DirectoryInfo(Path.Combine(Path.GetDirectoryName(ProjectService.CurrentProject.Path)!, ProjectService.ASSETS_FOLDER)); + AssetsDirectory = new DirectoryInfo(Path.Combine(EditorApplication.CurrentProjectPath, EditorApplication.ASSETS_FOLDER_NAME)); s_commandChannel = Channel.CreateUnbounded(new UnboundedChannelOptions { diff --git a/Ghost.Editor.Core/Inspector/IInspectable.cs b/Ghost.Editor.Core/Contracts/IInspectable.cs similarity index 84% rename from Ghost.Editor.Core/Inspector/IInspectable.cs rename to Ghost.Editor.Core/Contracts/IInspectable.cs index ea90fc9..16cf03b 100644 --- a/Ghost.Editor.Core/Inspector/IInspectable.cs +++ b/Ghost.Editor.Core/Contracts/IInspectable.cs @@ -1,7 +1,7 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; -namespace Ghost.Editor.Core.Inspector; +namespace Ghost.Editor.Core.Contracts; public interface IInspectable { diff --git a/Ghost.Editor.Core/Contracts/IInspectorService.cs b/Ghost.Editor.Core/Contracts/IInspectorService.cs new file mode 100644 index 0000000..9a38c05 --- /dev/null +++ b/Ghost.Editor.Core/Contracts/IInspectorService.cs @@ -0,0 +1,32 @@ +namespace Ghost.Editor.Core.Contracts; + +public class InspectorSelectionChangedEventArgs : EventArgs +{ + public object? Source + { + get; + } + + public IInspectable? Selected + { + get; + } + + public InspectorSelectionChangedEventArgs(object? source, IInspectable? selected) + { + Source = source; + Selected = selected; + } +} + +public interface IInspectorService +{ + IInspectable? Selected + { + get; + } + + event EventHandler OnSelectionChanged; + + void SetSelected(IInspectable? inspectable, object? source); +} \ No newline at end of file diff --git a/Ghost.Editor.Core/Notifications/INotificationService.cs b/Ghost.Editor.Core/Contracts/INotificationService.cs similarity index 76% rename from Ghost.Editor.Core/Notifications/INotificationService.cs rename to Ghost.Editor.Core/Contracts/INotificationService.cs index 6dee627..f96a633 100644 --- a/Ghost.Editor.Core/Notifications/INotificationService.cs +++ b/Ghost.Editor.Core/Contracts/INotificationService.cs @@ -1,6 +1,7 @@ using CommunityToolkit.WinUI.Behaviors; +using Ghost.Editor.Core.Notifications; -namespace Ghost.Editor.Core.Notifications; +namespace Ghost.Editor.Core.Contracts; public interface INotificationService { diff --git a/Ghost.Editor.Core/Contracts/IPreviewService.cs b/Ghost.Editor.Core/Contracts/IPreviewService.cs new file mode 100644 index 0000000..c15510a --- /dev/null +++ b/Ghost.Editor.Core/Contracts/IPreviewService.cs @@ -0,0 +1,12 @@ +namespace Ghost.Editor.Core.Contracts; + +public enum IconSize +{ + Small, + Large +} + +public interface IPreviewService +{ + string GetIconPath(string path, bool isDirectory, IconSize size); +} \ No newline at end of file diff --git a/Ghost.Editor.Core/Progress/IProgressService.cs b/Ghost.Editor.Core/Contracts/IProgressService.cs similarity index 85% rename from Ghost.Editor.Core/Progress/IProgressService.cs rename to Ghost.Editor.Core/Contracts/IProgressService.cs index 6db1c1c..3cb8a3a 100644 --- a/Ghost.Editor.Core/Progress/IProgressService.cs +++ b/Ghost.Editor.Core/Contracts/IProgressService.cs @@ -1,4 +1,4 @@ -namespace Ghost.Editor.Core.Progress; +namespace Ghost.Editor.Core.Contracts; public interface IProgressService { diff --git a/Ghost.Editor.Core/EditorApplication.cs b/Ghost.Editor.Core/EditorApplication.cs new file mode 100644 index 0000000..00226a4 --- /dev/null +++ b/Ghost.Editor.Core/EditorApplication.cs @@ -0,0 +1,39 @@ +using Microsoft.UI.Xaml; + +namespace Ghost.Editor.Core; + +public static class EditorApplication +{ + public const string ASSETS_FOLDER_NAME = "Assets"; + public const string CACHES_FOLDER_NAME = "Caches"; + + private static IServiceProvider? s_serviceProvider; + private static string s_currentProjectPath = string.Empty; + private static string s_currentProjectName = string.Empty; + + internal static Application CurrentApplication => Application.Current; + internal static string CurrentProjectPath => s_currentProjectPath; + internal static string CurrentProjectName => s_currentProjectName; + + internal static void Initialize(IServiceProvider serviceProvider, string projectPath, string projectName) + { + s_serviceProvider = serviceProvider; + s_currentProjectPath = projectPath; + s_currentProjectName = projectName; + } + + public static T GetService() + where T : class + { + if (s_serviceProvider?.GetService(typeof(T)) is not T service) + { + throw new ArgumentException($"{typeof(T)} needs to be registered in ConfigureServices."); + } + + return service; + } + + internal static void Shutdown() + { + } +} \ No newline at end of file diff --git a/Ghost.Editor.Core/EditorInjectionAttribute.cs b/Ghost.Editor.Core/EditorInjectionAttribute.cs new file mode 100644 index 0000000..47bda5f --- /dev/null +++ b/Ghost.Editor.Core/EditorInjectionAttribute.cs @@ -0,0 +1,28 @@ +namespace Ghost.Editor.Core; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] +public class EditorInjectionAttribute : Attribute +{ + public enum ServiceLifetime + { + Singleton, + Transient, + Scoped + } + + public ServiceLifetime Lifetime + { + get; + } + + public Type? ImplementationType + { + get; + } + + public EditorInjectionAttribute(ServiceLifetime lifetime, Type? implementationType = null) + { + Lifetime = lifetime; + ImplementationType = implementationType; + } +} \ No newline at end of file diff --git a/Ghost.Editor.Core/Ghost.Editor.Core.csproj b/Ghost.Editor.Core/Ghost.Editor.Core.csproj index bddef02..ea6f534 100644 --- a/Ghost.Editor.Core/Ghost.Editor.Core.csproj +++ b/Ghost.Editor.Core/Ghost.Editor.Core.csproj @@ -21,7 +21,6 @@ - diff --git a/Ghost.Editor.Core/Inspector/IInspectorService.cs b/Ghost.Editor.Core/Inspector/IInspectorService.cs deleted file mode 100644 index 2b7119c..0000000 --- a/Ghost.Editor.Core/Inspector/IInspectorService.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ghost.Editor.Core.Inspector; - -internal interface IInspectorService -{ - public IInspectable? SelectedInspectable - { - get; - set; - } - - public event Action? OnSelectionChanged; -} \ No newline at end of file diff --git a/Ghost.Editor.Core/Inspector/InspectorService.cs b/Ghost.Editor.Core/Inspector/InspectorService.cs deleted file mode 100644 index 32d2f3f..0000000 --- a/Ghost.Editor.Core/Inspector/InspectorService.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Ghost.Editor.Core.Inspector; - -public class InspectorService : IInspectorService -{ - public IInspectable? SelectedInspectable - { - get => field; - set - { - if (field != value) - { - field = value; - OnSelectionChanged?.Invoke(); - } - } - } - - public event Action? OnSelectionChanged; -} \ No newline at end of file diff --git a/Ghost.Editor.Core/SceneGraph/SceneGraphNode.cs b/Ghost.Editor.Core/SceneGraph/SceneGraphNode.cs index 120bc9b..cda5cca 100644 --- a/Ghost.Editor.Core/SceneGraph/SceneGraphNode.cs +++ b/Ghost.Editor.Core/SceneGraph/SceneGraphNode.cs @@ -1,5 +1,5 @@ using CommunityToolkit.Mvvm.ComponentModel; -using Ghost.Editor.Core.Inspector; +using Ghost.Editor.Core.Contracts; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.Collections.ObjectModel; diff --git a/Ghost.Editor.Core/Services/InspectorService.cs b/Ghost.Editor.Core/Services/InspectorService.cs new file mode 100644 index 0000000..5512986 --- /dev/null +++ b/Ghost.Editor.Core/Services/InspectorService.cs @@ -0,0 +1,21 @@ +using Ghost.Editor.Core.Contracts; + +namespace Ghost.Editor.Core.Services; + +public class InspectorService : IInspectorService +{ + private IInspectable? _selected; + + public IInspectable? Selected => _selected; + + public event EventHandler? OnSelectionChanged; + + public void SetSelected(IInspectable? inspectable, object? source) + { + if (_selected != inspectable) + { + _selected = inspectable; + OnSelectionChanged?.Invoke(this, new InspectorSelectionChangedEventArgs(source, inspectable)); + } + } +} \ No newline at end of file diff --git a/Ghost.Editor.Core/Notifications/NotificationService.cs b/Ghost.Editor.Core/Services/NotificationService.cs similarity index 91% rename from Ghost.Editor.Core/Notifications/NotificationService.cs rename to Ghost.Editor.Core/Services/NotificationService.cs index ff9abdb..aa0374c 100644 --- a/Ghost.Editor.Core/Notifications/NotificationService.cs +++ b/Ghost.Editor.Core/Services/NotificationService.cs @@ -1,7 +1,9 @@ using CommunityToolkit.WinUI.Behaviors; +using Ghost.Editor.Core.Contracts; +using Ghost.Editor.Core.Notifications; using Microsoft.UI.Xaml.Controls; -namespace Ghost.Editor.Core.Notifications; +namespace Ghost.Editor.Core.Services; public class NotificationService : INotificationService { diff --git a/Ghost.Editor.Core/Services/PreviewService.cs b/Ghost.Editor.Core/Services/PreviewService.cs new file mode 100644 index 0000000..95cc826 --- /dev/null +++ b/Ghost.Editor.Core/Services/PreviewService.cs @@ -0,0 +1,35 @@ +using Ghost.Editor.Core.Contracts; + +namespace Ghost.Editor.Core.Services; + +internal class PreviewService : IPreviewService +{ + public string GetIconPath(string path, bool isDirectory, IconSize size) + { + string iconPath; + if (isDirectory) + { + iconPath = "ms-appx:///Assets/EditorIcons/folder-{0}.png"; + } + else + { + // TODO: Generate preview icons dynamically for known file types like images, meshes, materials, etc. + var ext = Path.GetExtension(path); + iconPath = ext switch + { + ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".tiff" or ".svg" => "ms-appx:///Assets/EditorIcons/image-{0}.png", + _ => "ms-appx:///Assets/EditorIcons/document-{0}.png", + }; + } + + var sizeIndex = size switch + { + IconSize.Small => "0", + IconSize.Large => "1", + _ => "0" + }; + + iconPath = string.Format(iconPath, sizeIndex); + return iconPath; + } +} \ No newline at end of file diff --git a/Ghost.Editor.Core/Progress/ProgressService.cs b/Ghost.Editor.Core/Services/ProgressService.cs similarity index 96% rename from Ghost.Editor.Core/Progress/ProgressService.cs rename to Ghost.Editor.Core/Services/ProgressService.cs index 3b31575..78f319e 100644 --- a/Ghost.Editor.Core/Progress/ProgressService.cs +++ b/Ghost.Editor.Core/Services/ProgressService.cs @@ -1,9 +1,10 @@ using CommunityToolkit.WinUI; +using Ghost.Editor.Core.Contracts; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.Runtime.CompilerServices; -namespace Ghost.Editor.Core.Progress; +namespace Ghost.Editor.Core.Services; public class ProgressService : IProgressService { diff --git a/Ghost.Editor.Core/Utilities/EditorApplication.cs b/Ghost.Editor.Core/Utilities/EditorApplication.cs deleted file mode 100644 index 1110d8d..0000000 --- a/Ghost.Editor.Core/Utilities/EditorApplication.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.UI.Xaml; - -namespace Ghost.Editor.Core.Utilities; - -public static class EditorApplication -{ - private static IServiceProvider? _serviceProvider; - - public static Application Current => Application.Current; - - internal static void Initialize(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public static T GetService() - where T : class - { - if (_serviceProvider?.GetService(typeof(T)) is not T service) - { - throw new ArgumentException($"{typeof(T)} needs to be registered in ConfigureServices within App.xaml.cs."); - } - - return service; - } -} \ No newline at end of file diff --git a/Ghost.Editor.Core/Utilities/FileExtensions.cs b/Ghost.Editor.Core/Utilities/FileExtensions.cs index cc25701..8bfa52b 100644 --- a/Ghost.Editor.Core/Utilities/FileExtensions.cs +++ b/Ghost.Editor.Core/Utilities/FileExtensions.cs @@ -1,12 +1,10 @@ -using Ghost.Data.Models; - namespace Ghost.Editor.Core.Utilities; internal static class FileExtensions { public const string META_FILE_EXTENSION = ".gmeta"; - public const string PROJECT_FILE_EXTENSION = "." + ProjectMetadata.PROJECT_FILE_EXTENSION_NAME; + public const string PROJECT_FILE_EXTENSION = ".gproj"; public const string TEMPLATE_FILE_EXTENSION = ".gtmpl"; public const string SCENE_FILE_EXTENSION = ".gscene"; public const string ASSET_FILE_EXTENSION = ".gasset"; diff --git a/Ghost.Editor.Core/Utilities/TypeCache.cs b/Ghost.Editor.Core/Utilities/TypeCache.cs index c3e8890..c2c076b 100644 --- a/Ghost.Editor.Core/Utilities/TypeCache.cs +++ b/Ghost.Editor.Core/Utilities/TypeCache.cs @@ -29,6 +29,12 @@ public static class TypeCache s_types = loadableTypes.Select(t => t.GetTypeInfo()).ToArray(); } + internal static void Init() + { + // Intentionally left blank. + // This method exists to force the static constructor to run. + } + public static Type[] GetTypes() { return s_types; diff --git a/Ghost.Editor/ActivationHandler.cs b/Ghost.Editor/ActivationHandler.cs index b52f7be..a7296c6 100644 --- a/Ghost.Editor/ActivationHandler.cs +++ b/Ghost.Editor/ActivationHandler.cs @@ -1,30 +1,67 @@ -using Ghost.Data.Resources; -using Ghost.Data.Services; +using Ghost.Editor.Core; using Ghost.Editor.Core.Utilities; +using Ghost.Editor.Models; +using Ghost.Engine; using Microsoft.UI.Xaml; +using System.Reflection; namespace Ghost.Editor; internal static class ActivationHandler { - private static void FolderInitialization() + public static LaunchArguments ParseArguments(ReadOnlySpan args) { - if (!Directory.Exists(DataPath.s_applicationDataFolder)) + var arguments = new LaunchArguments(); + var properties = typeof(LaunchArguments).GetProperties(); + var split = args.Split(' '); + + while (split.MoveNext()) { - Directory.CreateDirectory(DataPath.s_applicationDataFolder); + var range = split.Current; + var arg = args[range.Start..range.End]; + if (arg.Length > 2) + { + if (arg[0] == '-' && arg[1] == '-') + { + var argName = arg[2..]; + foreach (var property in properties) + { + var propName = property.Name; + var attr = property.GetCustomAttributes(false).FirstOrDefault(); + if (attr != null) + { + propName = attr.Name; + } + + if (argName.Equals(propName, StringComparison.OrdinalIgnoreCase)) + { + if (split.MoveNext()) + { + var valueRange = split.Current; + var value = args[valueRange.Start..valueRange.End]; + var convertedValue = Convert.ChangeType(value.ToString(), property.PropertyType); + + property.SetValue(arguments, convertedValue); + break; + } + } + } + } + } } - if (!Directory.Exists(DataPath.s_projectTemplateFolder)) - { - Directory.CreateDirectory(DataPath.s_projectTemplateFolder); - } + return arguments; } - public static void Handle(LaunchActivatedEventArgs args) + public static async Task HandleAsync(LaunchArguments args) { - FolderInitialization(); - ProjectService.EnsureDefaultTemplate(); + await Task.Run(() => + { + TypeCache.Init(); + ((EngineCore)App.GetService()).Init(); + }); - EditorApplication.Initialize(((App)(Application.Current)).Host.Services); + // TODO: Initialize other subsystems here. + // await Task.Delay(10000); // Wait 10 seconds to simulate work. } } \ No newline at end of file diff --git a/Ghost.Editor/App.xaml b/Ghost.Editor/App.xaml index 961b1c6..a329b04 100644 --- a/Ghost.Editor/App.xaml +++ b/Ghost.Editor/App.xaml @@ -9,9 +9,8 @@ - + - diff --git a/Ghost.Editor/App.xaml.cs b/Ghost.Editor/App.xaml.cs index e1ad521..dea3bb0 100644 --- a/Ghost.Editor/App.xaml.cs +++ b/Ghost.Editor/App.xaml.cs @@ -1,15 +1,18 @@ using Ghost.Core; -using Ghost.Editor.Core.AppState; -using Ghost.Editor.Core.Inspector; -using Ghost.Editor.Core.Notifications; -using Ghost.Editor.Core.Progress; -using Ghost.Editor.Utilities; +using Ghost.Editor.Core; +using Ghost.Editor.Core.Contracts; +using Ghost.Editor.Core.Services; +using Ghost.Editor.View.Pages.EngineEditor; +using Ghost.Editor.View.Windows; +using Ghost.Editor.ViewModels.Controls; +using Ghost.Editor.ViewModels.Pages.EngineEditor; +using Ghost.Editor.ViewModels.Windows; +using Ghost.Engine; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.UI.Xaml; - -// To learn more about WinUI, the WinUI project structure, -// and more about our project templates, see: http://aka.ms/winui-project-info. +using System.Diagnostics; +using WinUIEx; namespace Ghost.Editor; @@ -53,13 +56,32 @@ public partial class App : Application UseContentRoot(AppContext.BaseDirectory). ConfigureServices((context, services) => { - HostHelper.AddLandingScope(context, services); - HostHelper.AddEngineScope(context, services); + services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + + services.AddSingleton(); + + services.AddTransient(); + + #region Should be deleted + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + #endregion }) .Build(); @@ -81,32 +103,55 @@ public partial class App : Application return service; } - /// - /// Invoked when the application is launched. - /// - /// Details about the launch request and process. protected override async void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); + var arguments = ActivationHandler.ParseArguments("--project-path F:/GhostProject/Test2 --project-name Test2"); // args.Arguments + if (!arguments.IsValid()) + { + Exit(); + return; + } + + EditorApplication.Initialize(Host.Services, arguments.ProjectPath, arguments.ProjectName); + + var splashWindow = new SplashWindow(); + splashWindow.Activate(); + Window = splashWindow; + await Host.StartAsync(); - ActivationHandler.Handle(args); + await ActivationHandler.HandleAsync(arguments); - var stateMachine = GetService(); - stateMachine.RegisterState(StateKey.Landing, () => new LandingState()); - stateMachine.RegisterState(StateKey.EngineEditor, () => new EditorState()); + splashWindow.Hide(); - await stateMachine.TransitionToAsync(StateKey.Landing); + var editorWindow = new EngineEditorWindow(); + editorWindow.Activate(); + Window = editorWindow; + + splashWindow.Close(); } private void OnClosed(object? sender, WindowEventArgs args) { - Host.StopAsync().GetAwaiter().GetResult(); - Host.Dispose(); + try + { + Host.StopAsync().GetAwaiter().GetResult(); + Host.Dispose(); + + EditorApplication.Shutdown(); + } + catch (Exception ex) + { + Debugger.BreakForUserUnhandledException(ex); + } } private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) { Logger.LogError(e.Exception); +#if DEBUG + Debugger.BreakForUserUnhandledException(e.Exception); +#endif } } \ No newline at end of file diff --git a/Ghost.Editor/Assets/EditorIcons/document-0.png b/Ghost.Editor/Assets/EditorIcons/document-0.png new file mode 100644 index 0000000000000000000000000000000000000000..f361c50b89e1627a58168fb9a9f3eb05d4635fe9 GIT binary patch literal 453 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?3oVGw3ym^DX&fq}8y z)5S5QV$R!}_TGmbB-lRa#2&HS+q663uW?5m^G4N0FU>EmU9wJ3EGCM}SINS{>X#sw zt9ZMa)T$d#g3bkAINJ2VOUtT*#rK_F?>>H;-+xd1_6Zc>Vf(x~M9$%|WKRj(geBSE zHY{E;QI^f|(((4#8}FAkKlu1#!_lbsvW0I-jkz^WIXubrSDt3CbXGcmUw?;<-J7Jf z`s|K6_8Ji)70lCm_Q|;Xs1R&OJv^~lfHlHU#*!nj;cD}3k0ZZ2@6XISkoG;2&q?IL z@=$>UMFu0r8=sCXxV!(ztFjNX^b!tNw%mzhF53NZ)wT1NSf|`kpJAFaW96)kR@ZI( z|F;w{^O%3A1(6eUb~I|`CHyiIDE(X|h9Ir-9(W5J5SXA-&+(usYJbb8yAf&)pP09> zO|ak9^fNeItSL-l$__@Zw~7;vePt1>>-;dsCFJ2;{{!rcOlQ1t3=s{qw@8^X!|o}6 q279U`N7An;5hg#+CL8?M$&WGGl)ZFQ`b=QFFnGH9xvXS5MlI^CixG2X?r*qRp zVp~*8?(6O1JW^_S%5u5W+c(#z3Y))JB>&-v_|~$FYjB$Aoc|L2a6y<2bqTj@8ucp zFg92+7_c)uV>lqgFoT()nBfA?gJ;kDrOsaKt36g!DwKMdQE8>o+&$uph0D_;(>~Om z%4zs;+;rR1>SDWzCNc^$nHkg%WR$i0*;jclUluR_`-@GDbGUu(EM5f>nRkDg8>|@& z+N&9gcd#Q<7OaL4JKr&$c_?>428j|m0&&QyJIu$dY@SQA3cUPeyI^whzCebDdiR;F zEYoJOPI&XqmVu$?d&4}w^FQ4fIau4P|1&(`V>pB1n+Y-xw*8)7>$%8VSod;Y3xlQn zg6}WI&AYXIj<# zB{ePoB4*|3gnq4%nY!{>?Wd&?|MoH5+y3BZ74yT$WvvTdMQqwG-|+TH^n0fNvkfNa z?G+A@_V#RuZMmD@bSPPq`@%oJ5AkQt=C>pzul&Z$H|uPlYBl5WzX}Hzt?)ivf9`*L zZRe#{hdmo~4{my)q5fb;bo$&yGVW)Y|MpA`u1L3TmHPhZ&0)XC`4ItWKcNZLd+R^O Yzopr0Pgg8!vFvP literal 0 HcmV?d00001 diff --git a/Ghost.Editor/Assets/EditorIcons/folder-0.png b/Ghost.Editor/Assets/EditorIcons/folder-0.png new file mode 100644 index 0000000000000000000000000000000000000000..e90bb593bad5941735925c2be9e885b30daac9be GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?3oVGw3ym^DX&fq}8v z)5S5QV$Rze=d}+P${hcA{p?-Oe~nuwwM=uFq@wF76s4p3M=*?!FKEhPz7u@=*qYtIY%9&J1cCsb0bOq(Q;7VauOXbD+`-u0X+BU zwgoVsU_5(;A<1D;r<4Pa1t*B#3*;Xtv;}GnaOYJxd-MD5pNpfW8LPjW9^bvQ_f?1R w_nkivOHET&e^~ zr;B4q#hkZyvi;8$${hdr{>}%MI}iF2^E9XWty8h$@HBcF;9g!dKzV9advA<^g;rFj||NgH&pI&X-`2KhKZ}me!Bax8# zL-T^jWycR+lHosnA|c|#{-cLKS<6jp{Nb7@l{Lv^riZkJ`sL)_Ppa26J~aD_r|4YM zs7_s^Q{^}7_j&G`6>(~Z?B-3K*q_d77pmX6Z=W%f{qF)dJ};&Be={5J@3o$LK=9r? zAr_atDvzrCxtbO|UlQ}uPVHsv@03j{r*`#mHzlpm6^?ta_u#DDeTmn%-qrR`Io_7{ zY|09z5;;+pg8|WE7k1y?URQdp^5e9C6P6Cg1sm`4ZcAf&tbhNxo7|MI*6bPfIv+OQ z`159 z?+me~3#5#@7-l=pKC8i$!<1|ESnk1Bw+n7Sv8xNRfMnz6!se=h$+hr@CQzqn|GO>!Okd^1kbqbA(s{E*OZf!$ znyh{De6Gs*>KRO4fxio_Pj<)6nWj7ItEn$pg`njxgN@xNA$XbX! literal 0 HcmV?d00001 diff --git a/Ghost.Editor/Assets/EditorIcons/image-0.png b/Ghost.Editor/Assets/EditorIcons/image-0.png new file mode 100644 index 0000000000000000000000000000000000000000..a1775326167afd917e81086b78021dd3f25477b6 GIT binary patch literal 727 zcmV;|0x127P)AY^c+vaAi?dC0-d&M0}#dhIsx4RqM8=l-x zH}3Jd-CL*AMjLIkQRQ3+qSr&QhoMRXu*MQO0c$K#8i10219pLLz`lhK zSrvdy1b5;rOYm34x6p}?EIMAq(D5>clMAV$pl!tfSSg^>{R1to@IQ6EXVed{QW^fl zjgz6A9etBfFThG=aOC-SG*5*7n?+)TP6~k4pTVK0t1yfQx0Gcrp7k527E-Xd<1oA9 zIQ{9Te1P-hI@)I=(2vogGQZwHP(b%Q!ymxGC#z_mjpD%LD7xom*h1%sb+pYy&^Sux zRi`_S;~y9te)cU3uzx0ku6IoF0KL96OjBVrIH-bZon8?Hv`w$z*jq+=z}clVzg6l- z0+M8Mg#`hvE)J294sgcv3wmb|bq@oQW}FNQ0!&k3!4)hTz`gd``~IS2oCpa5TDTQF zmna;t_b!QIW^e`t0nOtfST?s;zJQux62(sM3N;gCigaXmZf}-$^uJ_bmc)R?n?j0YKvjB_2>YxD2_gdk~Ngu(#O76#aUeGy7m&8^vd0TtI4p@yn%6Zrwk`@R11elOHe z)gTcQ4cK<&b5B{{7k^ow2TE3P)tjyy@Ld!Q&_)|=w9&~izX4PQv*?FO2$TQ-002ov JPDHLkV1j>3KSlrm literal 0 HcmV?d00001 diff --git a/Ghost.Editor/Assets/EditorIcons/image-1.png b/Ghost.Editor/Assets/EditorIcons/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a02fea04a29c6cb8434c8551326f959ba0c90196 GIT binary patch literal 1404 zcmV-?1%vvDP)MCE*{WiS-7Ln%zRku1yNM)?co zAG0rj)6H!viVTo5<)Cw$V`iC~L!2fqZcB``w57ain!5RTbX!vLi2CF%k zRV%(tz>MY(F6fQ`tBv9UqAOqfhlL)o@#s}U0JR-q6L`!iFF@;u6!Z-V5J*5mlSBeQ z0uq@d5&#mQH;#%+u+IkI3ULUB-BHFu9C~L1(a%VLpd9tnAuNPFz@lqI*k|lJBtTH6 z_>oNtzZ&)(xg?MPVHwt1wp#g*^DykeM>4b{5+E$Ydj58c|A?O1012p(33rH#SpXZ% zBtVdda18Bd^*|;8f;`01|5wie5+KL}+w)Tk(vV&n!rF3_wxRKL5UZtw7!;GhR`*sb zU#{Yl0AXWTYhnGJ4OzB5Ww6)mJvrJ=+zUA3Ucy^<7GS+GkBX6bynQ!}>WPTv;tVgq z#sSuw^C-MH3G={OiY`q>MQB}6!wRV8B6#)3S(y9%TT=O(eEpdOJX-k^5tLn>#r{73 zwy=)OYhGBx2>8$&!NH*bOnv^Ch!+XE7Vv@RKa_ks4U^p`3F{60OVF(Vw$mxTJcWW@ z-&0Ypa|yZ>aKyC~-PIKI_++7cSicf4%KO8Iawrq=h)-7wy~6~dug zAyoajsMt9}R|4J}{RgIgKk~XoMX)?Uf{h0b-&sKE&#9G( z#uf1Hy}wal_aU!KR20jv8%wb9k?78;bSQv>->(<&%H?Ske?5gmw;vi$K-FK1(KeCW zDX4}T(bzY~4+zvriEZ2i8Cu}yP%UJQZDWFJ3 z37QHx{QClOIt1jjYs2f;f+)WpjGnS%6;O0>5|uYY@hgDsFml>?WVdNc;oziX0WS|u zqT(qfXd-|OJFN?!y;{P+q+|i?w-qCy_z}PcVAcg*cbNPAk_8m@GYRwh7x3Co50KT$ z>6ZOWfKPA=N_HD3SwK!Jk2kK(sUYCA2Sz5lm6I$WyM?`>I-=GxD$kP1$K$2u7FRRAe?Jp5>ykAe9RF{IpzT2Si>H6iPyqEP+UMt z{pesyy#s_}9jT{0x0M%Ach9`DZZwcw=K$eYA*J3CNo{ajlhnvFA3HL4)ZXviQG0)G zXYD8wndG|B$gUGk@9s06N>z$ap-?Ck3WY+UP$(1%g+fV+*ZdFIe9M|tpKA;N0000< KMNUMnLSTYhz=@Xt literal 0 HcmV?d00001 diff --git a/Ghost.Editor/Assets/Icon.scale-100.png b/Ghost.Editor/Assets/Icon.scale-100.png index 2f5b942367cd28d9e5370aee471e9f9f6f83269b..a9e79bc5bac15839998896a8e35f21c0e333d255 100644 GIT binary patch delta 1335 zcmV-71<3mU2;K^iIDZ8YNkl}hUU=nAuLQy0;15s{dm%);sm5kSLkm$6wGqF9;Ac~#r1|L1e$4L7c+NXB zX%c5AyPK?OLk}!Fne)EqJm-0z_q?+c75A8_+YO*myAQb4wtsT~kB*KGXqxtf>$;NX zc}*v1bgrT(zT-Hbjg5^>#Q9?ZGg!kgCTKELH5lUier$qT_nY-ek_1_nF)}hT7za8Q zFa_)9NyTEZuH>8bulJdz$-w*RvOd6ME(d9ry+#49w@^lIoG%tIRp+k{+Dd?N{{H|7 zt>&iN48yIIPk$`nxSicf5cT*YOYFnj#UlG^wZlY7Y!!g5@JDvnGF;1QYWSXHn8Kh? zmQm%7NGA~e2}SmiGJN6NC`W9&;!uGTHpO;Vq$<&|OtJM~PE#5#S0tP}o=5Ki2Nk;3 zR3E?pqv6A^Qv@7Th$P17ng>luE}&9{7;9)gR2o|)Jb%xg%Hv>1m3%?$nHw6eT(_X> z4N4*;fU5T~&}ZY(hv|qe5kd+yJFDZPZ&JvYB%D23z_G(+yphXdxhM(dBhV4MyfB5b zga<4SFFn1C>0b=wrY&O9!!sufI6!283IWaSo-v6Gi`Z>O!w4qX4goF7DADriRbMP2 z%fca69)D`D;@p$V=;^57wRd-8{k-HclLJL@e$$GRfqv zPt*8oK^CjiG{ZbGZMyj2tCUD|;mmDn9e)xYJ5bAc~Dl^5FOtsxW3@8r_B{H2MEd57JmpCuTQMVsr*Pcqbl6`b$4(Y>!KHi@aO zLLvnpMPh)#eU&?*74^AQ!D);_+Wl=##ihvk#SH7wf_(iCUohL!+0 z?pcBZW=I}N+sYT-{F;}*PB7(ixhrww tYi>FQjhOed+ig4Ne;jwK-3Q!i`xn@QXX~d8bJzd?002ovPDHLkV1nh$jQs!r delta 1110 zcmV-c1gZPp3jYX@IDZ5&NklSmy?kbvX7KWs|mTUq}R^BI@EV2uRc9AAfLyc3bP-wxBRh&Q`g}4hPC4siKq)M{J z^SC+ZN^)dHvS;iW(gYnm$U1W$-~I17XYNSHYi9bZ1_*0i;D5NS3mms~f#bF}8+dAJ zDqSj-)F=TA!w|ExvxT7T0|8G@Pb(`cE0=BC&d^t-`JND>ZJ!W+k;!DPkBp3bJu@@Y zzEfD>TrQWUk5hD6s`^4;o?KD3@NWVI@i+R@=P4589J%t506UJO_`Y9pUDu+|mmpfL zoqvb66`msqOMl=PCMCo!VYc2H{Z1AdxOsxTf;W#Dxx$?$ z-cF$~;6W`ga4p#slx+o#yt5Jl1{Do|bH43iSVPwX);DTuvZ%eu7($|0EW)%b=#+P# z9IYTppghg}#|f;KG&mmQB2s1zx>c|WEmEbvx&{pNdVd%_ydmKk{BF*ILo3#_2!YvL zS3!Tu$2XI!NYSJ)1TI~F8$aIa!_;^l&+yjd;>uzgpN`u2 z_Nz4-kbuh?PG8xNzpMPjix?QBkn3?ssIUlDB_LB5@JOApVH=}I3#76@_AW!$V&=bf z1>*#J_J8Cm9y~IsEnre#kg^_KWm*h}h|(sM_6)2lJ_;3`l+^IfTdwr+_8OXBgP^*9 z`tu_0Ju&c4v9`a5_PIDiKG5#);=1SYMGLwYZ#=WA>Oa zD9kb0WBSP6N#gjsHpV|Ld_D=h2r0iGCqdz@Y(B zm;isdmBi1>rW`ZOvm+ERtEQ_yF8`1j`&X`;&7}l4-Nmh=0R-I^= z+JELLq^{lU!FRuaq33!yOta_=c;L%fEE;dEVYATPZp!q-*8Ssl|KV(hi^0h_@v-B{r`QYGt2}&-0 zpfK?LoQ~x`4b+~xLgqn&7Sm^WatFA5Y=38o26XeGMJI*ymV{w{Lom~*moaPw6HRSf z&nJ-qcN#qG*`QtjSb%o|+U?0L=qasXyH)R{JI|*@Z8*7abjZPD%H!3$3?Yn5xnBp-QvdB*iTqt zette0U>^F70bN;z^?E2pssI2007*qoM6N<$f+4FTe*gdg diff --git a/Ghost.Editor/Assets/Icon.scale-125.png b/Ghost.Editor/Assets/Icon.scale-125.png index 4bbb04d544666b4ca3f1b64f8f33062ba569cd2f..c4f1ebab5ce9a075714964250b172e8bec8a7372 100644 GIT binary patch delta 1752 zcmV;}1}FK#3j7U_IDZDNNkl}w9w0Tx4U!u z$8-LFX4_r%GPApMTj+shnVo;m|9$6t=luWdjtaN2sqF@ED}QZ`+-kKoa;w$qk{cKp zSeH(xyA8t#ZwpD9Zp7GYU-3DWKxGmdG-1%JAauY1p$Z2dp5Ai4=fLPKMV$ z>VfO?3V$ctleQs(pO0NrA)zyp z4vCKb7Ke8}?}VgMA9vuTKqY6G8OsrfNf{CRM^h=XGUQRRFF&4zr*`Jx!!sT5)h`Lq zQL>7BvoGHq%m_*E*QiAAFaFxK=rXn*gG+TETia0lu5^s;H5no_;pN!|7MkvCPSTfQ@0KKADidnXgqb1 z4M~PdV30xLU6^?Zr+4j=sKDP7st8Z3WPeE#x%96Fvl)ex@av8;xv9(M$DLUCJqXD0 zil3H^REojV+ZW*dv*{9YRA>F$7WnzXf+$Mr$UPkntV4n~Fgy1l`QowzqP}Nv{)^)p z;$cuCqejV5bX1he)oBIJUW&u>7;P&j9J@&B!Fx@Vr3?3Cx9dncP%z}hYmvmx&3^`r zc+#bgN;Q;&Rnf1-{rjfGTsZSnjN?ef9Il+EH_rY#Le1jS z9}}=+a{>D9u^^AqF|i@^^;$5zI}5wE7{xWP2pGZjVm4@rxN=>^h+{^P#HRJQX5#0z zQ#ziA?|UeZ&4|I~jW+jB@MB19?0-rGj-QX=rh$o)sGqpt-BMK;WO31c?~6`&duRsk zLfIH7DF*=_z&1{qF%79iEzIkB={OU0MW1=if{5B>-+s{b+xtw+stJZq46mJ-QsLdt z(tQ4e?n2O=Sg4J2934{z-uPra9DF7NyS5g1dv+{Zvm}t@((5U@GQJdPv3~)OC+dhK z(VKP`cu2t_^m? z3oN~V|9cdExE$pRHnr|p#D81Oz2QWFh>TCF{2DT9_5WN`;PsC?`A)<^Zc+c!*t)0YBpfaUU4$wD`jW&kYrmw!hMH?rlsVPYJVxYq*_WYsg{yUs-@(T zYRcqhXJ?ODmUYJSyh0EJJN661u;o0h{Ea>#1PsGicU^aGetv#Y1*#A7ngwhQ% z?f6wJj&e$>J%7lrpqv8A$o^N#?c|HAX4jSLgs*4h>WjtQ{(=ex zE*5&IT-gzr9Ch*93q>MG5H7mFAf@@w;k_+T-QpKoSiYU(&+Dd+kj_CHj`lapnjLaUNu6D0%hF9uk$}g&lxW=eu!lEax`QjfX7JvZgLrt@$Fq|Ta(NC5>STu) zxst_?*MEqp*(2q66ImHJIvm=4&4Ua@%Lu@=bRieuiOCAioVbO#4~KE{woVFef@9^! z_f~QC#BCfHck%lTGa9c)AzdZne6?u_R+mFPjwzGlHvyf_#|nj^>x$Zer^1iG588oD zE<-um`I3f_y&g^;FJkWeuq4eOxi617d3+rQNPjt$bPNqdp*xuM>=cg)|dE9|>PlH9_Hb$Gk8#Y?-VbU3`ka9NlU0OEr$ErbRGN3|T9cQdF#|k)A zV1NGm98OI*l<6Yh^rJ4Wtr(09Jie(ra0pN}aD z&*=$Q&Lig||0mxL$aQS9$K}@mDRr3ue|#yAS15r56@jBuWjsxaa3=TbScr^NM2}KE zpG*GE_obWe>C`+uyN&@;Eg-TMh3SQ_a(}pZ)grYy)b$;4bd=m?brQ-X!C9{OkA_!| zmM}OJARlr@pcG$!#!(*zD9;-)p;L;y9mxCk#-zZ=eor?4zN_K<=Xp{sE6*S6-}Azm zO((z{G8ewd;X6v_e3lN6RX0*UTZRBGT{k5Gp+(iq4}V&y(sN8^+?ti>EdFxCz<=ed z87!~qas%qgDz3#+jx$%|Gixv#VC9a6k1pn9Vlecr{n-$HyL$vSN@Z~ zbc$$H&kE%lERJ$z{_Vcg%C#D27zRAgE4L4^HcoW_fq27p-Ln)XE&t`I^=;{IXFUJQ zL)RkpeM=RqGP#9?g+;nNr#h}5mj3yeR7=Sv)lzavwUk^^EhU#!+tuX$1r(Z+Dj*6M RQ%wK>002ovPDHLkV1loHj57cL diff --git a/Ghost.Editor/Assets/Icon.scale-150.png b/Ghost.Editor/Assets/Icon.scale-150.png index d70b84b6ae8f238b06c5fb0ffb1440c3010bc791..9b2962687f05add5f2ff6b6f9897c72f35d951c6 100644 GIT binary patch delta 2023 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 b5fc9c+^`8{QoBDX00000NkvXXu0mjf_>U8q diff --git a/Ghost.Editor/Assets/Icon.scale-200.png b/Ghost.Editor/Assets/Icon.scale-200.png index 462c308931b486159c0cde9e9793626fac1571a6..a05a6b97b8b71dcb4b2e26c003ea6012f8dad406 100644 GIT binary patch delta 2839 zcmV+y3+VKq5waGLIDZP{Nkl6+Sa}X5Zd*5+|We(}&vVFmG1i_ynQ~w}+E%+J3tL`}Ohcr!lV8@Ofj~qB~;6=A`Tob%!&mQ5- znKM5ka?9ni+in~|t+bOKV)aLIA(2Rs$NmtxIJ|f7URMLVCU|0Eq6b66r>oVfC&m1r z8wj-nc`ahY`1p7pf4YjvUP1&z;i4bK7DBfY>Hy+^xqof!nqahE(xgF~#p?P2^)_l; zxPqrmjuf+Ap0!$}i&5X-&p44DG`fM5PROoDs07D^wjvP0%aKs8xqBRgJ@oIY7`zk+ z4Fhou4ncN1_$GKU6B5VZko(6mIK;l4mfeid366_pKcYjX=>$(n%xvtbLT0)m(9vrlPw}y<4)gprS?^Z&a5jY0Z+p;Q{rFgsi8$XvN z1DM!dglalKRc&)%z)K0#TNE1e;K*X|)YKHDQmKZ|NEQ)y>opaS#irXGHR#yr+$9N= zs=$@?f~Xcm$4jY%0k?dr%1>p@O$EUKRRj3of`7yp!sm@|jzA%zR2E^|oip&nmPt_6 zRz(TPgboK^>w#a579fq2s@HX{BH#oBNXa@#EL=iWBt}8~MA3juvd-i1MT`B72dCk& zO(iIoTiGK*CA8k3juhazlWEAM{Oc8nU|QY2yb26S)Kq4>(gHK!x|M2+^;T7Y&3BYw zMSqV5!>6)PoE0IPbT7NzVw8}yLPm$L-a8GGGa`(Rr$Meuen^#dD>V?%>$qOcdXs0O zF{~+QXzc>n`=&bttVN(Jp#=iIbSE8jkrU77fQ?9BT9}kouT9PZxj89uz9_*pD^xRFwDiFcf!4Ajr@?!lm~l`=BG(`( z4C8QBX?z-s2)cHS3Xk1013y2U2Wf#6sf=Fn&3mVKA7!?2ES-k~9r`d+(P|qOE$FHq zou_WPgM-jQottEs2aA|K>VLNBr&|OH5fUnLX_~sG07>I~&! z2Dkimt5nBvRg9ls{`?#a|0Ba)n@&`Apaosur^3V7RF@MLQ(Ad zh`2$%@!tf_4O7PeIWQq`7D0+1dozWTEb*MuDX!hTw#td6>q#W6e}ApY z7m7eKZbCxW_Nx5o+kcbN;I{Qu)XBbm0xk9xB=>c+;B=xf{zsk%+X=8%`S*Xz!5uf2 z`6ks|L?Ktc9%Ce3|I^>I@byg!2Tj?%J7pz3Aleifg4blO0{)SD4i?K3h>*%W`B9sPTm=`=oU&nm`FW+ zE&= z)ixH)+oH>Fzk8N%pj+;o@mL0iPNoBIZ1o5ngDsH46p!~E>EZ7C_=7WOb@O>CU8jj!hXA+x zN3tn2%-03TrE6}o03Rfa(lbq&*Tn+qOwX+UZZreGIe(hvzdMyxI}(HIL6$%}{;!Yb zFz1!vTVI-nwG<6D!rX6?8gXM8Hm9M7p4tNpcvxIj6C zSMvn(Xn!wC=HQo#A{;r9goCeU@H8s&nlCR%g?uL|6oOk;8q8V))nb44Vjli{Dg$@j zQo$^u0yp9gPDf|!Hj)!FRI4qcOJAH88?4F#kxJK;Il){6r?Q1$mL181inENLCja?v z0#3do!-p5mLyT4Ph~h3?XffChq&&SYOffk4T7MdePV*W-Z${@;L&!awga6D3}({YUN8I;ZEn+V`r|B9?0$?wS}(=oV70w(Mps`WW2p&k1)V1}|0%jbm`cvb!b* zFBL+=KpcbP7#v>TFl5IuI6~Q76N3p$g@4qba7}QvS`{QoYX2z1A|=IRUqRC}*QV^6 zU>sCKf*Wo~EfYeU`w|Cj9@c7vYk~&`2Bycx#!fTF`ZUeq$+`B5dF~Td|FC3>BEP-; zFXCc!bktQ}*96nIjSdbDKCP^5+`f%-eg-Yq^>+soJZBLjBO@>1 zj~CFIduikI+P_=T&dN)rl5za_@ymY3^_`}nHTx2{+z|gS1Q8=9IAX*EM~s-@h!GPU pF=B!vMoe(ThzX7uF~Jez|A;~K@(?m`;2i(}002ovPDHLkV1g;`X=DHZ delta 2175 zcma*oc{~%01IKaOScEwu*GMGykt<! zmNF4@lu5aT6lvtwpTEC;uiy9I&;Q?d{mBxMY$FQqWm_u?m&gYj4>%!Wu44TorleM~ zlShjDfF3i}DvAJqr#+t2oY1S&Mt-+$?G64rFV$f0T}ie4iafDXGt z8VXmT0$XbKJZLZeIr@EAoE+R^L>1d=44N^#S2k5jkbYWeTodGIoi^gs-_1&{sB#;p zcm;CqvXW7p-3=3c`fcSB8vstRSh2an?_{dkLSl{mgG zEGPux>dl7`WYHm^{a%ZJQ1}%`cn+{gW!5eVugV#;uP=3>=|3AX)z3Y2=>`5g5@>MC z0hZY+42=_X8=X~K{VcgFJYpUCZc)^HK$t4??ivAPs#4n1QhRt(iW;Ms8q5)PBK*t& z(M~^dH0WUR22eaT^y?MSW$uNUT)79eTS5k#+?!mVr{@8muP**w`xFtB=2q=))#ud7 zOxulIX+zFozf>MOfe?R-?4=|hMa-_pu1bqdBvV){23qSM=I(zD>mkLn z_=bU9S_J4cR4a3IQ4){{Wp?K_*rw;v8w$A&5CIjU&0@P|-A_hV!kG-8mu# zDEhP2v4$AmzA*TDr~++`_ZD6{5n?Ji&aNpmTwiSiw_XfPbe6EkTMgjC3qzHhkI(9v z3DyR!C0_b&V{=`h>>bxHyB?U6Ka+UrT!CJlHwMr3T`=>I{ah-x7pU2tS62;s}mO!kn~HvthLm&73rL=6503S1#0YmgEk;@8$5Ejb@I<=BW$ zmziX@lu`pK1k}{yPO!L&6kDZGI8&Z~ZMS2xC`m!G1d?mW?q~HRrK8;}K>K;(yoG+Z z(CfiyIaDYytK!Yrg6iuBGs5u=$U#4|(}G^esRLPy=ec?RvH zi2=5*k>3KL8ln7G3UsL-Wz-(LvMLlngDreO)d5rLDKIkwG|!v$LxRFB2KHdCKq)PKH_EXD9amN}SwB`b%UreIz+2WW7&&=Ur-zPLXOL z1QD$SU?hZf=gS=bhOj2CBi8Lco=Wp$LZ_Y0Z7DK@RqnvuuSbA}u(ke93y{}$b z0KL$AydZ4$R{^LvVzO)4@0jr^J2=<`9s6!MXJfhR^$mczI_!K&u|hYqeV&ggA$xw} z!b{1E(mHviiUSWl?uGj@vRO9e04gwYvrl3_X7+hyIT9T697*i>uwU#{ zsWFpB^qjy>H|)8=4!-9D(6Cr_!?r|}2V_k1D_EHWjGa%-xOcF*l3h~4t4fnv@{s0E zpOF$Un=3M$kFOQ=`J_1FnitBEy(_NH2BN{j+g~R;1S83t`gltJV8DAg|H+Yhtg+vT z-qzqVKxAt$3{=_No-C8Wj0TGt#mBq0#Vw@KIvbe#hxL%ThXy*bV?2&#IF-p7odqu| z#_DkOlH>1v#pn|o4@R#^M!r^`%FX2J6Ckk`>;r%F21vIx_y{XMl$BS{Ha?|2 z49#OFJdSvtB2U?uErImka zfc#ZnfN)VMH;WcIZhk+D$Lm5SxzvkZ$+ASx83s;48()#%Zz5d25yDDOjbxS9`- z=ATyZ;SA==E^aVWEC2lS3xHB2kU59THB++Gl^1(4|htTen|xj5k*#J1Jc5q&^a09-Y2gby{I^H_kCH*Kypv z$0T#X6nn31K;@uVk#`ku5c{U-aj{;B;lk1kT}_>C10aQm%dRdjvn11cBfN2*J7bN5 zJtmQJRehX`>3w#Jd|I^d4~-iz>rCj%aaTMaq6h)K7*lZT+?jV*1uJ|9=hm_RH_-o0 bdi4>PW}3d{c7MVbu0OLyI9S!dy>I^q#PkdS diff --git a/Ghost.Editor/Assets/Icon.scale-400.png b/Ghost.Editor/Assets/Icon.scale-400.png index 42e431721faa11bcbd131be850a60a5dc7105d04..2e54086d040941330791156ccf07aea06dd19550 100644 GIT binary patch literal 5588 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 YAW8-S-w)yzvj6}907*qoM6N<$g0po5h5!Hn delta 385 zcmV-{0e=3(1hE5r8)=&(OoD`Zf=5$Ac!vg z0Dc8Of*+)~+}aLqqI;pBiy~^V*rKOa%H1`+B<4~r9eM?E&<7#O%ggU2`M(hS(#Zb; zR4SEq%d&PDV`HBXVmzjlVlWugJkM)P1#r#}T-QA^3ZQDi|hB-Bz4p7;` z*ItMri$F{X#nBrR28&g2Bw<2?saIgJKzTL7^E*S^PnJg6g(8%SF&5_}nzu9F;N=52 z++gFrttaN5l2?Azr4`K-X&ih;f3LOQ@y?c^el{S6<>r6IaKQv-H4`)IW@sGiR! z=Sc??U52wu2YNS;1uQMZXmyCb#8b6^j&GsmQxy}X0}{!yG{#-m#C6*S%?SMr_gxBN zNw_(#WSnsV&ZR?026;z($!F?5Ymd|*gdhk4Cl#Q~Q#wcAg)~`2qXazh)lvcVdOazS f27X|F|Cv4kYkQ`{30xbG00000NkvXXu0mjfu|uuo diff --git a/Ghost.Editor/Assets/Icon.targetsize-24.png b/Ghost.Editor/Assets/Icon.targetsize-24.png index f74f60350f2b990c751dc0296f560be444c134ea..5a020e46cd3c6891a3db76ffd04400135b59e052 100644 GIT binary patch delta 782 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 IUbPDNKUt4UKL7v# literal 6991 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 diff --git a/Ghost.Editor/Assets/Icon.targetsize-32.png b/Ghost.Editor/Assets/Icon.targetsize-32.png index 33a089f3fbc9b44adbf137e940bb896662f852f7..22268c03295a9f50fecd317aa0f32a305d610193 100644 GIT binary patch delta 1050 zcmV+#1m*kG2E+)EIe+#^L_t(|ob8uQXj54f$N%pu?MT)Ze0}Aor4>p-)HK&P`ME z@$%8y8E4_8k2L4qd(Q9t?>XU2! zg@uJHwr$7gt5SMT2odOb9d;3m#cuZZ_n#dfA78s!29QW3qV#c!E=yIv3Bb-2rHp4S zKr{B@dip#?30@#mG7!LV9L4wjoa?$4eQqSnMssrjkMCRRD$JQ;@Y46zk9m2^iEA{@VKb&N)Zd z1D00`*>cjY;U=~qole8FEa+5+hxgx`% zxH5SazwOUqXNQZcGf^BJu<^%pNI_rKpD6mZ-EMnf~yq3)CD}E zAMCR+uqQ<-2*jT+;>Bx|<^m?I1!eBhl_fad5+z{kssL2QM=GaN zrW&?yaet+aZTH~hRCI0i(6@u< z6TGj;Eu5JTOP?)f6AJL2wwONRPr}&0%f`^5EPsCOUBREnmk^@aEU!UVF9ETn?2`Wn z**y9ZB2g~JQt0j=1t{SCxiId{o6=`cCkFy>R=Vor(w%maPs6c;IrR28QVm%{CU*h{ z_a#7>Gb5X|8ljKoCTR=*y4!;540@oh2;O=7!zjV2>=r{(q z(trCeTA?QB@9)_#W?zNiQSq`WnY@D6A9M*Hq0BXveJUtD;2J0Z8HjtD+ii&oX!d1j z?Lox%LR4)0fMS5>2_5rq3>2QSLe^1;;My!tD#Y`fJ`0KvrH6=48R!)S#P(uBrm@;~ zC=Vn`=2o6BbrlGjyq*&<=w8zR8x7iMZhz$|SQDU9f$z;c$Y)&uhHZ8W)&sa|tCFD% zK-YCa?}HJI`mDw)RW)sZJ;=r{xt`}m`1QOdz~tm)dU$yF8ue?; delta 808 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 diff --git a/Ghost.Editor/Assets/icon.ico b/Ghost.Editor/Assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..26c99b9f122ba33c6e7bf80d1183ea1dd0ef2862 GIT binary patch literal 174430 zcmeEP2b>f|`ke(~Ma-h$9iU0H_k|9}rRO*tX=%RS zO)?ygPqG}2ygcLjQe1zR!_lRSk$wuU|I*GstIPwT!{u@j4T0?i1qDI@ z`3ME%CkW)DupRM+fWz%}6Agf^fIvQesJs}O@?!Z|Plwm*B^r1oC$gct5C@d@_8WeiHTRo+1MDDGVM8-p}i1ewi3umu^A|GHp{lS+-_AU2{ zf}&F4Dk#{Bd>a6cqM{<8ut8CA@z$KNGepZpTSV%dPehBdeImdAa0$j!p8o{rHjAvg zrVBU9>c;gbqobsx#8K)lXi(Ux`_`5(d@a&vyeV?WJR#C%yd}KtI!Q2|bLZnC?Ws3K z%Z2|D?)IIxdh>HwXGdvisiT$G-JrNr*R9zPEE4%6r;5U^y@j_+Z&6%SB;o1OOL#i> z61gKD7FqW#6rOh1Y%MCtZ@{{@YSoHp0Bi*W@)M;cB@!r`kSInz62%CM1?s#NXu!I+ zY14*i0BmjDy0svfkAlpPc>@0YN=mjOp9X-VZQHg)Lts1d5DF@2kdcI2~Ffn`!aJ}e)x9c6nJr~|0`Cm4A&MA(2p9)2JX)~^AsB^m;CfCNBYugc*M zalQW>u9ZA7y&1|5R5qlYfvI!AoJsp5^MTDX+ZlO0#{aQB(>AePDX@*|U>Y5?Av$=y z8LHSke)ZK?GryCOe|>}jK)&_OK;HFrAdmV6PNw~1p6bsiGxMGW&=zhZaGwC+9@}&v z|7|*u=XPKga5A8>cfgJj^#Q-FME-u;#yIX30Nh8}Oc~-n!T{|s>*mj&_6VpCYy+en zrR~%a!TnfA^6Af?_6n#EYye}6e*XMv&w%>CHo$Mgc`vK`neSz~ zUxoaQzM?)tnLqF0LEau$f$$VKCEN(zZuBASN6=rmbl{wJPwEC`=`X)O|H8s;hzqaR zBV3)ji(K>@S$91pvc}C6*|5RxlGYN8XO5jIGSMew51k;K?YpvXQF5aUDNBF;w70O? z^^1@{LgDOp8~T-xMbhg(i59EMMe{WWMDmN@2v_^g5{&a0&oNEPa~nlo-=V&`K}WzT zW$DkK_86#NTvWKt)48WeMcysSeiK=f=KA`yHGhcI+3SU;b$bcMTi_VWkU4RVOv`%| zbm#_NUF4Xu^ykmM4ya#J=-rlo+a%Fqi5Fc?^cod(981rT=ZY4pJ4qMXWyCe z;7h{U_ZE@#>JOsDioM`-g7CTug63a}^5>49DVnc6D3V|KR(QKzi$3*9^nD9NVcQPu zzX05$O$U)Rd4b3o{e*C%zf6AlThV;oL6MDqyb$Gw45=&r^0U7I>X()jZ}Z%6o5-Co zTjbyQm?&=7(TCP;MG5*xaOeZ?)2a>b(_SKX)FUGM?pdM$GAQ(VD8u@IKY#W|Kz(3a ztI`tD3Vm)Xz`Cg{`Rmk7yQ|lv?`STt+)O}PK z=6>6#i@2vMzUsT{8{-Ip`}m>X$Et3;r|EtiqfnOS{7**yvw06-8^QXRfqSryejtC! zOo3yVS-{D9{zxy!v&i!lfb|Ff?m_PSKzho`59CkXP+&RbxJ6X}*UH~KZUvs#!Sd)p z-WA3_Ja#z#gbsbN!u4e}BUC%&Wgtb&z%=b6y$$L)( zIF{H+;CKb#-aD;;d+#&@_uC2V0=5D70XNOb6NOXD-Y#H-KlVYj=O+*z)rw_f4wY>tNZJret$h~Q5NbFb-Kd+IW7bI_h%V& zn9HGl>*dhndO1`a_YHf0lwl_z6!bFaadm$^)bFpy)%_8&P1OS`)ZZAZ*F(4y@ZVpS z1LJ=+ACMvD0B-20zdW2H({f-ZeT-i;$f z?%;7E_vY~uT#Mpdg=NU^H9+Lxcn;3z+%#6?_P;~qU(-vt+?a2m4CKftN6`Co+zHeJ zb^;iWf&+|=v&TLqQs#apl9vB0=M61Z?U!>1u7Sz967J8qZ(gzAH@8^!vuKHHvM|Oj zXw_EEFAO=cZLy72s6WT0Ks{h5$E#l4JM)3X7~lUY@0~LLOUw^`ljHvutACes058_} z2+jw1jB^8~NtyqJNJ1HSZN~jC2v@1E4B(1wi#lH6{usM*u2T=#i86>h%tw-z?LmF^ z%e6P>;ISh4r5!#FkZ%sg?ijO6<7q)%TfuVg)}eWA+eP z_dM$>E6e}n8sWxTChp6&WqE&NE>;iom7PT$yU4Xk-kbH$!@R2qa~ZBha(>3S8rC=c z^CrbtGUj7klk}Fh7CD&9@>=G>bxb$cE^&Y8HQQK)`up!+g8O&sCR)C<6EfxX`-Kzt zE1^tAO%=|ecZ;IZR{r%z-dm!iROAo28*{{mMG-j3yY*h*{gDUd=D{2o^Y5Vd=eQrJ z2kb0q(@wYsj}ZmPqX4oi#Cj>`adPg%5P+VT;9Fajyg+|F*YuF($sc-;a1Odt6qdB2 zyx6wb#wygG<947PuoE!mdYtbS`PN@6u9*hR#VV8s^I6XQioI^%9MH!Tb(?Lh!u^f0 zcs+!^`)hMRS)TCov(V-7@wL-vV@Dl*QKlQ3n4!mvOxu zdR#AuitA<2<3@RQA!Hk?P=90oSQjDZz=ANBBhs?4OnMm*-v-nLEbou}YvH~VjWX;+ z7yz8#X$5dXnFRp%-f05wJrSs7b$?v%=-sY0Ia^{jwvskaq?`?EbO z)J2+Fv^~h9Lj8FRY2`c~_qR2l=QRZKwFL7Eh6)AvA3cDz0{OSn;i!H%q3+9d3O+09 z0{GV{E~vOpf%J|z;vB?vAg%*PlMY}l1=D%CUglr3vRL;BShLdBWAwF|fH>BO%xhNx zzp;)cOxTLw`H^yCE<1kv>!IRRtxveR@Vrr%t&x`BSXWT%3l++)>Y&1Kb>aDN@(ER+ zs+Rvq*C*2Q8|y0i8joKV=DP5=l0&dCoP5H`rYhyv>%zEI`SoML>YyKwv_6rRpX+ag zx$IWI^|D*V^>PP`hpSIz%dhI8LaXwdk6G10KNhSG>bO;1A}v4HXH}U)h32xGf9vHA z7FXpC7P3B-DL?C=BUC-qIdl2Vzk}65KWJMuA?-RieqZmYPeOJ&M0 z*V?(>&NXj~@|%w-83YTh%5OeqRR8H4?cr4 z=aD&izF!8FEx%fuX4&06Zm6I$nGe1wpKoMNSyG`~S0g09yEw4q4(SLJ7zjrZxy9Lr}#s9XN+_XnIy!gD%z=iUM3XI=O#i|6!w_zphH zpL^Tnfa6S)IdN{4%FlIqRR`*WeqYAj*A15EUDpl{I7jZyZAZz%EQ5kRgJk)geQpZK zgZcAWCF@4e7DURw@mxVZ_mJ;>nsmGn?`^VveE(n7jcu<8HcBslKpf|E8{odCr<9W$ z&lOc3D&##?`59KF{3=g9EW&d`mcIzkC_jD|;u&NX+6=EL z#Is9j+wfdf&s)XiIYS1KmS2C)Vzv+bU93HmDsJ1}uWNew&2hahEW7$$2p%flG{~3=ebEwd&4*D^x^6STf)j=JvO8ND= zFdnKNJg1jCSX?i=Ra})@g^`vY&v)drNpsn)ejkqdRJQ!89xAjdzxh~I>tiL4NXw6B zZy}#m+pSNyy4cY-)~B-NSM^}1${Z>*%fkG-vh|6y{CNHu^!d1|Q>c2VbLR4!e}}7& zYX6lfKkJ~N${Z?GWeyga%Wm~MSbeHmepL?@hN_1;7pxxYxK;Vh$5eeHEkB;|%Xb}A zsLCBIRAmkpsxpTP&1KhrSEBs>_cc@TtwE zYaZ zZ)-lT=Vd33_q8f~mmBOD-b1teUe|m)XhnmZFv^*L@Oadj-}jyeG}3{3HnIcc(I^t2 zu8r&h^=xE;^Kgvc4<8RC06}UQ{IF5~;}JGTogV}~1UBhF-8b0*^4Js!Q1?xCfx2z7 zzy=(f0$dG{gWwenat8IJ&QtEJJNkFf78sx;st;9b&izfoVlpScAf z2h@WgwG4h3bz%Lf^OU=-x-*^K`ZJxXpPevVoz3S_XL3M2U|R@Y(I98=jtajqZv<@8 z-&bKgR(!;O6SgDTk|4DVei-!(T7NSi>bG59BGHj5a#HE~;~g1(-`@z>q`xnt>S{NP z1t)gei;;$QmwiugK?gZ=xa%Jy+Y$Bp>$;%gc6EX2?COI`7fD;O(2GjfAMYp8zeFQo zlX_Q4)z@xlmlsu6yI};JaD2isS`aM{e%Px1iU&Qk%Y{l83r<4tam>~~(zX(WgG$#Q z?^e;jNh83o|GL~m#g(k>gm(2orL)^cm=2sorT%=+%nG46usUal52jIdwHt=ug!2{7 z*@8FpAZPGy8vOz{0ybIIJ=ig;dRrZ{%Y{m3mkXxT_=rmV`JP^|`kIeh)iu~LRX4j~ zB{+y${mFrXxz2&V;SZF4r16c94(St=enBMyeI@z%f$qEDOEfeN`I;hcVL0L3g>#r7 zS|0o`>gv~jRqt@2$3r~IR&ROoM~Ong+j z{&=^L{*4*|oA{ogjzc`a-xB2Mg|C(Ze0z{P9;AL-y{?k`+UnveF@YFtvzw>!Z}QE zK?ga5`Ub5(xsbl5ii&;phTj{0zmPiX1L->_X~i$nzf$wHf5L}qAd>J7c`kh1c%6Cv z`ZLaBJZDbN-_lnT@}xi7lxN-t7x1|Xt|br9C*`wBtGD`QBS!UyEr3rUSI_=}@AT7W zyLvY`bO`@Qvi|TtTcQ3FjCc8w#`I2hh2N|8iDdYK&w$U|{BC`vE-1TV;-J#?$NQc1 zuhj_Hq~7&pDBA(rw)6U1MEVnD@Oit-ez{RE`q|2Z-=)HWe7`+qJQv4W&<9t@x*PBL z)6W!mOoq>=^v73tp>5&~MUja^{5Rq`xqkw{cH?YeL(Q z4_#C`pxIT9U87k4V!RvQPUMX9?NcEAeNkR03%{94f9ef{i?x zLI1|4()Gu?sr2vG2-w8;RJj*I5xx;{!*w0=eF(o@%bL7UrjdTkH15)#eplqdpPajGN9hAR z8TZoDuqIYb><^WQGe~b9F(!;lI_AdV3hE}#~=OB`Rk9k7kcF!c&ALG=gmAa zroJYe_@2gt>)21wUwA+o<_&*;*(0Y4H}c^g9!B3<>H6dSSo#`o1o-3+-`IulGne`3 zQnY(~Ge}=`hK%S(k1}$>CKk1Z-@LBZifnxEQLVpxR~Y5< z!mnK#eYV4&p|5PdZ!77`F&+Bn?cNvPufT5|%0L_8vs3%=P0cT|%}~CDkYN$>Qhkcj zfg<`wgs*d^Nk{wQHHu^Ul=RRaU~!3X;rp|+X={D{BmHdzwguw@jz8S+m#=I~RrFt% zKkHvg`FDliM0|hcw>?V!YY&KwCss-QDCT!k(7{~zb*C+-KS$cUygMEU{SB4+CJEQ) z-7y8%z!u_K=8-e%QH(d>2cB)aLs#^9Wf&*HFTcP3J{z1e?+fALw^xU3>n7M(&S8VJ z^5BOp>kmKpv~vNvhcd7%8IP?H^4lxp`?&n!Q=rGt$!V*F6aFm=VY{Rqr7bm}bif>X z;a8v6WK3Hl^N`%p-#$3vxs1n_SExVBB>hIBokXMlct4x|9UB3gu_NaVo>ln3$byPuJELhD`L*`F$06G1ocVZ@vD$IKFQL4;29WpzNs;R=WOpN1pyg8v&cN_vL-x zn9&|`KZyX?@@EgG!^<*G@bf7wWvhL)7XYD-P_`Sx=+tXD0*)QLR5Y&=F1#%;%NN!-aZ%?ZiWH zu?gomhYixogCEBCYV_6H2$1@(*E>|)T<37V!*QXXx5EX~XnaJa{^oD@Le<~uTsRK& z^Ll;l#KUmHxeMno!37=Uj4pq3{rTIfo}rHEbqp1^Q)fNRk*fbO!bzp&kMCIN)4LI{ zN&lvmajUuqI~GbO%;!Ssh1EG-4}!!wci|i+h?WOGjC!*E=K&wG&Y=*j?!k_m>mBO1 zRlP$UGx4wizt5{e{pnZ!Az*8$`tw|{x&}KQs?PekP<6FBr`4bP5kCl6`tJ`edEXh7 zoBiMMKnsI|kMPYm+k$Q2+D(xF^=4li7N|GpB%$yj&OZn=2aX5ARky-X!Fw6mzTkciB5OtOaw$Fh& zZw~c5?8H%b%Y6~d$5E%C`y>QA7pA)L({Tpk48$3TGw?sgfX`om{r{zZ26$?Shf-0F zIv(sx(wCBcBKURCWWety0*_1Lej=oNd3k$~U++eKvs%<`j5)ezP~{m%wBje({>GX)%P77377v&sPFXch^;O*0EL z#j(b~*+4Cz8cszy{!BU?YL!5dnE^tPH@-#z=sAZ#3a!{H9-t zGT?ULa)2CFnjh4i?dEKQoAuKz8rg+iQs$*86;z&QIj%ne? zh|}grgP)B$2jSv+{q4l{dPfr1>u)EnaYH*sdtW7f`28f%4A`iDUl)#_VCU^{rKgF6 zE2g!>k(P%2D90L=)}LVfkSoPOq`a~I>RO$PU~$%4KNpTO)?ZJf@nPmKru^u<=y6qd zyP;lpyK%k#cH%)esxm+PJ`-pLYy{-@dpZ|(<94}H>Fn}kPG^TJEe*%D9Q#+geOd8C zp2&;hOZ^VVm8!d*P93ufRo(S->R70d^;hRLE&|$|aXe=H=-jBdUhhcadj0LhRo(4| zAvmfsKm7g^Xa@M(m*T^27ztNQYlkCq8oOMnbkWiuogc*gZHjRPJ3O)8db)6&vHp4* zGapvJRo(S->X=msj->wJT&3-gnIFZ8In?WJH?G&;PF$~dBylTljALAX;5tpE`Qi7K zKr>*YnUiq8?ee73+2P14O(a|~t;SbW`2k1%Hl@cy@ucdmr%}hOLREkLoH`aNWWDwC z;W#5lNW(c(GaxGZLr%=l>m3*m^f9FS8}iW45bcpd7{5dGpCSFIkb_WQI^?NyD?4*#nDye~GMdGXq2TG~%ABZhU*~LH!gr zjJsNQ5IMI_lzxxs`^XIXEXu;S@L9J{5jpU2lGl5XC_p|g_<3?U^DTY%D2@!yIOpcv zyVC6|6hGuk>5CWN7t_Z^LC+gS9=^NIyzd2(3V%Z_mu$ng_}EVx-{Q+}|KW2aFx)Rv zpZf@V{$5+buMdy$ob+W-;X33aeFW?l$&0s&l&9Y_d>h>@^5G+-pjA8Jg3NsWzz(%J zrAvp4AE{ID&p_W2x!9MNet+omh(0Hzj{@lr0=_=1>W5?ePMy99xOcGG?-7sjob>Y) zA_b`_n(QX;@M)G8|W6lXU_pWsN3dRq87Vvw0PY3t|8TFWyGxyi^ zbAf%EsY9}Th4TFby%zC>~3Z?TfxreEvwxA^i>|FWx5a)k5tR4bE5=@=m`o zQjg$EOxk*54I<|JpiOyUhw0xU?P=%@xnUjH4p2_Et;{Kl<@pr&xAB+VRL`Vkd*EN? z4fu$`{@Cy3i~NoI(5Fexu=_;@_Wkzx95LE5?!z*r&UjnoU@vV~ z>-NG8zf}e=Dy*{p;5$wFT51Mt1P=LofWH@a?*XtktKbI&`>~T3`ouv7?RUY(*x#+u7XTk4};$L#?%Y(j{a_)Q_)HCQ?=9HI&tK0R`&tnC@Rq)9~e_omJ(a5wu zj#zKzQ7+qF9>!Q6_yj6Ix~#ir`~19_%Y%N6J`}m(4P=)IDN0g!8%~!UNxGu8!U0STq^;4$x=b3w=MwVtMebCVfx( zxFJVX)*qc8#3eV>pS+P%eg4Q~nGKzQ?z69Dn{y5s51&UJvA=w4;eidJ4ybxbyMu9K z*2KBOb?r@>pAw&sjzj$TxN<@6Srg~UzEIjBgP+VPFGBY)ZYnMn9{5(HF8SKK=KqOl zQAYNo9Lp{ndswZKicHC zBIEHD;AXJ&tEZ2vtm1{#52Ve2o#nMkhuCJ^&>Q*&qaW7%{==moqzdCD_NORo_UI=9 z_yI>70j}Lt+CH20$IlP^0m?apv;~L8CiIt;vhY8`4cknAVa3on>QOfQII@qYt;~Gz zMfkuPE&b^gLyolh%I;h7Ltjbsz2_V>8usc%k%By!R~GW5&n&i0`VT9B|G1X8cLo1p zEFN!=Sl*o&U&EJL_T+iO z1@4N-oxzJ9TJfWf6+%zgCo+$;*&9SI#_aT|<(uPR91q`~DY$pV`3U{}m5Xf5joAl8 zlOKMc4>SWd0-_Z9K;%IdzHyt+R{CuV>|rYUT~Dw6Li*Q2TH39`&OL+&<0WtBo}#Et zJ4PG%v_|q$b-pKRllU(rc$$P8z=PwhuVOewFhg0^E;K;CX zT$AA1M5WsoI0@uO`kjJ3gdE9HF7zlDeYqd_?WDiGj$Pn;tniRO2x+&9e4L@4s+~%k zZ=pvzKa7(D*>|FElfKEMA4APQ8QTr~f94Il557R37TFs3I|uf%0DWB{eF;iP+aCjd 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 literal 0 HcmV?d00001 diff --git a/Ghost.Editor/Assets/icon.svg b/Ghost.Editor/Assets/icon.svg new file mode 100644 index 0000000..0689f0c --- /dev/null +++ b/Ghost.Editor/Assets/icon.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-16.png b/Ghost.Editor/Assets/icon.targetsize-16_altform-lightunplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-16.png rename to Ghost.Editor/Assets/icon.targetsize-16_altform-lightunplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-unplated_targetsize-16.png b/Ghost.Editor/Assets/icon.targetsize-16_altform-unplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-unplated_targetsize-16.png rename to Ghost.Editor/Assets/icon.targetsize-16_altform-unplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-24.png b/Ghost.Editor/Assets/icon.targetsize-24_altform-lightunplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-24.png rename to Ghost.Editor/Assets/icon.targetsize-24_altform-lightunplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-unplated_targetsize-24.png b/Ghost.Editor/Assets/icon.targetsize-24_altform-unplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-unplated_targetsize-24.png rename to Ghost.Editor/Assets/icon.targetsize-24_altform-unplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-256.png b/Ghost.Editor/Assets/icon.targetsize-256_altform-lightunplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-256.png rename to Ghost.Editor/Assets/icon.targetsize-256_altform-lightunplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-unplated_targetsize-256.png b/Ghost.Editor/Assets/icon.targetsize-256_altform-unplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-unplated_targetsize-256.png rename to Ghost.Editor/Assets/icon.targetsize-256_altform-unplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-32.png b/Ghost.Editor/Assets/icon.targetsize-32_altform-lightunplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-32.png rename to Ghost.Editor/Assets/icon.targetsize-32_altform-lightunplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-unplated_targetsize-32.png b/Ghost.Editor/Assets/icon.targetsize-32_altform-unplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-unplated_targetsize-32.png rename to Ghost.Editor/Assets/icon.targetsize-32_altform-unplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-48.png b/Ghost.Editor/Assets/icon.targetsize-48_altform-lightunplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-lightunplated_targetsize-48.png rename to Ghost.Editor/Assets/icon.targetsize-48_altform-lightunplated.png diff --git a/Ghost.Editor/Assets/Icon.altform-unplated_targetsize-48.png b/Ghost.Editor/Assets/icon.targetsize-48_altform-unplated.png similarity index 100% rename from Ghost.Editor/Assets/Icon.altform-unplated_targetsize-48.png rename to Ghost.Editor/Assets/icon.targetsize-48_altform-unplated.png diff --git a/Ghost.Editor/Controls/ViewModelPage.cs b/Ghost.Editor/Controls/ViewModelPage.cs deleted file mode 100644 index 36ba697..0000000 --- a/Ghost.Editor/Controls/ViewModelPage.cs +++ /dev/null @@ -1,38 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using Ghost.Editor.Core.Contracts; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Navigation; - -namespace Ghost.Editor.Controls; - -public abstract partial class ViewModelPage : Page - where VM : ObservableObject -{ - public VM ViewModel - { - get; - } - - protected ViewModelPage(VM viewModel) - { - ViewModel = viewModel; - } - - protected override void OnNavigatedTo(NavigationEventArgs e) - { - base.OnNavigatedTo(e); - if (ViewModel is INavigationAware navigationAware) - { - navigationAware.OnNavigatedTo(e.Parameter); - } - } - - protected override void OnNavigatedFrom(NavigationEventArgs e) - { - base.OnNavigatedFrom(e); - if (ViewModel is INavigationAware navigationAware) - { - navigationAware.OnNavigatedFrom(); - } - } -} \ No newline at end of file diff --git a/Ghost.Editor/Core/AppState/EditorState.cs b/Ghost.Editor/Core/AppState/EditorState.cs deleted file mode 100644 index d620ea1..0000000 --- a/Ghost.Editor/Core/AppState/EditorState.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Ghost.Core; -using Ghost.Data.Models; -using Ghost.Data.Services; -using Ghost.Editor.Core.AssetHandle; -using Ghost.Editor.View.Windows; -using Ghost.Engine; - -namespace Ghost.Editor.Core.AppState; - -internal class EditorState : IAppState -{ - private EngineEditorWindow? _window; - private EngineCore? _engineCore; - - public ValueTask OnExitingAsync() - { - if (App.Window == _window) - { - App.Window = null; - } - - _engineCore?.Dispose(); - - return ValueTask.FromResult(Result.Success()); - } - - public ValueTask OnEnteringAsync(object? parameter) - { - if (parameter is not ProjectMetadataInfo metadataInfo) - { - return ValueTask.FromResult(Result.Failure("Invalid parameter for entering EditorState.")); - } - - ProjectService.CurrentProject = metadataInfo; - - _engineCore = App.GetService(); - _engineCore.Init(); - - _window = App.GetService(); - _window.Activate(); - - App.Window = _window; - - return ValueTask.FromResult(Result.Success()); - } - - public ValueTask OnExitedAsync() - { - _window?.Close(); - _window = null; - - return ValueTask.FromResult(Result.Success()); - } - - public async ValueTask OnEnteredAsync(object? parameter) - { - await AssetDatabase.Initialize(); - return Result.Success(); - } -} \ No newline at end of file diff --git a/Ghost.Editor/Core/AppState/LandingState.cs b/Ghost.Editor/Core/AppState/LandingState.cs deleted file mode 100644 index b4d54db..0000000 --- a/Ghost.Editor/Core/AppState/LandingState.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Ghost.Core; -using Ghost.Editor.View.Windows; - -namespace Ghost.Editor.Core.AppState; - -internal class LandingState : IAppState -{ - private LandingWindow? _window; - - public ValueTask OnExitingAsync() - { - if (App.Window == _window) - { - App.Window = null; - } - - return ValueTask.FromResult(Result.Success()); - } - - public ValueTask OnEnteringAsync(object? parameter) - { - _window = App.GetService(); - _window.Activate(); - - App.Window = _window; - - return ValueTask.FromResult(Result.Success()); - } - - public ValueTask OnExitedAsync() - { - _window?.Close(); - _window = null; - - return ValueTask.FromResult(Result.Success()); - } - - public ValueTask OnEnteredAsync(object? parameter) - { - return ValueTask.FromResult(Result.Success()); - } -} diff --git a/Ghost.Editor/Ghost.Editor.csproj b/Ghost.Editor/Ghost.Editor.csproj index 8cf67fb..1288031 100644 --- a/Ghost.Editor/Ghost.Editor.csproj +++ b/Ghost.Editor/Ghost.Editor.csproj @@ -45,7 +45,106 @@ - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + Designer + + + + MSBuild:Compile @@ -54,11 +153,6 @@ MSBuild:Compile - - - MSBuild:Compile - - MSBuild:Compile @@ -79,11 +173,6 @@ MSBuild:Compile - - - MSBuild:Compile - - MSBuild:Compile diff --git a/Ghost.Editor/Models/LaunchArguments.cs b/Ghost.Editor/Models/LaunchArguments.cs new file mode 100644 index 0000000..630dbeb --- /dev/null +++ b/Ghost.Editor/Models/LaunchArguments.cs @@ -0,0 +1,35 @@ +namespace Ghost.Editor.Models; + +[AttributeUsage(AttributeTargets.Property)] +internal sealed class ArgumentNameAttribute : Attribute +{ + public string Name + { + get; + } + + public ArgumentNameAttribute(string name) + { + Name = name; + } +} + +internal class LaunchArguments +{ + [ArgumentName("project-path")] + public string ProjectPath + { + get; set; + } = string.Empty; + + [ArgumentName("project-name")] + public string ProjectName + { + get; set; + } = string.Empty; + + public bool IsValid() + { + return Directory.Exists(ProjectPath) && !string.IsNullOrWhiteSpace(ProjectName); + } +} \ No newline at end of file diff --git a/Ghost.Editor/Package.appxmanifest b/Ghost.Editor/Package.appxmanifest index 8cb61da..3025c27 100644 --- a/Ghost.Editor/Package.appxmanifest +++ b/Ghost.Editor/Package.appxmanifest @@ -36,7 +36,7 @@ + Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\icon.png" BackgroundColor="transparent"> diff --git a/Ghost.Editor/Themes/Generic.xaml b/Ghost.Editor/Themes/Generic.xaml new file mode 100644 index 0000000..70f6ee1 --- /dev/null +++ b/Ghost.Editor/Themes/Generic.xaml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + 12 + 12 + 24 + 2,2,6,1 + 32 + 24 + 24 + 0 + 0 + 0,1,0,2 + 0,1,0,2 + 9,0,0,1 + 10,0,30,0 + 24 + 12,1,0,3 + 32 + + + + -