using Microsoft.Web.WebView2.Core; using System.Text.Json; namespace SpaceEngineersBlueprintEditor.Views; public sealed partial class BlueprintEditSubPage { private bool isThreeDimensionalEditorInitialized; private async void BlueprintThreeDimensionalEditor_Loaded(object sender, RoutedEventArgs e) { if (isThreeDimensionalEditorInitialized) { return; } isThreeDimensionalEditorInitialized = true; ViewModel.ThreeDimensionalSceneChanged += ViewModel_ThreeDimensionalSceneChanged; await blueprintThreeDimensionalEditor.EnsureCoreWebView2Async(); blueprintThreeDimensionalEditor.CoreWebView2.SetVirtualHostNameToFolderMapping( "blueprint-editor.local", Path.Combine(AppContext.BaseDirectory, "Assets"), CoreWebView2HostResourceAccessKind.Allow); blueprintThreeDimensionalEditor.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; blueprintThreeDimensionalEditor.CoreWebView2.WebMessageReceived += ThreeDimensionalEditor_WebMessageReceived; blueprintThreeDimensionalEditor.Source = new Uri("https://blueprint-editor.local/Blueprint3DEditor.html"); } private void ViewModel_ThreeDimensionalSceneChanged(object? sender, string sceneJson) { DispatcherQueue.TryEnqueue(() => blueprintThreeDimensionalEditor.CoreWebView2?.PostWebMessageAsJson(sceneJson)); } private async void ThreeDimensionalEditor_WebMessageReceived( object? sender, CoreWebView2WebMessageReceivedEventArgs e) { try { using var document = JsonDocument.Parse(e.WebMessageAsJson); var root = document.RootElement; if (!root.TryGetProperty("type", out var typeElement)) { return; } switch (typeElement.GetString()) { case "ready": await ViewModel.RefreshThreeDimensionalSceneAsync(); break; case "select" when root.TryGetProperty("id", out var idElement): ViewModel.SelectThreeDimensionalBlock(idElement.GetInt32()); break; case "action" when root.TryGetProperty("action", out var actionElement): await ViewModel.HandleThreeDimensionalEditorActionAsync( actionElement.GetString() ?? string.Empty); break; } } catch (JsonException) { // Ignore malformed messages from the isolated local editor page. } } }