#pragma once #include "Panel.h" #include "XCUIBackend/XCUIHostedPreviewPresenter.h" #include "XCUIBackend/XCUIInputBridge.h" #include "XCUIBackend/XCUIPanelCanvasHost.h" #include "XCUIBackend/XCUILayoutLabRuntime.h" #include #include namespace XCEngine { namespace NewEditor { struct XCUILayoutLabFrameCompositionRequest { ::XCEngine::Editor::XCUIBackend::XCUIPanelCanvasSession canvasSession = {}; ::XCEngine::Editor::XCUIBackend::XCUIInputBridgeFrameSnapshot inputSnapshot = {}; }; struct XCUILayoutLabFrameComposition { ::XCEngine::Editor::XCUIBackend::XCUIPanelCanvasSession canvasSession = {}; ::XCEngine::Editor::XCUIBackend::XCUIInputBridgeFrameSnapshot inputSnapshot = {}; ::XCEngine::Editor::XCUIBackend::XCUIInputBridgeFrameDelta inputDelta = {}; ::XCEngine::Editor::XCUIBackend::XCUILayoutLabInputState inputState = {}; ::XCEngine::Editor::XCUIBackend::XCUIHostedPreviewStats previewStats = {}; ::XCEngine::Editor::XCUIBackend::XCUIHostedPreviewSurfaceDescriptor hostedSurfaceDescriptor = {}; ::XCEngine::Editor::XCUIBackend::XCUIHostedPreviewSurfaceImage hostedSurfaceImage = {}; const ::XCEngine::Editor::XCUIBackend::XCUILayoutLabFrameResult* frameResult = nullptr; std::string previewPathLabel = {}; std::string previewStateLabel = {}; std::string previewSourceLabel = {}; bool hostedPreviewEnabled = true; bool nativeHostedPreview = false; bool hasHostedSurfaceDescriptor = false; bool showHostedSurfaceImage = false; }; class XCUILayoutLabPanel : public Panel { public: explicit XCUILayoutLabPanel( ::XCEngine::Editor::XCUIBackend::IXCUIInputSnapshotSource* inputSource = nullptr); XCUILayoutLabPanel( ::XCEngine::Editor::XCUIBackend::IXCUIInputSnapshotSource* inputSource, std::unique_ptr<::XCEngine::Editor::XCUIBackend::IXCUIHostedPreviewPresenter> previewPresenter, std::unique_ptr<::XCEngine::Editor::XCUIBackend::IXCUIPanelCanvasHost> canvasHost = nullptr); ~XCUILayoutLabPanel() override = default; void Render() override; const XCUILayoutLabFrameComposition& ComposeFrame( const XCUILayoutLabFrameCompositionRequest& request); void SetHostedPreviewEnabled(bool enabled); void SetHostedPreviewPresenter( std::unique_ptr<::XCEngine::Editor::XCUIBackend::IXCUIHostedPreviewPresenter> previewPresenter); void SetCanvasHost( std::unique_ptr<::XCEngine::Editor::XCUIBackend::IXCUIPanelCanvasHost> canvasHost); bool IsHostedPreviewEnabled() const { return m_hostedPreviewEnabled; } bool IsUsingNativeHostedPreview() const; const ::XCEngine::Editor::XCUIBackend::XCUILayoutLabFrameResult& GetFrameResult() const; const XCUILayoutLabFrameComposition& GetLastFrameComposition() const; const ::XCEngine::Editor::XCUIBackend::XCUIHostedPreviewStats& GetLastPreviewStats() const; bool GetLastReloadSucceeded() const { return m_lastReloadSucceeded; } bool TryGetElementRect(const std::string& elementId, ::XCEngine::UI::UIRect& outRect) const; private: bool m_lastReloadSucceeded = false; bool m_hostedPreviewEnabled = true; ::XCEngine::Editor::XCUIBackend::IXCUIInputSnapshotSource* m_inputSource = nullptr; ::XCEngine::Editor::XCUIBackend::XCUIInputBridge m_inputBridge; ::XCEngine::Editor::XCUIBackend::XCUILayoutLabRuntime m_runtime; std::unique_ptr<::XCEngine::Editor::XCUIBackend::IXCUIHostedPreviewPresenter> m_previewPresenter; std::unique_ptr<::XCEngine::Editor::XCUIBackend::IXCUIPanelCanvasHost> m_canvasHost; ::XCEngine::Editor::XCUIBackend::XCUIHostedPreviewStats m_lastPreviewStats = {}; XCUILayoutLabFrameComposition m_lastFrameComposition = {}; }; } // namespace NewEditor } // namespace XCEngine