XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
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.
        }
    }
}