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.
}
}
}
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.
}
}
}