From 2816cf4d1245b44af873accab1262337c016a61b Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Fri, 23 May 2025 18:00:59 +0100 Subject: [PATCH 01/15] initial work in running game project from editor --- sources/Directory.Packages.props | 4 +- .../Stride.GameStudio.Avalonia/App.axaml.cs | 1 + .../Stride.GameStudio.Avalonia.csproj | 1 + .../ViewModels/MainViewModel.cs | 140 ++++++++++++++++++ .../Views/MainWindow.axaml.cs | 12 ++ 5 files changed, 156 insertions(+), 2 deletions(-) diff --git a/sources/Directory.Packages.props b/sources/Directory.Packages.props index 9b2c9a1b6b..2ea419c968 100644 --- a/sources/Directory.Packages.props +++ b/sources/Directory.Packages.props @@ -118,7 +118,7 @@ 11.2.7.3 - + @@ -147,4 +147,4 @@ - + \ No newline at end of file diff --git a/sources/editor/Stride.GameStudio.Avalonia/App.axaml.cs b/sources/editor/Stride.GameStudio.Avalonia/App.axaml.cs index ef0e4f011e..642cf7b632 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/App.axaml.cs +++ b/sources/editor/Stride.GameStudio.Avalonia/App.axaml.cs @@ -4,6 +4,7 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Data.Core.Plugins; +using Avalonia.Input; using Avalonia.Markup.Xaml; using Stride.Core.Assets.Editor.Services; using Stride.Core.IO; diff --git a/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj b/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj index c01b1eda6e..741f19f6d3 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj +++ b/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj @@ -30,6 +30,7 @@ + diff --git a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs index 9acc96e64a..3fee79bcf8 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs +++ b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Runtime.InteropServices; using Avalonia; +//using Microsoft.Build.Utilities; using Stride.Core.Assets; using Stride.Core.Assets.Editor.Components.Status; using Stride.Core.Assets.Editor.ViewModels; @@ -44,6 +45,7 @@ public MainViewModel(IViewModelServiceProvider serviceProvider) OpenCommand = new AnonymousTaskCommand(serviceProvider, OnOpen); OpenDebugWindowCommand = new AnonymousTaskCommand(serviceProvider, OnOpenDebugWindow, () => DialogService.HasMainWindow); OpenWebPageCommand = new AnonymousTaskCommand(serviceProvider, OnOpenWebPage); + RunCurrentProjectCommand = new AnonymousCommand(serviceProvider, RunCurrentProject); Status = new StatusViewModel(ServiceProvider); Status.PushStatus("Ready"); @@ -79,6 +81,8 @@ public string Title public ICommandBase OpenDebugWindowCommand { get; } + public ICommandBase RunCurrentProjectCommand { get; } + public async Task OpenSession(UFile? filePath, CancellationToken token = default) { if (filePath == null || !File.Exists(filePath)) @@ -138,6 +142,140 @@ private void OnExit() DialogService.Exit(); } + private bool BuildProject(string projectPath, string framework, string workingDirectory) + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "dotnet", + Arguments = $"build \"{projectPath}\" --framework {framework}", + WorkingDirectory = workingDirectory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + } + }; + + process.OutputDataReceived += (s, e) => { if (e.Data != null) Console.WriteLine("[build] " + e.Data); }; + process.ErrorDataReceived += (s, e) => { if (e.Data != null) Console.Error.WriteLine("[build-err] " + e.Data); }; + + try + { + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + process.WaitForExit(); + return process.ExitCode == 0; + } + catch (Exception ex) + { + Console.Error.WriteLine("Build process failed: " + ex); + return false; + } + } + + + + private async void RunCurrentProject() + { + var mainProjectPath = Session?.CurrentProject?.RootDirectory; + if (mainProjectPath == null) return; + + var projectDir = Path.GetDirectoryName(mainProjectPath.FullPath); + var projectBaseName = Path.GetFileNameWithoutExtension(mainProjectPath.FullPath); + + string platformSuffix, framework, platformRuntime; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + platformSuffix = "Windows"; + platformRuntime = "win-x64"; + framework = "net8.0-windows"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + platformSuffix = "Linux"; + platformRuntime = "linux-x64"; + framework = "net8.0-linux"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + platformSuffix = "macOS"; + platformRuntime = "osx-x64"; + framework = "net8.0-macos"; + } + else + { + await ShowError("Unsupported OS platform"); + return; + } + + var platformProjectName = $"{projectBaseName}.{platformSuffix}.csproj"; + var platformProjectPath = Path.Combine(projectDir, $"{projectBaseName}.{platformSuffix}", platformProjectName); + var ExecPath = Path.Combine(projectDir, "Bin", platformSuffix, "Debug", platformRuntime); + var dllPath = Path.Combine(ExecPath, $"{projectBaseName}.{platformSuffix}.dll"); + + + if (!File.Exists(platformProjectPath)) + { + await ShowError($"Platform-specific project not found: {platformProjectPath}"); + return; + } + + Status.PushStatus("Building project..."); + Console.WriteLine("Building project..."); + bool buildSuccess = await Task.Run(() => BuildProject(platformProjectPath, framework, projectDir)); + if (!buildSuccess) + { + Status.PushStatus("Build failed."); + Console.WriteLine("Build failed."); + await ShowError("Build failed. See output for details."); + return; + } + + Status.PushStatus("Running project..."); + Console.WriteLine("Running project..."); + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "dotnet", + Arguments = $"\"{dllPath}\"", + WorkingDirectory = projectDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = false, + } + }; + + process.OutputDataReceived += (s, e) => { if (e.Data != null) Console.WriteLine("[run] " + e.Data); }; + process.ErrorDataReceived += (s, e) => { if (e.Data != null) Console.Error.WriteLine("[run-err] " + e.Data); }; + + try + { + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + } + catch (Exception ex) + { + Console.Error.WriteLine("Run process failed: " + ex); + await ShowError("Failed to start the game process. See output for details."); + } + } + + + + + private async Task ShowError(string message) + { + await ServiceProvider.Get().MessageBoxAsync(message, MessageBoxButton.OK, MessageBoxImage.Error); + } + + + private async Task OnOpen(UFile? initialPath) { await OpenSession(initialPath); @@ -157,6 +295,8 @@ private async Task OnOpenWebPage(string url) } } + + private async Task OnOpenDebugWindow() { await DialogService.ShowDebugWindowAsync(); diff --git a/sources/editor/Stride.GameStudio.Avalonia/Views/MainWindow.axaml.cs b/sources/editor/Stride.GameStudio.Avalonia/Views/MainWindow.axaml.cs index 275c9a27c6..4b0bac2295 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/Views/MainWindow.axaml.cs +++ b/sources/editor/Stride.GameStudio.Avalonia/Views/MainWindow.axaml.cs @@ -2,6 +2,7 @@ // Distributed under the MIT license. See the LICENSE.md file in the project root for more information. using Avalonia.Controls; +using Avalonia.Input; namespace Stride.GameStudio.Avalonia.Views; @@ -10,6 +11,17 @@ public partial class MainWindow : Window public MainWindow() { InitializeComponent(); + this.KeyDown += MainWindow_KeyDown; + } + + private void MainWindow_KeyDown(object? sender, KeyEventArgs e) + { + if (e.Key == Key.F5) + { + (DataContext as ViewModels.MainViewModel)?.RunCurrentProjectCommand.Execute(null); + e.Handled = true; + Console.WriteLine("Run"); + } } } From c334afaf37ea2da720d03c2c650eb18858363f9b Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Fri, 23 May 2025 18:11:23 +0100 Subject: [PATCH 02/15] Update Directory.Packages.props --- sources/Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/Directory.Packages.props b/sources/Directory.Packages.props index 2ea419c968..cfb304d282 100644 --- a/sources/Directory.Packages.props +++ b/sources/Directory.Packages.props @@ -118,7 +118,7 @@ 11.2.7.3 - + From ef5a20359b239f5c5a42d8e555ac4af35b9def1c Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Sat, 24 May 2025 23:29:17 +0100 Subject: [PATCH 03/15] some fixes includin going from async void to async Task --- sources/Directory.Packages.props | 1 - .../Views/ImageResources.axaml | 10 ++++++++++ .../ViewModels/MainViewModel.cs | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/sources/Directory.Packages.props b/sources/Directory.Packages.props index cfb304d282..039efcfc75 100644 --- a/sources/Directory.Packages.props +++ b/sources/Directory.Packages.props @@ -118,7 +118,6 @@ 11.2.7.3 - diff --git a/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml b/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml index c8249c12ab..0a0f6281d4 100644 --- a/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml +++ b/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml @@ -151,4 +151,14 @@ + + + + + + F1 M 2,2 L 14,8 L 2,14 Z + + + + diff --git a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs index 3fee79bcf8..7aa67f6ea9 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs +++ b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs @@ -45,7 +45,7 @@ public MainViewModel(IViewModelServiceProvider serviceProvider) OpenCommand = new AnonymousTaskCommand(serviceProvider, OnOpen); OpenDebugWindowCommand = new AnonymousTaskCommand(serviceProvider, OnOpenDebugWindow, () => DialogService.HasMainWindow); OpenWebPageCommand = new AnonymousTaskCommand(serviceProvider, OnOpenWebPage); - RunCurrentProjectCommand = new AnonymousCommand(serviceProvider, RunCurrentProject); + RunCurrentProjectCommand = new AnonymousTaskCommand(serviceProvider, RunCurrentProject); Status = new StatusViewModel(ServiceProvider); Status.PushStatus("Ready"); @@ -178,7 +178,7 @@ private bool BuildProject(string projectPath, string framework, string workingDi - private async void RunCurrentProject() + private async Task RunCurrentProject() { var mainProjectPath = Session?.CurrentProject?.RootDirectory; if (mainProjectPath == null) return; From 3c1013603dcccbdf2f05686c86264c9ed7d3b0ec Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Sat, 24 May 2025 23:31:09 +0100 Subject: [PATCH 04/15] Update Stride.GameStudio.Avalonia.csproj --- .../Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj b/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj index 741f19f6d3..c01b1eda6e 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj +++ b/sources/editor/Stride.GameStudio.Avalonia/Stride.GameStudio.Avalonia.csproj @@ -30,7 +30,6 @@ - From 6b5a2c1927c2a807d16569a31a2c3d6e3e9a4a2d Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Mon, 26 May 2025 12:06:03 +0100 Subject: [PATCH 05/15] Update Directory.Packages.props --- sources/Directory.Packages.props | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/Directory.Packages.props b/sources/Directory.Packages.props index 039efcfc75..cfb304d282 100644 --- a/sources/Directory.Packages.props +++ b/sources/Directory.Packages.props @@ -118,6 +118,7 @@ 11.2.7.3 + From 67283fc0e6d58b5127036b72dd4262a0fe68c18b Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Mon, 26 May 2025 12:09:08 +0100 Subject: [PATCH 06/15] Update ImageResources.axaml --- .../Views/ImageResources.axaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml b/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml index 0a0f6281d4..aac884df41 100644 --- a/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml +++ b/sources/editor/Stride.Core.Assets.Editor.Avalonia/Views/ImageResources.axaml @@ -153,12 +153,12 @@ - - - - F1 M 2,2 L 14,8 L 2,14 Z - - - - + + + + F1 M 2,2 L 14,8 L 2,14 Z + + + + From 9972240ca10e78364f36f98732ac829e4c327006 Mon Sep 17 00:00:00 2001 From: hatim ourahou <147079928+ourabigdev@users.noreply.github.com> Date: Wed, 28 May 2025 13:52:42 +0100 Subject: [PATCH 07/15] Wip: base changes to add start button --- .../Stride.GameStudio.Avalonia/Views/MainView.axaml | 8 +++++++- .../Views/MainWindow.axaml.cs | 13 ------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml b/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml index 65610ff05c..86970c7c78 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml +++ b/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml @@ -78,7 +78,13 @@ - + + + Date: Wed, 28 May 2025 22:53:46 +0100 Subject: [PATCH 08/15] Update MainViewModel.cs --- .../Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs index 7aa67f6ea9..874c30539f 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs +++ b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs @@ -166,7 +166,7 @@ private bool BuildProject(string projectPath, string framework, string workingDi process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); - process.WaitForExit(); + process.WaitForExitAsync(); return process.ExitCode == 0; } catch (Exception ex) From 0a56ef0db6020265bc23cf6ff0d87ee3334c950a Mon Sep 17 00:00:00 2001 From: Nicolas Musset Date: Mon, 23 Jun 2025 15:56:50 +0200 Subject: [PATCH 09/15] Cleanup --- .../ViewModels/MainViewModel.cs | 68 ++++++++----------- .../Views/MainView.axaml | 15 ++-- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs index 2d0514a62c..c05e340f62 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs +++ b/sources/editor/Stride.GameStudio.Avalonia/ViewModels/MainViewModel.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using System.Runtime.InteropServices; using Avalonia; -//using Microsoft.Build.Utilities; using Stride.Core.Assets; using Stride.Core.Assets.Editor.Components.Status; using Stride.Core.Assets.Editor.ViewModels; @@ -82,10 +81,10 @@ public string Title public ICommandBase OpenWebPageCommand { get; } - private EditorDialogService DialogService => ServiceProvider.Get(); - public ICommandBase RunCurrentProjectCommand { get; } + private EditorDialogService DialogService => ServiceProvider.Get(); + public async Task OpenSession(UFile? filePath, CancellationToken token = default) { if (filePath == null || !File.Exists(filePath)) @@ -145,42 +144,38 @@ private void OnExit() DialogService.Exit(); } - private bool BuildProject(string projectPath, string framework, string workingDirectory) + private static async Task BuildProject(string projectPath, string framework, string workingDirectory) { - var process = new Process + using var process = new Process(); + process.StartInfo = new ProcessStartInfo { - StartInfo = new ProcessStartInfo - { - FileName = "dotnet", - Arguments = $"build \"{projectPath}\" --framework {framework}", - WorkingDirectory = workingDirectory, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true, - } + FileName = "dotnet", + Arguments = $"build \"{projectPath}\" --framework {framework}", + WorkingDirectory = workingDirectory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, }; - process.OutputDataReceived += (s, e) => { if (e.Data != null) Console.WriteLine("[build] " + e.Data); }; - process.ErrorDataReceived += (s, e) => { if (e.Data != null) Console.Error.WriteLine("[build-err] " + e.Data); }; + process.OutputDataReceived += (_, e) => { if (e.Data != null) Console.Out.WriteLine("[build] " + e.Data); }; + process.ErrorDataReceived += (_, e) => { if (e.Data != null) Console.Error.WriteLine("[build-err] " + e.Data); }; try { process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); - process.WaitForExitAsync(); + await process.WaitForExitAsync(); return process.ExitCode == 0; } catch (Exception ex) { - Console.Error.WriteLine("Build process failed: " + ex); + await Console.Error.WriteLineAsync("Build process failed: " + ex); return false; } } - - private async Task RunCurrentProject() { var mainProjectPath = Session?.CurrentProject?.RootDirectory; @@ -216,8 +211,8 @@ private async Task RunCurrentProject() var platformProjectName = $"{projectBaseName}.{platformSuffix}.csproj"; var platformProjectPath = Path.Combine(projectDir, $"{projectBaseName}.{platformSuffix}", platformProjectName); - var ExecPath = Path.Combine(projectDir, "Bin", platformSuffix, "Debug", platformRuntime); - var dllPath = Path.Combine(ExecPath, $"{projectBaseName}.{platformSuffix}.dll"); + var execPath = Path.Combine(projectDir, "Bin", platformSuffix, "Debug", platformRuntime); + var dllPath = Path.Combine(execPath, $"{projectBaseName}.{platformSuffix}.dll"); if (!File.Exists(platformProjectPath)) @@ -227,18 +222,18 @@ private async Task RunCurrentProject() } Status.PushStatus("Building project..."); - Console.WriteLine("Building project..."); + await Console.Out.WriteLineAsync("Building project..."); bool buildSuccess = await Task.Run(() => BuildProject(platformProjectPath, framework, projectDir)); if (!buildSuccess) { Status.PushStatus("Build failed."); - Console.WriteLine("Build failed."); + await Console.Out.WriteLineAsync("Build failed."); await ShowError("Build failed. See output for details."); return; } Status.PushStatus("Running project..."); - Console.WriteLine("Running project..."); + await Console.Out.WriteLineAsync("Running project..."); var process = new Process { StartInfo = new ProcessStartInfo @@ -253,8 +248,8 @@ private async Task RunCurrentProject() } }; - process.OutputDataReceived += (s, e) => { if (e.Data != null) Console.WriteLine("[run] " + e.Data); }; - process.ErrorDataReceived += (s, e) => { if (e.Data != null) Console.Error.WriteLine("[run-err] " + e.Data); }; + process.OutputDataReceived += (_, e) => { if (e.Data != null) Console.Out.WriteLine("[run] " + e.Data); }; + process.ErrorDataReceived += (_, e) => { if (e.Data != null) Console.Error.WriteLine("[run-err] " + e.Data); }; try { @@ -264,21 +259,13 @@ private async Task RunCurrentProject() } catch (Exception ex) { - Console.Error.WriteLine("Run process failed: " + ex); + await Console.Error.WriteLineAsync("Run process failed: " + ex); await ShowError("Failed to start the game process. See output for details."); } - } - - - - private async Task ShowError(string message) - { - await ServiceProvider.Get().MessageBoxAsync(message, MessageBoxButton.OK, MessageBoxImage.Error); + // FIXME: should we wait for process end? } - - private async Task OnOpen(UFile? initialPath) { await OpenSession(initialPath); @@ -307,4 +294,9 @@ private async Task OnOpenWebPage(string url) await ServiceProvider.Get().MessageBoxAsync(message, MessageBoxButton.OK, MessageBoxImage.Error); } } + + private async Task ShowError(string message) + { + await ServiceProvider.Get().MessageBoxAsync(message, MessageBoxButton.OK, MessageBoxImage.Error); + } } diff --git a/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml b/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml index 5c2b629581..031e1b6402 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml +++ b/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml @@ -85,13 +85,14 @@ - - - + + + Date: Wed, 29 Oct 2025 14:05:37 +0100 Subject: [PATCH 10/15] change run button placement --- .../Views/MainView.axaml | 487 +++++++++--------- 1 file changed, 248 insertions(+), 239 deletions(-) diff --git a/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml b/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml index 031e1b6402..6af213fefe 100644 --- a/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml +++ b/sources/editor/Stride.GameStudio.Avalonia/Views/MainView.axaml @@ -14,247 +14,256 @@ mc:Ignorable="d" d:DesignWidth="1024" d:DesignHeight="768" x:Class="Stride.GameStudio.Avalonia.Views.MainView" x:DataType="gsvm:MainViewModel"> - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + - - - - - - - - - - - - - + + + + + + + + - + + + + - - - - - - - - - + + + + - - - - - - - -